V10/cmd/post.src/post.src.cpio

0707070014231030370407550057030000000000400277220522634650100001100000000000post.src0707070014230361420407550057030057030000021040140522633073100002000000000000post.src/common0707070014230361431006440057030057030000011040300522627500500003200000007173post.src/common/request.c/*
 *
 * Things used to handle special requests (eg. manual feed) globally or on a per
 * page basis. Requests are passed through to the translator using the -R option.
 * The argument to -R can be "request", "request:page", or "request:page:file".
 * If page is omitted (as in the first form) or set to 0 request will be applied
 * to the global environment. In all other cases it applies only to the selected
 * page. If a file is given, page must be supplied, and the lookup is in that file
 * rather than *requestfile.
 *
 */

#include <stdio.h>

#include "gen.h"			/* general purpose definitions */
#include "request.h"			/* a few special definitions */
#include "path.h"			/* for the default request file */

Request	request[MAXREQUEST];		/* next page or global request */
int	nextreq = 0;			/* goes in request[nextreq] */
char	*requestfile = REQUESTFILE;	/* default lookup file */

/*****************************************************************************/

saverequest(want)

    char	*want;			/* grab code for this stuff */

{

    char	*page;			/* and save it for this page */
    char	*strtok();

/*
 *
 * Save the request until we get to appropriate page - don't even bother with
 * the lookup right now. Format of *want string is "request", "request:page", or
 * "request:page:file", and we assume we can change the string here as needed.
 * If page is omitted or given as 0 the request will be done globally. If *want
 * includes a file, request and page must also be given, and in that case *file
 * will be used for the lookup.
 *
 */

    if ( nextreq < MAXREQUEST )  {
	request[nextreq].want = strtok(want, ": ");
	if ( (page = strtok(NULL, ": ")) == NULL )
	    request[nextreq].page = 0;
	else request[nextreq].page = atoi(page);
	if ( (request[nextreq].file = strtok(NULL, ": ")) == NULL )
	    request[nextreq].file = requestfile;
	nextreq++;
    } else error(NON_FATAL, "too many requests - ignoring %s", want);

}   /* End of saverequest */

/*****************************************************************************/

writerequest(page, fp_out)

    int		page;			/* write everything for this page */
    FILE	*fp_out;		/* to this file */

{

    int		i;			/* loop index */

/*
 *
 * Writes out all the requests that have been saved for page. Page 0 refers to
 * the global environment and is done during initial setup.
 *
 */

    for ( i = 0; i < nextreq; i++ )
	if ( request[i].page == page )
	    dumprequest(request[i].want, request[i].file, fp_out);

}   /* End of writerequest */

/*****************************************************************************/

dumprequest(want, file, fp_out)

    char	*want;			/* look for this string */
    char	*file;			/* in this file */
    FILE	*fp_out;		/* and write the value out here */

{

    char	buf[100];		/* line buffer for reading *file */
    FILE	*fp_in;

/*
 *
 * Looks for *want in the request file and if it's found the associated value
 * is copied to the output file. Keywords (ie. the *want strings) begin an @ in
 * the first column of file, while the values (ie. the stuff that's copied to
 * the output file) starts on the next line and extends to the next keyword or
 * to the end of file.
 *
 */

    if ( (fp_in = fopen(file, "r")) != NULL )  {
	while ( fgets(buf, sizeof(buf), fp_in) != NULL )
	    if ( buf[0] == '@' && strncmp(want, &buf[1], strlen(want)) == 0 )
		while ( fgets(buf, sizeof(buf), fp_in) != NULL )
		    if ( buf[0] == '#' || buf[0] == '%' )
			continue;
		    else if ( buf[0] != '@' )
			fprintf(fp_out, "%s", buf);
		    else break;
	fclose(fp_in);
    }	/* End if */

}   /* End of dumprequest */

/*****************************************************************************/

0707070014230361441006440057030057030000011040150522627500500003200000001035post.src/common/tempnam.c#include <stdio.h>
#include <errno.h>

#if defined(V9) || defined(BSD4_2)
char *tempnam(dir, pfx)
char *dir, *pfx;
{
	int pid;
	unsigned int len;
	char *tnm, *malloc();
	static int seq = 0;

	pid = getpid();
	len = strlen(dir) + strlen(pfx) + 10;
	if ((tnm = malloc(len)) != NULL) {
		sprintf(tnm, "%s", dir);
		if (access(tnm, 7) == -1)
			return(NULL);
		do {
			sprintf(tnm, "%s/%s%d%d", dir, pfx, pid, seq++);
			errno = 0;
			if (access(tnm, 7) == -1)
				if (errno == ENOENT)
					return(tnm);
		} while (1);
	}
	return(tnm);
}
#endif
0707070014230361451006440057030057030000011040160522627500500003200000001432post.src/common/request.h/*
 *
 * Things used to handle special PostScript requests (like manual feed) globally
 * or on a per page basis. All the translators I've supplied accept the -R option
 * that can be used to insert special PostScript code before the global setup is
 * done, or at the start of named pages. The argument to the -R option is a string
 * that can be "request", "request:page", or "request:page:file". If page isn't
 * given (as in the first form) or if it's 0 in the last two, the request applies
 * to the global environment, otherwise request holds only for the named page.
 * If a file name is given a page number must be supplied, and in that case the
 * request will be looked up in that file.
 *
 */

#define MAXREQUEST	30

typedef struct {
	char	*want;
	int	page;
	char	*file;
} Request;

0707070014230361461006440057030057030000011041310522633073100002700000002213post.src/common/path.h/*
 *
 * pathname definitions for important files and directories.
 *
 */

#define DPOST		"/usr/lib/postscript/dpost.ps"
#define POSTBGI		"/usr/lib/postscript/postbgi.ps"
#define POSTDAISY	"/usr/lib/postscript/postdaisy.ps"
#define POSTDMD		"/usr/lib/postscript/postdmd.ps"
#define POSTMD		"/usr/lib/postscript/postmd.ps"
#define POSTPLOT	"/usr/lib/postscript/postplot.ps"
#define POSTPRINT	"/usr/lib/postscript/postprint.ps"
#define POSTNPRINT	"/usr/lib/postscript/postnprint.ps"
#define POSTTEK		"/usr/lib/postscript/posttek.ps"
#define POSTGIF		"/usr/lib/postscript/postgif.ps"

#define BASELINE	"/usr/lib/postscript/baseline.ps"
#define COLOR		"/usr/lib/postscript/color.ps"
#define DRAW		"/usr/lib/postscript/draw.ps"
#define FORMFILE	"/usr/lib/postscript/forms.ps"
#define SHADEFILE	"/usr/lib/postscript/shade.ps"
#define KERNING		"/usr/lib/postscript/kerning.ps"
#define REQUESTFILE	"/usr/lib/postscript/ps.requests"
#define ROUNDPAGE	"/usr/lib/postscript/roundpage.ps"

#define ENCODINGDIR	"/usr/lib/postscript"
#define HOSTDIR		"/usr/lib/font/postscript"
#define FONTDIR		"/usr/lib/font"
#define POSTLIBDIR	"/usr/lib/postscript"
#define TEMPDIR		"/tmp"

0707070014230357551006400057030057030000011024350522633073100002600000002157post.src/common/gen.h/*
 *
 * A few definitions that shouldn't have to change. Used by most programs in
 * this package.
 *
 */

#define PROGRAMVERSION	"3.3.2"

#define NON_FATAL	0
#define FATAL		1
#define USER_FATAL	2

#define OFF		0
#define ON		1

#define FALSE		0
#define TRUE		1

#define BYTE		8
#define BMASK		0377

#define POINTS		72.3

#ifndef PI
#define PI		3.141592654
#endif

#define ONEBYTE		0
#define UTFENCODING	1

#define READING		ONEBYTE
#define WRITING		ONEBYTE

/*
 *
 * DOROUND controls whether some translators include file ROUNDPAGE (path.h)
 * after the prologue. Used to round page dimensions obtained from the clippath
 * to know paper sizes. Enabled by setting DOROUND to TRUE (or 1).
 *
 */

#define DOROUND	TRUE

/*
 *
 * Default resolution and the height and width of a page (in case we need to get
 * to upper left corner) - only used in BoundingBox calculations!!
 *
 */

#define DEFAULT_RES	72
#define PAGEHEIGHT	11.0 * DEFAULT_RES
#define PAGEWIDTH	8.5 * DEFAULT_RES

/*
 *
 * Simple macros.
 *
 */

#define ABS(A)		((A) >= 0 ? (A) : -(A))
#define MIN(A, B)	((A) < (B) ? (A) : (B))
#define MAX(A, B)	((A) > (B) ? (A) : (B))

0707070014230361501006440057030057030000011040500522627500500002700000007564post.src/common/misc.c/*
 *
 * General purpose routines.
 *
 */

#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>

#include "gen.h"
#include "ext.h"
#include "path.h"

int	nolist = 0;			/* number of specified ranges */
int	olist[50];			/* processing range pairs */

/*****************************************************************************/

out_list(str)

    char	*str;

{

    int		start, stop;

/*
 *
 * Grab page ranges from str, save them in olist[], and update the nolist
 * count. Range syntax matches nroff/troff syntax.
 *
 */

    while ( *str && nolist < sizeof(olist) - 2 ) {
	start = stop = str_convert(&str, 0);

	if ( *str == '-' && *str++ )
	    stop = str_convert(&str, 9999);

	if ( start > stop )
	    error(FATAL, "illegal range %d-%d", start, stop);

	olist[nolist++] = start;
	olist[nolist++] = stop;

	if ( *str != '\0' ) str++;
    }	/* End while */

    olist[nolist] = 0;

}   /* End of out_list */

/*****************************************************************************/

in_olist(num)

    int		num;

{

    int		i;

/*
 *
 * Return ON if num is in the current page range list. Print everything if
 * there's no list.
 *
 */
    if ( nolist == 0 )
	return(ON);

    for ( i = 0; i < nolist; i += 2 )
	if ( num >= olist[i] && num <= olist[i+1] )
	    return(ON);

    return(OFF);

}   /* End of in_olist */

/*****************************************************************************/

setencoding(name)

    char	*name;

{

    char	path[150];

/*
 *
 * Include the font encoding file selected by name. It's a full pathname if
 * it begins with /, otherwise append suffix ".enc" and look for the file in
 * ENCODINGDIR. Missing files are silently ignored.
 *
 */

    if ( name == NULL )
	name = "Default";

    if ( *name == '/' )
	strcpy(path, name);
    else sprintf(path, "%s/%s.enc", ENCODINGDIR, name);

    if ( cat(path) == TRUE )
	writing = strncmp(name, "UTF", 3) == 0;

}   /* End of setencoding */

/*****************************************************************************/

cat(file)

    char	*file;

{

    int		fd_in;
    int		fd_out;
    char	buf[512];
    int		count;

/*
 *
 * Copy *file to stdout. Return FALSE is there was a problem.
 *
 */

    fflush(stdout);

    if ( (fd_in = open(file, O_RDONLY)) == -1 )
	return(FALSE);

    fd_out = fileno(stdout);
    while ( (count = read(fd_in, buf, sizeof(buf))) > 0 )
	write(fd_out, buf, count);

    close(fd_in);

    return(TRUE);

}   /* End of cat */

/*****************************************************************************/

str_convert(str, err)

    char	**str;
    int		err;

{

    int		i;

/*
 *
 * Grab the next integer from **str and return its value or err if *str
 * isn't an integer. *str is modified after each digit is read.
 *
 */

    if ( ! isdigit(**str) )
	return(err);

    for ( i = 0; isdigit(**str); *str += 1 )
	i = 10 * i + **str - '0';

    return(i);

}   /* End of str_convert */

/*****************************************************************************/

error(kind, mesg, a1, a2, a3)

    int		kind;
    char	*mesg;
    unsigned	a1, a2, a3;

{

/*
 *
 * Print an error message and quit if kind is FATAL.
 *
 */

    if ( mesg != NULL && *mesg != '\0' ) {
	fprintf(stderr, "%s: ", prog_name);
	fprintf(stderr, mesg, a1, a2, a3);
	if ( lineno > 0 )
	    fprintf(stderr, " (line %d)", lineno);
	if ( position > 0 )
	    fprintf(stderr, " (near byte %d)", position);
	putc('\n', stderr);
    }	/* End if */

    if ( kind == FATAL && ignore == OFF ) {
	if ( temp_file != NULL )
	    unlink(temp_file);
	exit(x_stat | 01);
    }	/* End if */

}   /* End of error */

/*****************************************************************************/

void interrupt(sig)

    int		sig;

{

/*
 *
 * Signal handler for translators.
 *
 */

    if ( temp_file != NULL )
	unlink(temp_file);

    exit(1);

}   /* End of interrupt */

/*****************************************************************************/

0707070014230361511006440057030057030000011040540522627500500002600000002032post.src/common/ext.h/*
 *
 * External varibles - most are in glob.c.
 *
 */

extern char	**argv;			/* global so everyone can use them */
extern int	argc;

extern int	x_stat;			/* program exit status */
extern int	debug;			/* debug flag */
extern int	ignore;			/* what we do with FATAL errors */

extern long	lineno;			/* line number */
extern long	position;		/* byte position */
extern char	*prog_name;		/* and program name - for errors */
extern char	*temp_file;		/* temporary file - for some programs */
extern char	*fontencoding;		/* text font encoding scheme */

extern int	dobbox;			/* enable BoundingBox stuff if TRUE */
extern double	pageheight;		/* only for BoundingBox calculations! */
extern double	pagewidth;

extern int	reading;		/* input */
extern int	writing;		/* and output encoding */

extern char	*optarg;		/* for getopt() */
extern int	optind;

extern void	interrupt();
extern char	*malloc();
extern char	*calloc();
extern char	*tempnam();
extern char	*strtok();
extern long	ftell();
extern double	atof();
extern double	sqrt();
extern double	atan2();

0707070014230361521006440057030057030000011040170522627500500002700000001461post.src/common/glob.c/*
 *
 * Global varibles - for PostScript translators.
 *
 */

#include <stdio.h>
#include "gen.h"

char	**argv;				/* global so everyone can use them */
int	argc;

int	x_stat = 0;			/* program exit status */
int	debug = OFF;			/* debug flag */
int	ignore = OFF;			/* what we do with FATAL errors */

long	lineno = 0;			/* line number */
long	position = 0;			/* byte position */
char	*prog_name = "";		/* and program name - for errors */
char	*temp_file = NULL;		/* temporary file - for some programs */
char	*fontencoding = NULL;		/* text font encoding scheme */

int	dobbox = FALSE;			/* enable BoundingBox stuff if TRUE */
double	pageheight = PAGEHEIGHT;	/* only for BoundingBox calculations! */
double	pagewidth = PAGEWIDTH;

int	reading = READING;		/* input */
int	writing = WRITING;		/* and output encoding */

0707070014230361531006440057030057030000011040700522627500500003300000007534post.src/common/comments.h/*
 *
 * Currently defined file structuring comments from Adobe - plus a few others.
 * Ones that end with a colon expect arguments, while those ending with a newline
 * stand on their own. Truly overkill on Adobe's part and mine for including them
 * all!
 *
 * All PostScript files should begin with a header that starts with one of the
 * following comments.
 *
 */

#define NONCONFORMING			"%!PS\n"
#define MINCONFORMING			"%!PS-Adobe-\n"
#define OLDCONFORMING			"%!PS-Adobe-1.0\n"

#define CONFORMING			"%!PS-Adobe-2.0\n"
#define CONFORMINGEPS			"%!PS-Adobe-2.0 EPS\n"
#define CONFORMINGQUERY			"%!PS-Adobe-2.0 Query\n"
#define CONFORMINGEXITSERVER		"%!PS-Adobe-2.0 ExitServer\n"

/*
 *
 * Header comments - immediately follow the appropriate document classification
 * comment.
 *
 */

#define TITLE				"%%Title:"
#define CREATOR				"%%Creator:"
#define CREATIONDATE			"%%CreationDate:"
#define FOR				"%%For:"
#define ROUTING				"%%Routing:"
#define BOUNDINGBOX			"%%BoundingBox:"
#define PAGES				"%%Pages:"
#define REQUIREMENTS			"%%Requirements:"

#define DOCUMENTFONTS			"%%DocumentFonts:"
#define DOCUMENTNEEDEDFONTS		"%%DocumentNeededFonts:"
#define DOCUMENTSUPPLIEDFONTS		"%%DocumentSuppliedFonts:"
#define DOCUMENTNEEDEDPROCSETS		"%%DocumentNeededProcSets:"
#define DOCUMENTSUPPLIEDPROCSETS	"%%DocumentSuppliedProcSets:"
#define DOCUMENTNEEDEDFILES		"%%DocumentNeededFiles:"
#define DOCUMENTSUPPLIEDFILES		"%%DocumentSuppliedFiles:"
#define DOCUMENTPAPERSIZES		"%%DocumentPaperSizes:"
#define DOCUMENTPAPERFORMS		"%%DocumentPaperForms:"
#define DOCUMENTPAPERCOLORS		"%%DocumentPaperColors:"
#define DOCUMENTPAPERWEIGHTS		"%%DocumentPaperWeights:"
#define DOCUMENTPRINTERREQUIRED		"%%DocumentPrinterREquired:"
#define ENDCOMMENTS			"%%EndComments\n"
#define ENDPROLOG			"%%EndProlog\n"

/*
 *
 * Body comments - can appear anywhere in a document.
 *
 */

#define BEGINSETUP			"%%BeginSetup\n"
#define ENDSETUP			"%%EndSetup\n"
#define BEGINDOCUMENT			"%%BeginDocument:"
#define ENDDOCUMENT			"%%EndDocument\n"
#define BEGINFILE			"%%BeginFile:"
#define ENDFILE				"%%EndFile\n"
#define BEGINPROCSET			"%%BeginProcSet:"
#define ENDPROCSET			"%%EndProcSet\n"
#define BEGINBINARY			"%%BeginBinary:"
#define ENDBINARY			"%%EndBinary\n"
#define BEGINPAPERSIZE			"%%BeginePaperSize:"
#define ENDPAPERSIZE			"%%EndPaperSize\n"
#define BEGINFEATURE			"%%BeginFeature:"
#define ENDFEATURE			"%%EndFeature\n"
#define BEGINEXITSERVER			"%%BeginExitServer:"
#define ENDEXITSERVER			"%%EndExitServer\n"
#define TRAILER				"%%Trailer\n"

/*
 *
 * Page level comments - usually will occur once per page.
 *
 */

#define PAGE				"%%Page:"
#define PAGEFONTS			"%%PageFonts:"
#define PAGEFILES			"%%PageFiles:"
#define PAGEBOUNDINGBOX			"%%PageBoundingBox:"
#define BEGINPAGESETUP			"%%BeginPageSetup\n"
#define BEGINOBJECT			"%%BeginObject:"
#define ENDOBJECT			"%%EndObject\n"

/*
 *
 * Resource requirements - again can appear anywhere in a document.
 *
 */

#define INCLUDEFONT			"%%IncludeFont:"
#define INCLUDEPROCSET			"%%IncludeProcSet:"
#define INCLUDEFILE			"%%IncludeFile:"
#define EXECUTEFILE			"%%ExecuteFile:"
#define CHANGEFONT			"%%ChangeFont:"
#define PAPERFORM			"%%PaparForm:"
#define PAPERCOLOR			"%%PaperColor:"
#define PAPERWEIGHT			"%%PaperWeight:"
#define PAPERSIZE			"%%PaperSize:"
#define FEATURE				"%%Feature:"
#define ENDOFFILE			"%%EOF\n"

#define CONTINUECOMMENT			"%%+"
#define ATEND				"(atend)"

/*
 *
 * Some non-standard document comments. Global definitions are occasionally used
 * in dpost and are marked by BEGINGLOBAL and ENDGLOBAL. The resulting document
 * violates page independence, but can easily be converted to a conforming file
 * using a utililty program.
 *
 */

#define BEGINSCRIPT			"%%BeginScript\n"
#define BEGINGLOBAL			"%%BeginGlobal\n"
#define ENDGLOBAL			"%%EndGlobal\n"
#define ENDPAGE				"%%EndPage:"
#define FORMSPERPAGE			"%%FormsPerPage:"
#define VERSION				"%%Version:"

0707070014230361541006440057030057030000011041100522627500600002700000012551post.src/common/bbox.c/*
 *
 * Boundingbox code for PostScript translators. The boundingbox for each page
 * is accumulated in bbox - the one for the whole document goes in docbbox. A
 * call to writebbox() puts out an appropriate comment, updates docbbox, and
 * resets bbox for the next page. The assumption made at the end of writebbox()
 * is that we're really printing the current page only if output is now going
 * to stdout - a valid assumption for all supplied translators. Needs the math
 * library.
 *
 */

#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <math.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* a few general purpose definitions */
#include "ext.h"			/* external variable declarations */

typedef struct bbox {
	int	set;
	double	llx, lly;
	double	urx, ury;
} Bbox;

Bbox	bbox = {FALSE, 0.0, 0.0, 0.0, 0.0};
Bbox	docbbox = {FALSE, 0.0, 0.0, 0.0, 0.0};

double	ctm[6] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
double	matrix1[6], matrix2[6];

/*****************************************************************************/

cover(x, y)

    double	x, y;

{

/*
 *
 * Adds point (x, y) to bbox. Coordinates are in user space - the transformation
 * to default coordinates happens in writebbox().
 *
 */

    if ( bbox.set == FALSE ) {
	bbox.llx = bbox.urx = x;
	bbox.lly = bbox.ury = y;
	bbox.set = TRUE;
    } else {
	if ( x < bbox.llx )
	    bbox.llx = x;
	if ( y < bbox.lly )
	    bbox.lly = y;
	if ( x > bbox.urx )
	    bbox.urx = x;
	if ( y > bbox.ury )
	    bbox.ury = y;
    }	/* End else */

}   /* End of cover */

/*****************************************************************************/

writebbox(fp, keyword, slop)

    FILE	*fp;			/* the comment is written here */
    char	*keyword;		/* the boundingbox comment string */
    int		slop;			/* expand (or contract?) the box a bit */

{

    Bbox	ubbox;			/* user space bounding box */
    double	x, y;

/*
 *
 * Transforms the numbers in the bbox[] using ctm[], adjusts the corners a bit
 * (depending on slop) and then writes comment. If *keyword is BoundingBox use
 * whatever's been saved in docbbox, otherwise assume the comment is just for
 * the current page.
 *
 */

    if ( strcmp(keyword, BOUNDINGBOX) == 0 )
	bbox = docbbox;

    if ( bbox.set == TRUE ) {
	ubbox = bbox;
	bbox.set = FALSE;		/* so cover() works properly */
	x = ctm[0] * ubbox.llx + ctm[2] * ubbox.lly + ctm[4];
	y = ctm[1] * ubbox.llx + ctm[3] * ubbox.lly + ctm[5];
	cover(x, y);
	x = ctm[0] * ubbox.llx + ctm[2] * ubbox.ury + ctm[4];
	y = ctm[1] * ubbox.llx + ctm[3] * ubbox.ury + ctm[5];
	cover(x, y);
	x = ctm[0] * ubbox.urx + ctm[2] * ubbox.ury + ctm[4];
	y = ctm[1] * ubbox.urx + ctm[3] * ubbox.ury + ctm[5];
	cover(x, y);
	x = ctm[0] * ubbox.urx + ctm[2] * ubbox.lly + ctm[4];
	y = ctm[1] * ubbox.urx + ctm[3] * ubbox.lly + ctm[5];
	cover(x, y);
	bbox.llx -= slop + 0.5;
	bbox.lly -= slop + 0.5;
	bbox.urx += slop + 0.5;
	bbox.ury += slop + 0.5;
	fprintf(fp, "%s %d %d %d %d\n", keyword, (int)bbox.llx, (int)bbox.lly,(int)bbox.urx, (int)bbox.ury);
	bbox = ubbox;
    }	/* End if */

    resetbbox((fp == stdout) ? TRUE : FALSE);

}   /* End of writebbox */

/*****************************************************************************/

resetbbox(output)

    int		output;

{

/*
 *
 * Adds bbox to docbbox and resets bbox for the next page. Only update docbbox
 * if we really did output on the last page.
 *
 */

    if ( docbbox.set == TRUE ) {
	cover(docbbox.llx, docbbox.lly);
	cover(docbbox.urx, docbbox.ury);
    }	/* End if */

    if ( output == TRUE ) {
	docbbox = bbox;
	docbbox.set = TRUE;
    }	/* End if */

    bbox.set = FALSE;

}   /* End of resetbbox */

/*****************************************************************************/

scale(sx, sy)

    double	sx, sy;

{

/*
 *
 * Scales the default matrix.
 *
 */

    matrix1[0] = sx;
    matrix1[1] = 0;
    matrix1[2] = 0;
    matrix1[3] = sy;
    matrix1[4] = 0;
    matrix1[5] = 0;

    concat(matrix1);

}   /* End of scale */

/*****************************************************************************/

translate(tx, ty)

    double	tx, ty;

{

/*
 *
 * Translates the default matrix.
 *
 */

    matrix1[0] = 1.0;
    matrix1[1] = 0.0;
    matrix1[2] = 0.0;
    matrix1[3] = 1.0;
    matrix1[4] = tx;
    matrix1[5] = ty;

    concat(matrix1);

}   /* End of translate */

/*****************************************************************************/

rotate(angle)

    double	angle;

{

/*
 *
 * Rotates by angle degrees.
 *
 */

    angle *= 3.1416 / 180;

    matrix1[0] = matrix1[3] = cos(angle);
    matrix1[1] = sin(angle);
    matrix1[2] = -matrix1[1];
    matrix1[4] = 0.0;
    matrix1[5] = 0.0;

    concat(matrix1);

}   /* End of rotate */

/*****************************************************************************/

concat(m1)

    double	m1[];

{

    double	m2[6];

/*
 *
 * Replaces the ctm[] by the result of the matrix multiplication m1[] x ctm[].
 *
 */

    m2[0] = ctm[0];
    m2[1] = ctm[1];
    m2[2] = ctm[2];
    m2[3] = ctm[3];
    m2[4] = ctm[4];
    m2[5] = ctm[5];

    ctm[0] = m1[0] * m2[0] + m1[1] * m2[2];
    ctm[1] = m1[0] * m2[1] + m1[1] * m2[3];
    ctm[2] = m1[2] * m2[0] + m1[3] * m2[2];
    ctm[3] = m1[2] * m2[1] + m1[3] * m2[3];
    ctm[4] = m1[4] * m2[0] + m1[5] * m2[2] + m2[4];
    ctm[5] = m1[4] * m2[1] + m1[5] * m2[3] + m2[5];

}   /* End of concat */

/*****************************************************************************/

0707070014230361551006440057030057030000011040560522627500600003500000001604post.src/common/pathtemplate/*
 *
 * pathname definitions for important files and directories.
 *
 */

#define DPOST		"POSTLIB/dpost.ps"
#define POSTBGI		"POSTLIB/postbgi.ps"
#define POSTDAISY	"POSTLIB/postdaisy.ps"
#define POSTDMD		"POSTLIB/postdmd.ps"
#define POSTMD		"POSTLIB/postmd.ps"
#define POSTPLOT	"POSTLIB/postplot.ps"
#define POSTPRINT	"POSTLIB/postprint.ps"
#define POSTNPRINT	"POSTLIB/postnprint.ps"
#define POSTTEK		"POSTLIB/posttek.ps"
#define POSTGIF		"POSTLIB/postgif.ps"

#define BASELINE	"POSTLIB/baseline.ps"
#define COLOR		"POSTLIB/color.ps"
#define DRAW		"POSTLIB/draw.ps"
#define FORMFILE	"POSTLIB/forms.ps"
#define SHADEFILE	"POSTLIB/shade.ps"
#define KERNING		"POSTLIB/kerning.ps"
#define REQUESTFILE	"POSTLIB/ps.requests"
#define ROUNDPAGE	"POSTLIB/roundpage.ps"

#define ENCODINGDIR	"POSTLIB"
#define HOSTDIR		"HOSTDIR"
#define FONTDIR		"FONTDIR"
#define POSTLIBDIR	"POSTLIB"
#define TEMPDIR		"/tmp"

0707070014230357541006400057030057030000011040360522633073100003200000002342post.src/common/common.mkMAKE=/bin/make
MAKEFILE=common.mk

SYSTEM=V9
VERSION=3.3.2

FONTDIR=/usr/lib/font
HOSTDIR=/usr/lib/font/postscript
POSTLIB=/usr/lib/postscript

ROUNDPAGE=TRUE

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS)
LDFLAGS=$(LDFLGS)

all :

install : all

clean :
	rm -f *.o

clobber : clean

bbox.o : bbox.c ext.h gen.h
	$(CC) $(CFLAGS) -c bbox.c

glob.o : glob.c gen.h
	$(CC) $(CFLAGS) -c glob.c

misc.o : misc.c ext.h gen.h path.h
	$(CC) $(CFLAGS) -c misc.c

request.o : request.c gen.h path.h request.h
	$(CC) $(CFLAGS) -c request.c

rune.o : rune.c rune.h
	$(CC) $(CFLAGS) -c rune.c

tempnam.o : tempnam.c
	$(CC) $(CFLAGS) -D$(SYSTEM) -c tempnam.c

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	    -e "s'^HOSTDIR=.*'HOSTDIR=$(HOSTDIR)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	    -e "s'^ROUNDPAGE=.*'ROUNDPAGE=$(ROUNDPAGE)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e 's:"FONTDIR:"$(FONTDIR):' \
	    -e 's:"HOSTDIR:"$(HOSTDIR):' \
	    -e 's:"POSTLIB:"$(POSTLIB):' \
	pathtemplate >path.h; \
	sed \
	    -e "s'^#define.*DOROUND.*'#define DOROUND	$(ROUNDPAGE)'" \
	gen.h >Xgen.h; \
	mv Xgen.h gen.h

0707070014230361571006440057030057030000011040570522627500600002700000000566post.src/common/rune.h/*
 *
 * Rune declarations - for supporting UTF encoding.
 *
 */

#define RUNELIB		1

#ifdef RUNELIB
typedef unsigned short	Rune;

enum
{
	UTFmax		= 3,		/* maximum bytes per rune */
	Runesync	= 0x21,		/* cannot represent part of a utf sequence (<) */
	Runeself	= 0xA0,		/* rune and utf sequences are the same (<) */
	Runeerror	= 0x80,		/* decoding error in utf */
};
#endif
0707070014230361601006440057030057030000011040740522627500600002700000004760post.src/common/rune.c/*
 *
 * Rune library routines for supporting UTF encoding.
 *
 */

#include "rune.h"

#ifdef RUNELIB
enum
{
	Char1	= Runeself,	Rune1	= Runeself,
	Char21	= 0xA1,		Rune21	= 0x0100,
	Char22	= 0xF6,		Rune22	= 0x4016,
	Char3	= 0xFC,		Rune3	= 0x10000,	/* really 0x38E2E */
	Esc	= 0xBE,		Bad	= Runeerror,
};

static	unsigned char	U[256];
static	unsigned char	T[256];

static
void
mktable()
{
	int i, u;

	for(i=0; i<256; i++) {
		u = i + (0x5E-0xA0);
		if(i < 0xA0)
			u = i + (0xDF-0x7F);
		if(i < 0x7F)
			u = i + (0x00-0x21);
		if(i < 0x21)
			u = i + (0xBE-0x00);
		U[i] = u;
		T[u] = i;
	}
}

int
chartorune(rune, str)
	Rune *rune;
	char *str;
{
	int c, c1, c2;
	long l;

	if(U[0] == 0)
		mktable();

	/*
	 * one character sequence
	 *	00000-0009F => 00-9F
	 */
	c = *(unsigned char*)str;
	if(c < Char1) {
		*rune = c;
		return 1;
	}

	/*
	 * two character sequence
	 *	000A0-000FF => A0; A0-FF
	 */
	c1 = *(unsigned char*)(str+1);
	if(c < Char21) {
		if(c1 >= Rune1 && c1 < Rune21) {
			*rune = c1;
			return 2;
		}
		goto bad;
	}

	/*
	 * two character sequence
	 *	00100-04015 => A1-F5; 21-7E/A0-FF
	 */
	c1 = U[c1];
	if(c1 >= Esc)
		goto bad;
	if(c < Char22) {
		*rune =  (c-Char21)*Esc + c1 + Rune21;
		return 2;
	}

	/*
	 * three character sequence
	 *	04016-38E2D => A6-FB; 21-7E/A0-FF
	 */
	c2 = U[*(unsigned char*)(str+2)];
	if(c2 >= Esc)
		goto bad;
	if(c < Char3) {
		l = (c-Char22)*Esc*Esc + c1*Esc + c2 + Rune22;
		if(l >= Rune3)
			goto bad;
		*rune = l;
		return 3;
	}

	/*
	 * bad decoding
	 */
bad:
	*rune = Bad;
	return 1;
}

int
runetochar(str, rune)
	char *str;
	Rune *rune;
{
	long c;

	if(T[0] == 0)
		mktable();

	/*
	 * one character sequence
	 *	00000-0009F => 00-9F
	 */
	c = *rune;
	if(c < Rune1) {
		str[0] = c;
		return 1;
	}

	/*
	 * two character sequence
	 *	000A0-000FF => A0; A0-FF
	 */
	if(c < Rune21) {
		str[0] = Char1;
		str[1] = c;
		return 2;
	}

	/*
	 * two character sequence
	 *	00100-04015 => A1-F5; 21-7E/A0-FF
	 */
	if(c < Rune22) {
		c -= Rune21;
		str[0] = c/Esc + Char21;
		str[1] = T[c%Esc];
		return 2;
	}

	/*
	 * three character sequence
	 *	04016-38E2D => A6-FB; 21-7E/A0-FF
	 */
	c -= Rune22;
	str[0] = c/(Esc*Esc) + Char22;
	str[1] = T[c/Esc%Esc];
	str[2] = T[c%Esc];
	return 3;
}

int
runelen(c)
	long c;
{
	Rune rune;
	char str[10];

	rune = c;
	return runetochar(str, &rune);
}

int
fullrune(str, n)
	char *str;
	int n;
{
	int c;

	if(n > 0) {
		c = *(unsigned char*)str;
		if(c < Char1)
			return 1;
		if(n > 1)
			if(c < Char22 || n > 2)
				return 1;
	}
	return 0;
}

#endif RUNELIB
0707070014231030400407550057030057030000020277230522633100400001700000000000post.src/dpost0707070014231030411006440057030057030000010277240522627500600002600000002711post.src/dpost/README
Troff to PostScript translator. The big change is in the font table
routines. The old binary format and makedev are gone. Troff and dpost
now both read ASCII tables. Translating the ASCII font tables in dpost
(and troff) means some startup overhead. Both programs run a bit slower,
but it's a small price to pay for the added flexibility.

Long PostScript font names can now be included in the font tables.
They should follow the fontname keyword as in,

	fontname Times-Roman

The fontname field helps with the DocumentFonts comment, font name
abbreviations (formally required to be in the prologue), and is used
to manage host resident fonts.

dpost can also now calculate a reasonably tight BoundingBox, which
helps picture inclusion. By default the calculations are disabled.
Use the -B option when you BoundingBox and PageBoundingBox comments.
If you're stubborn and always want the comment set dobbox (in file
dpost.c) to TRUE. You'll still need -B to get the the best fit.

Most other changes are bug fixes. Color support has been improved,
and now works with the drawing routines. The different text encoding
schemes are all still in. Level 2 is well tested and is now the default.
For a different default change DFLTENCODING (file dpost.h). Don't make
level 3 the default unless you can live with ragged right margins.

A typical command line would be,

    pic file | tbl | eqn | troff -mm | dpost >file.ps

file.ps is PostScript and can be sent directly to a printer.

0707070014231030421006440057030057030000010277400522627500600002700000015654post.src/dpost/color.c/*
 *
 * Routines that handle color requests passed through as device control commands
 * in the form "x X SetColor:red". The following PostScript procedures are needed:
 *
 *	setcolor
 *
 *	  mark /color setcolor mark
 *	  mark /color1 /color2 setcolor mark
 *
 *	    Called whenever we want to change PostScript's current color graphics
 *	    state parameter. One or two color arguments can be given. In each case
 *	    the colors are looked up in the PostScript colordict dictionary that's
 *	    defined in *colorfile. Two named colors implies reverse video printing
 *	    with the background given in /color2 and the text printed in /color1.
 *	    Unknown colors are mapped into defaults - black for a single color and
 *	    white on black for reverse video.
 *
 *	drawrvbox
 *
 *	  leftx rightx drawrvbox -
 *
 *	    Fills a box that extends from leftx to rightx with the background color
 *	    that was requested when setcolor set things up for reverse video mode.
 *	    The vertical extent of the box is determined using FontBBox just before
 *	    the first string is printed, and the height remains in effect until
 *	    there's an explicit color change. In otherwords font or size changes
 *	    won't always produce correct result in reverse video mode.
 *
 *	setdecoding
 *
 *	  num setdecoding -
 *
 *	    Selects the text decoding procedure (ie. what's assigned to PostScript
 *	    procedure t) from the decodingdefs array defined in the prologue. num
 *	    should be the value assigned to variable encoding (in dpost) and will
 *	    remain constant throughout a job, unless special features, like reverse
 *	    video printing, are requested. The text encoding scheme can be set on
 *	    the command line using the -e option. Print time and the size of the
 *	    output file will usually decrease as the value assigned to encoding
 *	    increases.
 *
 *
 * The recognized collection of "x X SetColor:" commands are:
 *
 *	x X SetColor:				selects black
 *	x X SetColor:color			selects color
 *	x X SetColor:color1 on color2		reverse video
 *	x X SetColor:color1 color2		reverse video again
 *	x X SetColor:num1 num2 num3 rgb		explicit rgb color request
 *	x X SetColor:num1 num2 num3 hsb		explicit hsb color request
 *
 * In the last three examples num1, num2, and num3 should be numbers between 0 and
 * 1 inclusive and are passed on as aguments to the approrpriate PostScript color
 * command (eg. setrgbcolor). Unknown color names (ie. the ones that setcolor
 * doesn't find in colordict) are mapped into defaults. For one color the default
 * is black, while for reverse video it's white text on a black background.
 *
 * dpost makes sure the current color is maintained across page boundaries, which
 * may not be what you want if you're using a macro package like mm that puts out
 * page footers and headers. Adding a color request to troff and keeping track of
 * the color in each environment may be the best solution.
 *
 * To get reverse video printing follow the "x X SetColor:" command with two or
 * three arguments. "x X SetColor:white on black" or "x X SetColor:white black"
 * both produce white text on a black background. Any two colors named in colordict
 * (in file *colorfile) can be chosen so "x X SetColor:yellow on blue" also works.
 * Each reverse video mode request selects the vertical extent of the background
 * box based on the font and size in use just before the first string is printed.
 * Font and/or size changes aren't guaranteed to work properly in reverse video
 * printing.
 *
 */

#include <stdio.h>
#include <ctype.h>

#include "gen.h"			/* general purpose definitions */
#include "ext.h"			/* external variable definitions */

#define DEFAULTCOLOR	"black"

char	color[50] = DEFAULTCOLOR;	/* current color */
int	gotcolor = FALSE;		/* TRUE after *colorfile is downloaded */
int	wantcolor = FALSE;		/* TRUE if we really ask for a color */

/*
 *
 * All these should be defined in dpost.c.
 *
 */

extern int	lastend;
extern int	encoding;
extern int	maxencoding;
extern int	realencoding;

extern char	*colorfile;
extern FILE	*tf;

/*****************************************************************************/

getcolor()

{

/*
 *
 * Responsible for making sure the PostScript color procedures are downloaded from
 * *colorfile. Done at most once per job, and only if the job really uses color.
 * For now I've decided not to quit if we can't read the color file.
 *
 */

    if ( gotcolor == FALSE )
	exportfile(colorfile);

    if ( tf == stdout )
	gotcolor = TRUE;

}   /* End of getcolor */

/*****************************************************************************/

newcolor(name)

    char	*name;			/* of the color */

{

    char	*p;			/* next character in *name */
    int		i;			/* goes in color[i] */

/*
 *
 * Converts *name to lower case and saves the result in color[] for use as the
 * current color. The first time something other than DEFAULTCOLOR is requested
 * sets wantcolor to TRUE. Characters are converted to lower case as they're put
 * in color[] and we quit when we find a newline or get to the end of *name. The
 * isupper() test is for Berkley systems.
 *
 */

    for ( p = name; *p && (*p == ' ' || *p == ':'); p++ ) ;

    for ( i = 0; i < sizeof(color) - 1 && *p != '\n' && *p; i++, p++ )
	if ( isupper(*p) )
	    color[i] = tolower(*p);
	else color[i] = *p;

    if ( i == 0 )
	strcpy(color, DEFAULTCOLOR);
    else color[i] = '\0';

    if ( strcmp(color, DEFAULTCOLOR) != 0 )
	wantcolor = TRUE;

}   /* End of newcolor */

/*****************************************************************************/

setcolor()

{

    int		newencoding;		/* text encoding scheme that's needed */
    char	*p;			/* for converting what's in color[] */

/*
 *
 * Sets the color being used by the printer to whatever's stored as the current
 * color (ie. the string in color[]). wantcolor is only set to TRUE if we've been
 * through newcolor() and asked for something other than DEFAULTCOLOR (probably
 * black). While in reverse video mode encoding gets set to maxencoding + 1 in
 * dpost and 0 on the printer. Didn't see much point in trying to extend reverse
 * video to all the different encoding schemes. realencoding is restored when we
 * leave reverse video mode.
 *
 */

    if ( wantcolor == TRUE ) {
	flushtext();
	getcolor();

	lastend = -1;
	newencoding = realencoding;

	if ( islower(color[0]) == 0 )		/* explicit rgb or hsb request */
	    fprintf(tf, "%s\n", color);
	else {
	    putc('/', tf);
	    for ( p = color; *p && *p != ' '; p++ )
		putc(*p, tf);
	    for ( ; *p && *p == ' '; p++ ) ;
	    if ( strncmp(p, "on ", 3) == 0 ) p += 3;
	    if ( *p != '\0' ) {
		fprintf(tf, " /%s", p);
		newencoding = maxencoding + 1;
	    }	/* End if */
	    fprintf(tf, " setcolor\n");
	}   /* End else */

	if ( newencoding != encoding ) {
	    encoding = newencoding;
	    fprintf(tf, "%d setdecoding\n", encoding);
	    resetpos();
	}   /* End if */
    }	/* End if */

}   /* End of setcolor */

/*****************************************************************************/

0707070014231027441006400057030057030000010254600522633100400002700000012240post.src/dpost/dpost.1.ds dF /usr/lib/font
.ds dQ /usr/lib/postscript
.TH DPOST 1 "DWB 3.2"
.SH NAME
.B dpost
\-
.B troff
postprocessor for PostScript printers
.SH SYNOPSIS
\*(mBdpost\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B dpost
translates
.I files
created by
.BR troff (1)
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num
(default is 1.0).
Pages are scaled uniformly about the origin,
which is located near the upper left corner of
each page.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default,
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP mode.
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP
.OP \-w num
Set the line width used to implement
.B troff
graphics commands to
.I num
points, where a point is approximately 1/72
of an inch.
By default
.I num
is set to 0.3 points.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed near the
upper left corner of the page, with positive
x to the right and positive y down the page.
Positive
.I num
moves everything right.
The default offset is 0 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves text down the page.
The default offset is 0.
.TP
.OP \-B
Include
.MW %%BoundingBox
comments in the output file.
Should only be used when the comments are needed
for picture inclusion.
Output is forced onto an 8.5\(mu11-inch page.
.TP
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ/ name .enc \f1.
A nonexistent encoding file is silently ignored.
There is no default.
.TP
.OP \-F dir
Use
.I dir
as the font directory.
The default
.I dir
is
.MR \*(dF ,
and
.B dpost
reads
.SM ASCII
font files from directory
.MR \*(dF/devpost .
.TP
.OP \-H dir
Use
.I dir
as the host-resident font directory.
A file in
.I dir
that matches the name of the
.B troff
font is assumed to be a host resident font program
and is included in
.B dpost
output.
There is no default.
.TP
.OP \-L \^file
Use
.I file
as the PostScript prologue.
The default is
.MR \*(dQ/dpost.ps .
.TP
.OP \-T name
Use font files for device
.I name
as the best description of available PostScript fonts.
By default,
.I name
is
\*(mBpost\fP
and
.B dpost
reads
.SM ASCII
files from
.MR \*(dF/devpost .
.br
.ne 1i
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C \^file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include
.I string
in the output file;
.I string
must be legitimate PostScript.
.TP
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request \|,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0 the request
applies to all pages.
If
.I file
is omitted the request
lookup is done in
.MR \*(dQ/ps.requests .
.PP
All
.I files
should be prepared by
.B troff
for the same device.
Device tables that describe real PostScript fonts that can be
used by
.B dpost
should include
.EX
PDL PostScript
.EE
in their
.SM DESC
file.
Tables that depend on a non-standard character set encoding indicate
that fact by an
.MW Encoding
entry in their
.SM DESC
file.
For example,
.EX
Encoding Latin1
.EE
means include file
.MR \*(dQ/Latin1.enc .
The
.OP \-E
option overrides the
.SM DESC
setting.
.SH EXAMPLES
.PP
A typical command line might be:
.EX
pic  \f2files\fP | tbl | eqn | troff -mm | dpost
.EE
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully translated,
while 2 often indicates a syntax error in the input
.IR files .
.SH WARNINGS
.PP
.B dpost
output does not usually conform to Adobe's file-structuring conventions.
Send the output through
.B postreverse
to produce a minimally conforming PostScript file.
.PP
Emulation is expensive and does not always produce satisfactory results.
No attempt has been made to implement the character sets or fonts available
on all devices supported by
.BR troff .
Missing characters are replaced by white space, and unrecognized
fonts default to one of the Times fonts (e.g.,
.MR R ,
.MR I ,
.MR B ,
or
.MR BI ).
.SH FILES
.MW \*(dF/devpost/*
.br
.MW \*(dF/devpost/charlib/*
.br
.MW \*(dQ/dpost.ps
.br
.MW \*(dQ/color.ps
.br
.MW \*(dQ/draw.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR buildtables (1),
.BR postio (1),
.BR postprint (1),
.BR postreverse (1),
.BR psencoding (1),
.BR troff (1),
.BR font (5),
.BR troff (5)
0707070014231030441006440057030057030000010300000522627500600002700000130466post.src/dpost/dpost.c/*
 *
 * dpost - troff post-processor for PostScript printers.
 *
 * A program that translates output generated by the device independent troff
 * into PostScript. Much was borrowed from dimpress and dps (formally dlzw),
 * and even though the code has changed, credit has to be given to Richard
 * Flood for his early work on the PostScript driver.
 *
 * The big change is in the font table routines. The old binary format and
 * makedev are gone. dpost and troff now read ASCII tables, and both skip
 * unrecognized entries in the ASCII tables. That means problems, like where
 * to put the real name of the PostScript font, have disappeared. The added
 * flexibility means some overhead translating the ASCII tables, but the
 * overhead isn't too bad.
 *
 * dpost can also now calculate a reasonably tight BoundingBox, which helps
 * picture inclusion. The calculations, by default, are disabled. Couldn't
 * justify the overhead for a comment, particularly one that's only needed
 * occasionally. Use the -B option to get the comment.
 *
 * Output produced by dpost is still nonconforming. Definitions made in pages
 * and exported to the job's global environment are the primary problem. It's
 * an efficient approach, but means pages are not independent. Violations are
 * bracketed by %%BeginGlobal and %%EndGlobal comments and can be pulled into
 * the prologue by utility programs (like postreverse) that recognize the new
 * comments.
 *
 * The program handles files formatted for any device, although the best and
 * most efficient output is generated when the font and description files
 * match PostScript's resident fonts. Emulation is relatively expensive, and
 * can produce output files that are more than twice the size of the input
 * files.
 *
 * Several different methods can be used to encode lines of text. What's done
 * depends on the value assigned to encoding. Print time should decrease as
 * encoding increases (up to MAXENCODING). Setting encoding to 3 (or higher)
 * is not normally recommended. It's fast and produces very compact output,
 * but rounding errors in troff's width tables can accumulate and lead to a
 * ragged right margin. encoding can be changed on the command line using the
 * -e option.
 *
 * PostScript fonts don't support all of troff's characters. Some are built
 * by special PostScript procedures in directory *fontdir/devpost/charlib.
 * The charlib approach is not meant to replace user defined fonts. It was
 * a quick implementation designed to handle characters that aren't used
 * often - charlib should not be overused! The charlib lookup is triggered
 * when a character in a font table is assigned a code less than 32.
 *
 * Most defaults are set in the prologue, but can be changed by options. The
 * -P option passes arbitrary PostScript into the setup section of the output
 * file. It can be used to set (or change) values that can't be accessed by
 * other options. For example,
 *
 *	dpost -P'/useclippath false def' file > file.ps
 *
 * defines useclippath to be false. Everything passed through using the -P
 * (-C to copy a file) options become part of the job's global environment.
 * Definitions override defaults in the prologue.
 *
 * dpost expects to find the following procedures in the prologue:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Initialization procedure mainly responsible for setting up an
 *	    appropriate coordinate system.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Called at the start of each page, immediately after the page
 *	    level save. Argument is the current page number.
 *
 *	setdecoding
 *
 *	  num setdecoding -
 *
 *	    Select the decoding procedure used to print text strings encoded
 *	    by dpost. num is whatever has been assigned to encoding.
 *
 *	f
 *
 *	  size font f -
 *
 *	    Set the font and size used for character imaging. The font name
 *	    argument is (normally) the name troff used. Mapping to the real
 *	    PostScript font name is made using the fontname field in the
 *	    ASCII width tables.
 *
 *	m
 *
 *	  x y m -
 *
 *	    Move to point (x, y). Not used for positioning words in text
 *	    strings.
 *
 *	t
 *
 *	  mark text t mark
 *
 *	    Everything on the stack (up to the mark) is treated as a line
 *	    of text to be decoded and printed. What's on the stack depends
 *	    on encoding.
 *
 *	w
 *
 *	  string x y w -
 *
 *	    Print a single word starting at position (x, y). Only used in
 *	    the more complicated encoding schemes, like the ones based on
 *	    widthshow.
 *
 *	done
 *
 *	    Make sure the last page prints. Always called, but only needed
 *	    when printing more than one page on each sheet of paper.
 *
 * output language from troff:
 * all numbers are character strings
 * 
 * sn	size in points
 * fn	font as number from 1-n
 * cx	ascii character x
 * Cxyz	funny char xyz. terminated by white space
 * Hn	go to absolute horizontal position n
 * Vn	go to absolute vertical position n (down is positive)
 * hn	go n units horizontally (relative)
 * vn	ditto vertically
 * nnc	move right nn, then print c (exactly 2 digits!)
 * 		(this wart is an optimization that shrinks output file size
 * 		 about 35% and run-time about 15% while preserving ascii-ness)
 * Dt ...\n	draw operation 't':
 * 	Dl x y		line from here by x,y
 * 	Dc d		circle of diameter d with left side here
 * 	De x y		ellipse of axes x,y with left side here
 *	Da x1 y1 x2 y2	arc counter-clockwise from current point (x, y) to
 *			(x + x1 + x2, y + y1 + y2)
 * 	D~ x y x y ...	wiggly line by x,y then x,y ...
 * nb a	end of line (information only -- no action needed)
 * 	b = space before line, a = after
 * p	new page begins -- set v to 0
 * #...\n	comment
 * x ...\n	device control functions:
 * 	x i	init
 * 	x T s	name of device is s
 * 	x r n h v	resolution is n/inch
 * 		h = min horizontal motion, v = min vert
 * 	x p	pause (can restart)
 * 	x s	stop -- done forever
 * 	x t	generate trailer
 * 	x f n s	font position n contains font s
 * 	x H n	set character height to n
 * 	x S n	set slant to N
 * 
 * 	Subcommands like "i" are often spelled out like "init".
 *
 */

#include	<stdio.h>
#include	<fcntl.h>
#include	<signal.h>
#include	<math.h>
#include	<ctype.h>
#include	<time.h>

#include	"comments.h"		/* structuring comments */
#include	"gen.h"			/* general purpose definitions */
#include	"path.h"		/* prologue and a few other files */
#include	"ext.h"			/* external variable declarations */
#include	"font.h"		/* font table definitions */
#include	"dpost.h"		/* a few definitions just used here */
#include	"motion.h"		/* positioning macros */

char	*prologue = DPOST;		/* the PostScript prologue */
char	*colorfile = COLOR;		/* color support */
char	*drawfile = DRAW;		/* drawing routines */
char	*formfile = FORMFILE;		/* multiple pages on each sheet */
char	*baselinefile = BASELINE;	/* for text along curved baseline */

char	*fontdir = FONTDIR;		/* font table directories */
char	*hostfontdir = NULL;		/* host resident font directory */

char	*realdev = DEVNAME;		/* use these width tables */
char	devname[20] = "";		/* job formatted for this device */
Fontmap	fontmap[] = FONTMAP;		/* font translation table - emulation */
char	*useencoding = NULL;		/* text font encoding - from -E option */

int	copies = 1;			/* copies of each sheet */
int	printed = 0;			/* pages processed and printed */
int	formsperpage = 1;		/* pages on each sheet of paper */
int	picflag = ON;			/* enable/disable picture inclusion */

int	encoding = DFLTENCODING;	/* how text is translated to PostScript */
int	realencoding = DFLTENCODING;	/* where we started */
int	maxencoding = MAXENCODING;	/* max that users can select */

int	landscape = FALSE;		/* for BoundingBox calculations only */
double	magnification = 1.0;
double	xoffset = 0.0;
double	yoffset = 0.0;

int	smnt;				/* special fonts start here */
int	devres;				/* device resolution */
int	unitwidth;			/* and unitwidth - from DESC file */

char	downloaded[MAXCH+32+ALPHABET];	/* status of charlib characters */

int	nfonts = 0;			/* number of font positions */
int	size = 10;			/* current point size */
int	font = 0;			/* and font position */
int	hpos = 0;			/* where troff wants to be */
int	vpos = 0;
float	lastw = 0;			/* width of the last input character */
int	lastc = 0;			/* its name (or index) - for charlib() */

int	fontheight = 0;			/* points from x H ... */
int	fontslant = 0;			/* angle from x S ... */

int	res;				/* resolution assumed in input file */
float	widthfac = 1.0;			/* for emulation = res/devres */

int	lastsize = -1;			/* for tracking printer's current size */
int	lastfont = -1;			/* current font */
float	lastx = -1;			/* and current position */
int	lasty = -1;
int	lastend;			/* where last character on this line was */

int	seenpage = FALSE;		/* expect fonts are now all mounted */
int	gotspecial = FALSE;		/* append special fonts - emulation */

float	pointslop = SLOP;		/* horizontal error in points */
int	slop;				/* and machine units */
int	rvslop;				/* to extend box in reverse video mode */

int	textcount = 0;			/* strings accumulated so far */
int	stringstart = 0;		/* where the next one starts */
int	spacecount = 0;			/* spaces in current string */

Line	line[MAXSTACK+3];		/* data about words accumulated so far */
char	strings[STRINGSPACE];		/* strings temporarily saved here */
char	*strptr;			/* next free slot in strings[] */

FILE	*tf = NULL;			/* most output goes here */
FILE	*fp_acct = NULL;		/* accounting file */

char	*optnames = "a:c:e:m:n:o:p:tw:x:y:A:BC:E:J:F:H:L:OP:R:S:T:DI";

extern int	gotcolor;		/* read *colorfile when TRUE */
extern Font	fonts[];		/* data about every font we see */
extern Font	*mount[];		/* troff mounts fonts here */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * Translates output from troff into PostScript. Input files must be formatted
 * for the same device. Each input file begins on a new page.
 *
 */

    argc = agc;				/* global so everyone can use them */
    argv = agv;

    prog_name = argv[0];		/* for error messages */

    init_signals();			/* interrupt handling */
    header();				/* structuring comments */
    options();				/* command line options */
    arguments();			/* translate the input files */
    done();				/* add trailing comments etc. */
    account();				/* job accounting data */

    exit(x_stat);

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Make sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN ) {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;
    int		old_optind = optind;

/*
 *
 * Scan the option list for things needed now (e.g. prologue file), but could
 * be changed from defaults. An attempt to follow to Adobe's 2.0 structuring
 * conventions.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    setpaths(optarg);
	else if ( ch == 'B' )
	    dobbox = TRUE;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* restored for options() */

    fprintf(stdout, "%s", NONCONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    if ( dobbox == TRUE )
	fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    if ( DOROUND )
	cat(ROUNDPAGE);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;

    extern char	*optarg;
    extern int	optind;

/*
 *
 * Command line options - there are too many!
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF ) {
	switch ( ch ) {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* number of copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'e':			/* select the encoding scheme */
		    if ( (encoding = atoi(optarg)) < 0 || encoding > MAXENCODING )
			encoding = DFLTENCODING;
		    realencoding = encoding;
		    break;

	    case 'm':			/* magnification */
		    magnification = atof(optarg);
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    landscape = (*optarg == 'l') ? TRUE : FALSE;
		    if ( landscape == TRUE )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 't':			/* compatibility */
		    break;

	    case 'w':			/* line width - for drawing */
		    fprintf(stdout, "/linewidth %s def\n", optarg);
		    break;

	    case 'x':			/* shift horizontally */
		    xoffset = atof(optarg);
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* shift vertically */
		    yoffset = atof(optarg);
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'B':			/* enable BoundingBox calculations */
		    dobbox = TRUE;
		    fprintf(stdout, "/rotation 1 def\n");
		    fprintf(stdout, "/gotpagebbox true def\n");
		    break;

	    case 'C':			/* copy file to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding - override DESC */
		    useencoding = optarg;
		    break;

	    case 'F':			/* font table directory */
		    fontdir = optarg;
		    break;

	    case 'H':			/* host resident font directory */
		    hostfontdir = optarg;
		    break;

	    case 'L':			/* prologue file */
		    setpaths(optarg);	/* already been done in header() */
		    break;

	    case 'O':			/* disable picture inclusion */
		    picflag = OFF;
		    break;

	    case 'P':			/* copy string to output */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* global or page level request */
		    saverequest(optarg);
		    break;

	    case 'S':			/* horizontal position error */
		    if ( (pointslop = atof(optarg)) < 0 )
			pointslop = 0;
		    break;

	    case 'T':			/* target printer */
		    realdev = optarg;
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    tf = stdout;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't know the option */
		    error(FATAL, "");
		    break;

	    default:
		    error(FATAL, "missing case for option %c", ch);
		    break;
	}   /* End switch */
    }	/* End while */

    argc -= optind;
    argv += optind;

}   /* End of options */

/*****************************************************************************/

setpaths(name)

    char	*name;

{

    char	*path;

/*
 *
 * Extends the -L option to permit modification of more than just the prologue
 * file pathname. Syntax is -Lpath or -Lname:path. For debugging and development
 * only!
 *
 */

    for ( path = name; *path; path++ )
	if ( *path == ':' || *path == ' ' ) {
	    while ( *path == ':' || *path == ' ' ) path++;
	    break;
	}   /* End if */

    if ( *path == '\0' )		/* didn't find "name:" prefix */
	path = name;

    if ( path == name || strncmp(name, "prologue", strlen("prologue")) == 0 )
	prologue = path;
    else if ( strncmp(name, "draw", strlen("draw")) == 0 )
	drawfile = path;
    else if ( strncmp(name, "color", strlen("color")) == 0 )
	colorfile = path;
    else if ( strncmp(name, "form", strlen("form")) == 0 )
	formfile = path;
    else if ( strncmp(name, "baseline", strlen("baseline")) == 0 )
	baselinefile = path;

}   /* End of setpaths */

/*****************************************************************************/

setup()

{

    double	t;

/*
 *
 * Job and BoundingBox initialization. Called once from t_init() - must know
 * the resolution before generating the PostScript call to setup. dpost only
 * includes an encoding file if it's set in the DESC file or requested with
 * the -E option.
 *
 */

    writerequest(0, stdout);		/* global requests e.g. manual feed */
    fprintf(stdout, "/resolution %d def\n", res);
    if ( useencoding != NULL || fontencoding != NULL )
	setencoding((useencoding != NULL) ? useencoding : fontencoding);
    fprintf(stdout, "setup\n");
    fprintf(stdout, "%d setdecoding\n", realencoding);

    if ( formsperpage > 1 ) {		/* multiple pages */
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

    if ( dobbox == TRUE ) {		/* ctm[] - must agree with prologue */
	translate(pagewidth/2.0, pageheight/2.0);
	if ( landscape == TRUE ) {
	    rotate(90.0);
	    t = pagewidth;
	    pagewidth = pageheight;
	    pageheight = t;
	}   /* End if */
	translate(-pagewidth/2.0, pageheight/2.0);
	translate(72.0 * xoffset, -72.0 * yoffset);
	scale(magnification, magnification);
	scale(72.0/devres, 72.0/devres);
    }	/* End if */

}   /* End of setup */

/*****************************************************************************/

arguments()

{

    FILE	*fp;

/*
 *
 * Everything else is an input file. No arguments or '-' means stdin.
 *
 */

    if ( argc < 1 )
	conv(stdin);
    else
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp = stdin;
	    else if ( (fp = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    conv(fp);
	    if ( fp != stdin )
		fclose(fp);
	    argc--;
	    argv++;
	}   /* End while */

}   /* End of arguments */

/*****************************************************************************/

done()

{

    int		i;
    int		n;

/*
 *
 * Force out the last page and add trailing comments.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %d\n", PAGES, printed);

    for ( i = 0, n = 0; i < MAXFONTS+1; i++ )
	if ( (fonts[i].flags & USED) && fonts[i].fontname != NULL ) {
	    if ( n++ == 0 )
		fprintf(stdout, "%s", DOCUMENTFONTS);
	    else if ( (n - 1) % 8 == 0 )
		fprintf(stdout, "\n%s", CONTINUECOMMENT);
	    fprintf(stdout, " %s", fonts[i].fontname);
	}   /* End if */
    if ( n > 0 )
	putc('\n', stdout);

    if ( dobbox == TRUE )
	writebbox(stdout, BOUNDINGBOX, 10);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Accounting record to fp_acct - provided it's not NULL.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

conv(fp)

    register FILE	*fp;

{

    register int	c;
    int			m, n, n1, m1;
    char		str[50];

/*
 *
 * Read troff output from file fp and translate it into PostScript. The final
 * t_page() call means input files start on a new page.
 *
 */

    redirect(-1);			/* do output only after a page command */
    lineno = 1;

    while ((c = getc(fp)) != EOF) {
	switch (c) {
	    case '\n':			/* just count this line */
		    lineno++;
		    break;

	    case ' ':			/* when input is text */
	    case 0:			/* occasional noise creeps in */
		    break;

	    case '0': case '1': case '2': case '3': case '4':
	    case '5': case '6': case '7': case '8': case '9':
		    /* two motion digits plus a character */
		    hmot((c-'0')*10 + getc(fp)-'0');
		    put1(getc(fp));
		    break;

	    case 'c':			/* single ascii character */
		    put1(getc(fp));
		    break;

	    case 'C':			/* special character */
		    fscanf(fp, "%s", str);
		    put1(chindex(str));
		    break;

	    case 'N':			/* character at position n */
		    fscanf(fp, "%d", &m);
		    flushtext();
		    oput(m);
		    break;

	    case 'D':			/* drawing functions */
		    flushtext();
		    getdraw();
		    if ( size != lastsize )
			t_sf();
		    switch ((c=getc(fp))) {
			case 'p':	/* draw a path */
			    while (fscanf(fp, "%d %d", &n, &m) == 2)
				drawline(n, m);
			    lineno++;
			    break;

			case 'l':	/* draw a line */
			    fscanf(fp, "%d %d %c", &n, &m, &n1);
			    drawline(n, m);
			    break;

			case 'c':	/* circle */
			    fscanf(fp, "%d", &n);
			    drawcirc(n);
			    break;

			case 'e':	/* ellipse */
			    fscanf(fp, "%d %d", &m, &n);
			    drawellip(m, n);
			    break;

			case 'a':	/* counter-clockwise arc */
			case 'A':	/* clockwise arc */
			    fscanf(fp, "%d %d %d %d", &n, &m, &n1, &m1);
			    drawarc(n, m, n1, m1, c);
			    break;

			case 'q':	/* spline without end points */
			    drawspline(fp, 1);
			    lineno++;
			    break;

			case '~':	/* wiggly line */
			    drawspline(fp, 2);
			    lineno++;
			    break;

			default:
			    error(FATAL, "unknown drawing function %c", c);
			    break;
		    }	/* End switch */
		    break;

	    case 's':			/* use this point size */
		    fscanf(fp, "%d", &size);	/* ignore fractional sizes */
		    break;

	    case 'f':			/* use font mounted here */
		    fscanf(fp, "%s", str);
		    setfont(t_font(str));
		    break;

	    case 'H':			/* absolute horizontal motion */
		    fscanf(fp, "%d", &n);
		    hgoto(n);
		    break;

	    case 'h':			/* relative horizontal motion */
		    fscanf(fp, "%d", &n);
		    hmot(n);
		    break;

	    case 'w':			/* word space */
		    break;

	    case 'V':			/* absolute vertical position */
		    fscanf(fp, "%d", &n);
		    vgoto(n);
		    break;

	    case 'v':			/* relative vertical motion */
		    fscanf(fp, "%d", &n);
		    vmot(n);
		    break;

	    case 'p':			/* new page */
		    fscanf(fp, "%d", &n);
		    t_page(n);
		    break;

	    case 'n':			/* end of line */
		    while ( (c = getc(fp)) != '\n' && c != EOF ) ;
		    hgoto(0);
		    lineno++;
		    break;

	    case '#':			/* comment */
		    while ( (c = getc(fp)) != '\n' && c != EOF ) ;
		    lineno++;
		    break;

	    case 'x':			/* device control function */
		    devcntrl(fp);
		    lineno++;
		    break;

	    default:
		    error(FATAL, "unknown input character %o %c", c, c);
		    done();
	}   /* End switch */
    }	/* End while */

    t_page(-1);				/* print the last page */
    flushtext();

}   /* End of conv */

/*****************************************************************************/

devcntrl(fp)

    FILE	*fp;

{

    char	str[50], buf[256], str1[100];
    int		c, n;

/*
 *
 * Interpret device control commands, ignoring any we don't recognize. The
 * "x X ..." commands are a device dependent collection generated by troff's
 * \X'...' request.
 *
 */

    fscanf(fp, "%s", str);

    switch ( str[0] ) {
	case 'f':			/* load font in a position */
		fscanf(fp, "%d %s", &n, str);
		fgets(buf, sizeof buf, fp);	/* in case there's a filename */
		ungetc('\n', fp);	/* fgets() goes too far */
		str1[0] = '\0';		/* in case there's nothing to come in */
		sscanf(buf, "%s", str1);
		loadfont(n, str, str1);
		break;

	case 'i':			/* initialize */
		t_init();
		break;

	case 'p':			/* pause */
		break;

	case 'r':			/* resolution assumed when prepared */
		fscanf(fp, "%d", &res);
		break;

	case 's':			/* stop */
	case 't':			/* trailer */
		flushtext();
		break;

	case 'H':			/* char height */
		fscanf(fp, "%d", &n);
		t_charht(n);
		break;

	case 'S':			/* slant */
		fscanf(fp, "%d", &n);
		t_slant(n);
		break;

	case 'T':			/* device name */
		fscanf(fp, "%s", devname);
		break;

	case 'X':			/* copy through - from troff */
		fscanf(fp, " %[^: \n]:", str);
		fgets(buf, sizeof(buf), fp);
		ungetc('\n', fp);
		if ( strcmp(str, "PI") == 0 || strcmp(str, "PictureInclusion") == 0 )
		    picture(buf);
		else if ( strcmp(str, "InlinePicture") == 0 )
		    inlinepic(fp, buf);
		else if ( strcmp(str, "BeginPath") == 0 )
		    beginpath(buf, FALSE);
		else if ( strcmp(str, "DrawPath") == 0 )
		    drawpath(buf, FALSE);
		else if ( strcmp(str, "BeginObject") == 0 )
		    beginpath(buf, TRUE);
		else if ( strcmp(str, "EndObject") == 0 )
		    drawpath(buf, TRUE);
		else if ( strcmp(str, "NewBaseline") == 0 )
		    newbaseline(buf);
		else if ( strcmp(str, "DrawText") == 0 )
		    drawtext(buf);
		else if ( strcmp(str, "SetText") == 0 )
		    settext(buf);
		else if ( strcmp(str, "SetColor") == 0 ) {
		    newcolor(buf);
		    setcolor();
		} else if ( strcmp(str, "INFO") == 0 ) {
		    flushtext();
		    fprintf(tf, "%%INFO%s", buf);
		} else if ( strcmp(str, "PS") == 0 || strcmp(str, "PostScript") == 0 ) {
		    flushtext();
		    fprintf(tf, "%s", buf);
		} else if ( strcmp(str, "ExportPS") == 0 ) {	/* dangerous!! */
		    if ( tf == stdout ) {
			restore();
			fprintf(tf, "%s", buf);
			save();
		    }	/* End if */
		}   /* End else */
		break;
    }	/* End switch */

    while ( (c = getc(fp)) != '\n' && c != EOF ) ;

}   /* End of devcntrl */

/*****************************************************************************/

loadfont(m, f, name)

    int		m;
    char	*f;
    char	*name;

{

    char	path[150];

/*
 *
 * Load position m with font f. Font file pathname is *fontdir/dev*realdev/*f
 * or name, if name isn't empty. Use mapfont() to replace the missing font
 * if we're emulating another device, name is empty, and the first mount
 * fails.
 *
 */

    if ( name[0] == '\0' )
	sprintf(path, "%s/dev%s/%s", fontdir, realdev, f);
    else sprintf(path, "%s", name);

    if ( mountfont(path, m) == -1 ) {
	if ( name[0] == '\0' ) {
	    sprintf(path, "%s/dev%s/%s", fontdir, realdev, mapfont(f));
	    if ( mountfont(path, m) == -1 ) {
		sprintf(path, "%s/dev%s/%s", fontdir, realdev, f);
		error(FATAL, "can't load %s at %d", path, m);
	    }	/* End if */
	} else error(FATAL, "can't load %s at %d", path, m);
    }	/* End if */

    if ( smnt == 0 && mount[m]->specfont )
	smnt = m;

    if ( m == lastfont )		/* force a call to t_sf() */
	lastfont = -1;

    if ( m > nfonts ) {			/* got more positions */
	nfonts = m;
	gotspecial = FALSE;
    }	/* End if */

}   /* End of loadfont */

/*****************************************************************************/

char *mapfont(name)

    char	*name;

{

    int		i;

/*
 *
 * Map a missing font name into one that should be available. Only used when
 * we're emulating another device and the first mount fails. Consider deleting
 * this routine.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].use);

    switch ( *++name ) {
	case 'I': return("I");
	case 'B': return("B");
	case 'X': return("BI");
	default:  return("R");
    }	/* End switch */

}   /* End of mapfont */

/*****************************************************************************/

loadspecial()

{

/*
 *
 * Fix - later.
 *
 */

    gotspecial = TRUE;

}   /* End of loadspecial */

/*****************************************************************************/

t_init()

{

    char	path[150];
    static int	initialized = FALSE;

/*
 *
 * Finish initialization - just read an "x init" command. Assumes we already
 * know the input file resolution.
 *
 */

    flushtext();			/* moved - for cat'ed troff files */

    if ( initialized == FALSE ) {
	if ( strcmp(devname, realdev) ) {
	    sprintf(path, "%s/dev%s/DESC", fontdir, devname);
	    if ( checkdesc(path) )
		realdev = devname;
	}   /* End if */

	sprintf(path, "%s/dev%s/DESC", fontdir, realdev);
	if ( getdesc(path) == -1 )
	    error(FATAL, "can't open %s", path);
	nfonts = 0;
	gotspecial = FALSE;
	widthfac = (float) res /devres;
	slop = pointslop * res / POINTS + .5;
	rvslop = res * .025;
	setup();
	initialized = TRUE;
    }	/* End if */

    hpos = vpos = 0;
    size = 10;
    reset();

}   /* End of t_init */

/*****************************************************************************/

t_page(pg)

    int		pg;

{

    static int	lastpg = 0;

/*
 *
 * Finish the previous page and get ready for the next one. End page output
 * goes to /dev/null at the start of each input file. Start page output goes
 * to /dev/null at the end of each input file.
 *
 * Consider doing showpage after page level restore (as Adobe recommends). If
 * the order is changed use restore() and save(). forms.ps will likely also
 * need fixing.
 *
 */

    if ( tf == stdout )
	printed++;

    flushtext();			/* just in case */

    fprintf(tf, "cleartomark\n");
    fprintf(tf, "showpage\n");
    fprintf(tf, "saveobj restore\n");
    if ( dobbox == TRUE )
	writebbox(tf, PAGEBOUNDINGBOX, 10);
    fprintf(tf, "%s %d %d\n", ENDPAGE, lastpg, printed);

    redirect(pg);

    fprintf(tf, "%s %d %d\n", PAGE, pg, printed+1);
    if ( dobbox == TRUE )
	fprintf(tf, "%s %s\n", PAGEBOUNDINGBOX, ATEND);
    fprintf(tf, "/saveobj save def\n");
    fprintf(tf, "mark\n");
    writerequest(printed+1, tf);
    fprintf(tf, "%d pagesetup\n", printed+1);

    if ( encoding != realencoding )
	fprintf(tf, "%d setdecoding\n", encoding);

    if ( gotcolor == TRUE )
	setcolor();

    lastpg = pg;			/* for the next ENDPAGE comment */
    hpos = vpos = 0;			/* get ready for the next page */
    reset();				/* force position and font stuff - later */

    seenpage = TRUE;

}   /* End of t_page */

/*****************************************************************************/

t_font(s)

    char	*s;

{

    int		n;

/*
 *
 * Converts the string *s into an integer and checks to make sure it's a legal
 * font position. Also arranges to mount all the special fonts after the last
 * legitimate font (by calling loadspecial()), provided it hasn't already been
 * done.
 *
 */

    n = atoi(s);

    if ( seenpage == TRUE ) {
	if ( n < 0 || n > nfonts )
	    error(FATAL, "illegal font position %d", n);

	if ( gotspecial == FALSE )
	    loadspecial();
    }	/* End if */

    return(n);

}   /* End of t_font */

/*****************************************************************************/

setfont(m)

    int		m;

{

/*
 *
 * Use the font mounted at position m. Bounds checks are probably unnecessary.
 * Changing the font and size used by the printer is handled in t_sf().
 *
 */

    if ( m < 0 || m > MAXFONTS )
	error(FATAL, "illegal font %d", m);
    font = m;

}   /* End of setfont */

/*****************************************************************************/

t_sf()

{

    Font	*fpos;
    char	temp[150];

/*
 *
 * Force a new font or size. Generates name definitions for fonts that haven't
 * been named, grabs host resident font files and keeps track of the fonts used
 * by this job. When necessary also adjusts the font's height and slant. Should
 * only be called immediately before printing a character.
 *
 */

    if ( tf == stdout && mounted(font) ) {
	flushtext();

	fpos = mount[font];
	if ( (fpos->flags & USED) == 0 ) {
	    if ( (fpos->flags & NAMED) == 0 && fpos->fontname != NULL ) {
		sprintf(temp, "/%s /%s def\n", fpos->name, fpos->fontname);
		exportstring(temp);
		fpos->flags |= NAMED;		/* unnecessary */
	    }	/* End if */

	    if ( hostfontdir != NULL ) {
		sprintf(temp, "%s/%s", hostfontdir, fpos->name);
		exportfile(temp);
	    }	/* End if */
	}   /* End if */

	fprintf(tf, "%d %s f\n", size, fpos->name);
	if ( fontheight != 0 || fontslant != 0 )
	    fprintf(tf, "%d %d changefont\n", fontslant, (fontheight != 0) ? fontheight : size);

	lastfont = font;
	lastsize = size;
	fpos->flags |= USED;
    }	/* End if */

}   /* End of t_sf */

/*****************************************************************************/

t_charht(n)

    int		n;

{

/*
 *
 * Set character height to n points. Disabled if n is 0 or the current size.
 *
 */

    fontheight = (n == size) ? 0 : n;
    lastfont = -1;

}   /* End of t_charht */

/*****************************************************************************/

t_slant(n)

    int		n;

{

/*
 *
 * Set slant to n degrees. Disable slanting if n is 0.
 *
 */

    fontslant = n;
    lastfont = -1;

}   /* End of t_slant */

/*****************************************************************************/

xymove(x, y)

    int		x, y;

{

/*
 *
 * Make the the printer and post-processor agree about the current position.
 *
 */

    flushtext();

    hgoto(x);
    vgoto(y);

    fprintf(tf, "%d %d m\n", hpos, vpos);

    lastx = hpos;
    lasty = vpos;

}   /* End of xymove */

/*****************************************************************************/

put1(c)

    register int	c;

{

    register int	i;
    register int	j;
    register int	k;
    int			code;
    int			ofont;

/*
 *
 * Print character c. ASCII if c < ALPHABET, otherwise it's special. Look for
 * c in the current font, then in others starting at the first special font.
 * Save c in lastc so it's available when oput() runs. Restore original font
 * before leaving.
 *
 */

    lastc = c;				/* charlib() needs name not code */
    if ( (c -= 32) <= 0 )
	return;

    k = ofont = font;

    if ( (i = onfont(lastc, k)) == -1 && smnt > 0 )
	for ( k = smnt, j = 0; j < nfonts; j++, k = k % nfonts + 1 ) {
	    if ( (i = onfont(lastc, k)) != -1 ) {
		setfont(k);
		break;
	    }	/* End if */
	}   /* End for */

    if ( i != -1 && (code = mount[k]->wp[i].code) != 0 ) {
	lastw = widthfac * (((int)mount[k]->wp[i].wid * size + unitwidth/2) / unitwidth);
	oput(code);
    }	/* End if */

    if ( font != ofont )
	setfont(ofont);

}   /* End of put1 */

/*****************************************************************************/

oput(c)

    int		c;

{

    double	llx, lly, urx, ury;	/* boundingbox corners */

/*
 *
 * Arranges to print the character whose code is c in the current font. All the
 * actual positioning is done here, in charlib(), or in the drawing routines.
 *
 */

    if ( textcount > MAXSTACK )		/* don't put too much on the stack? */
	flushtext();

    if ( font != lastfont || size != lastsize )
	t_sf();

    if ( vpos != lasty )
	endline();

    starttext();

    if ( ABS(hpos - lastx) > slop )
	endstring();

    if ( isascii(c) && isprint(c) )
	switch ( c ) {
	    case '(':
	    case ')':
	    case '\\':
		    addchar('\\');

	    default:
		    addchar(c);
	}   /* End switch */
    else if ( c > 040 )
	addoctal(c);
    else charlib(c);

    if ( dobbox == TRUE ) {
	llx = lastx;
	lly = -(vpos + 0.5 * (devres * size / 72.0));
	urx = lastx + lastw;
	ury = -(vpos - (devres * size / 72.0));
	cover(llx, lly);
	cover(urx, ury);
    }	/* End if */

    lastx += lastw;

}   /* End of oput */

/*****************************************************************************/

starttext()

{

/*
 * Called whenever we want to be sure we're ready to start collecting characters
 * for the next call to PostScript procedure t (ie. the one that prints them). If
 * textcount is positive we've already started, so there's nothing to do. The more
 * complicated encoding schemes save text strings in the strings[] array and need
 * detailed information about the strings when they're written to the output file
 * in flushtext().
 *
 */

    if ( textcount < 1 ) {
	switch ( encoding ) {
	    case 0:
	    case 1:
		putc('(', tf);
		break;

	    case 2:
	    case 3:
		strptr = strings;
		spacecount = 0;
		line[1].str = strptr;
		line[1].dx = 0;
		line[1].spaces = 0;
		line[1].start = hpos;
		line[1].width = 0;
		break;

	    case MAXENCODING+1:			/* reverse video */
		if ( lastend == -1 )
		    lastend = hpos;
		putc('(', tf);
		break;

	    case MAXENCODING+2:			/* follow a funny baseline */
		putc('(', tf);
		break;
	}   /* End switch */

	textcount = 1;
	lastx = stringstart = hpos;
    }	/* End if */

}   /* End of starttext */

/*****************************************************************************/

flushtext()

{

    int		i;

/*
 *
 * Generates a call to the PostScript procedure that processes all the text we've
 * accumulated - provided textcount is positive.
 *
 */

    if ( textcount > 0 ) {
	switch ( encoding ) {
	    case 0:
		fprintf(tf, ")%d t\n", stringstart);
		break;

	    case 1:
		fprintf(tf, ")%d %d t\n", stringstart, lasty);
		break;

	    case 2:
		*strptr = '\0';
		line[textcount].width = lastx - line[textcount].start;
		if ( spacecount != 0 || textcount != 1 ) {
		    for ( i = textcount; i > 0; i-- )
			fprintf(tf, "(%s)%d %d", line[i].str, line[i].spaces, line[i].width);
		    fprintf(tf, " %d %d %d t\n", textcount, stringstart, lasty);
		} else fprintf(tf, "(%s)%d %d w\n", line[1].str, stringstart, lasty);
		break;

	    case 3:
		*strptr = '\0';
		if ( spacecount != 0 || textcount != 1 ) {
		    for ( i = textcount; i > 0; i-- )
			fprintf(tf, "(%s)%d", line[i].str, line[i].dx);
		    fprintf(tf, " %d %d %d t\n", textcount, stringstart, lasty);
		} else fprintf(tf, "(%s)%d %d w\n", line[1].str, stringstart, lasty);
		break;

	    case MAXENCODING+1:
		fprintf(tf, ")%d ", stringstart);
		fprintf(tf, "%d %d drawrvbox ", lastend - rvslop, (int)(lastx + .5) + rvslop);
		fprintf(tf, "t\n", stringstart);
		lastend = (lastx + .5) + 2 * rvslop;
		break;

	    case MAXENCODING+2:
		fprintf(tf, ")%d %d t\n", stringstart, lasty);
		break;
	}   /* End switch */
    }	/* End if */

    textcount = 0;

}   /* End of flushtext */

/*****************************************************************************/

endstring()

{

    int		dx;

/*
 *
 * Horizontal positions are out of sync. End the last open string, adjust the
 * printer's position, and start a new string. Assumes we've already started
 * accumulating text.
 *
 */

    switch ( encoding ) {
	case 0:
	case 1:
	    fprintf(tf, ")%d(", stringstart);
	    textcount++;
	    lastx = stringstart = hpos;
	    break;

	case 2:
	case 3:
	    dx = hpos - lastx;
	    if ( spacecount++ == 0 )
		line[textcount].dx = dx;
	    if ( line[textcount].dx != dx ) {
		*strptr++ = '\0';
		line[textcount].width = lastx - line[textcount].start;
		line[++textcount].str = strptr;
		*strptr++ = ' ';
		line[textcount].dx = dx;
		line[textcount].start = lastx;
		line[textcount].width = 0;
		line[textcount].spaces = 1;
	    } else {
		*strptr++ = ' ';
		line[textcount].spaces++;
	    }	/* End else */
	    lastx += dx;
	    break;

	case MAXENCODING+1:
	    fprintf(tf, ")%d(", stringstart);
	    textcount++;
	    lastx = stringstart = hpos;
	    break;

	case MAXENCODING+2:
	    flushtext();
	    starttext();
	    break;
    }	/* End switch */

}   /* End of endstring */

/*****************************************************************************/

endline()

{

/*
 *
 * The vertical position has changed. Dump any accumulated text, then adjust
 * the printer's vertical position.
 *
 */

    flushtext();

    if ( encoding == 0 || encoding == MAXENCODING+1 )
	fprintf(tf, "%d %d m\n", hpos, vpos);

    lastx = stringstart = lastend = hpos;
    lasty = vpos;

}   /* End of endline */

/*****************************************************************************/

addchar(c)

    int		c;

{

/*
 *
 * Does whatever is needed to add character c to the current string.
 *
 */

    switch ( encoding ) {
	case 0:
	case 1:
	    putc(c, tf);
	    break;

	case 2:
	case 3:
	    *strptr++ = c;
	    break;

	case MAXENCODING+1:
	case MAXENCODING+2:
	    putc(c, tf);
	    break;
    }	/* End switch */

}   /* End of addchar */

/*****************************************************************************/

addoctal(c)

    int		c;

{

/*
 *
 * Add c to the current string as an octal escape.
 *
 */

    switch ( encoding ) {
	case 0:
	case 1:
	    fprintf(tf, "\\%o", c);
	    break;

	case 2:
	case 3:
	    sprintf(strptr, "\\%o", c);
	    strptr += strlen(strptr);
	    break;

	case MAXENCODING+1:
	case MAXENCODING+2:
	    fprintf(tf, "\\%o", c);
	    break;
    }	/* End switch */

}   /* End of addoctal */

/*****************************************************************************/

charlib(code)

    int		code;			/* either 1 or 2 */

{

    char	*name;			/* name of the character */
    char	tname[10];		/* in case it's a single ASCII character */
    char	temp[150];

/*
 *
 * Called from oput() for characters having codes less than 040. Special files
 * that define PostScript procedures for certain characters can be found in
 * directory *fontdir/devpost/charlib. If there's a file that has the same name as
 * the character we're trying to print it's copied to the output file, otherwise
 * nothing, except some positioning, is done.
 *
 * All character definitions are only made once. Subsequent requests to print the
 * character generate a call to a procedure that begins with the prefix build_ and
 * ends with the character's name. Special characters that are assigned codes
 * other than 1 are assumed to have additional data files that should be copied
 * to the output file immediately after the build_ call. Those data files should
 * end in the suffix .map, and usually will be a hex representation of a bitmap.
 *
 */

    flushtext();

    if ( lastc < ALPHABET ) {		/* ASCII character */
	sprintf(tname, "%.3o", lastc);
	name = tname;
    } else name = chname(lastc);

    if ( downloaded[lastc] == 0 ) {
	sprintf(temp, "%s/dev%s/charlib/%s", fontdir, realdev, name);
	if ( exportfile(temp) == TRUE ) {
	    downloaded[lastc] = 1;
	    t_sf();
	}   /* End if */
    }	/* End if */

    if ( downloaded[lastc] == 1 ) {
	xymove(hpos, vpos);
	fprintf(tf, "%d build_%s\n", (int) lastw, name);
	if ( code != 1 ) {		/* get the bitmap or whatever */
	    sprintf(temp, "%s/dev%s/charlib/%s.map", fontdir, realdev, name);
	    if ( access(temp, 04) == 0 && tf == stdout )
		cat(temp);
	}   /* End if */
	fprintf(tf, "%d %d m\n", stringstart = hpos + lastw, vpos);
    }	/* End if */

}   /* End of charlib */

/*****************************************************************************/

reset()

{

/*
 *
 * Reset variables that keep track of the printer's current position, size and
 * font. Eventually forces things back in sync before oput() prints the next
 * character.
 *
 */

    lastx = -(slop + 1);
    lasty = -1;
    lastfont = lastsize = -1;

}   /* End of reset */

/*****************************************************************************/

resetpos()

{

/*
 *
 * Reset the position tracking variables. Forces oput() to get positions back
 * in sync before printing the next character.
 *
 */

    lastx = -(slop + 1);
    lasty = -1;

}   /* End of resetpos */

/*****************************************************************************/

save()

{

/*
 *
 * Save the current PostScript environment. Initialize things that may have
 * disappeared after the preceeding restore.
 *
 */

    fprintf(tf, "/saveobj save def\n");
    fprintf(tf, "mark\n");

    if ( encoding != realencoding )
	fprintf(tf, "%d setdecoding\n", encoding);

    if ( gotcolor == TRUE )		/* prevent getcolor() recursion */
	setcolor();

}   /* End of save */

/*****************************************************************************/

restore()

{

/*
 *
 * Restore the previous PostScript environment.
 *
 */

    flushtext();
    fprintf(tf, "cleartomark\n");
    fprintf(tf, "saveobj restore\n");
    reset();

}   /* End of restore */

/*****************************************************************************/

exportfile(path)

    char	*path;

{

    int		val = FALSE;

/*
 *
 * Exports the contents of file path to the global environment. Returns TRUE
 * if we're doing output (i.e. tf == stdout) and the copy worked.
 *
 */

    if ( tf == stdout && access(path, 04) == 0 ) {
	restore();
	fprintf(tf, "%s", BEGINGLOBAL);
	val = cat(path);
	fprintf(tf, "%s", ENDGLOBAL);
	save();
    }	/* End if */

    return(val);

}   /* End of exportfile */

/*****************************************************************************/

exportstring(str)

    char	*str;

{

/*
 *
 * Exports string str to the global environment. No return value needed yet.
 *
 */

    if ( tf == stdout && str != NULL && *str != '\0' ) {
	restore();
	fprintf(tf, "%s", BEGINGLOBAL);
	fprintf(tf, "%s", str);
	fprintf(tf, "%s", ENDGLOBAL);
	save();
    }	/* End if */

}   /* End of exportstring */

/*****************************************************************************/

redirect(pg)

    int		pg;

{

    static FILE	*fp_null = NULL;

/*
 *
 * If we're not supposed to print page pg, tf will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	tf = stdout;
    else if ( (tf = fp_null) == NULL )
	tf = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014231030451006440057030057030000010301400522627500600002700000010457post.src/dpost/dpost.h/*
 *
 * DEVNAME should be the name of a device whose font files accurately describe
 * what's available on the target printer. It's a string that's combined with
 * "/usr/lib/font/dev" to locate the final font directory. It can be changed
 * using the -T option, but you may end up getting garbage - the character code
 * field must agree with PostScript's character encoding scheme for each font and
 * troff's one or two character font names must be mapped into the appropriate
 * PostScript font names (typically in the prologue)
 *
 *
 */

#define	DEVNAME		"post"		/* name of the target printer */

/*
 *
 * SLOP controls how much horizontal positioning error we'll accept and primarily
 * helps when we're emulating another device. It's used when we output characters
 * in oput() to check if troff and the printer have gotten too far out of sync.
 * Given in units of points and can be changed using the -S option. Converted to
 * machine units in t_init() after the resolution is known.
 *
 */

#define SLOP		.2		/* horizontal error - in points */

/*
 *
 * Several different text line encoding schemes are supported. Print time should
 * decrease as the value assigned to encoding (in dpost.c) increases, although the
 * only encoding that's well tested is the lowest level one, which produces output
 * essentially identical to the original version of dpost. Setting DFLTENCODING to
 * 0 will give you the most stable (but slowest) encoding. The encoding scheme can
 * also be set on the command line using the -e option. Faster methods are based
 * on widthshow and may not place words exactly where troff wanted, but errors will
 * usually not be noticeable.
 *
 */

#define MAXENCODING	3

#ifndef DFLTENCODING
#define DFLTENCODING	2
#endif

/*
 *
 * The encoding scheme controls how lines of text are output. In the lower level
 * schemes words and horizontal positions are put on the stack as they're read and
 * when they're printed it's done in reverse order - the first string printed is
 * the one on top of the stack and it's the last one on the line. Faster methods
 * may be forced to reverse the order of strings on the stack, making the top one
 * the first string on the line. STRINGSPACE sets the size of a character array
 * that's used to save the strings that make up  a line of text so they can be
 * output in reverse order or perhaps combined in groups for widthshow.
 *
 * MAXSTACK controls how far we let PostScript's operand stack grow and determines
 * the number of strings we'll save before printing all or part of a line of text.
 * The internal limit in PostScript printers built by Adobe is 500, so MAXSTACK
 * should never be bigger than about 240!
 *
 * Line is a structure used to keep track of the words (or rather strings) on the
 * current line that have been read but not printed. dx is the width troff wants
 * to use for a space in the current string. start is where the string began, width
 * is the total width of the string, and spaces is the number of space characters
 * in the current string. *str points to the start of the string in the strings[]
 * array. The Line structure is only used in the higher level encoding schemes.
 * 
 */

#define	MAXSTACK	50		/* most strings we'll save at once */
#define	STRINGSPACE	2000		/* bytes available for string storage */

typedef struct {
	char	*str;			/* where the string is stored */
	int	dx;			/* width of a space */
	int	spaces;			/* number of space characters */
	int	start;			/* horizontal starting position */
	int	width;			/* and its total width */
} Line;

/*
 *
 * Simple stuff used to map unrecognized font names into something reasonable. The
 * mapping array is initialized using FONTMAP and used in loadfont() whenever the
 * job tries to use a font that we don't recognize. Normally only needed when we're
 * emulating another device.
 *
 */

typedef struct {
	char	*name;			/* font name we're looking for */
	char	*use;			/* and this is what we should use */
} Fontmap;

#define	FONTMAP								\
									\
	{								\
	    "G", "H",							\
	    "LO", "S",							\
	    "S2", "S",							\
	    "GI", "HI",							\
	    "HM", "H",							\
	    "HK", "H",							\
	    "HL", "H",							\
	    "PA", "R",							\
	    "PI", "I",							\
	    "PB", "B",							\
	    "PX", "BI",							\
	    NULL, NULL,							\
	}

/*
 *
 * Non-integer valued functions.
 *
 */

extern char	*mapfont();

0707070014231027401006400057030057030000010310030522633100300003000000005210post.src/dpost/dpost.mkMAKE=/bin/make
MAKEFILE=dpost.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=dpost.h\
       font.h\
       motion.h\
       ps_include.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=dpost.o\
       draw.o\
       color.o\
       font.o\
       pictures.o\
       ps_include.o\
       $(COMMONDIR)/bbox.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o\
       $(COMMONDIR)/tempnam.o

all : dpost

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp dpost $(POSTBIN)/dpost
	@chmod 755 $(POSTBIN)/dpost
	@chgrp $(GROUP) $(POSTBIN)/dpost
	@chown $(OWNER) $(POSTBIN)/dpost
	cp dpost.ps $(POSTLIB)/dpost.ps
	@chmod 644 $(POSTLIB)/dpost.ps
	@chgrp $(GROUP) $(POSTLIB)/dpost.ps
	@chown $(OWNER) $(POSTLIB)/dpost.ps
	cp draw.ps $(POSTLIB)/draw.ps
	@chmod 644 $(POSTLIB)/draw.ps
	@chgrp $(GROUP) $(POSTLIB)/draw.ps
	@chown $(OWNER) $(POSTLIB)/draw.ps
	cp dpost.1 $(MAN1DIR)/dpost.1
	@chmod 644 $(MAN1DIR)/dpost.1
	@chgrp $(GROUP) $(MAN1DIR)/dpost.1
	@chown $(OWNER) $(MAN1DIR)/dpost.1

clean :
	rm -f *.o

clobber : clean
	rm -f dpost

dpost : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o dpost $(OFILES) -lm

dpost.o : $(HFILES)
color.o : $(COMMONDIR)/ext.h $(COMMONDIR)/gen.h
draw.o : motion.h $(COMMONDIR)/ext.h $(COMMONDIR)/gen.h
font.o : font.h $(COMMONDIR)/gen.h
pictures.o : $(COMMONDIR)/comments.h $(COMMONDIR)/gen.h
ps_include.o : ps_include.h

$(COMMONDIR)/bbox.o\
$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o\
$(COMMONDIR)/tempnam.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dF.*'.ds dF $(FONTDIR)'" \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	dpost.1 >XXX.1; \
	mv XXX.1 dpost.1

0707070014231030471006440057030057030000010301600522627500600003000000011014post.src/dpost/dpost.ps%
% Version 3.3.2 prologue for troff files.
%

/#copies 1 store
/aspectratio 1 def
/formsperpage 1 def
/landscape false def
/linewidth .3 def
/magnification 1 def
/margin 0 def
/orientation 0 def
/resolution 720 def
/rotation 1 def
/xoffset 0 def
/yoffset 0 def

/roundpage true def
/useclippath true def
/pagebbox [0 0 612 792] def

/R  /Times-Roman def
/I  /Times-Italic def
/B  /Times-Bold def
/BI /Times-BoldItalic def
/H  /Helvetica def
/HI /Helvetica-Oblique def
/HB /Helvetica-Bold def
/HX /Helvetica-BoldOblique def
/CW /Courier def
/CO /Courier def
/CI /Courier-Oblique def
/CB /Courier-Bold def
/CX /Courier-BoldOblique def
/PA /Palatino-Roman def
/PI /Palatino-Italic def
/PB /Palatino-Bold def
/PX /Palatino-BoldItalic def
/Hr /Helvetica-Narrow def
/Hi /Helvetica-Narrow-Oblique def
/Hb /Helvetica-Narrow-Bold def
/Hx /Helvetica-Narrow-BoldOblique def
/KR /Bookman-Light def
/KI /Bookman-LightItalic def
/KB /Bookman-Demi def
/KX /Bookman-DemiItalic def
/AR /AvantGarde-Book def
/AI /AvantGarde-BookOblique def
/AB /AvantGarde-Demi def
/AX /AvantGarde-DemiOblique def
/NR /NewCenturySchlbk-Roman def
/NI /NewCenturySchlbk-Italic def
/NB /NewCenturySchlbk-Bold def
/NX /NewCenturySchlbk-BoldItalic def
/ZD /ZapfDingbats def
/ZI /ZapfChancery-MediumItalic def
/S  /S def
/S1 /S1 def
/GR /Symbol def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if
	/scaling 72 resolution div def
	linewidth setlinewidth
	1 setlinecap

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	width 2 div neg height 2 div translate
	xoffset inch yoffset inch neg translate
	margin 2 div dup neg translate
	magnification dup aspectratio mul scale
	scaling scaling scale

	addmetrics
	0 0 moveto
} def

/pagedimensions {
	useclippath userdict /gotpagebbox known not and {
		/pagebbox [clippath pathbbox newpath] def
		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/addmetrics {
	/Symbol /S null Sdefs cf
	/Times-Roman /S1 StandardEncoding dup length array copy S1defs cf
} def

/pagesetup {
	/page exch def
	currentdict /pagedict known currentdict page known and {
		page load pagedict exch get cvx exec
	} if
} def

/decodingdefs [
	{counttomark 2 idiv {y moveto show} repeat}
	{neg /y exch def counttomark 2 idiv {y moveto show} repeat}
	{neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat}
	{neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat}
	{counttomark 2 idiv {y moveto show} repeat}
	{neg setfunnytext}
] def

/setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def

/w {neg moveto show} bind def
/m {neg dup /y exch def moveto} bind def
/done {/lastpage where {pop lastpage} if} def

/f {
	dup /font exch def findfont exch
	dup /ptsize exch def scaling div dup /size exch def scalefont setfont
	linewidth ptsize mul scaling 10 mul div setlinewidth
	/spacewidth ( ) stringwidth pop def
} bind def

/changefont {
	/fontheight exch def
	/fontslant exch def
	currentfont [
		1 0
		fontheight ptsize div fontslant sin mul fontslant cos div
		fontheight ptsize div
		0 0
	] makefont setfont
} bind def

/sf {f} bind def

/cf {
	dup length 2 idiv
	/entries exch def
	/chtab exch def
	/newencoding exch def
	/newfont exch def

	findfont dup length 1 add dict
	/newdict exch def
	{1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall

	newencoding type /arraytype eq {newdict /Encoding newencoding put} if

	newdict /Metrics entries dict put
	newdict /Metrics get
	begin
		chtab aload pop
		1 1 entries {pop def} for
		newfont newdict definefont pop
	end
} bind def

%
% A few arrays used to adjust reference points and character widths in some
% of the printer resident fonts. If square roots are too high try changing
% the lines describing /radical and /radicalex to,
%
%	/radical	[0 -75 550 0]
%	/radicalex	[-50 -75 500 0]
%
% Move braceleftbt a bit - default PostScript character is off a bit.
%

/Sdefs [
	/bracketlefttp		[201 500]
	/bracketleftbt		[201 500]
	/bracketrighttp		[-81 380]
	/bracketrightbt		[-83 380]
	/braceleftbt		[203 490]
	/bracketrightex		[220 -125 500 0]
	/radical		[0 0 550 0]
	/radicalex		[-50 0 500 0]
	/parenleftex		[-20 -170 0 0]
	/integral		[100 -50 500 0]
	/infinity		[10 -75 730 0]
] def

/S1defs [
	/underscore		[0 80 500 0]
	/endash			[7 90 650 0]
] def
0707070014231030501006440057030057030000010302000522627500600002600000061605post.src/dpost/draw.c/*
 *
 * Drawing routines used by dpost. Almost no real work is done here. Instead
 * the required calculations are done in special Postscript procedures that
 * include:
 *
 *
 *	Dl
 *
 *	  x1 y1 x y Dl -
 *
 *	    Starts a new path and then draws a line from the current point
 *	    (x, y) to (x1, y1).
 *
 *	De
 *
 *	  x y a b De -
 *
 *	    Starts a new path and then draws an ellipse that has its left side
 *	    at the current point (x, y) and horizontal and vertical axes lengths
 *	    given by a and b respectively.
 *
 *	Da
 *
 *	  x y dx1 dy1 dx2 dy2 Da -
 *
 *	    Starts a new segment and then draws a circular arc from the current
 *	    point (x, y) to (x + dx1 + dx2, y + dy1 + dy2). The center of the
 *	    circle is at (x + dx1, y + dy1). Arcs always go counter-clockwise
 *	    from the starting point to the end point.
 *
 *	DA
 *
 *	  x y dx1 dy1 dx2 dy2 DA -
 *
 *	    Draws a clockwise arc from (x, y) to (x + dx1 + dx2, y + dy1 + dy2)
 *	    with center at (x + dx1, y + dy1). Only needed when we're building
 *	    large paths that use arcs and want to control the current point. The
 *	    arguments passed to drawarc() will be whatever they would have been
 *	    for a counter-clockwise arc, so we need to map them into appropriate
 *	    arguments for PostScript's arcn operator. The mapping is,
 *
 *			x = hpos + dx1' + dx2'
 *			y = vpos + dy1' + dy2'
 *			dx1 = -dx2'
 *			dy1 = -dy2'
 *			dx2 = -dx1'
 *			dy2 = -dy1'
 *
 *	   where primed values represent the drawarc() arguments and (hpos, vpos)
 *	   is our current position.
 *
 *	Ds
 *
 *	  x0 y0 x1 y1 x2 y2 Ds -
 *
 *	    Starts a new segment and then draws a quadratic spline connecting
 *	    point ((x0 + x1)/2, (y0 + y1)/2) to ((x1 + x2)/2, (y1 + y2)/2).
 *	    The points used in Postscript's curveto procedure are given by,
 *
 *		x0' = (x0 + 5 * x1) / 6
 *		x1' = (x2 + 5 * x1) / 6
 *		x2' = (x1 + x2) / 2
 *
 *	    with similar equations for the y coordinates.
 *
 * By default all the PostScript drawing procedures begin with a newpath (just to
 * be safe) and end with a stroke, which essentially isolates the path elements
 * built by the drawing procedures. In order to accommodate big paths built from
 * smaller pieces each of the PostScript drawing procedures can forced to retain
 * the path that's being built. That's what happens in beginpath() when an "x X
 * BeginPath" command is read. beginpath() sets the PostScript variable inpath to
 * true, and that essentially eliminates the newpath/stroke pair that bracket the
 * individual pieces. In that case the path is terminated and drawn when dpost
 * reads an "x X DrawPath" command.
 *
 * Early versions of dpost included the PostScript drawing procedures as part of
 * the prologue, and as a result they were included with every job, even if they
 * were never used. This version has separated the drawing procedures from the
 * default prologue (they're now in *drawfile) and only includes them if they're
 * really needed, which is yet another convenient violation of page independence.
 * Routine getdraw() is responsible for adding *drawfile to the output file, and
 * if it can't read *drawfile it continues on as if nothing happened. That means
 * everything should still work if you append *drawfile to *prologue and then
 * delete *drawfile.
 *
 */

#include <stdio.h>
#include <math.h>

#include "gen.h"			/* general purpose definitions */
#include "ext.h"			/* external variable definitions */
#include "motion.h"			/* positioning macros */

int	gotdraw = FALSE;		/* TRUE when *drawfile has been added */
int	gotbaseline = FALSE;		/* TRUE after *baselinefile is added */
int	inpath = FALSE;			/* TRUE if we're putting pieces together */

/*
 *
 * All these should be defined in file dpost.c.
 *
 */

extern int		hpos;
extern int		vpos;
extern int		encoding;
extern int		maxencoding;
extern int		realencoding;

extern char		*drawfile;
extern char		*baselinefile;
extern FILE		*tf;

/*****************************************************************************/

getdraw()

{

/*
 *
 * Responsible for making sure the PostScript drawing procedures are downloaded
 * from *drawfile. Stuff is done at most once per job, and only if the job needs
 * them. For now I've decided not to quit if we can't read the drawing file. That
 * pretty much assumes an old version of prologue is being used that includes all
 * the drawing procedures.
 *
 */

    if ( gotdraw == FALSE )
	exportfile(drawfile);

    if ( tf == stdout )
	gotdraw = TRUE;

}   /* End of getdraw */

/*****************************************************************************/

drawline(dx, dy)

    int		dx, dy;			/* endpoint is (hpos+dx, vpos+dy) */

{

/*
 *
 * Draws a line from (hpos, vpos) to (hpos+dx, vpos+dy), and leaves the current
 * position at the endpoint.
 *
 */

    if ( dx == 0 && dy == 0 )
	drawcirc(1);
    else fprintf(tf, "%d %d %d %d Dl\n", hpos + dx, vpos + dy, hpos, vpos);

    if ( dobbox == TRUE ) {
	cover((double)hpos, (double)-vpos);
	cover((double)(hpos + dx), (double)-(vpos + dy));
    }	/* End if */

    hgoto(hpos+dx);			/* where troff expects to be */
    vgoto(vpos+dy);

    resetpos();				/* not sure where the printer is */

}   /* End of drawline */

/*****************************************************************************/

drawcirc(d)

    int		d;			/* diameter of the circle */

{

/*
 *
 * Draws a circle of diameter d with the left 'side' of the circle at the
 * current point. After we're finished drawing we move the current position
 * to the right side.
 *
 */

    drawellip(d, d);

}   /* End of drawcirc */

/*****************************************************************************/

drawellip(a, b)

    int		a, b;			/* axes lengths for the ellipse */

{

/*
 *
 * Draws an ellipse having axes lengths horizontally and vertically of a and
 * b. The left side of the ellipse is at the current point. After we're done
 * drawing the path we move the current position to the right side.
 *
 */

    if ( a == 0 && b == 0 )
	return;

    fprintf(tf, "%d %d %d %d De\n", hpos, vpos, a, b);

    if ( dobbox == TRUE ) {
	cover((double)hpos, (double)-(vpos + b/2));
	cover((double)(hpos+a), (double)-(vpos - b/2));
    }	/* End if */

    hgoto(hpos + a);			/* where troff expects to be */
    vgoto(vpos);

    resetpos();				/* not sure where the printer is */

}   /* End of drawellip */

/*****************************************************************************/

drawarc(dx1, dy1, dx2, dy2, c)

    int		dx1, dy1;		/* vector from current pos to center */
    int		dx2, dy2;		/* from center to end of the arc */
    int		c;			/* clockwise if c is A */

{

/*
 *
 * If c isn't set to 'A' a counter-clockwise arc is drawn from the current point
 * (hpos, vpos) to (hpos+dx1+dx2, vpos+dy1+dy2). The center of the circle is the
 * point (hpos+dx1, vpos+dy1). If c is 'A' the arc goes clockwise from the point
 * (hpos+dx1+dx2, vpos+dy1+dy2) to (hpos, vpos). Clockwise arcs are only needed
 * if we're building a larger path out of pieces that include arcs, and want to
 * have PostScript manage the path for us. Arguments (for a clockwise arc) are
 * what would have been supplied if the arc was drawn in a counter-clockwise
 * direction, and are converted to values suitable for use with PostScript's arcn
 * operator.
 *
 */

    if ( (dx1 != 0 || dy1 != 0) && (dx2 != 0 || dy2 != 0) ) {
	if ( c != 'A' )
	    fprintf(tf, "%d %d %d %d %d %d Da\n", hpos, vpos, dx1, dy1, dx2, dy2);
	else fprintf(tf, "%d %d %d %d %d %d DA\n", hpos+dx1+dx2, vpos+dy1+dy2,
						-dx2, -dy2, -dx1, -dy1);

	if ( dobbox == TRUE )
	    arc_extreme(dx1, dy1, dx2, dy2);
    }	/* End if */

    hgoto(hpos + dx1 + dx2);		/* where troff expects to be */
    vgoto(vpos + dy1 + dy2);

    resetpos();				/* not sure where the printer is */

}   /* End of drawarc */

/*****************************************************************************/

drawspline(fp, flag)

    FILE	*fp;			/* input for point list */
    int		flag;			/* flag!=1 connect end points */

{

    int		x[100], y[100];
    int		i, N;

/*
 *
 * Spline drawing routine for Postscript printers. The complicated stuff is
 * handled by procedure Ds, which should be defined in the library file. I've
 * seen wrong implementations of troff's spline drawing, so fo the record I'll
 * write down the parametric equations and the necessary conversions to Bezier
 * cubic splines (as used in Postscript).
 *
 *
 * Parametric equation (x coordinate only):
 *
 *
 *	    (x2 - 2 * x1 + x0)    2                    (x0 + x1)
 *	x = ------------------ * t   + (x1 - x0) * t + ---------
 *		    2					   2
 *
 *
 * The coefficients in the Bezier cubic are,
 *
 *
 *	A = 0
 *	B = (x2 - 2 * x1 + x0) / 2
 *	C = x1 - x0
 *
 *
 * while the current point is,
 *
 *	current-point = (x0 + x1) / 2
 *
 * Using the relationships given in the Postscript manual (page 121) it's easy to
 * see that the control points are given by,
 *
 *
 *	x0' = (x0 + 5 * x1) / 6
 *	x1' = (x2 + 5 * x1) / 6
 *	x2' = (x1 + x2) / 2
 *
 *
 * where the primed variables are the ones used by curveto. The calculations
 * shown above are done in procedure Ds using the coordinates set up in both
 * the x[] and y[] arrays.
 *
 * A simple test of whether your spline drawing is correct would be to use cip
 * to draw a spline and some tangent lines at appropriate points and then print
 * the file.
 *
 */

    for ( N = 2; N < sizeof(x)/sizeof(x[0]); N++ )
	if (fscanf(fp, "%d %d", &x[N], &y[N]) != 2)
		break;

    x[0] = x[1] = hpos;
    y[0] = y[1] = vpos;

    for (i = 1; i < N; i++) {
	x[i+1] += x[i];
	y[i+1] += y[i];
    }	/* End for */

    x[N] = x[N-1];
    y[N] = y[N-1];

    for (i = ((flag!=1)?0:1); i < ((flag!=1)?N-1:N-2); i++) {
	fprintf(tf, "%d %d %d %d %d %d Ds\n", x[i], y[i], x[i+1], y[i+1], x[i+2], y[i+2]);
	if ( dobbox == TRUE ) {		/* could be better */
	    cover((double)(x[i] + x[i+1])/2,(double)-(y[i] + y[i+1])/2);
	    cover((double)x[i+1], (double)-y[i+1]);
	    cover((double)(x[i+1] + x[i+2])/2, (double)-(y[i+1] + y[i+2])/2);
	}   /* End if */
    }	/* End for */

    hgoto(x[N]);			/* where troff expects to be */
    vgoto(y[N]);

    resetpos();				/* not sure where the printer is */

}   /* End of drawspline */

/*****************************************************************************/

arc_extreme(dx1, dy1, dx2, dy2)

    int		dx1, dy1, dx2, dy2;

{

    double	x0, y0, x1, y1, xc, yc;  /* start, end, center */
    double	r, xmin, ymin, xmax, ymax;
    int		j, k;

/*
 *
 * bounding box of a circular arc             Eric Grosse  24 May 84
 *
 * Conceptually, this routine generates a list consisting of the start,
 * end, and whichever north, east, south, and west points lie on the arc.
 * The bounding box is then the range of this list.
 *     list = {start,end}
 *     j = quadrant(start)
 *     k = quadrant(end)
 *     if( j==k && long way 'round )  append north,west,south,east
 *     else
 *       while( j != k )
 *          append center+radius*[j-th of north,west,south,east unit vectors]
 *          j += 1  (mod 4)
 *     return( bounding box of list )
 * The following code implements this, with simple optimizations.
 *
 */

    x0 = hpos;
    y0 = -vpos;
    x1 = hpos + dx1 + dx2;
    y1 = -(vpos + dy1 + dy2);
    xc = hpos + dx1;
    yc = -(vpos + dy1);

    x0 -= xc; y0 -= yc;			/* move to center */
    x1 -= xc; y1 -= yc;
    xmin = (x0<x1)?x0:x1; ymin = (y0<y1)?y0:y1;
    xmax = (x0>x1)?x0:x1; ymax = (y0>y1)?y0:y1;
    r = sqrt(x0*x0 + y0*y0);
    if (r > 0.0) {
	j = quadrant(x0,y0);
	k = quadrant(x1,y1);
	if (j == k && y1*x0 < x1*y0) {
	    /* viewed as complex numbers, if Im(z1/z0)<0, arc is big */
	    if( xmin > -r) xmin = -r; if( ymin > -r) ymin = -r;
	    if( xmax <  r) xmax =  r; if( ymax <  r) ymax =  r;
	} else {
	    while (j != k) {
		switch (j) {
		    case 1: if( ymax <  r) ymax =  r; break; /* north */
		    case 2: if( xmin > -r) xmin = -r; break; /* west */
		    case 3: if( ymin > -r) ymin = -r; break; /* south */
		    case 4: if( xmax <  r) xmax =  r; break; /* east */
		}   /* End switch */
		j = j%4 + 1;
	    }	/* End while */
	}   /* End else */
    }	/* End if */

    xmin += xc; ymin += yc;
    xmax += xc; ymax += yc;
    cover(xmin, ymin);
    cover(xmax, ymax);

}   /* End of arc_extreme */

/*****************************************************************************/

quadrant(x,y)

	double x, y;

{

    if (     x>=0.0 && y> 0.0) return(1);
    else if( x< 0.0 && y>=0.0) return(2);
    else if( x<=0.0 && y< 0.0) return(3);
    else if( x> 0.0 && y<=0.0) return(4);
    else		       return 0;	/* shut up lint */

}   /* End of quadrant */

/*****************************************************************************/

beginpath(buf, copy)

    char	*buf;			/* whatever followed "x X BeginPath" */
    int		copy;			/* ignore *buf if FALSE */

{

/*
 *
 * Called from devcntrl() whenever an "x X BeginPath" command is read. It's used
 * to mark the start of a sequence of drawing commands that should be grouped
 * together and treated as a single path. By default the drawing procedures in
 * *drawfile treat each drawing command as a separate object, and usually start
 * with a newpath (just as a precaution) and end with a stroke. The newpath and
 * stroke isolate individual drawing commands and make it impossible to deal with
 * composite objects. "x X BeginPath" can be used to mark the start of drawing
 * commands that should be grouped together and treated as a single object, and
 * part of what's done here ensures that the PostScript drawing commands defined
 * in *drawfile skip the newpath and stroke, until after the next "x X DrawPath"
 * command. At that point the path that's been built up can be manipulated in
 * various ways (eg. filled and/or stroked with a different line width).
 *
 * String *buf is unnecessary and is only included for compatibility with an early
 * verion of that's still in use. In that version "x X BeginObject" marked the
 * start of a graphical object, and whatever followed it was passed along in *buf
 * and copied to the output file. Color selection is one of the options that's
 * available in parsebuf(), so if we get here we add *colorfile to the output
 * file before doing anything important.
 *
 */

    if ( inpath == FALSE ) {
	flushtext();
	getdraw();
	getcolor();
	fprintf(tf, "gsave\n");
	fprintf(tf, "newpath\n");
	fprintf(tf, "%d %d m\n", hpos, vpos);
	fprintf(tf, "/inpath true def\n");
	if ( copy == TRUE )
	    fprintf(tf, "%s", buf);
	inpath = TRUE;
    }	/* End if */

}   /* End of beginpath */

/*****************************************************************************/

drawpath(buf, copy)

    char	*buf;
    int		copy;

{

/*
 *
 * Called from devcntrl() whenever an "x X DrawPath" command is read. It marks the
 * end of the path started by the last "x X BeginPath" command and uses whatever
 * has been passed along in *buf to manipulate the path (eg. fill and/or stroke
 * the path). Once that's been done the drawing procedures are restored to their
 * default behavior in which each drawing command is treated as an isolated path.
 * The new version (called after "x X DrawPath") has copy set to FALSE, and calls
 * parsebuf() to figure out what goes in the output file. It's a feeble attempt
 * to free users and preprocessors (like pic) from having to know PostScript. The
 * comments in parsebuf() describe what's handled.
 *
 * In the early version a path was started with "x X BeginObject" and ended with
 * "x X EndObject". In both cases *buf was just copied to the output file, and
 * was expected to be legitimate PostScript that manipulated the current path.
 * The old escape sequence will be supported for a while (for Ravi), and always
 * call this routine with copy set to TRUE.
 * 
 *
 */

    if ( inpath == TRUE ) {
	if ( copy == TRUE )
	    fprintf(tf, "%s", buf);
	else parsebuf(buf);
	fprintf(tf, "grestore\n");
	fprintf(tf, "/inpath false def\n");
	reset();
	inpath = FALSE;
    }	/* End if */

}   /* End of drawpath */

/*****************************************************************************/

parsebuf(buf)

    char	*buf;			/* whatever followed "x X DrawPath" */

{

    char	*p;			/* usually the next token */
    char	*p1;			/* for grabbing arguments */
    char	*pend;			/* end of the original string (ie. *buf) */
    int		gsavelevel = 0;		/* non-zero if we've done a gsave */

/*
 *
 * Simple minded attempt at parsing the string that followed an "x X DrawPath"
 * command. Everything not recognized here is simply ignored - there's absolutely
 * no error checking and what was originally in buf is clobbered by strtok().
 * A typical *buf might look like,
 *
 *	gray .9 fill stroke
 *
 * to fill the current path with a gray level of .9 and follow that by stroking the
 * outline of the path. Since unrecognized tokens are ignored the last example
 * could also be written as,
 *
 *	with gray .9 fill then stroke
 *
 * The "with" and "then" strings aren't recognized tokens and are simply discarded.
 * The "stroke", "fill", and "wfill" force out appropriate PostScript code and are
 * followed by a grestore. In otherwords changes to the grahics state (eg. a gray
 * level or color) are reset to default values immediately after the stroke, fill,
 * or wfill tokens. For now "fill" gets invokes PostScript's eofill operator and
 * "wfill" calls fill (ie. the operator that uses the non-zero winding rule).
 *
 * The tokens that cause temporary changes to the graphics state are "gray" (for
 * setting the gray level), "color" (for selecting a known color from the colordict
 * dictionary defined in *colorfile), and "line" (for setting the line width). All
 * three tokens can be extended since strncmp() makes the comparison. For example
 * the strings "line" and "linewidth" accomplish the same thing. Colors are named
 * (eg. "red"), but must be appropriately defined in *colorfile. For now all three
 * tokens must be followed immediately by their single argument. The gray level
 * (ie. the argument that follows "gray") should be a number between 0 and 1, with
 * 0 for black and 1 for white.
 *
 * To pass straight PostScript through enclose the appropriate commands in double
 * quotes. Straight PostScript is only bracketed by the outermost gsave/grestore
 * pair (ie. the one from the initial "x X BeginPath") although that's probably
 * a mistake. Suspect I may have to change the double quote delimiters.
 *
 */

    pend = buf + strlen(buf);
    p = strtok(buf, " \n");

    while ( p != NULL ) {
	if ( gsavelevel == 0 ) {
	    fprintf(tf, "gsave\n");
	    gsavelevel++;
	}   /* End if */
	if ( strcmp(p, "stroke") == 0 ) {
	    fprintf(tf, "closepath stroke\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "openstroke") == 0 ) {
	    fprintf(tf, "stroke\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "fill") == 0 ) {
	    fprintf(tf, "eofill\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "wfill") == 0 ) {
	    fprintf(tf, "fill\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "sfill") == 0 ) {
	    fprintf(tf, "eofill\ngrestore\ngsave\nstroke\ngrestore\n");
	    gsavelevel--;
	} else if ( strncmp(p, "gray", strlen("gray")) == 0 ) {
	    p1 = strtok(NULL, " \n");
	    fprintf(tf, "%s setgray\n", p1);
	} else if ( strncmp(p, "color", strlen("color")) == 0 ) {
	    p1 = strtok(NULL, " \n");
	    fprintf(tf, "/%s setcolor\n", p1);
	} else if ( strncmp(p, "line", strlen("line")) == 0 ) {
	    p1 = strtok(NULL, " \n");
	    fprintf(tf, "%s resolution mul 2 div setlinewidth\n", p1);
	} else if ( strncmp(p, "reverse", strlen("reverse")) == 0 )
	    fprintf(tf, "reversepath\n");
	else if ( *p == '"' ) {
	    for ( ; gsavelevel > 0; gsavelevel-- )
		fprintf(tf, "grestore\n");
	    if ( (p1 = p + strlen(p)) < pend )
		*p1 = ' ';
	    p = strtok(p, "\"\n");
	    fprintf(tf, "%s\n", p);
	}   /* End else */
	p = strtok(NULL, " \n");
    }	/* End while */

    for ( ; gsavelevel > 0; gsavelevel-- )
	fprintf(tf, "grestore\n");

}   /* End of parsebuf */

/*****************************************************************************/

getbaseline()

{

/*
 *
 * Responsible for making sure the PostScript procedures needed for printing text
 * along an arbitrary baseline are downloaded from *baselinefile. Done at most
 * once per job, and only if the the stuff is really used.
 *
 */

    if ( gotbaseline == FALSE )
	exportfile(baselinefile);

    if ( tf == stdout )
	gotbaseline = TRUE;

}   /* End of getbaseline */

/*****************************************************************************/

newbaseline(buf)

    char	*buf;			/* whatever followed "x X NewBaseline" */

{

    char	*p;			/* for eliminating white space etc. */

/*
 *
 * Called from devcntrl() whenever an "x X NewBaseline" command is recognized. We
 * assume whatever is in *buf is a set of parametric equations that describe the
 * new baseline. Equations for x(t), y(t), dx/dt, and dy/dt must be written in
 * PostScript, bracketed by { and } characters, and supplied in exactly that order.
 * In particular the equation for x must come first in *buf and it ends up as the
 * last one on the stack, while the equation for dy/dt comes last (in *buf) and
 * ends up on the top of the PostScript stack. For example if *buf is given by,
 *
 *	{} {180 mul 3.1416 div cos} {pop 1} {180 mul 3.1416 div sin neg}
 *
 * text will be printed along the curve y = cos(x).
 *
 * Angles given in radians must be converted to degrees for the PostScript trig
 * functions, and things are scaled so that 1 unit maps into 1 inch. In the last
 * example the cosine curve that describes the baseline has an amplitude of 1 inch.
 * As another example of this rather confusing syntax if *buf is,
 *
 *	{} {} {pop 1} {pop 1}
 *
 * the baseline will be the 45 degree line y = x.
 *
 * When any of the four functions is used they're called with a single number on
 * the stack that's equal to the current value of the parameter t. The coordinate
 * system axes run parallel to the PostScript coordinate system that's currently
 * being used.
 *
 */

    for ( p = buf; *p; p++ )		/* eliminate trailing '\n' */
	if ( *p == '\n' ) {
	    *p = '\0';
	    break;
	}   /* End if */

    for ( p = buf; *p && (*p == ' ' || *p == ':'); p++ ) ;

    if ( *p != '\0' ) {			/* something's there */
	flushtext();
	getbaseline();
	fprintf(tf, "mark resolution %s newbaseline\n", p);
	reset();
    }	/* End if */

}   /* End of newbaseline */

/*****************************************************************************/

drawtext(buf)

    char	*buf;			/* whatever followed "x X DrawText */

{

    char	*p;			/* for eliminating white space etc. */

/*
 *
 * Called from devcntrl() whenever an "x X DrawText command is recognized. *buf
 * should contain three arguments in the following order. First comes the text we
 * want to print along the current baseline. Right now the string should be given
 * as a PostScript string using characters '(' and ')' as the delimiters. Next in
 * *buf comes a justification mode that can be the words left, right, or center.
 * Last comes a number that represents the starting value of the parameter t that's
 * given as the argument to the parametric equations that describe the current
 * baseline. For example if *buf is given by,
 *
 *	(hello world) left .5
 *
 * hello world will be printed along the path described by the current baseline
 * and left justified at whatever (x(.5), y(.5)) happens to be. Usually will be
 * preceeded by an "x X NewBaseline" call that defines the current baseline. The
 * origin of the coordinate system used by the parametric equations will be the
 * current point.
 *
 */

    for ( p = buf; *p; p++ )		/* eliminate trailing '\n' */
	if ( *p == '\n' ) {
	    *p = '\0';
	    break;
	}   /* End if */

    for ( p = buf; *p && (*p == ' ' || *p == ':'); p++ ) ;

    if ( *p != '\0' ) {			/* something's there */
	flushtext();
	getbaseline();
	xymove(hpos, vpos);
	fprintf(tf, "mark %s drawfunnytext\n", p);
	resetpos();
    }	/* End if */

}   /* End of drawtext */

/*****************************************************************************/

settext(buf)

    char	*buf;

{

    char	*p;

/*
 *
 * Does whatever is needed to ensure any text that follows will be set along the
 * curve described by the PostScript procedures listed in *buf. If *buf doesn't
 * contain anything useful (eg. just a newline) things are restored to whatever
 * they originally were. Doesn't work well if we try to start in the middle of a
 * line of text.
 *
 * The parametric equations needed are,
 *
 *	x = f(t)
 *	y = g(t)
 *	dx/dt = f'(t)
 *	dy/dt = g'(t)
 *
 * and must be given as proper PostScript procedures. The equation for x must come
 * first (ie. it ends up on the bottom of the stack) and the equation for dy/dt
 * must be given last (ie. it ends up on top of the stack). For example if *buf
 * is given by,
 *
 *	{} {180 mul 3.1416 div cos} {pop 1} {180 mul 3.1416 div sin neg}
 *
 * text will be set along the curve y=cos(x).
 *
 */

    flushtext();
    getbaseline();

    for ( p = buf; *p && *p == ' '; p++ ) ;

    if ( *p && *p != '\n' ) {
	encoding = maxencoding + 2;
	fprintf(tf, "mark resolution %s newbaseline\n", buf);
    } else encoding = realencoding;

    fprintf(tf, "%d setdecoding\n", encoding);
    resetpos();

}   /* End of settext */

/*****************************************************************************/

0707070014231030511006440057030057030000010277260522627500600002700000002363post.src/dpost/draw.ps%
% Version 3.3.2 drawing procedures for dpost. Automatically pulled in when
% needed.
%

/inpath false def
/savematrix matrix def

/Dl {
	inpath
		{pop pop neg lineto}
		{newpath neg moveto neg lineto stroke}
	ifelse
} bind def

/De {
	/y1 exch 2 div def
	/x1 exch 2 div def
	/savematrix savematrix currentmatrix def
	neg exch x1 add exch translate
	x1 y1 scale
	0 0 1 0 360
	inpath
		{1 0 moveto arc savematrix setmatrix}
		{newpath arc savematrix setmatrix stroke}
	ifelse
} bind def

/Da {
	/dy2 exch def
	/dx2 exch def
	/dy1 exch def
	/dx1 exch def
	dy1 add neg exch dx1 add exch
	dx1 dx1 mul dy1 dy1 mul add sqrt
	dy1 dx1 neg atan
	dy2 neg dx2 atan
	inpath
		{arc}
		{newpath arc stroke}
	ifelse
} bind def

/DA {
	/dy2 exch def
	/dx2 exch def
	/dy1 exch def
	/dx1 exch def
	dy1 add neg exch dx1 add exch
	dx1 dx1 mul dy1 dy1 mul add sqrt
	dy1 dx1 neg atan
	dy2 neg dx2 atan
	inpath
		{arcn}
		{newpath arcn stroke}
	ifelse
} bind def

/Ds {
	/y2 exch def
	/x2 exch def
	/y1 exch def
	/x1 exch def
	/y0 exch def
	/x0 exch def
	x0 5 x1 mul add 6 div
	y0 5 y1 mul add -6 div
	x2 5 x1 mul add 6 div
	y2 5 y1 mul add -6 div
	x1 x2 add 2 div
	y1 y2 add -2 div
	inpath
		{curveto}
		{newpath x0 x1 add 2 div y0 y1 add -2 div moveto curveto stroke}
	ifelse
} bind def
0707070014231030521006440057030057030000010302600522627500600002600000030664post.src/dpost/font.c/*
 *
 * Typesetter font tables routines - for postprocessors.
 *
 */

#include <stdio.h>
#include <ctype.h>

#include "gen.h"
#include "ext.h"
#include "font.h"

Font	*mount[MAXFONTS+1];		/* mount table - pointers into fonts[] */
Font	fonts[MAXFONTS+2];		/* font data - guarantee one empty slot */

int	fcount;				/* entries in fonts[] */
int	mcount;				/* fonts currently in memory */
int	mlimit = MAXFONTS+1;		/* and the most we'll allow */

char	*chnames[MAXCH];		/* special character hash table */
int	nchnames;			/* number of entries in chnames[] */

extern int	devres;
extern int	unitwidth;
extern int	nfonts;

/*****************************************************************************/

checkdesc(path)

    char	*path;

{

    char	buf[150];
    FILE	*fp;
    int		val = 0;

/*
 *
 * Return non-zero if the typesetter description file path includes,
 *
 *	PDL PostScript
 *
 * before the charset table.
 *
 */

    if ( (fp = fopen(path, "r")) != NULL ) {
	while ( fscanf(fp, "%s", buf) != EOF ) {
	    if ( strcmp(buf, "PDL") == 0 ) {
		fscanf(fp, "%s", buf);
		val = strcmp(buf, "PostScript") == 0;
		break;
	    } else if ( strcmp(buf, "charset") == 0 )
		break;
	    skipline(fp);
	}   /* End while */
	fclose(fp);
    }	/* End if */

    return(val);

}   /* End of checkdesc */

/*****************************************************************************/

getdesc(path)

    char	*path;

{

    char	buf[150];
    FILE	*fp;
    int		n;

/*
 *
 * Read a typesetter description file. Font and size lists are discarded. Only
 * used to get to the start of the next command.
 *
 */

    if ( (fp = fopen(path, "r")) == NULL )
	return(-1);

    while ( fscanf(fp, "%s", buf) != EOF ) {
	if ( strcmp(buf, "res") == 0 )
	    fscanf(fp, "%d", &devres);
	else if ( strcmp(buf, "unitwidth") == 0 )
	    fscanf(fp, "%d", &unitwidth);
	else if ( strcmp(buf, "sizes") == 0 )
	    while ( fscanf(fp, "%d", &n) != EOF && n != 0 ) ;
	else if ( strcmp(buf, "inmemory") == 0 )
	    fscanf(fp, "%d", &mlimit);
	else if ( strcmp(buf, "Encoding") == 0 ) {
	    fscanf(fp, "%s", buf);
	    fontencoding = strsave(buf);
	} else if ( strcmp(buf, "fonts") == 0 ) {
	    fscanf(fp, "%d", &nfonts);
	    for ( n = 0; n < nfonts; n++ )
		fscanf(fp, "%s", buf);
	} else if ( strcmp(buf, "charset") == 0 ) {
	    while ( fscanf(fp, "%s", buf) != EOF )
		chadd(buf);
	    break;
	}   /* End if */
	skipline(fp);
    }	/* End while */

    fclose(fp);
    return(1);

}   /* End of getdesc */

/*****************************************************************************/

getfont(path, fpos)

    char	*path;
    Font	*fpos;

{

    FILE	*fin;
    Chwid	chtemp[MAXCH];
    static	Chwid chinit;
    int		i, nw, n, wid, code;
    char	buf[300], ch[100], s1[100], s2[100], s3[100], cmd[100];


/*
 *
 * Read a width table from path into *fpos. Skip unnamed characters, spacewidth,
 * ligatures, ascender/descender entries, and anything else not recognized. All
 * calls should come through mountfont().
 *
 */

    if ( fpos->state == INMEMORY )
	return(1);

    if ( (fin = fopen(path, "r")) == NULL )
	return(-1);

    if ( fpos->state == NEWFONT ) {
	if ( ++fcount > MAXFONTS+1 )
	    return(-1);
	fpos->path = strsave(path);
    }	/* End if */

    if ( ++mcount > mlimit && mcount > nfonts+1 )
	freefonts();

    for ( i = 0; i < ALPHABET-32; i++ )
	chtemp[i] = chinit;

    while ( fscanf(fin, "%s", cmd) != EOF ) {
	if ( strcmp(cmd, "name") == 0 ) {
	    release(fpos->name);
	    fscanf(fin, "%s", buf);
	    fpos->name = strsave(buf);
	} else if ( strcmp(cmd, "fontname") == 0 ) {
	    release(fpos->fontname);
	    fscanf(fin, "%s", buf);
	    fpos->fontname = strsave(buf);
	} else if ( strcmp(cmd, "special") == 0 )
	    fpos->specfont = 1;
	else if ( strcmp(cmd, "named") == 0 )	/* in prologue or somewhere else */
	    fpos->flags |= NAMED;
	else if ( strcmp(cmd, "charset") == 0 ) {
	    skipline(fin);
	    nw = ALPHABET-32;
	    while ( fgets(buf, sizeof(buf), fin) != NULL ) {
		sscanf(buf, "%s %s %s %s", ch, s1, s2, s3);
		if ( s1[0] != '"' ) {		/* not a synonym */
		    sscanf(s1, "%d", &wid);
		    code = strtol(s3, 0, 0);	/* dec/oct/hex */
		}   /* End if */
		if ( strlen(ch) == 1 ) {	/* it's ascii */
		    n = ch[0] - 32;		/* origin omits non-graphics */
		    chtemp[n].num = ch[0];
		    chtemp[n].wid = wid;
		    chtemp[n].code = code;
		} else if ( ch[0] == '\\' && ch[1] == '0' ) {
		    n = strtol(ch+1, 0, 0) - 32;	/* check against ALPHABET? */
		    chtemp[n].num = n + 32;
		    chtemp[n].wid = wid;
		    chtemp[n].code = code;
		} else if ( strcmp(ch, "---") != 0 ) {	/* ignore unnamed chars */
		    if ( (n = chindex(ch)) == -1 )	/* global? */
			n = chadd(ch);
		    chtemp[nw].num = n;
		    chtemp[nw].wid = wid;
		    chtemp[nw].code = code;
		    nw++;
		}   /* End else */
	    }	/* End while */
	    break;
	}   /* End else */
	skipline(fin);
    }	/* End while */

    fclose(fin);

    fpos->wp = (Chwid *)allocate(nw * sizeof(Chwid));
    for ( i = 0; i < nw; i++ )
	fpos->wp[i] = chtemp[i];

    fpos->nchars = nw;
    fpos->state = INMEMORY;

    return(1);

}   /* End of getfont */

/*****************************************************************************/

mountfont(path, m)

    char	*path;
    int		m;

{

    Font	*fpos;

/*
 *
 * Mount font table from file path at position m. Mounted fonts are guaranteed
 * to be in memory.
 *
 */

    if ( m < 0 || m > MAXFONTS )
	return(-1);

    if ( mount[m] != NULL ) {
	if ( mount[m]->path != NULL && strcmp(path, mount[m]->path) == 0 ) {
	    if ( mount[m]->state == INMEMORY )
		return(1);
	} else {
	    mount[m]->mounted--;
	    mount[m] = NULL;
	}   /* End else */
    }	/* End if */

    mount[m] = fpos = &fonts[findfont(path)];
    mount[m]->mounted++;
    return(getfont(path, fpos));

}   /* End of mountfont */

/*****************************************************************************/

freefonts()

{

    int		n;

/*
 *
 * Release memory used by all unmounted fonts - except for the path string.
 *
 */

    for ( n = 0; n < MAXFONTS+2; n++ )
	if ( fonts[n].state == INMEMORY && fonts[n].mounted == 0 ) {
	    release(fonts[n].wp);
	    fonts[n].wp = NULL;
	    fonts[n].state = RELEASED;
	    mcount--;
	}   /* End if */

}   /* End of freefonts */

/*****************************************************************************/

findfont(path)

    char	*path;

{

    register	n;

/*
 *
 * Look for path in the fonts table. Returns the index where it was found or can
 * be inserted (if not found).
 *
 */

    for ( n = hash(path, MAXFONTS+2); fonts[n].state != NEWFONT; n = (n+1) % (MAXFONTS+2) )
	if ( strcmp(path, fonts[n].path) == 0 )
	    break;
    return(n);

}   /* End of findfont */

/*****************************************************************************/

mounted(m)

    int		m;

{

/*
 *
 * Return 1 if a font is mounted at position m.
 *
 */

    return((m >= 0 && m <= MAXFONTS && mount[m] != NULL) ? 1 : 0);

}   /* End of mounted */

/*****************************************************************************/

onfont(c, m)

    int		c;
    int		m;

{

    register Font	*fp;
    register Chwid	*cp, *ep;

/*
 *
 * Returns the position of character c in the font mounted at m, or -1 if the
 * character is not found.
 *
 */

    if ( mounted(m) ) {
	fp = mount[m];
	if ( c < ALPHABET ) {
	    if ( fp->wp[c-32].num == c )	/* ascii at front */
		return c - 32;
	    else return -1;
	}   /* End if */

	cp = &fp->wp[ALPHABET-32];
	ep = &fp->wp[fp->nchars];
	for ( ; cp < ep; cp++ )			/* search others */
    	    if ( cp->num == c )
		return cp - &fp->wp[0];
    }	/* End if */

    return -1;

}   /* End of onfont */

/*****************************************************************************/

chwidth(n, m)

    int		n;
    int		m;

{

/*
 *
 * Return width of the character at position n in the font mounted at m. Skip
 * bounds checks - assume it's already been done.
 *
 */

    return(mount[m]->wp[n].wid);

}   /* End of chwidth */

/*****************************************************************************/

chcode(n, m)

    int		n;
    int		m;

{

/*
 *
 * Return typesetter code for the character at position n in the font mounted
 * at m. Skip bounds checks - assume it's already been done. 
 *
 */

    return(mount[m]->wp[n].code);

}   /* End of chcode */

/*****************************************************************************/

chindex(s)

    char	*s;

{

    register	i;

/*
 *
 * Look for s in global character name table. Hash table is guaranteed to have
 * at least one empty slot (by chadd()) so the loop terminate.
 *
 */

    for ( i = hash(s, MAXCH); chnames[i] != NULL; i = (i+1) % MAXCH )
	if ( strcmp(s, chnames[i]) == 0 )
	    return(i+ALPHABET);
    return(-1);

}   /* End of chindex */

/*****************************************************************************/

chadd(s)

    char	*s;

{

    register	i;

/*
 *
 * Add s to the global character name table. Leave one empty slot so loops
 * terminate.
 *
 */

    if ( nchnames >= MAXCH - 1 )
	error(FATAL, "out of table space adding character %s", s);

    for ( i = hash(s, MAXCH); chnames[i] != NULL; i = (i+1) % MAXCH ) ;

    nchnames++;
    chnames[i] = strsave(s);

    return(i+ALPHABET);

}   /* End of chadd */

/*****************************************************************************/

char *chname(n)

    int		n;

{

/*
 *
 * Returns string for the character with index n.
 *
 */

    return(chnames[n-ALPHABET]);

}   /* End of chname */

/*****************************************************************************/

hash(s, l)

    char	*s;
    int		l;

{

    register	i;

/*
 *
 * Return the hash index for string s in a table of length l. Probably should
 * make i unsigned and mod once at the end.
 *
 */

    for ( i = 0; *s != '\0'; s++ )
	i = (i * 10 + *s) % l;
    return(i);

}   /* End of hash */

/*****************************************************************************/

char *strsave(s)

    char	*s;

{

    char	*ptr = NULL;

/*
 *
 * Make a permanent copy of string s.
 *
 */

    if ( s != NULL ) {
	ptr = (char *)allocate(strlen(s)+1);
	strcpy(ptr, s);
    }	/* End if */
    return(ptr);

}   /* End of strsave */

/*****************************************************************************/

char *allocate(count)

    int		count;

{

    char	*ptr;

/*
 *
 * Allocates count bytes. Free unmounted fonts if the first attempt fails. To
 * be absolutely correct all memory allocation should be done by this routine.
 *
 */

    if ( (ptr = (char *)malloc(count)) == NULL ) {
	freefonts();
	if ( (ptr = (char *)malloc(count)) == NULL )
	    error(FATAL, "no memory");
    }	/* End if */
    return(ptr);

}   /* End of allocate */

/*****************************************************************************/

release(ptr)

    char	*ptr;

{

/*
 *
 * Free memory provided ptr isn't NULL.
 *
 */

    if ( ptr != NULL )
	free(ptr);

}   /* End of release */

/*****************************************************************************/

dumpmount(m)

    int		m;

{

/*
 *
 * Dumps the font mounted at position n.
 *
 */

    if ( mount[m] != NULL )
	dumpfont((mount[m] - &fonts[0]));
    else fprintf(stderr, "no font mounted at %d\n", m);

}   /* End of dumpmount */

/*****************************************************************************/

dumpfont(n)

    int		n;

{

    int		i;
    Font	*fpos;
    char	*str;

/*
 *
 * Dump of everything known about the font saved at fonts[n].
 *
 */

    fpos = &fonts[n];

    if ( fpos->state ) {
	fprintf(stderr, "path %s\n", fpos->path);
	fprintf(stderr, "state %d\n", fpos->state);
	fprintf(stderr, "flags %d\n", fpos->flags);
	fprintf(stderr, "mounted %d\n", fpos->mounted);
	fprintf(stderr, "nchars %d\n", fpos->nchars);
	fprintf(stderr, "special %d\n", fpos->specfont);
	fprintf(stderr, "name %s\n", fpos->name);
	fprintf(stderr, "fontname %s\n", fpos->fontname);
	if ( fpos->state == INMEMORY ) {
	    fprintf(stderr, "charset\n");
	    for ( i = 0; i < fpos->nchars; i++ ) {
		if ( fpos->wp[i].num > 0 ) {
		    if ( fpos->wp[i].num < ALPHABET )
			fprintf(stderr, "%c\t%d\t%d\n", fpos->wp[i].num,
				fpos->wp[i].wid, fpos->wp[i].code);
		    else {
			str = chname(fpos->wp[i].num);
			if ( *str == '#' && isdigit(*(str+1)) && isdigit(*(str+2)) )
			    str = "---";
			fprintf(stderr, "%s\t%d\t%d\n", str, fpos->wp[i].wid,
				fpos->wp[i].code);
		    }	/* End else */
		}   /* End if */
	    }	/* End for */
	} else fprintf(stderr, "charset: not in memory\n");
    } else fprintf(stderr, "empty font: %d\n", n);

    putc('\n', stderr);

}   /* End of dumpfont */

/*****************************************************************************/

0707070014231030531006440057030057030000010277660522627500700002600000002616post.src/dpost/font.h/*
 *
 * Characteristics of a font - for postprocessors. Differs some from the troff
 * version.
 *
 */

#define ALPHABET	256		/* characters in basic alphabet */
#define MAXCH		512
#define MAXFONTS	99

/*
 *
 * State of a table entry in fonts[].
 *
 */

#define NEWFONT		0
#define RELEASED	1
#define INMEMORY	2

/*
 *
 * Flags - for setting bits in a font's flag field.
 *
 */

#define USED		1
#define NAMED		2

#define skipline(f)	while ( getc(f) != '\n' )

/*
 *
 * Data about each character on a font. Omitted the ascender/descender field.
 * An unsigned char is good enough for the code field on PostScript printers.
 *
 */

typedef struct {
	short		num;	/* 0 means not on this font */
	unsigned char	wid;	/* width */
	unsigned char	code;	/* code for actual device. */
} Chwid;

/*
 *
 * Font header - one for each available position.
 *
 */

typedef struct {
	char	*path;		/* where it came from */
	char	*name;		/* as known to troff */
	char	*fontname;	/* real name (e.g. Times-Roman) */
	char	state;		/* NEWFONT, RELEASED, or INMEMORY */
	char	flags;		/* for now just USED and NAMED */
	char	mounted;	/* mounted on this many positions */
	char	specfont;	/* 1 == special font */
	short	nchars;		/* number of width entries for this font */
	Chwid	*wp;		/* widths, etc., of the real characters */
} Font;

/*
 *
 * Non-integer functions.
 *
 */

extern char	*chname();
extern char	*strsave();
extern char	*allocate();

0707070014231030541006440057030057030000010301450522627500700003000000000272post.src/dpost/motion.h/*
 *
 * Position adjusting macros.
 *
 */

#define hgoto(n)	hpos = n
#define hmot(n)		hpos += n
#define vgoto(n)	vpos = n
#define vmot(n)		vpos += n

extern int	hpos;
extern int	vpos;

0707070014231030551006440057030057030000010303200522627500700003200000023077post.src/dpost/pictures.c/*
 *
 * PostScript picture inclusion routines. Support for managing in-line pictures
 * has been added, and works in combination with the simple picpack pre-processor
 * that's supplied with this package. An in-line picture begins with a special
 * device control command that looks like,
 *
 *		x X InlinPicture name size
 *
 * where name is the pathname of the original picture file and size is the number
 * of bytes in the picture, which begins immediately on the next line. When dpost
 * encounters the InlinePicture device control command inlinepic() is called and
 * that routine appends the string name and the integer size to a temporary file
 * (fp_pic) and then adds the next size bytes read from the current input file to
 * file fp_pic. All in-line pictures are saved in fp_pic and located later using
 * the name string and picture file size that separate pictures saved in fp_pic.
 *
 * When a picture request (ie. an "x X PI" command) is encountered picopen() is
 * called and it first looks for the picture file in fp_pic. If it's found there
 * the entire picture (ie. size bytes) is copied from fp_pic to a new temp file
 * and that temp file is used as the picture file. If there's nothing in fp_pic
 * or if the lookup failed the original route is taken.
 *
 * Support for in-line pictures is an attempt to address requirements, expressed
 * by several organizations, of being able to store a document as a single file
 * (usually troff input) that can then be sent through dpost and ultimately to
 * a PostScript printer. The mechanism may help some users, but the are obvious
 * disadvantages to this approach, and the original mechanism is the recommended
 * approach! Perhaps the most important problem is that troff output, with in-line
 * pictures included, doesn't fit the device independent language accepted by
 * important post-processors (like proff) and that means you won't be able to
 * reliably preview a packed file on your 5620 (or whatever).
 *
 */

#include <stdio.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* just for TEMPDIR definition */
#include "ext.h"			/* external variable declarations */

FILE	*fp_pic = NULL;			/* in-line pictures go here */
FILE	*picopen();

extern int	res, hpos, vpos;
extern int	picflag;
extern FILE	*tf;

/*****************************************************************************/

picture(buf)

    char	*buf;		/* stuff following 'x X PI' command */

{

    int		poffset;	/* page offset */
    int		indent;		/* indent */
    int		length;		/* line length  */
    int		totrap;		/* distance to next trap */
    char	name[100];	/* picture file and page string */
    char	hwo[40], *p;	/* height, width and offset strings */
    char	flags[20];	/* miscellaneous stuff */
    int		page = 1;	/* page number pulled from name[] */
    double	frame[4];	/* height, width, y, and x offsets from hwo[] */
    char	units;		/* scale indicator for frame dimensions */
    int		whiteout = 0;	/* white out the box? */
    int		outline = 0;	/* draw a box around the picture? */
    int		scaleboth = 0;	/* scale both dimensions? */
    double	adjx = 0.5;	/* left-right adjustment */
    double	adjy = 0.5;	/* top-bottom adjustment */
    double	rot = 0;	/* rotation in clockwise degrees */
    FILE	*fp_in;		/* for *name */
    int		i;		/* loop index */

    char	*strchr();

/*
 *
 * Called from devcntrl() after an 'x X PI' command is found. The syntax of that
 * command is:
 *
 *	x X PI:args
 *
 * with args separated by colons and given by:
 *
 *	poffset
 *	indent
 *	length
 *	totrap
 *	file[(page)]
 *	height[,width[,yoffset[,xoffset]]]
 *	[flags]
 *
 * poffset, indent, length, and totrap are given in machine units. height, width,
 * and offset refer to the picture frame in inches, unless they're followed by
 * the u scale indicator. flags is a string that provides a little bit of control
 * over the placement of the picture in the frame. Rotation of the picture, in
 * clockwise degrees, is set by the a flag. If it's not followed by an angle
 * the current rotation angle is incremented by 90 degrees, otherwise the angle
 * is set by the number that immediately follows the a.
 *
 */

    if ( picflag == OFF )		/* skip it */
	return;

    flushtext();

    flags[0] = '\0';			/* just to be safe */
    if ( sscanf(buf, "%d:%d:%d:%d:%[^:]:%[^:]:%[^:]", &poffset, &indent,
		&length, &totrap, name, hwo, flags) < 6 ) {
	    error(NON_FATAL, "too few arguments to specify picture");
	    return;
    }	/* End if */

    if ( sscanf(name, "%*[^(](%d", &page) == 1 )	/* grab the page number */
	strtok(name, "(");			/* and separate it from the name */

    if ( (fp_in = picopen(name)) == NULL ) {
	error(NON_FATAL, "can't open picture file %s", name);
	return;
    }	/* End if */

    frame[0] = frame[1] = -1;		/* default frame height, width */
    frame[2] = frame[3] = 0;		/* and y and x offsets */

    for ( i = 0, p = hwo-1; i < 4 && p != NULL; i++, p = strchr(p, ',') )
	if ( sscanf(++p, "%lf%c", &frame[i], &units) == 2 )
	    if ( units == 'i' || units == ',' || units == '\0' )
		frame[i] *= res;

    if ( frame[0] <= 0 )		/* check what we got for height */
	frame[0] = totrap;

    if ( frame[1] <= 0 )		/* and width - check too big?? */
	frame[1] = length - indent;

    frame[3] += poffset + indent;	/* real x offset */

    for ( i = 0; flags[i]; i++ )
	switch ( flags[i] ) {
	    case 'c': adjx = adjy = 0.5; break;	/* move to the center */
	    case 'l': adjx = 0; break;		/* left */
	    case 'r': adjx = 1; break;		/* right */
	    case 't': adjy = 1; break;		/* top */
	    case 'b': adjy = 0; break;		/* or bottom justify */
	    case 'o': outline = 1; break;	/* outline the picture */
	    case 'w': whiteout = 1; break;	/* white out the box */
	    case 's': scaleboth = 1; break;	/* scale both dimensions */
	    case 'a': if ( sscanf(&flags[i+1], "%lf", &rot) != 1 )
			  rot += 90;
	}   /* End switch */

    restore();
    ps_include(fp_in, tf, page, whiteout, outline, scaleboth,
		frame[3]+frame[1]/2, -vpos-frame[2]-frame[0]/2, frame[1], frame[0], adjx, adjy, -rot);
    save();
    fclose(fp_in);

}   /* End of picture */

/*****************************************************************************/

FILE *picopen(path)

    char	*path;			/* picture file pathname */

{

    char	name[100];		/* pathnames */
    long	pos;			/* current position */
    long	total;			/* and sizes - from *fp_pic */
    char	*tname;			/* pathname */
    FILE	*fp;			/* and pointer for the new temp file */

/*
 *
 * Responsible for finding and opening the next picture file. If we've accumulated
 * any in-line pictures fp_pic won't be NULL and we'll look there first. If *path
 * is found in *fp_pic we create another temp file, open it for update, unlink it,
 * copy in the picture, seek back to the start of the new temp file, and return
 * the file pointer to the caller. If fp_pic is NULL or the lookup fails we just
 * open file *path and return the resulting file pointer to the caller.
 *
 */

    if ( fp_pic != NULL ) {
	fseek(fp_pic, 0L, 0);
	while ( fscanf(fp_pic, "%s %ld\n", name, &total) != EOF ) {
	    pos = ftell(fp_pic);
	    if ( strcmp(path, name) == 0 ) {
		if ( (tname = tempnam(TEMPDIR, "dpost")) == NULL )
		    error(FATAL, "can't generate temp file name");
		if ( (fp = fopen(tname, "w+r")) == NULL )
		    error(FATAL, "can't open %s", tname);
		unlink(tname);
		free(tname);
		piccopy(fp_pic, fp, total);
		fseek(fp, 0L, 0);
		return(fp);
	    }   /* End if */
	    fseek(fp_pic, total+pos, 0);
	}   /* End while */
    }	/* End if */

    return(fopen(path, "r"));

}   /* End of picopen */

/*****************************************************************************/

inlinepic(fp, buf)

    FILE	*fp;			/* current input file */
    char	*buf;			/* whatever followed "x X InlinePicture" */

{

    char	*tname;			/* temp file pathname - for *fp_pic */
    char	name[100];		/* picture file pathname */
    long	total;			/* and size - both from *buf */

/*
 *
 * Adds an in-line picture file to the end of temporary file *fp_pic. All pictures
 * grabbed from the input file are saved in the same temp file. Each is preceeded
 * by a one line header that includes the original picture file pathname and the
 * size of the picture in bytes. The in-line picture file is opened for update,
 * left open, and unlinked so it disappears when we do.
 *
 */

    if ( fp_pic == NULL ) {
	if ( (tname = tempnam(TEMPDIR, "dpost")) == NULL )
	    error(FATAL, "can't generate in-line picture file name");
	if ( (fp_pic = fopen(tname, "w+r")) == NULL )
	    error(FATAL, "can't open in-line picture file %s", tname);
	unlink(tname);
    }	/* End if */

    if ( sscanf(buf, "%s %ld", name, &total) != 2 )
	error(FATAL, "in-line picture error");

    fseek(fp_pic, 0L, 2);
    fprintf(fp_pic, "%s %ld\n", name, total);
    getc(fp);
    fflush(fp_pic);
    piccopy(fp, fp_pic, total);
    ungetc('\n', fp);

}   /* End of inlinepic */

/*****************************************************************************/

piccopy(fp_in, fp_out, total)

    FILE	*fp_in;			/* input */
    FILE	*fp_out;		/* and output file pointers */
    long	total;			/* number of bytes to be copied */

{

    long	i;			/* loop index */

/*
 *
 * Copies total bytes from file fp_in to fp_out. Used to append picture files to
 * *fp_pic and then copy them to yet another temporary file immediately before
 * they're used (in picture()).
 *
 */

    for ( i = 0; i < total; i++ )
	if ( putc(getc(fp_in), fp_out) == EOF )
	    error(FATAL, "error copying in-line picture file");
    fflush(fp_out);

}   /* End of piccopy */

/*****************************************************************************/

0707070014231030561006440057030057030000010301650522627500700003600000000262post.src/dpost/ps_include.awk/^->/ {
	if(ndef)
		printf("\t0\n};\n\n")
	printf("static char *%s[] = {\n", $2)
	ndef++
	next
}
/^#/ {next}
$0 != "" {printf("\t\"%s\",\n", $0); next}
END {printf("\t0\n};\n")}
0707070014231030571006440057030057030000010303400522627500700003400000012407post.src/dpost/ps_include.c
#include <stdio.h>
#include "ps_include.h"

#define has(word)	(strncmp(buf, word, strlen(word)) == 0)
#define grab(n)		((Section *)(nglobal \
			? realloc((char *)global, n*sizeof(Section)) \
			: calloc(n, sizeof(Section))))

char	buf[512];
typedef struct {long start, end;} Section;

extern char	*calloc(), *realloc();


ps_include(fin, fout, page_no, whiteout, outline, scaleboth, cx, cy, sx, sy, ax, ay, rot)


    FILE	*fin, *fout;		/* input and output files */
    int		page_no;		/* physical page number from *fin */
    int		whiteout;		/* erase picture area */
    int		outline;		/* draw a box around it and */
    int		scaleboth;		/* scale both dimensions - if not zero */
    double	cx, cy;			/* center of the picture and */
    double	sx, sy;			/* its size - in current coordinates */
    double	ax, ay;			/* left-right, up-down adjustment */
    double	rot;			/* rotation - in clockwise degrees */


{


    int		foundpage = 0;		/* found the page when non zero */
    int		foundpbox = 0;		/* found the page bounding box */
    int		nglobal = 0;		/* number of global defs so far */
    int		maxglobal = 0;		/* and the number we've got room for */
    Section	prolog, page, trailer;	/* prologue, page, and trailer offsets */
    Section	*global;		/* offsets for all global definitions */
    double	llx, lly;		/* lower left and */
    double	urx, ury;		/* upper right corners - default coords */
    double	w = whiteout != 0;	/* mostly for the var() macro */
    double	o = outline != 0;
    double	s = scaleboth != 0;
    int		i;			/* loop index */


/*
 *
 * Reads a PostScript file (*fin), and uses structuring comments to locate the
 * prologue, trailer, global definitions, and the requested page. After the whole
 * file is scanned, the  special ps_include PostScript definitions are copied to
 * *fout, followed by the prologue, global definitions, the requested page, and
 * the trailer. Before returning the initial environment (saved in PS_head) is
 * restored.
 *
 * By default we assume the picture is 8.5 by 11 inches, but the BoundingBox
 * comment, if found, takes precedence.
 *
 */


	llx = lly = 0;			/* default BoundingBox - 8.5x11 inches */
	urx = 72 * 8.5;
	ury = 72 * 11.0;

	/* section boundaries and bounding box */

	prolog.start = prolog.end = 0;
	page.start = page.end = 0;
	trailer.start = 0;
	fseek(fin, 0L, 0);

	while ( fgets(buf, sizeof(buf), fin) != NULL )
		if (!has("%%"))
			continue;
		else if (has("%%Page: ")) {
			if (!foundpage)
				page.start = ftell(fin);
			sscanf(buf, "%*s %*s %d", &i);
			if (i == page_no)
				foundpage = 1;
			else if (foundpage && page.end <= page.start)
				page.end = ftell(fin);
		} else if (has("%%EndPage: ")) {
			sscanf(buf, "%*s %*s %d", &i);
			if (i == page_no) {
				foundpage = 1;
				page.end = ftell(fin);
			}
			if (!foundpage)
				page.start = ftell(fin);
		} else if (has("%%PageBoundingBox: ")) {
			if (i == page_no) {
				foundpbox = 1;
				sscanf(buf, "%*s %lf %lf %lf %lf",
						&llx, &lly, &urx, &ury);
			}
		} else if (has("%%BoundingBox: ")) {
			if (!foundpbox)
				sscanf(buf,"%*s %lf %lf %lf %lf",
						&llx, &lly, &urx, &ury);
		} else if (has("%%EndProlog") || has("%%EndSetup") || has("%%EndDocumentSetup"))
			prolog.end = page.start = ftell(fin);
		else if (has("%%Trailer"))
			trailer.start = ftell(fin);
		else if (has("%%BeginGlobal")) {
			if (page.end <= page.start) {
				if (nglobal >= maxglobal) {
					maxglobal += 20;
					global = grab(maxglobal);
				}
				global[nglobal].start = ftell(fin);
			}
		} else if (has("%%EndGlobal"))
			if (page.end <= page.start)
				global[nglobal++].end = ftell(fin);

	fseek(fin, 0L, 2);
	if (trailer.start == 0)
		trailer.start = ftell(fin);
	trailer.end = ftell(fin);

	if (page.end <= page.start)
		page.end = trailer.start;

/*
fprintf(stderr, "prolog=(%d,%d)\n", prolog.start, prolog.end);
fprintf(stderr, "page=(%d,%d)\n", page.start, page.end);
for(i = 0; i < nglobal; i++)
	fprintf(stderr, "global[%d]=(%d,%d)\n", i, global[i].start, global[i].end);
fprintf(stderr, "trailer=(%d,%d)\n", trailer.start, trailer.end);
*/

	/* all output here */
	print(fout, PS_head);
/*
 * Unix 4.0 didn't like the var macro.
 *
	var(llx); var(lly); var(urx); var(ury); var(w); var(o); var(s);
	var(cx); var(cy); var(sx); var(sy); var(ax); var(ay); var(rot);
 *
 */

	fprintf(fout, "/llx %g def\n", llx);
	fprintf(fout, "/lly %g def\n", lly);
	fprintf(fout, "/urx %g def\n", urx);
	fprintf(fout, "/ury %g def\n", ury);
	fprintf(fout, "/w %g def\n", w);
	fprintf(fout, "/o %g def\n", o);
	fprintf(fout, "/s %g def\n", s);
	fprintf(fout, "/cx %g def\n", cx);
	fprintf(fout, "/cy %g def\n", cy);
	fprintf(fout, "/sx %g def\n", sx);
	fprintf(fout, "/sy %g def\n", sy);
	fprintf(fout, "/ax %g def\n", ax);
	fprintf(fout, "/ay %g def\n", ay);
	fprintf(fout, "/rot %g def\n", rot);

	print(fout, PS_setup);
	copy(fin, fout, &prolog);
	for(i = 0; i < nglobal; i++)
		copy(fin, fout, &global[i]);
	copy(fin, fout, &page);
	copy(fin, fout, &trailer);
	print(fout, PS_tail);

	if(nglobal)
		free(global);

}

static
print(fout, s)
FILE *fout;
char **s;
{
	while (*s)
		fprintf(fout, "%s\n", *s++);
}

static
copy(fin, fout, s)
FILE *fin, *fout;
Section *s;
{
	if (s->end <= s->start)
		return;
	fseek(fin, s->start, 0);
	while (ftell(fin) < s->end && fgets(buf, sizeof(buf), fin) != NULL)
		if (buf[0] != '%')
			fprintf(fout, "%s", buf);
}

0707070014231030601006440057030057030000010301660522627500700003400000003752post.src/dpost/ps_include.hstatic char *PS_head[] = {
	"%ps_include: begin",
	"save",
	"/ed {exch def} def",
	"{} /showpage ed",
	"{} /copypage ed",
	"{} /erasepage ed",
	"{} /letter ed",
	"currentdict /findfont known systemdict /findfont known and {",
	"	/findfont systemdict /findfont get def",
	"} if",
	"36 dict dup /PS-include-dict-dw ed begin",
	"/context ed",
	"count array astore /o-stack ed",
	"%ps_include: variables begin",
	0
};

static char *PS_setup[] = {
	"%ps_include: variables end",
	"{llx lly urx ury} /bbox ed",
	"{newpath 2 index exch 2 index exch dup 6 index exch",
	" moveto 3 {lineto} repeat closepath} /boxpath ed",
	"{dup mul exch dup mul add sqrt} /len ed",
	"{2 copy gt {exch} if pop} /min ed",
	"{2 copy lt {exch} if pop} /max ed",
	"{transform round exch round exch A itransform} /nice ed",
	"{6 array} /n ed",
	"n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed",
	"urx llx sub 0 A dtransform len /Sx ed",
	"0 ury lly sub A dtransform len /Sy ed",
	"llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed",
	"rot dup sin abs /S ed cos abs /C ed",
	"Sx S mul Sy C mul add /H ed",
	"Sx C mul Sy S mul add /W ed",
	"sy H div /Scaley ed",
	"sx W div /Scalex ed",
	"s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if",
	"sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed",
	"sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed",
	"urx llx sub 0 A dtransform exch atan rot exch sub /rot ed",
	"n currentmatrix initgraphics setmatrix",
	"cx cy translate",
	"Scalex Scaley scale",
	"rot rotate",
	"Cx neg Cy neg translate",
	"A concat",
	"bbox boxpath clip newpath",
	"w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if",
	"end",
	"gsave",
	"%ps_include: inclusion begin",
	0
};

static char *PS_tail[] = {
	"%ps_include: inclusion end",
	"grestore",
	"PS-include-dict-dw begin",
	"o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice",
	"	initgraphics 0.1 setlinewidth boxpath stroke grestore} if",
	"clear o-stack aload pop",
	"context end restore",
	"%ps_include: end",
	0
};
0707070014231030611006440057030057030000010303600522627500700003500000007004post.src/dpost/ps_include.ps-> PS_head

%ps_include: begin
save
/ed {exch def} def

# redefine dangerous operators
{} /showpage ed
{} /copypage ed
{} /erasepage ed
{} /letter ed

# restore findfont from systemdict if it looks like it's be redefined
currentdict /findfont known systemdict /findfont known and {
	/findfont systemdict /findfont get def
} if

# computations are done in the context of a new dictionary
36 dict dup /PS-include-dict-dw ed begin

# context holds the save object created earlier
/context ed

# save and clear the operand stack
count array astore /o-stack ed

# the following variables are now expected:
#	llx,lly,urx,ury	bounding box of picture to be included
#	w		nonzero if space should be painted white to start
#	o		nonzero if space should be outlined
#	s		nonzero if both dimensions should be scaled
#	cx,cy		center of page space in current coordinates
#	sx,sy		size of page space in current coordinates
#	ax,ay		left-right, up-down adjustment of picture in page space
#	rot		rotation of picture in page space
%ps_include: variables begin



-> PS_setup

%ps_include: variables end

# some routines:
# - BBOX llx lly urx ury	put bounding box on stack
# llx lly urx ury BOXPATH -	make a path with given box corners
# dx dy LEN length		compute length of positionless vector
# a b MIN min			compute minimum of two numbers
# a b MAX max			compute maximum of two numbers
# x y NICE x y			move to pixel boundaries in default coords
{llx lly urx ury} /bbox ed
{newpath 2 index exch 2 index exch dup 6 index exch
 moveto 3 {lineto} repeat closepath} /boxpath ed
{dup mul exch dup mul add sqrt} /len ed
{2 copy gt {exch} if pop} /min ed
{2 copy lt {exch} if pop} /max ed
{transform round exch round exch A itransform} /nice ed

# A is the transformation from default to current coordinates
{6 array} /n ed
n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed

# Sx,Sy and Cx,Cy are dimensions and size of bounding box in current coordinates
urx llx sub 0 A dtransform len /Sx ed
0 ury lly sub A dtransform len /Sy ed
llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed

# H and W are height and width of rotated box in current coordinates
rot dup sin abs /S ed cos abs /C ed
Sx S mul Sy C mul add /H ed
Sx C mul Sy S mul add /W ed

# Scalex and Scaley are the required horizontal and vertical scaling factors
sy H div /Scaley ed
sx W div /Scalex ed

# Preserve aspect ratio if we're not scaling both dimensions (ie. s is 0)
s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if

# add to cx,cy the shift needed within the page space
sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed
sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed

# the actual rotation needed is rot less the current rotation
urx llx sub 0 A dtransform exch atan rot exch sub /rot ed

# set up the coordinate system
n currentmatrix initgraphics setmatrix
cx cy translate
Scalex Scaley scale
rot rotate
Cx neg Cy neg translate
A concat

# set the clipping region, and conditionally whiteout and outline
bbox boxpath clip newpath
w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if

# pop local dictionary from the dict stack
end

# now begins the actual material extracted from the file
gsave
%ps_include: inclusion begin



-> PS_tail

%ps_include: inclusion end
grestore

# within the context of the local dictionary ...
PS-include-dict-dw begin

o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice
	initgraphics 0.1 setlinewidth boxpath stroke grestore} if

# ... restore the operand stack and the save context
clear o-stack aload pop
context end restore
%ps_include: end
0707070014231216400407550057030057030000020630640522633076600002300000000000post.src/postprint0707070014231216411006440057030057030000010630650522627500700003200000000175post.src/postprint/README
Simple ASCII file to PostScript translator. The -e options is new
and allows access to all characters in PostScript fonts.

0707070014231216421006440057030057030000010636000522627500700003700000051204post.src/postprint/postprint.c/*
 *
 * postprint - PostScript translator for ASCII files.
 *
 * A simple program that translates ASCII files into PostScript. All it really
 * does is expand tabs and backspaces, handle character quoting, print text lines,
 * and control when pages are started based on the requested number of lines per
 * page.
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following procedures are defined
 * in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how the program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects
 *	    to find the current page number on the stack.
 *
 *	l
 *
 *	  string l -
 *
 *	    Prints string starting in the first column and then goes to the next
 *	    line.
 *
 *	L
 *
 *	  mark string column string column ... L mark
 *
 *	    Prints each string on the stack starting at the horizontal position
 *	    selected by column. Used when tabs and spaces can be sufficiently well
 *	    compressed to make the printer overhead worthwhile. Always used when
 *	    we have to back up.
 *
 *	LL
 *
 *	  mark string column string column ... LL mark
 *
 *	    Like L, but only used to prevent potential PostScript stack overflow
 *	    from too many string/column pairs. Stays on the current line. It will
 *	    not be needed often!!
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * Almost everything has been changed in this version of postprint. The program
 * is more intelligent, especially about tabs, spaces, and backspacing, and as a
 * result output files usually print faster. Output files also now conform to
 * Adobe's file structuring conventions, which is undoubtedly something I should
 * have done in the first version of the program. If the number of lines per page
 * is set to 0, which can be done using the -l option, pointsize will be used to
 * guess a reasonable value. The estimate is based on the values of LINESPP,
 * POINTSIZE, and pointsize, and assumes LINESPP lines would fit on a page if
 * we printed in size POINTSIZE. Selecting a point size using the -s option and
 * adding -l0 to the command line forces the guess to be made.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable declarations */
#include "postprint.h"			/* a few special definitions */

char	*optnames = "a:c:ef:l:m:n:o:p:r:s:t:x:y:A:C:E:J:L:P:R:DI";

char	*prologue = POSTPRINT;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */

int	linespp = LINESPP;		/* number of lines per page */
int	pointsize = POINTSIZE;		/* in this point size */
int	tabstops = TABSTOPS;		/* tabs set at these columns */
int	crmode = 0;			/* carriage return mode - 0, 1, or 2 */
int	extended = TRUE;		/* use escapes for unprintable chars */

int	col = 1;			/* next character goes in this column */
int	line = 1;			/* on this line */

int	stringcount = 0;		/* number of strings on the stack */
int	stringstart = 1;		/* column where current one starts */

Fontmap	fontmap[] = FONTMAP;		/* for translating font names */
char	*fontname = "Courier";		/* use this PostScript font */

int	page = 0;			/* page we're working on */
int	printed = 0;			/* printed this many pages */

FILE	*fp_in = stdin;			/* read from this file */
FILE	*fp_out = stdout;		/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that translates ASCII files into PostScript. If there's more
 * than one input file, each begins on a new page.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* really just for error messages */

    init_signals();			/* sets up interrupt handling */
    header();				/* PostScript header and prologue */
    options();				/* handle the command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Makes sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN ) {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    if ( DOROUND )
	cat(ROUNDPAGE);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */

/*
 *
 * Reads and processes the command line options. Added the -P option so arbitrary
 * PostScript code can be passed through. Expect it could be useful for changing
 * definitions in the prologue for which options have not been defined.
 *
 * Although any PostScript font can be used, things will only work well for
 * constant width fonts.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF ) {
	switch ( ch ) {

	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'e':			/* obsolete - it's now always on */
		    extended = TRUE;
		    break;

	    case 'f':			/* use this PostScript font */
		    fontname = get_font(optarg);
		    fprintf(stdout, "/font /%s def\n", fontname);
		    break;

	    case 'l':			/* lines per page */
		    linespp = atoi(optarg);
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'r':			/* carriage return mode */
		    crmode = atoi(optarg);
		    break;

	    case 's':			/* point size */
		    pointsize = atoi(optarg);
		    fprintf(stdout, "/pointsize %s def\n", optarg);
		    break;

	    case 't':			/* tabstops */
		    tabstops = atoi(optarg);
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

char *get_font(name)

    char	*name;			/* name the user asked for */

{

    int		i;			/* for looking through fontmap[] */

/*
 *
 * Called from options() to map a user's font name into a legal PostScript name.
 * If the lookup fails *name is returned to the caller. That should let you choose
 * any PostScript font, although things will only work well for constant width
 * fonts.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].val);

    return(name);

}   /* End of get_font */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed. linespp (lines per page) can be set using the -l
 * option. If it's not positive we calculate a reasonable value using the
 * requested point size - assuming LINESPP lines fit on a page in point size
 * POINTSIZE.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 ) {
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

    if ( linespp <= 0 )
	linespp = LINESPP * POINTSIZE / pointsize;

}   /* End of setup */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll translate stdin.
 *
 */

    if ( argc < 1 )
	text();
    else {				/* at least one argument is left */
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    text();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */
    }   /* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files, so mark the end of the pages with a TRAILER
 * comment, make sure the last page prints, and add things like the PAGES comment
 * that can only be determined after all the input files have been read.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname);
    fprintf(stdout, "%s %d\n", PAGES, printed);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct provided it's not NULL. Accounting is
 * requested using the -A or -J options.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

text()

{

    int		ch;			/* next input character */

/*
 *
 * Translates *fp_in into PostScript. Intercepts space, tab, backspace, newline,
 * return, and formfeed. Everything else goes to oput(), which handles quoting
 * (if needed) and escapes for nonascii characters if extended is TRUE. The
 * redirect(-1) call forces the initial output to go to /dev/null - so stuff
 * that formfeed() does at the end of each page goes to /dev/null rather than
 * the real output file.
 *
 */

    redirect(-1);			/* get ready for the first page */
    formfeed();				/* force PAGE comment etc. */

    while ( (ch = getc(fp_in)) != EOF )
	switch ( ch ) {
	    case '\n':
		    newline();
		    break;

	    case '\t':
	    case '\b':
	    case ' ':
		    spaces(ch);
		    break;

	    case '\014':
		    formfeed();
		    break;

	    case '\r':
		    if ( crmode == 1 )
			spaces(ch);
		    else if ( crmode == 2 )
			newline();
		    break;

	    default:
		    oput(ch);
		    break;
	}   /* End switch */

    formfeed();				/* next file starts on a new page? */

}   /* End of text */

/*****************************************************************************/

formfeed()

{

/*
 *
 * Called whenever we've finished with the last page and want to get ready for the
 * next one. Also used at the beginning and end of each input file, so we have to
 * be careful about what's done. The first time through (up to the redirect() call)
 * output goes to /dev/null.
 *
 * Adobe now recommends that the showpage operator occur after the page level
 * restore so it can be easily redefined to have side-effects in the printer's VM.
 * Although it seems reasonable I haven't implemented it, because it makes other
 * things, like selectively setting manual feed or choosing an alternate paper
 * tray, clumsy - at least on a per page basis. 
 *
 */

    if ( fp_out == stdout )		/* count the last page */
	printed++;

    endline();				/* print the last line */

    fprintf(fp_out, "cleartomark\n");
    fprintf(fp_out, "showpage\n");
    fprintf(fp_out, "saveobj restore\n");
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);

    if ( ungetc(getc(fp_in), fp_in) == EOF )
	redirect(-1);
    else redirect(++page);

    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fprintf(fp_out, "/saveobj save def\n");
    fprintf(fp_out, "mark\n");
    writerequest(printed+1, fp_out);
    fprintf(fp_out, "%d pagesetup\n", printed+1);

    line = 1;

}   /* End of formfeed */

/*****************************************************************************/

newline()

{

/*
 *
 * Called when we've read a newline character. The call to startline() ensures
 * that at least an empty string is on the stack.
 *
 */

    startline();
    endline();				/* print the current line */

    if ( ++line > linespp )		/* done with this page */
	formfeed();

}   /* End of newline */

/*****************************************************************************/

spaces(ch)

    int		ch;			/* next input character */

{

    int		endcol;			/* ending column */
    int		i;			/* final distance - in spaces */

/*
 *
 * Counts consecutive spaces, tabs, and backspaces and figures out where the next
 * string should start. Once that's been done we try to choose an efficient way
 * to output the required number of spaces. The choice is between using procedure
 * l with a single string on the stack and L with several string and column pairs.
 * We usually break even, in terms of the size of the output file, if we need four
 * consecutive spaces. More means using L decreases the size of the file. For now
 * if there are less than 6 consecutive spaces we just add them to the current
 * string, otherwise we end that string, follow it by its starting position, and
 * begin a new one that starts at endcol. Backspacing is always handled this way.
 *
 */

    startline();			/* so col makes sense */
    endcol = col;

    do {
	if ( ch == ' ' )
	    endcol++;
	else if ( ch == '\t' )
	    endcol += tabstops - ((endcol - 1) % tabstops);
	else if ( ch == '\b' )
	    endcol--;
	else if ( ch == '\r' )
	    endcol = 1;
	else break;
    } while ( ch = getc(fp_in) );	/* if ch is 0 we'd quit anyway */

    ungetc(ch, fp_in);			/* wasn't a space, tab, or backspace */

    if ( endcol < 1 )			/* can't move past left edge */
	endcol = 1;

    if ( (i = endcol - col) >= 0 && i < 6 )
	for ( ; i > 0; i-- )
	    oput((int)' ');
    else {
	endstring();
	col = stringstart = endcol;
    }	/* End else */

}   /* End of spaces */

/*****************************************************************************/

startline()

{

/*
 *
 * Called whenever we want to be certain we're ready to start pushing characters
 * into an open string on the stack. If stringcount is positive we've already
 * started, so there's nothing to do. The first string starts in column 1.
 *
 */

    if ( stringcount < 1 ) {
	putc('(', fp_out);
	stringstart = col = 1;
	stringcount = 1;
    }	/* End if */

}   /* End of startline */

/*****************************************************************************/

endstring()

{

/*
 *
 * End the current string and start a new one.
 *
 */

    if ( stringcount > 100 ) {		/* don't put too much on the stack */
	fprintf(fp_out, ")%d LL\n(", stringstart-1);
	stringcount = 2;		/* kludge - don't let endline() use l */
    } else {
	fprintf(fp_out, ")%d(", stringstart-1);
	stringcount++;
    }   /* End else */

}   /* End of endstring */

/*****************************************************************************/

endline()

{

/*
 *
 * Generates a call to the PostScript procedure that processes all the text on
 * the stack - provided stringcount is positive. If one string is on the stack
 * the fast procedure (ie. l) is used to print the line, otherwise the slower
 * one that processes string and column pairs is used.
 *
 */

    if ( stringcount == 1 )
	fprintf(fp_out, ")l\n");
    else if ( stringcount > 1 )
	fprintf(fp_out, ")%d L\n", stringstart-1);

    stringcount = 0;

}   /* End of endline */

/*****************************************************************************/

oput(ch)

    int		ch;			/* next output character */

{

/*
 *
 * Responsible for adding all printing characters from the input file to the
 * open string on top of the stack.
 *
 */

    if ( isascii(ch) && isprint(ch) ) {
	startline();
	if ( ch == '(' || ch == ')' || ch == '\\' )
	    putc('\\', fp_out);
	putc(ch, fp_out);
	col++;
    } else if ( extended == TRUE ) {
	startline();
	fprintf(fp_out, "\\%.3o", ch & 0377);
	col++;
    }	/* End if */

}   /* End of oput */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014231216431006440057030057030000010636260522627500700003700000002055post.src/postprint/postprint.h/*
 *
 * Default lines per page, tab stops, and point size.
 *
 */

#define LINESPP		66
#define TABSTOPS	8
#define POINTSIZE	10

/*
 *
 * An array of type Fontmap helps convert font names requested by users into
 * legitimate PostScript names. The array is initialized using FONTMAP, which must
 * end with an entry that has NULL defined as its name field. The only fonts that
 * are guaranteed to work well are the constant width fonts.
 *
 */

typedef struct {
	char	*name;			/* user's font name */
	char	*val;			/* corresponding PostScript name */
} Fontmap;

#define FONTMAP								\
									\
	{								\
	    "R", "Courier",						\
	    "I", "Courier-Oblique",					\
	    "B", "Courier-Bold",					\
	    "CO", "Courier",						\
	    "CI", "Courier-Oblique",					\
	    "CB", "Courier-Bold",					\
	    "CW", "Courier",						\
	    "PO", "Courier",						\
	    "courier", "Courier",					\
	    "cour", "Courier",						\
	    "co", "Courier",						\
	    NULL, NULL							\
	}

/*
 *
 * Some of the non-integer functions in postprint.c.
 *
 */

char	*get_font();

0707070014231215121006400057030057030000010637050522633076500004000000004020post.src/postprint/postprint.mkMAKE=/bin/make
MAKEFILE=postprint.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=postprint.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=postprint.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o

all : postprint

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp postprint $(POSTBIN)/postprint
	@chmod 755 $(POSTBIN)/postprint
	@chgrp $(GROUP) $(POSTBIN)/postprint
	@chown $(OWNER) $(POSTBIN)/postprint
	cp postprint.ps $(POSTLIB)/postprint.ps
	@chmod 644 $(POSTLIB)/postprint.ps
	@chgrp $(GROUP) $(POSTLIB)/postprint.ps
	@chown $(OWNER) $(POSTLIB)/postprint.ps
	cp postprint.1 $(MAN1DIR)/postprint.1
	@chmod 644 $(MAN1DIR)/postprint.1
	@chgrp $(GROUP) $(MAN1DIR)/postprint.1
	@chown $(OWNER) $(MAN1DIR)/postprint.1

clean :
	rm -f *.o

clobber : clean
	rm -f postprint

postprint : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postprint $(OFILES)

postprint.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	postprint.1 >XXX.1; \
	mv XXX.1 postprint.1

0707070014231215061006400057030057030000010551100522633076600003700000010703post.src/postprint/postprint.1.ds dQ /usr/lib/postscript
.TH POSTPRINT 1 "DWB 3.2"
.SH NAME
.B postprint
\- PostScript translator for text files
.SH SYNOPSIS
\*(mBpostprint\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B postprint
translates text
.I files
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP 
.OP \-f name
Print
.I files
using font
.IR name .
Any PostScript font can be used,
although the best results will only be
obtained with constant width fonts.
The default font is Courier.
.TP 
.OP \-l num
Set the length of a page to
.I num
lines.
By default
.I num
is 66.
Setting
.I num
to 0 is allowed, and will cause
.B postprint
to guess a value, based on the point size that is being used.
.TP 
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which is located near the upper left corner of
each page.
The default magnification is 1.0.
.TP 
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default
.I num
is set to 1.
.TP 
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP 
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP 
.OP \-r num
Selects carriage return behavior.
Carriage returns are ignored if
.I num
is 0,
cause a return to column 1 if
.I num
is 1,
and generate a newline if
.I num
is 2.
The default
.I num
is 0.
.TP 
.OP \-s num
Print
.I files
using point size
.IR num .
When printing in landscape mode
.I num
is scaled by a factor that depends on the
imaging area of the device.
The default size for portrait mode is 10.
.TP 
.OP \-t num
Assume tabs are set every
.I num
columns, starting with the first column.
By default tabs are set every 8 columns.
.TP 
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed near the
upper left corner of the page, with positive
x to the right and positive y down the page.
Positive
.I num
moves everything right.
The default offset is 0.25 inches.
.TP 
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves text down the page.
The default offset is 0.25 inches.
.TP 
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ/ name .enc \f1.
A nonexistent encoding file is silently ignored.
The default selects file
.MR \*(dQ/Default.enc .
.TP 
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/postprint.ps .
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP  0.75i
.OP \-C file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP 
.OP \-P string
Include
.I string
in the output file;
.I string
must be legitimate PostScript.
.TP 
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request ,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0, the request
applies to all pages.
If
.I file
is omitted, the request
lookup is done in
.MR \*(dQ/ps.requests .
.PP
A new logical page is started after 66 lines have been printed
on the current page, or whenever an
.SM ASCII
form feed character is read.
The number of lines per page can be changed using the
.OP \-l
option.
Unprintable
.SM ASCII
characters are ignored,
and lines that are too long are silently truncated
by the printer.
.SH EXAMPLES
.PP
Print
.I file1
and
.I file2
in landscape mode:
.EX
postprint -pland \f2file1 file2
.EE
Print three logical pages on each physical page in portrait mode:
.EX
postprint -n3 \f2file
.EE
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.SH FILES
.MW \*(dQ/postprint.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy(1),
.BR postdmd(1),
.BR postio(1),
.BR postmd(1),
.BR postreverse(1),
.BR posttek(1),
.BR psencoding (1)
0707070014231216461006440057030057030000010637200522627500700004000000047760post.src/postprint/Lpostprint.c/*
 *
 * postprint - PostScript translator for ASCII files.
 *
 * A simple program that translates ASCII files into PostScript. All it really
 * does is expand tabs and backspaces, handle character quoting, print text lines,
 * and control when pages are started based on the requested number of lines per
 * page.
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following procedures are defined
 * in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how the program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects
 *	    to find the current page number on the stack.
 *
 *	l
 *
 *	  string l -
 *
 *	    Prints string starting in the first column and then goes to the next
 *	    line.
 *
 *	L
 *
 *	  mark string column string column ... L mark
 *
 *	    Prints each string on the stack starting at the horizontal position
 *	    selected by column. Used when tabs and spaces can be sufficiently well
 *	    compressed to make the printer overhead worthwhile. Always used when
 *	    we have to back up.
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * Almost everything has been changed in this version of postprint. The program
 * is more intelligent, especially about tabs, spaces, and backspacing, and as a
 * result output files usually print faster. Output files also now conform to
 * Adobe's file structuring conventions, which is undoubtedly something I should
 * have done in the first version of the program. If the number of lines per page
 * is set to 0, which can be done using the -l option, pointsize will be used to
 * guess a reasonable value. The estimate is based on the values of LINESPP,
 * POINTSIZE, and pointsize, and assumes LINESPP lines would fit on a page if
 * we printed in size POINTSIZE. Selecting a point size using the -s option and
 * adding -l0 to the command line forces the guess to be made.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable declarations */
#include "postprint.h"			/* a few special definitions */

char	*optnames = "a:c:ef:l:m:n:o:p:r:s:t:x:y:A:C:E:J:L:P:R:DI";

char	*prologue = POSTPRINT;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */

int	linespp = LINESPP;		/* number of lines per page */
int	pointsize = POINTSIZE;		/* in this point size */
int	tabstops = TABSTOPS;		/* tabs set at these columns */
int	crmode = 0;			/* carriage return mode - 0, 1, or 2 */
int	extended = TRUE;		/* use escapes for unprintable chars */

int	col = 1;			/* next character goes in this column */
int	line = 1;			/* on this line */

int	stringcount = 0;		/* number of strings on the stack */
int	stringstart = 1;		/* column where current one starts */

Fontmap	fontmap[] = FONTMAP;		/* for translating font names */
char	*fontname = "Courier";		/* use this PostScript font */

int	page = 0;			/* page we're working on */
int	printed = 0;			/* printed this many pages */

FILE	*fp_in = stdin;			/* read from this file */
FILE	*fp_out = stdout;		/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that translates ASCII files into PostScript. If there's more
 * than one input file, each begins on a new page.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* really just for error messages */

    init_signals();			/* sets up interrupt handling */
    header();				/* PostScript header and prologue */
    options();				/* handle the command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Makes sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN ) {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    if ( DOROUND )
	cat(ROUNDPAGE);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */

/*
 *
 * Reads and processes the command line options. Added the -P option so arbitrary
 * PostScript code can be passed through. Expect it could be useful for changing
 * definitions in the prologue for which options have not been defined.
 *
 * Although any PostScript font can be used, things will only work well for
 * constant width fonts.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF ) {
	switch ( ch ) {

	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'e':			/* obsolete - it's now always on */
		    extended = TRUE;
		    break;

	    case 'f':			/* use this PostScript font */
		    fontname = get_font(optarg);
		    fprintf(stdout, "/font /%s def\n", fontname);
		    break;

	    case 'l':			/* lines per page */
		    linespp = atoi(optarg);
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'r':			/* carriage return mode */
		    crmode = atoi(optarg);
		    break;

	    case 's':			/* point size */
		    pointsize = atoi(optarg);
		    fprintf(stdout, "/pointsize %s def\n", optarg);
		    break;

	    case 't':			/* tabstops */
		    tabstops = atoi(optarg);
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

char *get_font(name)

    char	*name;			/* name the user asked for */

{

    int		i;			/* for looking through fontmap[] */

/*
 *
 * Called from options() to map a user's font name into a legal PostScript name.
 * If the lookup fails *name is returned to the caller. That should let you choose
 * any PostScript font, although things will only work well for constant width
 * fonts.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].val);

    return(name);

}   /* End of get_font */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed. linespp (lines per page) can be set using the -l
 * option. If it's not positive we calculate a reasonable value using the
 * requested point size - assuming LINESPP lines fit on a page in point size
 * POINTSIZE.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 ) {
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

    if ( linespp <= 0 )
	linespp = LINESPP * POINTSIZE / pointsize;

}   /* End of setup */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll translate stdin.
 *
 */

    if ( argc < 1 )
	text();
    else {				/* at least one argument is left */
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    text();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */
    }   /* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files, so mark the end of the pages with a TRAILER
 * comment, make sure the last page prints, and add things like the PAGES comment
 * that can only be determined after all the input files have been read.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname);
    fprintf(stdout, "%s %d\n", PAGES, printed);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct provided it's not NULL. Accounting is
 * requested using the -A or -J options.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

text()

{

    int		ch;			/* next input character */

/*
 *
 * Translates *fp_in into PostScript. Intercepts space, tab, backspace, newline,
 * return, and formfeed. Everything else goes to oput(), which handles quoting
 * (if needed) and escapes for nonascii characters if extended is TRUE. The
 * redirect(-1) call forces the initial output to go to /dev/null - so stuff
 * that formfeed() does at the end of each page goes to /dev/null rather than
 * the real output file.
 *
 */

    redirect(-1);			/* get ready for the first page */
    formfeed();				/* force PAGE comment etc. */

    while ( (ch = getc(fp_in)) != EOF )
	switch ( ch ) {
	    case '\n':
		    newline();
		    break;

	    case '\t':
	    case '\b':
	    case ' ':
		    spaces(ch);
		    break;

	    case '\014':
		    formfeed();
		    break;

	    case '\r':
		    if ( crmode == 1 )
			spaces(ch);
		    else if ( crmode == 2 )
			newline();
		    break;

	    default:
		    oput(ch);
		    break;
	}   /* End switch */

    formfeed();				/* next file starts on a new page? */

}   /* End of text */

/*****************************************************************************/

formfeed()

{

/*
 *
 * Called whenever we've finished with the last page and want to get ready for the
 * next one. Also used at the beginning and end of each input file, so we have to
 * be careful about what's done. The first time through (up to the redirect() call)
 * output goes to /dev/null.
 *
 * Adobe now recommends that the showpage operator occur after the page level
 * restore so it can be easily redefined to have side-effects in the printer's VM.
 * Although it seems reasonable I haven't implemented it, because it makes other
 * things, like selectively setting manual feed or choosing an alternate paper
 * tray, clumsy - at least on a per page basis. 
 *
 */

    if ( fp_out == stdout )		/* count the last page */
	printed++;

    endline();				/* print the last line */

    fprintf(fp_out, "cleartomark\n");
    fprintf(fp_out, "showpage\n");
    fprintf(fp_out, "saveobj restore\n");
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);

    if ( ungetc(getc(fp_in), fp_in) == EOF )
	redirect(-1);
    else redirect(++page);

    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fprintf(fp_out, "/saveobj save def\n");
    fprintf(fp_out, "mark\n");
    writerequest(printed+1, fp_out);
    fprintf(fp_out, "%d pagesetup\n", printed+1);

    line = 1;

}   /* End of formfeed */

/*****************************************************************************/

newline()

{

/*
 *
 * Called when we've read a newline character. The call to startline() ensures
 * that at least an empty string is on the stack.
 *
 */

    startline();
    endline();				/* print the current line */

    if ( ++line > linespp )		/* done with this page */
	formfeed();

}   /* End of newline */

/*****************************************************************************/

spaces(ch)

    int		ch;			/* next input character */

{

    int		endcol;			/* ending column */
    int		i;			/* final distance - in spaces */

/*
 *
 * Counts consecutive spaces, tabs, and backspaces and figures out where the next
 * string should start. Once that's been done we try to choose an efficient way
 * to output the required number of spaces. The choice is between using procedure
 * l with a single string on the stack and L with several string and column pairs.
 * We usually break even, in terms of the size of the output file, if we need four
 * consecutive spaces. More means using L decreases the size of the file. For now
 * if there are less than 6 consecutive spaces we just add them to the current
 * string, otherwise we end that string, follow it by its starting position, and
 * begin a new one that starts at endcol. Backspacing is always handled this way.
 *
 */

    startline();			/* so col makes sense */
    endcol = col;

    do {
	if ( ch == ' ' )
	    endcol++;
	else if ( ch == '\t' )
	    endcol += tabstops - ((endcol - 1) % tabstops);
	else if ( ch == '\b' )
	    endcol--;
	else if ( ch == '\r' )
	    endcol = 1;
	else break;
    } while ( ch = getc(fp_in) );	/* if ch is 0 we'd quit anyway */

    ungetc(ch, fp_in);			/* wasn't a space, tab, or backspace */

    if ( endcol < 1 )			/* can't move past left edge */
	endcol = 1;

    if ( (i = endcol - col) >= 0 && i < 6 )
	for ( ; i > 0; i-- )
	    oput((int)' ');
    else {
	fprintf(fp_out, ")%d(", stringstart-1);
	stringcount++;
	col = stringstart = endcol;
    }	/* End else */

}   /* End of spaces */

/*****************************************************************************/

startline()

{

/*
 *
 * Called whenever we want to be certain we're ready to start pushing characters
 * into an open string on the stack. If stringcount is positive we've already
 * started, so there's nothing to do. The first string starts in column 1.
 *
 */

    if ( stringcount < 1 ) {
	putc('(', fp_out);
	stringstart = col = 1;
	stringcount = 1;
    }	/* End if */

}   /* End of startline */

/*****************************************************************************/

endline()

{

/*
 *
 * Generates a call to the PostScript procedure that processes all the text on
 * the stack - provided stringcount is positive. If one string is on the stack
 * the fast procedure (ie. l) is used to print the line, otherwise the slower
 * one that processes string and column pairs is used.
 *
 */

    if ( stringcount == 1 )
	fprintf(fp_out, ")l\n");
    else if ( stringcount > 1 )
	fprintf(fp_out, ")%d L\n", stringstart-1);

    stringcount = 0;

}   /* End of endline */

/*****************************************************************************/

oput(ch)

    int		ch;			/* next output character */

{

/*
 *
 * Responsible for adding all printing characters from the input file to the
 * open string on top of the stack.
 *
 */

    if ( isascii(ch) && isprint(ch) ) {
	startline();
	if ( ch == '(' || ch == ')' || ch == '\\' )
	    putc('\\', fp_out);
	putc(ch, fp_out);
	col++;
    } else if ( extended == TRUE ) {
	startline();
	fprintf(fp_out, "\\%.3o", ch & 0377);
	col++;
    }	/* End if */

}   /* End of oput */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014231216471006440057030057030000010643660522630326300004000000003403post.src/postprint/postprint.ps%
% Version 3.3.2 prologue for text files.
%

/#copies 1 store
/aspectratio 1 def
/font /Courier def
/formsperpage 1 def
/landscape false def
/magnification 1 def
/margin 10 def
/orientation 0 def
/pointsize 10 def
/rotation 1 def
/xoffset .25 def
/yoffset .25 def

/roundpage true def
/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/show {show} bind def		% so later references don't bind
/stringwidth {stringwidth} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if
	font findfont pointsize scalefont setfont
	/charwidth (M) stringwidth pop def
	/linespace pointsize pointsize .10 mul add neg def

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	width 2 div neg height 2 div translate
	xoffset inch yoffset inch neg translate
	margin 2 div dup neg translate
	magnification dup aspectratio mul scale
	height width div 1 min dup scale
	0 linespace translate
} def

/pagedimensions {
	useclippath userdict /gotpagebbox known not and {
		/pagebbox [clippath pathbbox newpath] def
		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def 0 0 moveto 0} bind def

/L {
	counttomark 2 idiv {charwidth mul currentpoint exch pop moveto show} repeat
	linespace add dup 0 exch moveto
} bind def

/l {show linespace add dup 0 exch moveto} bind def

/LL {
	counttomark 2 idiv {charwidth mul currentpoint exch pop moveto show} repeat
} bind def

/done {/lastpage where {pop lastpage} if} def
0707070014231030621006440057030057030000010252400522633110300002700000012724post.src/postscript.mk#
# Top level makefile. Instructions are included here and in the README file.
#
# First save a copy of this file. Then adjust the following definitions (all
# come immediatedly after the initial block of comments):
#
#     MAKE	where make lives
#
#     MAKEFILE	name of this file - for recursive make calls. Must change
#		if you rename this file.
#
#     SYSTEM	best match for your version of Unix. Current choices for
#		SYSTEM are:
#
#			SYSV	- System V
#			V9	- Ninth Edition
#			BSD4_2	- Berkeley (eg. Sun)
#
#		Controls conditional compilation in a few places.
#
#     VERSION	refers to the Version of the DWB package
#
#     GROUP	group assigned to all installed files
#
#     OWNER	owner of everything that's installed
#
#     HOSTDIR	hostresident font directory for PostScript printers. Only
#		used in the font download program.
#
#     FONTDIR	width table directory - for troff and dpost
#
#     MAN1DIR	command manpages. A command and its manpage are installed
#		together - there's no easy way to avoid it. Setting MAN1DIR
#		to an existing temporary directory (e.g. /tmp) means an
#		install will work but manpages won't go anywhere permanent.
#		MAN1DIR must already exist - it will not be created during
#		an install.
#
#     POSTBIN	where most PostScript support programs go. dpost and picpack
#		are the exceptions.
#
#     POSTLIB	prologues and miscellaneous PostScript files. Primarily for
#		the programs that live in POSTBIN.
#
#     CFLGS	common compiler options - used to build CFLAGS in the low
#		level makefiles. CFLGS and LDFLGS are best set on the make
#		command line.
#
#     LDFLGS	common link editor options - used to build LDFLAGS in the
#		low level makefiles. LDFLGS and CFLGS are best set on the
#		make command line.
#
#     DKHOST	set it to TRUE to compile the DKHOST Datakit support code
#		in postio. Temporarily resets SYSTEM to SYSV if DKHOST is
#		TRUE and SYSTEM is BSD4_2. Ignored if SYSTEM is not SYSV
#		or BSD4_2.
#
#     DKSTREAMS enables streams based DKHOST support in postio when DKHOST
#		is TRUE and SYSTEM is SYSV or BSD4_2. Choices are TRUE,
#		FALSE, or a stream module name (e.g. dknetty or dkty). TRUE
#		selects dknetty. Newer systems may expect dkty.
#
#     ROUNDPAGE	must only be set to TRUE or FALSE. TRUE means translators
#		include code that maps clipping path dimensions into known
#		paper sizes.
#
#     TARGETS	the default list of what's built by make. Each target must
#		be the name of a source directory. A target that names a
#		non-existent source directory is ignored. Setting TARGETS
#		on the make command line overrides the default list.
#
# Source files must be updated whenever this file changes. If you change any
# definitions type,
#
#	make -f postscript.mk changes
#
# to update the source files, man pages, and low level makefiles.
#
# To build (but not install) the default package (i.e. everything named by
# TARGETS) type,
#
#	make -f postscript.mk all
#
# The recommended way to build and install the package is,
#
#	make -f postscript.mk all install
#
# Although you'll likely have to be root for the install to work.
#
# After the package is installed use,
#
#	make -f postscript.mk clobber
#
# to delete binary files and compiled programs from the source directories.
#
# Set TARGETS on the command line to select part of the package. For example,
#
#	make -f postscript.mk TARGETS="dpost devpost" all install
#
# builds and installs dpsot and the PostScript font tables. Quotes hide white
# space from the shell.
#

MAKE=/bin/make
MAKEFILE=postscript.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

ROOT=
FONTDIR=$(ROOT)/usr/lib/font
HOSTDIR=$(ROOT)/usr/lib/font/postscript
MAN1DIR=$(ROOT)/tmp
POSTBIN=$(ROOT)/usr/bin/postscript
POSTLIB=$(ROOT)/usr/lib/postscript
TMACDIR=$(ROOT)/usr/lib/tmac

COMMONDIR=common
CURRENTDIR=.

CFLGS=-O
LDFLGS=-s

DKHOST=FALSE
DKSTREAMS=FALSE
ROUNDPAGE=TRUE

#
# $(TARGETS) is the default list of things built by make. Pick dpost or
# dpost.utf but not both!
#

TARGETS=buildtables\
	common\
	cropmarks\
	devLatin1\
	devpost\
	download\
	dpost.utf\
	grabit\
	hardcopy\
	mpictures\
	picpack\
        postbgi\
        postdaisy\
        postdmd\
	postgif\
	postio\
	postmd\
        postprint\
	postreverse\
        posttek\
	printfont\
	psencoding\
	psfiles\
	trofftable

ACTION=all

all : $(TARGETS)

clean clobber :
	@$(MAKE) -e -f $(MAKEFILE) MAKE=$(MAKE) ACTION=$@ $(TARGETS)

install changes :
	@SYSTEM='$(SYSTEM)'; export SYSTEM; \
	VERSION='$(VERSION)'; export VERSION; \
	GROUP='$(GROUP)'; export GROUP; \
	OWNER='$(OWNER)'; export OWNER; \
	FONTDIR='$(FONTDIR)'; export FONTDIR; \
	HOSTDIR='$(HOSTDIR)'; export HOSTDIR; \
	MAN1DIR='$(MAN1DIR)'; export MAN1DIR; \
	POSTBIN='$(POSTBIN)'; export POSTBIN; \
	POSTLIB='$(POSTLIB)'; export POSTLIB; \
	TMACDIR='$(TMACDIR)'; export TMACDIR; \
	ROUNDPAGE='$(ROUNDPAGE)'; export ROUNDPAGE; \
	$(MAKE) -e -f $(MAKEFILE) MAKE=$(MAKE) ACTION=$@ $(TARGETS)

$(TARGETS) ::
	@TARGETS=; unset TARGETS; \
	HFILES=; unset HFILES; \
	OFILES=; unset OFILES; \
	CFLAGS=; unset CFLAGS; \
	LDFLAGS=; unset LDFLAGS; \
	YFLAGS=; unset YFLAGS; \
	SYSTEM='$(SYSTEM)'; export SYSTEM; \
	VERSION='$(VERSION)'; export VERSION; \
	CFLGS='$(CFLGS)'; export CFLGS; \
	LDFLGS='$(LDFLGS)'; export LDFLGS; \
	COMMONDIR='../$(COMMONDIR)'; export COMMONDIR; \
	DKHOST='$(DKHOST)'; export DKHOST; \
	DKSTREAMS='$(DKSTREAMS)'; export DKSTREAMS; \
	if [ -d $@ -a -f $@/$@.mk ]; then  \
	    cd $@; \
	    echo "---- Making $(ACTION) in directory $(CURRENTDIR)/$@ ----"; \
	    $(MAKE) -e -f $@.mk MAKE=$(MAKE) $(ACTION); \
	    echo; \
	fi

0707070014231123300407550057030057030000020437670522633100000002400000000000post.src/psencoding0707070014231123311006440057030057030000010440040522627501000003700000006703post.src/psencoding/Latin1.enc%
% Encoding vector and redefinition of findfont for the ISO Latin1 standard.
% The 18 characters missing from ROM based fonts on older printers are noted
% below.
%

/ISOLatin1Encoding [
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/space
	/exclam
	/quotedbl
	/numbersign
	/dollar
	/percent
	/ampersand
	/quoteright
	/parenleft
	/parenright
	/asterisk
	/plus
	/comma
	/minus
	/period
	/slash
	/zero
	/one
	/two
	/three
	/four
	/five
	/six
	/seven
	/eight
	/nine
	/colon
	/semicolon
	/less
	/equal
	/greater
	/question
	/at
	/A
	/B
	/C
	/D
	/E
	/F
	/G
	/H
	/I
	/J
	/K
	/L
	/M
	/N
	/O
	/P
	/Q
	/R
	/S
	/T
	/U
	/V
	/W
	/X
	/Y
	/Z
	/bracketleft
	/backslash
	/bracketright
	/asciicircum
	/underscore
	/quoteleft
	/a
	/b
	/c
	/d
	/e
	/f
	/g
	/h
	/i
	/j
	/k
	/l
	/m
	/n
	/o
	/p
	/q
	/r
	/s
	/t
	/u
	/v
	/w
	/x
	/y
	/z
	/braceleft
	/bar
	/braceright
	/asciitilde
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/dotlessi
	/grave
	/acute
	/circumflex
	/tilde
	/macron
	/breve
	/dotaccent
	/dieresis
	/.notdef
	/ring
	/cedilla
	/.notdef
	/hungarumlaut
	/ogonek
	/caron
	/space
	/exclamdown
	/cent
	/sterling
	/currency
	/yen
	/brokenbar		% missing
	/section
	/dieresis
	/copyright
	/ordfeminine
	/guillemotleft
	/logicalnot
	/hyphen
	/registered
	/macron
	/degree			% missing
	/plusminus		% missing
	/twosuperior		% missing
	/threesuperior		% missing
	/acute
	/mu			% missing
	/paragraph
	/periodcentered
	/cedilla
	/onesuperior		% missing
	/ordmasculine
	/guillemotright
	/onequarter		% missing
	/onehalf		% missing
	/threequarters		% missing
	/questiondown
	/Agrave
	/Aacute
	/Acircumflex
	/Atilde
	/Adieresis
	/Aring
	/AE
	/Ccedilla
	/Egrave
	/Eacute
	/Ecircumflex
	/Edieresis
	/Igrave
	/Iacute
	/Icircumflex
	/Idieresis
	/Eth			% missing
	/Ntilde
	/Ograve
	/Oacute
	/Ocircumflex
	/Otilde
	/Odieresis
	/multiply		% missing
	/Oslash
	/Ugrave
	/Uacute
	/Ucircumflex
	/Udieresis
	/Yacute			% missing
	/Thorn			% missing
	/germandbls
	/agrave
	/aacute
	/acircumflex
	/atilde
	/adieresis
	/aring
	/ae
	/ccedilla
	/egrave
	/eacute
	/ecircumflex
	/edieresis
	/igrave
	/iacute
	/icircumflex
	/idieresis
	/eth			% missing
	/ntilde
	/ograve
	/oacute
	/ocircumflex
	/otilde
	/odieresis
	/divide			% missing
	/oslash
	/ugrave
	/uacute
	/ucircumflex
	/udieresis
	/yacute			% missing
	/thorn			% missing
	/ydieresis
] def

/NewFontDirectory FontDirectory maxlength dict def

%
% Apparently no guarantee findfont is defined in systemdict so the obvious
%
%	systemdict /findfont get exec
%
% can generate an error. So far the only exception is a VT600 (version 48.0).
%

userdict /@RealFindfont known not {
	userdict begin
		/@RealFindfont systemdict begin /findfont load end def
	end
} if

/findfont {
	dup NewFontDirectory exch known not {
		dup
		%dup systemdict /findfont get exec	% not always in systemdict
		dup userdict /@RealFindfont get exec
		dup /Encoding get StandardEncoding eq {
			dup length dict begin
				{1 index /FID ne {def}{pop pop} ifelse} forall
				/Encoding ISOLatin1Encoding def
				currentdict
			end
			/DummyFontName exch definefont
		} if
		NewFontDirectory 3 1 roll put
	} if
	NewFontDirectory exch get
} bind def

0707070014231123321006440057030057030000010440200522627501000004200000001523post.src/psencoding/psencoding.sh#
# Trivial script for checking and setting the default PostScript font
# encoding. Changing the default assumes you can write in $POSTLIB.
# Available font encodings are files in $POSTLIB that end in .enc.
# The default is $POSTLIB/Default.enc.
#

POSTLIB=/usr/lib/postscript
DEFAULT=Default.enc
CURRENTDEFAULT=

case "$1" in
    Default) ;;
 
    Standard)
	rm -f $POSTLIB/$DEFAULT;;

    "") cd $POSTLIB
	for i in *.enc; do
	    if [ -f "$i" -a "$i" != $DEFAULT ]; then
		NAME=`echo $i | sed s/\\.enc//`
		if cmp $i $DEFAULT >/dev/null 2>/dev/null; then
		    CURRENTDEFAULT=$NAME
		fi
		echo $NAME
	    fi
	done
	echo Standard
	echo "Default=${CURRENTDEFAULT:-Standard}";;

    *)  if [ -f "$POSTLIB/$1.enc" ]
	    then rm -f $POSTLIB/$DEFAULT
		 ln $POSTLIB/$1.enc $POSTLIB/$DEFAULT
	    else echo "unrecognized encoding name $1" >&2
	fi;;
esac

0707070014231122361006400057030057030000010446000522633077700004200000003265post.src/psencoding/psencoding.mkMAKE=/bin/make
MAKEFILE=psencoding.mk

OWNER=bin
GROUP=bin

MAN1DIR=/tmp
MAN5DIR=/usr/man/p_man/man5
POSTLIB=/usr/lib/postscript
POSTBIN=/usr/bin/postscript

all : psencoding

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp psencoding $(POSTBIN)/psencoding
	@chmod 755 $(POSTBIN)/psencoding
	@chgrp $(GROUP) $(POSTBIN)/psencoding
	@chown $(OWNER) $(POSTBIN)/psencoding
	cp Latin1.enc $(POSTLIB)/Latin1.enc
	@chmod 644 $(POSTLIB)/Latin1.enc
	@chgrp $(GROUP) $(POSTLIB)/Latin1.enc
	@chown $(OWNER) $(POSTLIB)/Latin1.enc
	cp UTF.enc $(POSTLIB)/UTF.enc
	@chmod 644 $(POSTLIB)/UTF.enc
	@chgrp $(GROUP) $(POSTLIB)/UTF.enc
	@chown $(OWNER) $(POSTLIB)/UTF.enc
	cp psencoding.1 $(MAN1DIR)/psencoding.1
	@chmod 644 $(MAN1DIR)/psencoding.1
	@chgrp $(GROUP) $(MAN1DIR)/psencoding.1
	@chown $(OWNER) $(MAN1DIR)/psencoding.1

clean :

clobber : clean
	rm -f psencoding

psencoding : psencoding.sh
	sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" psencoding.sh >psencoding
	@chmod 755 psencoding

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	psencoding.1 >XXX.1; \
	mv XXX.1 psencoding.1

0707070014231122321006400057030057030000010370160522633100000004100000001571post.src/psencoding/psencoding.1.ds dQ /usr/lib/postscript
.TH PSENCODING 1 "DWB 3.2"
.SH NAME
.B psencoding
\- check or set the default PostScript font encoding
.SH SYNOPSIS
\*(mBpsencoding\f1
.OP "" encoding []
.SH DESCRIPTION
.B psencoding
sets the default font Encoding used by many PostScript translators to
.IR encoding .
No arguments means list the available choices and the current default.
.PP
PostScript encoding files are in directory
.MR \*(dQ .
Many existing PostScript translators include the encoding file
.MR Default.enc ,
if it exists, in the output they generate.
.PP
Requesting
.I encoding
as the default means link the file
.MI \*(dQ/ encoding .enc
to the file
.MR \*(dQ/Default.enc .
Changing the default encoding assumes you can write in directory
.MR \*(dQ .
.SH FILES
.MW \*(dQ/Default.enc
.br
.MW \*(dQ/*.enc
.SH SEE ALSO
.BR buildtables (1),
.BR dpost (1),
.BR postprint (1),
.BR trofftable (1)
0707070014231123351006440057030057030000010440400522627501000003400000010340post.src/psencoding/UTF.enc%
% Encoding vector, operator and procedure redefinitions for Plan 9 UTF
% encoding. Prologues are expected to take steps to ensure operator
% redefinitions given here are actually used. Current implementation
% assumes UTF byte streams that represent ASCII or Latin1 text.
%

/UTFLatin1Encoding [
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/space
	/exclam
	/quotedbl
	/numbersign
	/dollar
	/percent
	/ampersand
	/quoteright
	/parenleft
	/parenright
	/asterisk
	/plus
	/comma
	/minus
	/period
	/slash
	/zero
	/one
	/two
	/three
	/four
	/five
	/six
	/seven
	/eight
	/nine
	/colon
	/semicolon
	/less
	/equal
	/greater
	/question
	/at
	/A
	/B
	/C
	/D
	/E
	/F
	/G
	/H
	/I
	/J
	/K
	/L
	/M
	/N
	/O
	/P
	/Q
	/R
	/S
	/T
	/U
	/V
	/W
	/X
	/Y
	/Z
	/bracketleft
	/backslash
	/bracketright
	/asciicircum
	/underscore
	/quoteleft
	/a
	/b
	/c
	/d
	/e
	/f
	/g
	/h
	/i
	/j
	/k
	/l
	/m
	/n
	/o
	/p
	/q
	/r
	/s
	/t
	/u
	/v
	/w
	/x
	/y
	/z
	/braceleft
	/bar
	/braceright
	/asciitilde
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/.notdef
	/dotlessi
	/grave
	/acute
	/circumflex
	/tilde
	/macron
	/breve
	/dotaccent
	/dieresis
	/.notdef
	/ring
	/cedilla
	/.notdef
	/hungarumlaut
	/ogonek
	/caron
	/.notdef		% was space
	/exclamdown
	/cent
	/sterling
	/currency
	/yen
	/brokenbar
	/section
	/dieresis
	/copyright
	/ordfeminine
	/guillemotleft
	/logicalnot
	/hyphen
	/registered
	/macron
	/degree
	/plusminus
	/twosuperior
	/threesuperior
	/acute
	/mu
	/paragraph
	/periodcentered
	/cedilla
	/onesuperior
	/ordmasculine
	/guillemotright
	/onequarter
	/onehalf
	/threequarters
	/questiondown
	/Agrave
	/Aacute
	/Acircumflex
	/Atilde
	/Adieresis
	/Aring
	/AE
	/Ccedilla
	/Egrave
	/Eacute
	/Ecircumflex
	/Edieresis
	/Igrave
	/Iacute
	/Icircumflex
	/Idieresis
	/Eth
	/Ntilde
	/Ograve
	/Oacute
	/Ocircumflex
	/Otilde
	/Odieresis
	/multiply
	/Oslash
	/Ugrave
	/Uacute
	/Ucircumflex
	/Udieresis
	/Yacute
	/Thorn
	/germandbls
	/agrave
	/aacute
	/acircumflex
	/atilde
	/adieresis
	/aring
	/ae
	/ccedilla
	/egrave
	/eacute
	/ecircumflex
	/edieresis
	/igrave
	/iacute
	/icircumflex
	/idieresis
	/eth
	/ntilde
	/ograve
	/oacute
	/ocircumflex
	/otilde
	/odieresis
	/divide
	/oslash
	/ugrave
	/uacute
	/ucircumflex
	/udieresis
	/yacute
	/thorn
	/ydieresis
] def

/NewFontDirectory FontDirectory maxlength dict def

%
% Apparently no guarantee findfont is defined in systemdict so the obvious
%
%	systemdict /findfont get exec
%
% can generate an error. So far the only exception is a VT600 (version 48.0).
%

userdict /@RealFindfont known not {
	userdict begin
		/@RealFindfont systemdict begin /findfont load end def
	end
} if

/findfont {
	dup NewFontDirectory exch known not {
		dup
		%dup systemdict /findfont get exec	% not always in systemdict
		dup userdict /@RealFindfont get exec
		dup /Encoding get StandardEncoding eq {
			dup length 1 add dict begin
				{1 index /FID ne {def}{pop pop} ifelse} forall
				/Encoding UTFLatin1Encoding def
				/Metrics 1 dict def
				Metrics /.notdef 0 put
				currentdict
			end
			/DummyFontName exch definefont
		} if
		NewFontDirectory 3 1 roll put
	} if
	NewFontDirectory exch get
} bind def

%
% Assume A0, except for A0A0 which is replaced by 20A0, can be ignored.
% Works with ASCII or Latin1 because A0 has been re-encoded as a zero
% width non-printing character. 
%

/UTFstring {
	dup {
		(\240\240) search {
			pop
			0 16#20 put
		}{pop exit} ifelse
	} loop
} bind def

/ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def
/awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def
/show {mark exch UTFstring //show cvx exec cleartomark} bind def
/stringwidth {UTFstring //stringwidth cvx exec} bind def
/widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def

%
% kshow is harder - stack can't change because of the procedure.
%

/kshow dup load type /operatortype eq
	{{UTFstring kshow} bind}
	{{UTFstring //kshow cvx exec} bind}
ifelse def

0707070014231216500407550057030057030000030636470522633073600002100000000000post.src/devpost0707070014231216511006440057030057030000010637600522627501000002400000003371post.src/devpost/ABname AB
fontname AvantGarde-Demi
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	60	2	35
$	56	2	36
%	86	2	37
&	68	2	38
'	28	2	39
(	38	3	40
)	38	3	41
*	44	2	42
+	60	0	43
,	28	1	44
hy	42	0	45
-	"
.	28	0	46
/	46	3	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	56	2	63
@	74	2	64
A	74	2	65
B	58	2	66
C	78	2	67
D	70	2	68
E	52	2	69
F	48	2	70
G	84	2	71
H	68	2	72
I	28	2	73
J	48	2	74
K	62	2	75
L	44	2	76
M	90	2	77
N	74	2	78
O	84	2	79
P	56	2	80
Q	84	2	81
R	58	2	82
S	52	2	83
T	42	2	84
U	64	2	85
V	70	2	86
W	90	2	87
X	68	2	88
Y	62	2	89
Z	50	2	90
[	32	3	91
\	64	2	92
bs	"
]	32	3	93
---	60	2	94
---	50	1	95
`	28	2	96
a	66	0	97
b	66	2	98
c	64	0	99
d	66	2	100
e	64	0	101
f	28	2	102
g	66	1	103
h	60	2	104
i	24	2	105
j	26	3	106
k	58	2	107
l	24	2	108
m	94	0	109
n	60	0	110
o	64	0	111
p	66	1	112
q	66	1	113
r	32	0	114
s	44	0	115
t	30	2	116
u	60	0	117
v	56	0	118
w	80	0	119
x	56	0	120
y	58	1	121
z	46	0	122
{	34	3	123
---	60	2	124
}	34	3	125
---	60	0	126
!!	28	1	161
ct	56	2	162
ps	56	2	163
fr	16	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	60	2	168
---	22	2	169
``	48	2	170
---	46	0	171
---	24	0	172
---	24	0	173
fi	52	2	174
fl	52	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	60	3	182
---	60	0	183
---	28	1	184
---	48	1	185
''	48	2	186
---	46	0	187
---	100	0	188
---	128	2	189
??	56	1	191
ga	42	2	193
\`	"
aa	42	2	194
\'	"
^a	54	2	195
^	"
~a	48	2	196
~	"
-a	42	2	197
Ua	48	2	198
.a	28	2	199
:a	50	2	200
oa	36	2	202
,a	34	1	203
"a	70	2	205
Ca	34	1	206
va	54	2	207
em	100	0	208
---	90	2	225
---	36	2	227
---	48	2	232
---	84	2	233
---	106	2	234
---	36	2	235
---	108	0	241
---	24	0	245
---	32	2	248
---	66	0	249
---	108	0	250
---	60	2	251
0707070014231216521006440057030057030000010637620522627501000002400000003400post.src/devpost/AIname AI
fontname AvantGarde-BookOblique
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	29	2	33
"	31	2	34
dq	"
#	72	2	35
$	55	2	36
%	77	2	37
&	76	2	38
'	35	2	39
(	37	3	40
)	37	3	41
*	42	2	42
+	61	0	43
,	28	0	44
hy	33	0	45
-	"
.	28	0	46
/	44	3	47
0	55	2	48
1	55	2	49
2	55	2	50
3	55	2	51
4	55	2	52
5	55	2	53
6	55	2	54
7	55	2	55
8	55	2	56
9	55	2	57
:	28	0	58
;	28	0	59
---	61	0	60
=	61	0	61
---	61	0	62
?	59	2	63
@	87	2	64
A	74	2	65
B	57	2	66
C	81	2	67
D	74	2	68
E	54	2	69
F	49	2	70
G	87	2	71
H	68	2	72
I	23	2	73
J	48	2	74
K	59	2	75
L	46	2	76
M	92	2	77
N	74	2	78
O	87	2	79
P	59	2	80
Q	87	2	81
R	61	2	82
S	50	2	83
T	43	2	84
U	66	2	85
V	70	2	86
W	96	2	87
X	61	2	88
Y	59	2	89
Z	48	2	90
[	35	3	91
\	61	2	92
bs	"
]	35	3	93
---	67	2	94
---	50	1	95
`	35	2	96
a	68	0	97
b	68	2	98
c	65	0	99
d	69	2	100
e	65	0	101
f	31	2	102
g	67	1	103
h	61	2	104
i	20	2	105
j	20	3	106
k	50	2	107
l	20	2	108
m	94	0	109
n	61	0	110
o	66	0	111
p	68	1	112
q	68	1	113
r	30	0	114
s	39	0	115
t	34	2	116
u	61	0	117
v	55	0	118
w	83	0	119
x	48	0	120
y	54	1	121
z	42	0	122
{	35	3	123
---	67	2	124
}	35	3	125
---	61	0	126
!!	29	1	161
ct	55	2	162
ps	55	2	163
fr	17	2	164
yn	55	2	165
fn	55	3	166
sc	61	3	167
cr	55	0	168
---	20	2	169
``	50	2	170
---	42	0	171
---	25	0	172
---	25	0	173
fi	49	2	174
fl	49	2	175
en	50	0	177
\-	"
dg	55	3	178
dd	55	3	179
---	28	0	180
pg	56	3	182
---	61	0	183
---	35	0	184
---	50	0	185
''	48	2	186
---	42	0	187
---	100	0	188
---	117	2	189
??	59	1	191
ga	38	2	193
\`	"
aa	38	2	194
\'	"
^a	50	2	195
^	"
~a	44	2	196
~	"
-a	49	2	197
Ua	45	2	198
.a	22	2	199
:a	37	2	200
oa	33	2	202
,a	32	1	203
"a	55	2	205
Ca	30	1	206
va	50	2	207
em	100	0	208
---	99	2	225
---	37	2	227
---	52	2	232
---	87	2	233
---	119	2	234
---	37	2	235
---	116	0	241
---	20	0	245
---	30	2	248
---	65	0	249
---	114	0	250
---	55	2	251
0707070014231216531006440057030057030000010637640522627501000002400000003371post.src/devpost/ARname AR
fontname AvantGarde-Book
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	29	2	33
"	31	2	34
dq	"
#	72	2	35
$	55	2	36
%	77	2	37
&	76	2	38
'	35	2	39
(	37	3	40
)	37	3	41
*	42	2	42
+	61	0	43
,	28	0	44
hy	33	0	45
-	"
.	28	0	46
/	44	3	47
0	55	2	48
1	55	2	49
2	55	2	50
3	55	2	51
4	55	2	52
5	55	2	53
6	55	2	54
7	55	2	55
8	55	2	56
9	55	2	57
:	28	0	58
;	28	0	59
---	61	0	60
=	61	0	61
---	61	0	62
?	59	2	63
@	87	2	64
A	74	2	65
B	57	2	66
C	81	2	67
D	74	2	68
E	54	2	69
F	49	2	70
G	87	2	71
H	68	2	72
I	23	2	73
J	48	2	74
K	59	2	75
L	46	2	76
M	92	2	77
N	74	2	78
O	87	2	79
P	59	2	80
Q	87	2	81
R	61	2	82
S	50	2	83
T	43	2	84
U	66	2	85
V	70	2	86
W	96	2	87
X	61	2	88
Y	59	2	89
Z	48	2	90
[	35	3	91
\	61	2	92
bs	"
]	35	3	93
---	67	2	94
---	50	1	95
`	35	2	96
a	68	0	97
b	68	2	98
c	65	0	99
d	69	2	100
e	65	0	101
f	31	2	102
g	67	1	103
h	61	2	104
i	20	2	105
j	20	3	106
k	50	2	107
l	20	2	108
m	94	0	109
n	61	0	110
o	66	0	111
p	68	1	112
q	68	1	113
r	30	0	114
s	39	0	115
t	34	2	116
u	61	0	117
v	55	0	118
w	83	0	119
x	48	0	120
y	54	1	121
z	42	0	122
{	35	3	123
---	67	2	124
}	35	3	125
---	61	0	126
!!	29	1	161
ct	55	2	162
ps	55	2	163
fr	17	2	164
yn	55	2	165
fn	55	3	166
sc	61	3	167
cr	55	0	168
---	20	2	169
``	50	2	170
---	42	0	171
---	25	0	172
---	25	0	173
fi	49	2	174
fl	49	2	175
en	50	0	177
\-	"
dg	55	3	178
dd	55	3	179
---	28	0	180
pg	56	3	182
---	61	0	183
---	35	0	184
---	50	0	185
''	48	2	186
---	42	0	187
---	100	0	188
---	117	2	189
??	59	1	191
ga	38	2	193
\`	"
aa	38	2	194
\'	"
^a	50	2	195
^	"
~a	44	2	196
~	"
-a	49	2	197
Ua	45	2	198
.a	22	2	199
:a	37	2	200
oa	33	2	202
,a	32	1	203
"a	55	2	205
Ca	30	1	206
va	50	2	207
em	100	0	208
---	99	2	225
---	37	2	227
---	52	2	232
---	87	2	233
---	119	2	234
---	37	2	235
---	116	0	241
---	20	0	245
---	30	2	248
---	65	0	249
---	114	0	250
---	55	2	251
0707070014231216541006440057030057030000010637660522627501000002400000003400post.src/devpost/AXname AX
fontname AvantGarde-DemiOblique
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	60	2	35
$	56	2	36
%	86	2	37
&	68	2	38
'	28	2	39
(	38	3	40
)	38	3	41
*	44	2	42
+	60	0	43
,	28	1	44
hy	42	0	45
-	"
.	28	0	46
/	46	3	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	56	2	63
@	74	2	64
A	74	2	65
B	58	2	66
C	78	2	67
D	70	2	68
E	52	2	69
F	48	2	70
G	84	2	71
H	68	2	72
I	28	2	73
J	48	2	74
K	62	2	75
L	44	2	76
M	90	2	77
N	74	2	78
O	84	2	79
P	56	2	80
Q	84	2	81
R	58	2	82
S	52	2	83
T	42	2	84
U	64	2	85
V	70	2	86
W	90	2	87
X	68	2	88
Y	62	2	89
Z	50	2	90
[	32	3	91
\	64	2	92
bs	"
]	32	3	93
---	60	2	94
---	50	1	95
`	28	2	96
a	66	0	97
b	66	2	98
c	64	0	99
d	66	2	100
e	64	0	101
f	28	2	102
g	66	1	103
h	60	2	104
i	24	2	105
j	26	3	106
k	58	2	107
l	24	2	108
m	94	0	109
n	60	0	110
o	64	0	111
p	66	1	112
q	66	1	113
r	32	0	114
s	44	0	115
t	30	2	116
u	60	0	117
v	56	0	118
w	80	0	119
x	56	0	120
y	58	1	121
z	46	0	122
{	34	3	123
---	60	2	124
}	34	3	125
---	60	0	126
!!	28	1	161
ct	56	2	162
ps	56	2	163
fr	16	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	60	2	168
---	22	2	169
``	48	2	170
---	46	0	171
---	24	0	172
---	24	0	173
fi	52	2	174
fl	52	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	60	3	182
---	60	0	183
---	28	1	184
---	48	1	185
''	48	2	186
---	46	0	187
---	100	0	188
---	128	2	189
??	56	1	191
ga	42	2	193
\`	"
aa	42	2	194
\'	"
^a	54	2	195
^	"
~a	48	2	196
~	"
-a	42	2	197
Ua	48	2	198
.a	28	2	199
:a	50	2	200
oa	36	2	202
,a	34	1	203
"a	70	2	205
Ca	34	1	206
va	54	2	207
em	100	0	208
---	90	2	225
---	36	2	227
---	48	2	232
---	84	2	233
---	106	2	234
---	36	2	235
---	108	0	241
---	24	0	245
---	32	2	248
---	66	0	249
---	108	0	250
---	60	2	251
0707070014231216551006440057030057030000010640200522627501000002300000003364post.src/devpost/Bname B
fontname Times-Bold
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	56	2	34
dq	"
#	50	2	35
$	50	3	36
%	100	2	37
&	83	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	57	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
---	57	0	60
=	57	0	61
---	57	0	62
?	50	2	63
@	93	3	64
A	72	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	78	2	72
I	39	2	73
J	50	2	74
K	78	2	75
L	67	2	76
M	94	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	72	2	82
S	56	2	83
T	67	2	84
U	72	2	85
V	72	2	86
W	100	2	87
X	72	2	88
Y	72	2	89
Z	67	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	58	2	94
---	50	1	95
`	33	2	96
a	50	0	97
b	56	2	98
c	44	0	99
d	56	2	100
e	44	0	101
f	33	2	102
g	50	1	103
h	56	2	104
i	28	2	105
j	33	3	106
k	56	2	107
l	28	2	108
m	83	0	109
n	56	0	110
o	50	0	111
p	56	1	112
q	56	1	113
r	44	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
{	39	3	123
---	22	3	124
}	39	3	125
---	52	0	126
!!	33	1	161
ct	50	3	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	28	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	25	0	180
pg	54	3	182
---	35	0	183
---	33	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
??	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	30	2	227
---	67	2	232
---	78	2	233
---	100	2	234
---	33	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	2	249
---	72	0	250
---	56	2	251
0707070014231216561006440057030057030000010640220522627501000002400000003367post.src/devpost/BIname BI
fontname Times-BoldItalic
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	39	2	33
"	56	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	57	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
---	57	2	60
=	57	0	61
---	57	2	62
?	50	2	63
@	83	3	64
A	67	2	65
B	67	2	66
C	67	2	67
D	72	2	68
E	67	2	69
F	67	2	70
G	72	2	71
H	78	2	72
I	39	2	73
J	50	2	74
K	67	2	75
L	61	2	76
M	89	2	77
N	72	2	78
O	72	2	79
P	61	2	80
Q	72	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	89	2	87
X	67	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	57	2	94
---	50	1	95
`	33	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	33	3	102
g	50	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	28	2	116
u	56	0	117
v	44	0	118
w	67	0	119
x	50	0	120
y	44	1	121
z	39	0	122
{	35	3	123
---	22	2	124
}	35	3	125
---	57	0	126
!!	39	1	161
ct	50	3	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	28	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	56	3	174
fl	56	3	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	25	0	180
pg	50	3	182
---	35	0	183
---	33	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
??	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	94	2	225
---	27	2	227
---	61	2	232
---	72	3	233
---	94	2	234
---	30	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	3	249
---	72	0	250
---	50	3	251
0707070014231216571006440057030057030000010640240522627501000002400000003272post.src/devpost/CBname CB
fontname Courier-Bold
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
!!	60	1	161
ct	60	2	162
ps	60	2	163
fr	60	2	164
yn	60	2	165
fn	60	2	166
sc	60	2	167
cr	60	2	168
---	60	2	169
``	60	2	170
---	60	0	171
---	60	0	172
---	60	0	173
en	60	0	177
\-	"
dg	60	2	178
dd	60	2	179
---	60	0	180
pg	60	2	182
---	60	0	183
---	60	1	184
---	60	1	185
''	60	2	186
---	60	0	187
---	60	0	188
---	60	2	189
??	60	1	191
ga	60	2	193
\`	"
aa	60	2	194
\'	"
^a	60	2	195
^	"
~a	60	2	196
~	"
-a	60	2	197
Ua	60	2	198
.a	60	2	199
:a	60	2	200
oa	60	2	202
,a	60	1	203
"a	60	2	205
Ca	60	1	206
va	60	2	207
em	60	0	208
---	60	2	225
---	60	2	227
---	60	2	232
---	60	2	233
---	60	2	234
---	60	2	235
---	60	0	241
---	60	0	245
---	60	2	248
---	60	0	249
---	60	0	250
---	60	2	251
0707070014231216601006440057030057030000010640260522627501000002400000003275post.src/devpost/CIname CI
fontname Courier-Oblique
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
!!	60	1	161
ct	60	2	162
ps	60	2	163
fr	60	2	164
yn	60	2	165
fn	60	2	166
sc	60	2	167
cr	60	2	168
---	60	2	169
``	60	2	170
---	60	0	171
---	60	0	172
---	60	0	173
en	60	0	177
\-	"
dg	60	2	178
dd	60	2	179
---	60	0	180
pg	60	2	182
---	60	0	183
---	60	1	184
---	60	1	185
''	60	2	186
---	60	0	187
---	60	0	188
---	60	2	189
??	60	1	191
ga	60	2	193
\`	"
aa	60	2	194
\'	"
^a	60	2	195
^	"
~a	60	2	196
~	"
-a	60	2	197
Ua	60	2	198
.a	60	2	199
:a	60	2	200
oa	60	2	202
,a	60	1	203
"a	60	2	205
Ca	60	1	206
va	60	2	207
em	60	0	208
---	60	2	225
---	60	2	227
---	60	2	232
---	60	2	233
---	60	2	234
---	60	2	235
---	60	0	241
---	60	0	245
---	60	2	248
---	60	0	249
---	60	0	250
---	60	2	251
0707070014231216611006440057030057030000010640400522627501000002400000003265post.src/devpost/COname CO
fontname Courier
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
!!	60	1	161
ct	60	2	162
ps	60	2	163
fr	60	2	164
yn	60	2	165
fn	60	2	166
sc	60	2	167
cr	60	2	168
---	60	2	169
``	60	2	170
---	60	0	171
---	60	0	172
---	60	0	173
en	60	0	177
\-	"
dg	60	2	178
dd	60	2	179
---	60	0	180
pg	60	2	182
---	60	0	183
---	60	1	184
---	60	1	185
''	60	2	186
---	60	0	187
---	60	0	188
---	60	2	189
??	60	1	191
ga	60	2	193
\`	"
aa	60	2	194
\'	"
^a	60	2	195
^	"
~a	60	2	196
~	"
-a	60	2	197
Ua	60	2	198
.a	60	2	199
:a	60	2	200
oa	60	2	202
,a	60	1	203
"a	60	2	205
Ca	60	1	206
va	60	2	207
em	60	0	208
---	60	2	225
---	60	2	227
---	60	2	232
---	60	2	233
---	60	2	234
---	60	2	235
---	60	0	241
---	60	0	245
---	60	2	248
---	60	0	249
---	60	0	250
---	60	2	251
0707070014231216621006440057030057030000010640420522627501100002400000003265post.src/devpost/CWname CW
fontname Courier
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
!!	60	1	161
ct	60	2	162
ps	60	2	163
fr	60	2	164
yn	60	2	165
fn	60	2	166
sc	60	2	167
cr	60	2	168
---	60	2	169
``	60	2	170
---	60	0	171
---	60	0	172
---	60	0	173
en	60	0	177
\-	"
dg	60	2	178
dd	60	2	179
---	60	0	180
pg	60	2	182
---	60	0	183
---	60	1	184
---	60	1	185
''	60	2	186
---	60	0	187
---	60	0	188
---	60	2	189
??	60	1	191
ga	60	2	193
\`	"
aa	60	2	194
\'	"
^a	60	2	195
^	"
~a	60	2	196
~	"
-a	60	2	197
Ua	60	2	198
.a	60	2	199
:a	60	2	200
oa	60	2	202
,a	60	1	203
"a	60	2	205
Ca	60	1	206
va	60	2	207
em	60	0	208
---	60	2	225
---	60	2	227
---	60	2	232
---	60	2	233
---	60	2	234
---	60	2	235
---	60	0	241
---	60	0	245
---	60	2	248
---	60	0	249
---	60	0	250
---	60	2	251
0707070014231216631006440057030057030000010640440522627501100002400000003301post.src/devpost/CXname CX
fontname Courier-BoldOblique
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
!!	60	1	161
ct	60	2	162
ps	60	2	163
fr	60	2	164
yn	60	2	165
fn	60	2	166
sc	60	2	167
cr	60	2	168
---	60	2	169
``	60	2	170
---	60	0	171
---	60	0	172
---	60	0	173
en	60	0	177
\-	"
dg	60	2	178
dd	60	2	179
---	60	0	180
pg	60	2	182
---	60	0	183
---	60	1	184
---	60	1	185
''	60	2	186
---	60	0	187
---	60	0	188
---	60	2	189
??	60	1	191
ga	60	2	193
\`	"
aa	60	2	194
\'	"
^a	60	2	195
^	"
~a	60	2	196
~	"
-a	60	2	197
Ua	60	2	198
.a	60	2	199
:a	60	2	200
oa	60	2	202
,a	60	1	203
"a	60	2	205
Ca	60	1	206
va	60	2	207
em	60	0	208
---	60	2	225
---	60	2	227
---	60	2	232
---	60	2	233
---	60	2	234
---	60	2	235
---	60	0	241
---	60	0	245
---	60	2	248
---	60	0	249
---	60	0	250
---	60	2	251
0707070014231216641006440057030057030000010640460522627501100002600000001740post.src/devpost/DESC#Device Description - original PostScript character set

PDL PostScript

fonts 10 R I B BI CW H HI HB S1 S
sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
120 125 130 135 140 145 150 155 160 0

res 720
hor 1
vert 1
unitwidth 10

charset
dq hy bs !! ct ps fr yn fn sc cr `` fi fl en \- dg dd pg ''
?? ga \` aa \' ^a ~a -a Ua .a :a oa ,a "a Ca va em fa te st
** pl mi sl eq cg *A *B *X *D *E *F *G *Y *I *K *L *M *N *O
*P *H *R *S *T *U ts *W *C *Q *Z tf pp ul rn *a *b *x *d *e
*f *g *y *i *k *l *m *n *o *p *h *r *s *t *u *w *c *q *z or
ap fm <= if ab <- ua -> da de +- >= mu pt pd bu di != == ~~
el av ah CR af If Rf ws Ox O+ es ca cu sp ip !b sb ib mo !m
an gr rg co tm sr c. no l& l| lz b< RG CO TM LT br LX LB lc
lx lf lt lk lb bv b> is RT RX RB rc rx rf rt rk rb ~= ru ff
Fi Fl 14 12 34 bx ob ci sq Sl L1 LA LV LH lh rh lH rH PC DG
-+ cs cy as os =. ld rd le ge 
0707070014231215101006400057030057030000010554200522633073600003400000003054post.src/devpost/devpost.mkMAKE=/bin/make
MAKEFILE=devpost.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
FONTFILES=DESC ? ?? [A-Z]??* shell.lib

all :
	@if [ -r LINKFILE ]; then sh LINKFILE; fi;

install : all
	@rm -f $(FONTDIR)/devpost/*.out
	@if [ ! -d $(FONTDIR) ]; then \
	    mkdir $(FONTDIR); \
	    chmod 755 $(FONTDIR); \
	    chgrp $(GROUP) $(FONTDIR); \
	    chown $(OWNER) $(FONTDIR); \
	fi
	@if [ ! -d $(FONTDIR)/devpost ]; then \
	    mkdir $(FONTDIR)/devpost; \
	    chmod 755 $(FONTDIR)/devpost; \
	    chgrp $(GROUP) $(FONTDIR)/devpost; \
	    chown $(OWNER) $(FONTDIR)/devpost; \
	fi
	@if [ ! -d $(FONTDIR)/devpost/charlib ]; then \
	    mkdir $(FONTDIR)/devpost/charlib; \
	    chmod 755 $(FONTDIR)/devpost/charlib; \
	    chgrp $(GROUP) $(FONTDIR)/devpost/charlib; \
	    chown $(OWNER) $(FONTDIR)/devpost/charlib; \
	fi
	cp $(FONTFILES) $(FONTDIR)/devpost
	@for i in $(FONTFILES); do \
	    chmod 644 $(FONTDIR)/devpost/$$i; \
	    chgrp $(GROUP) $(FONTDIR)/devpost/$$i; \
	    chown $(OWNER) $(FONTDIR)/devpost/$$i; \
	done
	cp charlib/* $(FONTDIR)/devpost/charlib
	@for i in charlib/*; do \
	    chmod 644 $(FONTDIR)/devpost/$$i; \
	    chgrp $(GROUP) $(FONTDIR)/devpost/$$i; \
	    chown $(OWNER) $(FONTDIR)/devpost/$$i; \
	done

clean :

clobber : clean

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014231216661006440057030057030000010640470522627501100002400000001145post.src/devpost/GRname GR
fontname Symbol
named in prologue
spacewidth 25
charset
*A	72	2	65
*B	67	2	66
*X	72	2	67
*D	61	2	68
*E	61	2	69
*F	76	2	70
*G	60	2	71
*Y	72	2	72
*I	33	2	73
*K	72	2	75
*L	69	2	76
*M	89	2	77
*N	72	2	78
*O	72	2	79
*P	77	2	80
*H	74	2	81
*R	56	2	82
*S	59	2	83
*T	61	2	84
*U	69	2	85
*W	77	2	87
*C	65	2	88
*Q	80	2	89
*Z	61	2	90
*a	63	0	97
*b	55	3	98
*x	55	1	99
*d	49	2	100
*e	44	0	101
*f	52	3	102
*g	41	1	103
*y	60	1	104
*i	33	0	105
*k	55	0	107
*l	55	2	108
*m	58	1	109
*n	52	0	110
*o	55	0	111
*p	55	0	112
*h	52	2	113
*r	55	1	114
*s	60	0	115
*t	44	0	116
*u	58	0	117
*w	69	0	119
*c	49	3	120
*q	69	1	121
*z	49	3	122
0707070014231216671006440057030057030000010641020522627501100002300000003362post.src/devpost/Hname H
fontname Helvetica
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	56	2	63
@	102	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
\	28	2	92
bs	"
]	28	3	93
---	47	2	94
---	56	1	95
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	26	3	124
}	33	3	125
---	58	0	126
!!	33	1	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	0	168
---	19	2	169
``	33	2	170
---	56	0	171
---	33	0	172
---	33	0	173
fi	50	2	174
fl	50	2	175
en	56	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	54	3	182
---	35	0	183
---	22	1	184
---	33	1	185
''	33	2	186
---	56	0	187
---	100	0	188
---	100	2	189
??	61	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	37	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	36	2	235
---	89	0	241
---	28	0	245
---	22	2	248
---	61	0	249
---	94	0	250
---	61	2	251
0707070014231216701006440057030057030000010641040522627501100002400000003367post.src/devpost/HBname HB
fontname Helvetica-Bold
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	47	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	61	2	63
@	98	3	64
A	72	2	65
B	72	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	56	2	74
K	72	2	75
L	61	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	58	2	94
---	56	1	95
`	28	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	33	2	102
g	61	1	103
h	61	2	104
i	28	2	105
j	28	3	106
k	56	2	107
l	28	2	108
m	89	0	109
n	61	0	110
o	61	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	56	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	78	0	119
x	56	0	120
y	56	1	121
z	50	0	122
{	39	3	123
---	28	3	124
}	39	3	125
---	58	0	126
!!	33	1	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	2	168
---	24	2	169
``	50	2	170
---	56	0	171
---	33	0	172
---	33	0	173
fi	61	2	174
fl	61	2	175
en	56	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	56	3	182
---	35	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	56	0	187
---	100	0	188
---	100	2	189
??	61	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	37	2	227
---	61	2	232
---	78	2	233
---	100	2	234
---	36	2	235
---	89	0	241
---	28	0	245
---	28	2	248
---	61	0	249
---	94	0	250
---	61	2	251
0707070014231216711006440057030057030000010641060522627501100002400000003373post.src/devpost/HIname HI
fontname Helvetica-Oblique
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	56	2	63
@	102	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
\	28	2	92
bs	"
]	28	3	93
---	47	2	94
---	56	1	95
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	26	3	124
}	33	3	125
---	58	0	126
!!	33	1	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	0	168
---	19	2	169
``	33	2	170
---	56	0	171
---	33	0	172
---	33	0	173
fi	50	2	174
fl	50	2	175
en	56	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	54	3	182
---	35	0	183
---	22	1	184
---	33	1	185
''	33	2	186
---	56	0	187
---	100	0	188
---	100	2	189
??	61	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	37	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	36	2	235
---	89	0	241
---	28	0	245
---	22	2	248
---	61	0	249
---	94	0	250
---	61	2	251
0707070014231216721006440057030057030000010641400522627501100002400000003376post.src/devpost/HXname HX
fontname Helvetica-BoldOblique
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	47	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	61	2	63
@	98	3	64
A	72	2	65
B	72	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	56	2	74
K	72	2	75
L	61	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	58	2	94
---	56	1	95
`	28	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	33	2	102
g	61	1	103
h	61	2	104
i	28	2	105
j	28	3	106
k	56	2	107
l	28	2	108
m	89	0	109
n	61	0	110
o	61	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	56	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	78	0	119
x	56	0	120
y	56	1	121
z	50	0	122
{	39	3	123
---	28	3	124
}	39	3	125
---	58	0	126
!!	33	1	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	2	168
---	24	2	169
``	50	2	170
---	56	0	171
---	33	0	172
---	33	0	173
fi	61	2	174
fl	61	2	175
en	56	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	56	3	182
---	35	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	56	0	187
---	100	0	188
---	100	2	189
??	61	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	37	2	227
---	61	2	232
---	78	2	233
---	100	2	234
---	36	2	235
---	89	0	241
---	28	0	245
---	28	2	248
---	61	0	249
---	94	0	250
---	61	2	251
0707070014231216731006440057030057030000010641420522627501100002400000003371post.src/devpost/Hbname Hb
fontname Helvetica-Narrow-Bold
named in prologue
ligatures fi fl 0
spacewidth 23
charset
!	27	2	33
"	39	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	59	2	38
'	23	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	27	0	58
;	27	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	50	2	63
@	80	3	64
A	59	2	65
B	59	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	46	2	74
K	59	2	75
L	50	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	27	3	91
\	23	2	92
bs	"
]	27	3	93
---	48	2	94
---	46	1	95
`	23	2	96
a	46	0	97
b	50	2	98
c	46	0	99
d	50	2	100
e	46	0	101
f	27	2	102
g	50	1	103
h	50	2	104
i	23	2	105
j	23	3	106
k	46	2	107
l	23	2	108
m	73	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	32	0	114
s	46	0	115
t	27	2	116
u	50	0	117
v	46	0	118
w	64	0	119
x	46	0	120
y	46	1	121
z	41	0	122
{	32	3	123
---	23	3	124
}	32	3	125
---	48	0	126
!!	27	1	161
ct	46	3	162
ps	46	2	163
fr	14	2	164
yn	46	2	165
fn	46	3	166
sc	46	3	167
cr	46	2	168
---	20	2	169
``	41	2	170
---	46	0	171
---	27	0	172
---	27	0	173
fi	50	2	174
fl	50	2	175
en	46	0	177
\-	"
dg	46	3	178
dd	46	3	179
---	23	0	180
pg	46	3	182
---	29	0	183
---	23	1	184
---	41	1	185
''	41	2	186
---	46	0	187
---	82	0	188
---	82	2	189
??	50	1	191
ga	27	2	193
\`	"
aa	27	2	194
\'	"
^a	27	2	195
^	"
~a	27	2	196
~	"
-a	27	2	197
Ua	27	2	198
.a	27	2	199
:a	27	2	200
oa	27	2	202
,a	27	1	203
"a	27	2	205
Ca	27	1	206
va	27	2	207
em	82	0	208
---	82	2	225
---	30	2	227
---	50	2	232
---	64	2	233
---	82	2	234
---	30	2	235
---	73	0	241
---	23	0	245
---	23	2	248
---	50	0	249
---	77	0	250
---	50	2	251
0707070014231216741006440057030057030000010641440522627501100002400000003374post.src/devpost/Hiname Hi
fontname Helvetica-Narrow-Oblique
named in prologue
ligatures fi fl 0
spacewidth 23
charset
!	23	2	33
"	29	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	55	2	38
'	18	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	23	0	58
;	23	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	46	2	63
@	83	3	64
A	55	2	65
B	55	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	41	2	74
K	55	2	75
L	46	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	23	3	91
\	23	2	92
bs	"
]	23	3	93
---	38	2	94
---	46	1	95
`	18	2	96
a	46	0	97
b	46	2	98
c	41	0	99
d	46	2	100
e	46	0	101
f	23	2	102
g	46	1	103
h	46	2	104
i	18	2	105
j	18	3	106
k	41	2	107
l	18	2	108
m	68	0	109
n	46	0	110
o	46	0	111
p	46	1	112
q	46	1	113
r	27	0	114
s	41	0	115
t	23	2	116
u	46	0	117
v	41	0	118
w	59	0	119
x	41	0	120
y	41	1	121
z	41	0	122
{	27	3	123
---	21	3	124
}	27	3	125
---	48	0	126
!!	27	1	161
ct	46	3	162
ps	46	2	163
fr	14	2	164
yn	46	2	165
fn	46	3	166
sc	46	3	167
cr	46	0	168
---	16	2	169
``	27	2	170
---	46	0	171
---	27	0	172
---	27	0	173
fi	41	2	174
fl	41	2	175
en	46	0	177
\-	"
dg	46	3	178
dd	46	3	179
---	23	0	180
pg	44	3	182
---	29	0	183
---	18	1	184
---	27	1	185
''	27	2	186
---	46	0	187
---	82	0	188
---	82	2	189
??	50	1	191
ga	27	2	193
\`	"
aa	27	2	194
\'	"
^a	27	2	195
^	"
~a	27	2	196
~	"
-a	27	2	197
Ua	27	2	198
.a	27	2	199
:a	27	2	200
oa	27	2	202
,a	27	1	203
"a	27	2	205
Ca	27	1	206
va	27	2	207
em	82	0	208
---	82	2	225
---	30	2	227
---	46	2	232
---	64	2	233
---	82	2	234
---	30	2	235
---	73	0	241
---	23	0	245
---	18	2	248
---	50	0	249
---	77	0	250
---	50	2	251
0707070014231216751006440057030057030000010641460522627501100002400000003364post.src/devpost/Hrname Hr
fontname Helvetica-Narrow
named in prologue
ligatures fi fl 0
spacewidth 23
charset
!	23	2	33
"	29	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	55	2	38
'	18	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	23	0	58
;	23	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	46	2	63
@	83	3	64
A	55	2	65
B	55	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	41	2	74
K	55	2	75
L	46	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	23	3	91
\	23	2	92
bs	"
]	23	3	93
---	38	2	94
---	46	1	95
`	18	2	96
a	46	0	97
b	46	2	98
c	41	0	99
d	46	2	100
e	46	0	101
f	23	2	102
g	46	1	103
h	46	2	104
i	18	2	105
j	18	3	106
k	41	2	107
l	18	2	108
m	68	0	109
n	46	0	110
o	46	0	111
p	46	1	112
q	46	1	113
r	27	0	114
s	41	0	115
t	23	2	116
u	46	0	117
v	41	0	118
w	59	0	119
x	41	0	120
y	41	1	121
z	41	0	122
{	27	3	123
---	21	3	124
}	27	3	125
---	48	0	126
!!	27	1	161
ct	46	3	162
ps	46	2	163
fr	14	2	164
yn	46	2	165
fn	46	3	166
sc	46	3	167
cr	46	0	168
---	16	2	169
``	27	2	170
---	46	0	171
---	27	0	172
---	27	0	173
fi	41	2	174
fl	41	2	175
en	46	0	177
\-	"
dg	46	3	178
dd	46	3	179
---	23	0	180
pg	44	3	182
---	29	0	183
---	18	1	184
---	27	1	185
''	27	2	186
---	46	0	187
---	82	0	188
---	82	2	189
??	50	1	191
ga	27	2	193
\`	"
aa	27	2	194
\'	"
^a	27	2	195
^	"
~a	27	2	196
~	"
-a	27	2	197
Ua	27	2	198
.a	27	2	199
:a	27	2	200
oa	27	2	202
,a	27	1	203
"a	27	2	205
Ca	27	1	206
va	27	2	207
em	82	0	208
---	82	2	225
---	30	2	227
---	46	2	232
---	64	2	233
---	82	2	234
---	30	2	235
---	73	0	241
---	23	0	245
---	18	2	248
---	50	0	249
---	77	0	250
---	50	2	251
0707070014231216761006440057030057030000010641600522627501100002400000003400post.src/devpost/Hxname Hx
fontname Helvetica-Narrow-BoldOblique
named in prologue
ligatures fi fl 0
spacewidth 23
charset
!	27	2	33
"	39	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	59	2	38
'	23	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	27	0	58
;	27	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	50	2	63
@	80	3	64
A	59	2	65
B	59	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	46	2	74
K	59	2	75
L	50	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	27	3	91
\	23	2	92
bs	"
]	27	3	93
---	48	2	94
---	46	1	95
`	23	2	96
a	46	0	97
b	50	2	98
c	46	0	99
d	50	2	100
e	46	0	101
f	27	2	102
g	50	1	103
h	50	2	104
i	23	2	105
j	23	3	106
k	46	2	107
l	23	2	108
m	73	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	32	0	114
s	46	0	115
t	27	2	116
u	50	0	117
v	46	0	118
w	64	0	119
x	46	0	120
y	46	1	121
z	41	0	122
{	32	3	123
---	23	3	124
}	32	3	125
---	48	0	126
!!	27	1	161
ct	46	3	162
ps	46	2	163
fr	14	2	164
yn	46	2	165
fn	46	3	166
sc	46	3	167
cr	46	2	168
---	20	2	169
``	41	2	170
---	46	0	171
---	27	0	172
---	27	0	173
fi	50	2	174
fl	50	2	175
en	46	0	177
\-	"
dg	46	3	178
dd	46	3	179
---	23	0	180
pg	46	3	182
---	29	0	183
---	23	1	184
---	41	1	185
''	41	2	186
---	46	0	187
---	82	0	188
---	82	2	189
??	50	1	191
ga	27	2	193
\`	"
aa	27	2	194
\'	"
^a	27	2	195
^	"
~a	27	2	196
~	"
-a	27	2	197
Ua	27	2	198
.a	27	2	199
:a	27	2	200
oa	27	2	202
,a	27	1	203
"a	27	2	205
Ca	27	1	206
va	27	2	207
em	82	0	208
---	82	2	225
---	30	2	227
---	50	2	232
---	64	2	233
---	82	2	234
---	30	2	235
---	73	0	241
---	23	0	245
---	23	2	248
---	50	0	249
---	77	0	250
---	50	2	251
0707070014231216771006440057030057030000010641620522627501100002300000003360post.src/devpost/Iname I
fontname Times-Italic
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	42	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	68	2	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
---	68	2	60
=	68	0	61
---	68	2	62
?	50	2	63
@	92	3	64
A	61	2	65
B	61	2	66
C	67	2	67
D	72	2	68
E	61	2	69
F	61	2	70
G	72	2	71
H	72	2	72
I	33	2	73
J	44	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	67	2	78
O	72	2	79
P	61	2	80
Q	72	3	81
R	61	2	82
S	50	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	83	2	87
X	61	2	88
Y	56	2	89
Z	56	2	90
[	39	3	91
\	28	2	92
bs	"
]	39	3	93
---	42	2	94
---	50	1	95
`	33	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	28	3	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	72	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	28	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	40	3	123
---	27	3	124
}	40	3	125
---	54	0	126
!!	39	1	161
ct	50	3	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	2	167
cr	50	2	168
---	21	2	169
``	56	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	50	3	174
fl	50	3	175
en	50	0	177
\-	"
dg	50	2	178
dd	50	2	179
---	25	0	180
pg	52	3	182
---	35	0	183
---	33	1	184
---	56	1	185
''	56	2	186
---	50	0	187
---	89	0	188
---	100	2	189
??	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	89	0	208
---	89	2	225
---	28	2	227
---	56	2	232
---	72	3	233
---	94	2	234
---	31	2	235
---	67	0	241
---	28	0	245
---	28	2	248
---	50	3	249
---	67	0	250
---	50	3	251
0707070014231217001006440057030057030000010641640522627501100002400000003366post.src/devpost/KBname KB
fontname Bookman-Demi
named in prologue
ligatures fi fl 0
spacewidth 34
charset
!	36	2	33
"	42	2	34
dq	"
#	60	2	35
$	66	3	36
%	94	2	37
&	80	2	38
'	32	2	39
(	32	3	40
)	32	3	41
*	46	2	42
+	60	0	43
,	34	1	44
hy	36	0	45
-	"
.	34	0	46
/	60	3	47
0	66	2	48
1	66	2	49
2	66	2	50
3	66	2	51
4	66	2	52
5	66	2	53
6	66	2	54
7	66	2	55
8	66	2	56
9	66	2	57
:	34	0	58
;	34	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	66	2	63
@	82	2	64
A	72	2	65
B	72	2	66
C	74	2	67
D	78	2	68
E	72	2	69
F	68	2	70
G	78	2	71
H	82	2	72
I	40	2	73
J	64	2	74
K	80	2	75
L	64	2	76
M	94	2	77
N	74	2	78
O	80	2	79
P	66	2	80
Q	80	3	81
R	78	2	82
S	66	2	83
T	70	2	84
U	74	2	85
V	72	2	86
W	94	2	87
X	78	2	88
Y	70	2	89
Z	64	2	90
[	30	3	91
\	60	2	92
bs	"
]	30	3	93
---	60	2	94
---	50	1	95
`	32	2	96
a	58	0	97
b	60	2	98
c	58	0	99
d	64	2	100
e	58	0	101
f	38	2	102
g	58	3	103
h	68	2	104
i	36	2	105
j	34	3	106
k	66	2	107
l	34	2	108
m	100	0	109
n	68	0	110
o	62	0	111
p	64	1	112
q	62	1	113
r	46	0	114
s	52	0	115
t	46	2	116
u	66	0	117
v	60	0	118
w	80	0	119
x	60	0	120
y	62	1	121
z	56	0	122
{	32	3	123
---	60	2	124
}	32	3	125
---	60	0	126
!!	36	1	161
ct	66	2	162
ps	66	2	163
fr	12	2	164
yn	66	2	165
fn	66	3	166
sc	60	3	167
cr	60	2	168
---	24	2	169
``	54	2	170
---	40	0	171
---	22	0	172
---	22	0	173
fi	74	2	174
fl	74	2	175
en	50	0	177
\-	"
dg	44	3	178
dd	38	3	179
---	34	0	180
pg	80	2	182
---	46	0	183
---	32	1	184
---	54	1	185
''	54	2	186
---	40	0	187
---	100	0	188
---	136	2	189
??	66	1	191
ga	40	2	193
\`	"
aa	40	2	194
\'	"
^a	50	2	195
^	"
~a	48	2	196
~	"
-a	46	2	197
Ua	50	2	198
.a	32	2	199
:a	50	2	200
oa	34	2	202
,a	36	1	203
"a	44	2	205
Ca	32	1	206
va	50	2	207
em	100	0	208
---	114	2	225
---	40	2	227
---	64	2	232
---	80	3	233
---	122	2	234
---	40	2	235
---	88	0	241
---	36	0	245
---	34	2	248
---	62	0	249
---	94	0	250
---	66	2	251
0707070014231217011006440057030057030000010641660522627501100002400000003373post.src/devpost/KIname KI
fontname Bookman-LightItalic
named in prologue
ligatures fi fl 0
spacewidth 30
charset
!	32	2	33
"	36	2	34
dq	"
#	60	2	35
$	62	2	36
%	80	2	37
&	82	2	38
'	28	2	39
(	28	3	40
)	28	3	41
*	44	2	42
+	60	2	43
,	30	1	44
hy	32	0	45
-	"
.	30	0	46
/	60	3	47
0	62	2	48
1	62	2	49
2	62	2	50
3	62	2	51
4	62	2	52
5	62	2	53
6	62	2	54
7	62	2	55
8	62	2	56
9	62	2	57
:	30	0	58
;	30	1	59
---	60	2	60
=	60	0	61
---	60	2	62
?	54	2	63
@	78	2	64
A	70	2	65
B	72	2	66
C	72	2	67
D	74	2	68
E	68	2	69
F	62	2	70
G	76	2	71
H	80	2	72
I	32	2	73
J	56	2	74
K	72	2	75
L	58	2	76
M	86	2	77
N	72	2	78
O	76	2	79
P	60	2	80
Q	78	3	81
R	70	2	82
S	64	2	83
T	60	2	84
U	72	2	85
V	68	2	86
W	96	2	87
X	70	2	88
Y	66	2	89
Z	58	2	90
[	26	3	91
\	60	2	92
bs	"
]	26	3	93
---	60	2	94
---	50	1	95
`	28	2	96
a	62	0	97
b	60	2	98
c	48	0	99
d	64	2	100
e	54	0	101
f	34	3	102
g	56	1	103
h	62	2	104
i	28	2	105
j	28	3	106
k	60	2	107
l	28	2	108
m	88	0	109
n	62	0	110
o	54	0	111
p	60	1	112
q	56	1	113
r	40	0	114
s	54	0	115
t	34	2	116
u	62	0	117
v	54	0	118
w	88	0	119
x	54	0	120
y	60	1	121
z	52	0	122
{	36	3	123
---	60	2	124
}	38	3	125
---	60	0	126
!!	32	1	161
ct	62	2	162
ps	62	2	163
fr	2	2	164
yn	62	2	165
fn	62	3	166
sc	62	3	167
cr	60	2	168
---	20	2	169
``	44	2	170
---	30	0	171
---	18	0	172
---	18	0	173
fi	64	3	174
fl	66	3	175
en	50	0	177
\-	"
dg	62	3	178
dd	62	3	179
---	30	0	180
pg	62	2	182
---	46	0	183
---	32	1	184
---	48	1	185
''	44	2	186
---	30	0	187
---	100	0	188
---	118	2	189
??	54	1	191
ga	34	2	193
\`	"
aa	32	2	194
\'	"
^a	44	2	195
^	"
~a	44	2	196
~	"
-a	44	2	197
Ua	44	2	198
.a	26	2	199
:a	42	2	200
oa	30	2	202
,a	32	1	203
"a	34	2	205
Ca	26	1	206
va	44	2	207
em	100	0	208
---	122	2	225
---	44	2	227
---	58	2	232
---	76	2	233
---	118	2	234
---	40	2	235
---	88	0	241
---	28	0	245
---	34	2	248
---	54	0	249
---	90	0	250
---	62	3	251
0707070014231217021006440057030057030000010642000522627501100002400000003366post.src/devpost/KRname KR
fontname Bookman-Light
named in prologue
ligatures fi fl 0
spacewidth 32
charset
!	30	2	33
"	38	2	34
dq	"
#	60	2	35
$	62	2	36
%	90	2	37
&	80	2	38
'	22	2	39
(	30	3	40
)	30	3	41
*	44	2	42
+	60	0	43
,	32	1	44
hy	40	0	45
-	"
.	32	0	46
/	60	3	47
0	62	2	48
1	62	2	49
2	62	2	50
3	62	2	51
4	62	2	52
5	62	2	53
6	62	2	54
7	62	2	55
8	62	2	56
9	62	2	57
:	32	0	58
;	32	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	54	2	63
@	82	2	64
A	68	2	65
B	74	2	66
C	74	2	67
D	80	2	68
E	72	2	69
F	64	2	70
G	80	2	71
H	80	2	72
I	34	2	73
J	60	2	74
K	72	2	75
L	60	2	76
M	92	2	77
N	74	2	78
O	80	2	79
P	62	2	80
Q	82	3	81
R	72	2	82
S	66	2	83
T	62	2	84
U	78	2	85
V	70	2	86
W	96	2	87
X	72	2	88
Y	64	2	89
Z	64	2	90
[	30	3	91
\	60	2	92
bs	"
]	30	3	93
---	60	2	94
---	50	1	95
`	22	2	96
a	58	0	97
b	62	2	98
c	52	0	99
d	62	2	100
e	52	0	101
f	32	2	102
g	54	3	103
h	66	2	104
i	30	2	105
j	30	3	106
k	62	2	107
l	30	2	108
m	94	0	109
n	66	0	110
o	56	0	111
p	62	1	112
q	58	1	113
r	44	0	114
s	52	0	115
t	38	2	116
u	68	0	117
v	52	0	118
w	78	0	119
x	56	0	120
y	54	1	121
z	48	0	122
{	28	3	123
---	60	2	124
}	28	3	125
---	60	0	126
!!	30	1	161
ct	62	2	162
ps	62	2	163
fr	14	2	164
yn	62	2	165
fn	62	3	166
sc	52	3	167
cr	60	2	168
---	22	2	169
``	40	2	170
---	36	0	171
---	24	0	172
---	24	0	173
fi	62	2	174
fl	62	2	175
en	50	0	177
\-	"
dg	54	3	178
dd	54	3	179
---	32	0	180
pg	60	2	182
---	46	0	183
---	22	0	184
---	40	0	185
''	40	2	186
---	36	0	187
---	100	0	188
---	128	2	189
??	54	1	191
ga	34	2	193
\`	"
aa	34	2	194
\'	"
^a	42	2	195
^	"
~a	44	2	196
~	"
-a	44	2	197
Ua	46	2	198
.a	26	2	199
:a	42	2	200
oa	32	2	202
,a	32	1	203
"a	38	2	205
Ca	32	1	206
va	42	2	207
em	100	0	208
---	126	2	225
---	42	2	227
---	60	2	232
---	80	2	233
---	124	2	234
---	42	2	235
---	86	0	241
---	30	0	245
---	32	2	248
---	56	0	249
---	90	0	250
---	66	2	251
0707070014231217031006440057030057030000010642020522627501100002400000003374post.src/devpost/KXname KX
fontname Bookman-DemiItalic
named in prologue
ligatures fi fl 0
spacewidth 34
charset
!	32	2	33
"	38	2	34
dq	"
#	60	2	35
$	68	3	36
%	88	2	37
&	98	2	38
'	32	2	39
(	26	3	40
)	26	3	41
*	46	2	42
+	60	0	43
,	34	1	44
hy	28	0	45
-	"
.	34	0	46
/	36	2	47
0	68	2	48
1	68	2	49
2	68	2	50
3	68	2	51
4	68	2	52
5	68	2	53
6	68	2	54
7	68	2	55
8	68	2	56
9	68	2	57
:	34	0	58
;	34	1	59
---	62	0	60
=	60	0	61
---	62	0	62
?	62	2	63
@	78	2	64
A	72	2	65
B	72	2	66
C	70	2	67
D	76	2	68
E	72	2	69
F	66	2	70
G	76	2	71
H	80	2	72
I	38	2	73
J	62	2	74
K	78	2	75
L	64	2	76
M	86	2	77
N	74	2	78
O	76	2	79
P	64	2	80
Q	76	3	81
R	74	2	82
S	70	2	83
T	70	2	84
U	74	2	85
V	66	2	86
W	100	2	87
X	74	2	88
Y	66	2	89
Z	68	2	90
[	26	3	91
\	58	2	92
bs	"
]	26	3	93
---	62	2	94
---	50	1	95
`	32	2	96
a	68	0	97
b	60	2	98
c	56	0	99
d	68	2	100
e	56	0	101
f	42	3	102
g	62	1	103
h	70	2	104
i	38	2	105
j	32	3	106
k	70	2	107
l	38	2	108
m	96	0	109
n	68	0	110
o	60	0	111
p	66	1	112
q	62	1	113
r	50	0	114
s	54	0	115
t	44	2	116
u	68	0	117
v	54	0	118
w	86	0	119
x	62	0	120
y	60	1	121
z	56	0	122
{	30	3	123
---	62	2	124
}	30	3	125
---	62	0	126
!!	32	1	161
ct	68	2	162
ps	68	2	163
fr	12	2	164
yn	68	2	165
fn	68	3	166
sc	62	3	167
cr	68	2	168
---	18	2	169
``	52	2	170
---	38	0	171
---	22	0	172
---	22	0	173
fi	82	3	174
fl	82	3	175
en	50	0	177
\-	"
dg	42	3	178
dd	42	3	179
---	34	0	180
pg	68	3	182
---	36	0	183
---	30	1	184
---	52	1	185
''	52	2	186
---	38	0	187
---	100	0	188
---	136	2	189
??	62	1	191
ga	38	2	193
\`	"
aa	34	2	194
\'	"
^a	48	2	195
^	"
~a	48	2	196
~	"
-a	48	2	197
Ua	46	2	198
.a	38	2	199
:a	52	2	200
oa	36	2	202
,a	36	1	203
"a	56	2	205
Ca	32	1	206
va	48	2	207
em	100	0	208
---	114	2	225
---	44	2	227
---	64	2	232
---	76	2	233
---	118	2	234
---	44	2	235
---	88	0	241
---	38	0	245
---	38	2	248
---	60	2	249
---	92	0	250
---	66	3	251
0707070014231217041006440057030057030000010642040522627501100002300000003242post.src/devpost/Cname C
fontname Courier
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
!!	60	1	161
ct	60	2	162
ps	60	2	163
fr	60	2	164
yn	60	2	165
fn	60	2	166
sc	60	2	167
cr	60	2	168
---	60	2	169
``	60	2	170
---	60	0	171
---	60	0	172
---	60	0	173
en	60	0	177
\-	"
dg	60	2	178
dd	60	2	179
---	60	0	180
pg	60	2	182
---	60	0	183
---	60	1	184
---	60	1	185
''	60	2	186
---	60	0	187
---	60	0	188
---	60	2	189
??	60	1	191
ga	60	2	193
\`	"
aa	60	2	194
\'	"
^a	60	2	195
^	"
~a	60	2	196
~	"
-a	60	2	197
Ua	60	2	198
.a	60	2	199
:a	60	2	200
oa	60	2	202
,a	60	1	203
"a	60	2	205
Ca	60	1	206
va	60	2	207
em	60	0	208
---	60	2	225
---	60	2	227
---	60	2	232
---	60	2	233
---	60	2	234
---	60	2	235
---	60	0	241
---	60	0	245
---	60	2	248
---	60	0	249
---	60	0	250
---	60	2	251
0707070014231217051006440057030057030000010642060522627501200002400000003375post.src/devpost/NBname NB
fontname NewCenturySchlbk-Bold
named in prologue
ligatures fi fl 0
spacewidth 29
charset
!	30	2	33
"	33	2	34
dq	"
#	57	2	35
$	57	3	36
%	83	2	37
&	85	2	38
'	24	2	39
(	39	3	40
)	39	3	41
*	50	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	57	2	48
1	57	2	49
2	57	2	50
3	57	2	51
4	57	2	52
5	57	2	53
6	57	2	54
7	57	2	55
8	57	2	56
9	57	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	50	2	63
@	75	2	64
A	76	2	65
B	78	2	66
C	78	2	67
D	83	2	68
E	76	2	69
F	72	2	70
G	83	2	71
H	87	2	72
I	44	2	73
J	65	2	74
K	81	2	75
L	72	2	76
M	98	2	77
N	83	2	78
O	83	2	79
P	76	2	80
Q	83	3	81
R	81	2	82
S	67	2	83
T	72	2	84
U	83	2	85
V	76	2	86
W	98	2	87
X	72	2	88
Y	72	2	89
Z	67	2	90
[	39	3	91
\	61	2	92
bs	"
]	39	3	93
---	61	2	94
---	50	1	95
`	24	2	96
a	61	0	97
b	65	2	98
c	56	0	99
d	67	2	100
e	57	0	101
f	39	2	102
g	61	1	103
h	69	2	104
i	37	2	105
j	35	3	106
k	67	2	107
l	35	2	108
m	96	0	109
n	69	0	110
o	61	0	111
p	67	1	112
q	65	1	113
r	52	0	114
s	50	0	115
t	43	2	116
u	69	0	117
v	61	0	118
w	89	0	119
x	61	0	120
y	61	1	121
z	54	0	122
{	39	3	123
---	61	2	124
}	39	3	125
---	61	0	126
!!	30	1	161
ct	57	3	162
ps	57	2	163
fr	17	2	164
yn	72	2	165
fn	57	3	166
sc	50	2	167
cr	61	2	168
---	24	2	169
``	48	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	69	2	174
fl	69	2	175
en	50	0	177
\-	"
dg	50	2	178
dd	50	2	179
---	28	0	180
pg	75	2	182
---	61	0	183
---	24	1	184
---	48	1	185
''	48	2	186
---	50	0	187
---	100	0	188
---	100	2	189
??	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	98	2	225
---	37	2	227
---	72	2	232
---	83	2	233
---	100	2	234
---	37	2	235
---	87	0	241
---	37	0	245
---	35	2	248
---	61	3	249
---	91	0	250
---	61	2	251
0707070014231217061006440057030057030000010642400522627501200002400000003376post.src/devpost/NIname NI
fontname NewCenturySchlbk-Italic
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	40	2	34
dq	"
#	61	2	35
$	56	3	36
%	83	2	37
&	85	2	38
'	20	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	61	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	2	64
A	70	2	65
B	72	2	66
C	72	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	61	2	74
K	74	2	75
L	67	2	76
M	94	2	77
N	81	2	78
O	78	2	79
P	67	2	80
Q	78	3	81
R	74	2	82
S	67	2	83
T	69	2	84
U	81	2	85
V	70	2	86
W	93	2	87
X	70	2	88
Y	69	2	89
Z	67	2	90
[	33	3	91
\	61	2	92
bs	"
]	33	3	93
---	61	2	94
---	50	1	95
`	20	2	96
a	57	0	97
b	56	2	98
c	44	0	99
d	61	2	100
e	44	0	101
f	33	3	102
g	54	1	103
h	61	2	104
i	33	2	105
j	32	3	106
k	56	2	107
l	33	2	108
m	89	0	109
n	61	0	110
o	50	0	111
p	57	1	112
q	56	1	113
r	44	0	114
s	44	0	115
t	35	2	116
u	61	0	117
v	52	0	118
w	78	0	119
x	50	0	120
y	50	1	121
z	46	0	122
{	33	3	123
---	61	2	124
}	33	3	125
---	61	0	126
!!	33	3	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	50	3	167
cr	61	2	168
---	28	2	169
``	39	2	170
---	43	0	171
---	33	0	172
---	33	0	173
fi	61	3	174
fl	61	3	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	28	0	180
pg	65	2	182
---	61	2	183
---	20	1	184
---	39	1	185
''	39	2	186
---	43	0	187
---	100	0	188
---	100	2	189
??	44	3	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	87	2	225
---	42	2	227
---	67	2	232
---	78	2	233
---	98	2	234
---	37	2	235
---	72	0	241
---	33	0	245
---	33	2	248
---	50	3	249
---	78	0	250
---	56	3	251
0707070014231217071006440057030057030000010642420522627501200002400000003377post.src/devpost/NRname NR
fontname NewCenturySchlbk-Roman
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	30	2	33
"	39	2	34
dq	"
#	56	2	35
$	56	3	36
%	83	2	37
&	81	2	38
'	20	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	74	2	64
A	72	2	65
B	72	2	66
C	72	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	56	2	74
K	78	2	75
L	67	2	76
M	94	2	77
N	81	2	78
O	78	2	79
P	67	2	80
Q	78	3	81
R	72	2	82
S	63	2	83
T	67	2	84
U	81	2	85
V	72	2	86
W	98	2	87
X	70	2	88
Y	70	2	89
Z	61	2	90
[	33	3	91
\	61	2	92
bs	"
]	33	3	93
---	61	2	94
---	50	1	95
`	20	2	96
a	56	0	97
b	56	2	98
c	44	0	99
d	57	2	100
e	50	0	101
f	33	2	102
g	54	1	103
h	61	2	104
i	32	2	105
j	30	3	106
k	59	2	107
l	32	2	108
m	89	0	109
n	61	0	110
o	50	0	111
p	57	1	112
q	56	1	113
r	44	0	114
s	46	0	115
t	39	2	116
u	61	0	117
v	54	0	118
w	78	0	119
x	54	0	120
y	54	1	121
z	48	0	122
{	33	3	123
---	61	2	124
}	33	3	125
---	61	0	126
!!	30	3	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	70	2	165
fn	56	3	166
sc	50	3	167
cr	61	2	168
---	20	2	169
``	39	2	170
---	43	0	171
---	26	0	172
---	26	0	173
fi	61	2	174
fl	61	2	175
en	56	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	28	0	180
pg	61	3	182
---	61	2	183
---	20	1	184
---	39	1	185
''	39	2	186
---	43	0	187
---	100	0	188
---	100	2	189
??	44	3	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	33	2	227
---	67	2	232
---	78	2	233
---	100	2	234
---	30	2	235
---	80	0	241
---	32	0	245
---	32	2	248
---	50	2	249
---	83	0	250
---	57	2	251
0707070014231217101006440057030057030000010642440522627501200002400000003402post.src/devpost/NXname NX
fontname NewCenturySchlbk-BoldItalic
named in prologue
ligatures fi fl 0
spacewidth 29
charset
!	33	2	33
"	40	2	34
dq	"
#	61	2	35
$	57	3	36
%	89	2	37
&	89	2	38
'	26	2	39
(	41	3	40
)	41	3	41
*	50	2	42
+	61	0	43
,	29	1	44
hy	33	0	45
-	"
.	29	0	46
/	28	2	47
0	57	2	48
1	57	2	49
2	57	2	50
3	57	2	51
4	57	2	52
5	57	2	53
6	57	2	54
7	57	2	55
8	57	2	56
9	57	2	57
:	29	0	58
;	29	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	48	2	63
@	75	2	64
A	74	2	65
B	76	2	66
C	76	2	67
D	83	2	68
E	74	2	69
F	70	2	70
G	81	2	71
H	87	2	72
I	44	2	73
J	67	2	74
K	78	2	75
L	70	2	76
M	94	2	77
N	85	2	78
O	83	2	79
P	74	2	80
Q	83	3	81
R	80	2	82
S	69	2	83
T	72	2	84
U	83	2	85
V	74	2	86
W	94	2	87
X	74	2	88
Y	70	2	89
Z	70	2	90
[	41	3	91
\	61	2	92
bs	"
]	41	3	93
---	61	2	94
---	50	1	95
`	26	2	96
a	67	0	97
b	61	2	98
c	54	0	99
d	67	2	100
e	52	0	101
f	39	3	102
g	61	1	103
h	69	2	104
i	39	2	105
j	37	3	106
k	65	2	107
l	39	2	108
m	94	0	109
n	69	0	110
o	57	0	111
p	65	1	112
q	63	1	113
r	52	0	114
s	48	0	115
t	41	2	116
u	69	0	117
v	56	0	118
w	83	0	119
x	57	0	120
y	52	1	121
z	52	0	122
{	41	3	123
---	61	2	124
}	41	3	125
---	61	0	126
!!	33	3	161
ct	57	3	162
ps	57	2	163
fr	17	2	164
yn	57	2	165
fn	57	3	166
sc	50	3	167
cr	57	2	168
---	29	2	169
``	48	2	170
---	48	0	171
---	28	0	172
---	28	0	173
fi	69	3	174
fl	69	3	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	29	0	180
pg	65	2	182
---	61	0	183
---	26	1	184
---	48	1	185
''	48	2	186
---	48	0	187
---	100	0	188
---	117	2	189
??	48	3	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	89	2	225
---	41	2	227
---	70	2	232
---	83	2	233
---	96	2	234
---	36	2	235
---	81	0	241
---	39	0	245
---	39	2	248
---	57	3	249
---	85	0	250
---	57	3	251
0707070014231217111006440057030057030000010642460522627501200002400000003367post.src/devpost/PAname PA
fontname Palatino-Roman
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	28	2	33
"	37	2	34
dq	"
#	50	2	35
$	50	2	36
%	84	2	37
&	78	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	39	2	42
+	61	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	61	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	2	64
A	78	2	65
B	61	2	66
C	71	2	67
D	77	2	68
E	61	2	69
F	56	2	70
G	76	2	71
H	83	2	72
I	34	2	73
J	33	3	74
K	73	2	75
L	61	2	76
M	95	2	77
N	83	2	78
O	79	2	79
P	60	2	80
Q	79	3	81
R	67	2	82
S	53	2	83
T	61	2	84
U	78	2	85
V	72	2	86
W	100	2	87
X	67	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	55	2	98
c	44	0	99
d	61	2	100
e	48	0	101
f	33	2	102
g	56	1	103
h	58	2	104
i	29	2	105
j	23	3	106
k	56	2	107
l	29	2	108
m	88	0	109
n	58	0	110
o	55	0	111
p	60	1	112
q	56	1	113
r	40	0	114
s	42	0	115
t	33	2	116
u	60	0	117
v	56	0	118
w	83	0	119
x	52	0	120
y	56	1	121
z	50	0	122
{	33	2	123
---	61	2	124
}	33	2	125
---	61	0	126
!!	28	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	21	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	61	2	174
fl	61	2	175
en	50	0	177
\-	"
dg	50	2	178
dd	50	3	179
---	25	0	180
pg	63	3	182
---	61	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	114	2	189
??	44	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	25	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	38	2	205
Ca	31	1	206
va	33	2	207
em	100	0	208
---	94	2	225
---	33	2	227
---	61	2	232
---	83	2	233
---	100	2	234
---	33	2	235
---	76	0	241
---	29	0	245
---	29	2	248
---	56	0	249
---	83	0	250
---	56	2	251
0707070014231217121006440057030057030000010643200522627501200002400000003370post.src/devpost/PBname PB
fontname Palatino-Bold
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	28	2	33
"	40	2	34
dq	"
#	50	2	35
$	50	2	36
%	89	2	37
&	83	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	44	2	42
+	61	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	30	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	2	64
A	78	2	65
B	67	2	66
C	72	2	67
D	83	2	68
E	61	2	69
F	56	2	70
G	83	2	71
H	83	2	72
I	39	2	73
J	39	3	74
K	78	2	75
L	61	2	76
M	100	2	77
N	83	2	78
O	83	2	79
P	61	2	80
Q	83	3	81
R	72	2	82
S	61	2	83
T	67	2	84
U	78	2	85
V	78	2	86
W	100	2	87
X	67	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	61	2	98
c	44	0	99
d	61	2	100
e	50	0	101
f	39	2	102
g	56	1	103
h	61	2	104
i	33	2	105
j	33	3	106
k	61	2	107
l	33	2	108
m	89	0	109
n	61	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	44	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	83	0	119
x	50	0	120
y	56	1	121
z	50	0	122
{	31	2	123
---	61	2	124
}	31	2	125
---	61	0	126
!!	28	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	23	2	169
``	50	2	170
---	50	0	171
---	39	0	172
---	39	0	173
fi	61	2	174
fl	61	2	175
en	50	0	177
\-	"
dg	50	2	178
dd	50	3	179
---	25	0	180
pg	64	3	182
---	61	0	183
---	33	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
??	44	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	44	2	227
---	61	2	232
---	83	2	233
---	100	2	234
---	49	2	235
---	78	0	241
---	33	0	245
---	33	2	248
---	56	0	249
---	83	0	250
---	61	2	251
0707070014231217131006440057030057030000010643220522627501200002400000003367post.src/devpost/PIname PI
fontname Palatino-Italic
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	50	2	34
dq	"
#	50	2	35
$	50	2	36
%	89	2	37
&	78	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	39	2	42
+	61	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	30	3	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	50	2	63
@	75	2	64
A	72	2	65
B	61	2	66
C	67	2	67
D	78	2	68
E	61	2	69
F	56	2	70
G	72	2	71
H	78	2	72
I	33	2	73
J	33	3	74
K	67	2	75
L	56	2	76
M	94	2	77
N	78	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	78	2	85
V	72	2	86
W	94	2	87
X	72	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
---	61	2	94
---	50	1	95
`	28	2	96
a	44	0	97
b	46	2	98
c	41	0	99
d	50	2	100
e	39	0	101
f	28	3	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	44	0	111
p	50	1	112
q	46	1	113
r	39	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
{	33	2	123
---	61	2	124
}	33	2	125
---	61	0	126
!!	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	33	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	53	3	174
fl	54	3	175
en	50	0	177
\-	"
dg	50	2	178
dd	50	3	179
---	25	0	180
pg	50	3	182
---	50	0	183
---	28	0	184
---	50	0	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
??	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	94	2	225
---	33	2	227
---	56	2	232
---	78	2	233
---	103	2	234
---	33	2	235
---	64	0	241
---	28	0	245
---	28	2	248
---	44	0	249
---	67	0	250
---	50	3	251
0707070014231217141006440057030057030000010643240522627501200002400000003373post.src/devpost/PXname PX
fontname Palatino-BoldItalic
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	50	2	34
dq	"
#	50	2	35
$	50	2	36
%	89	2	37
&	83	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	44	2	42
+	61	0	43
,	25	1	44
hy	39	0	45
-	"
.	25	0	46
/	32	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	83	2	64
A	72	2	65
B	67	2	66
C	69	2	67
D	78	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	78	2	72
I	39	2	73
J	39	3	74
K	72	2	75
L	61	2	76
M	94	2	77
N	78	2	78
O	83	2	79
P	67	2	80
Q	83	3	81
R	72	2	82
S	56	2	83
T	61	2	84
U	78	2	85
V	67	2	86
W	100	2	87
X	72	2	88
Y	61	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
---	61	2	94
---	50	1	95
`	28	2	96
a	56	0	97
b	54	2	98
c	44	0	99
d	56	2	100
e	44	0	101
f	33	3	102
g	50	1	103
h	56	2	104
i	33	2	105
j	33	3	106
k	56	2	107
l	33	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	54	1	113
r	39	0	114
s	44	0	115
t	39	2	116
u	56	0	117
v	56	0	118
w	83	0	119
x	50	0	120
y	56	1	121
z	50	0	122
{	33	2	123
---	61	2	124
}	33	2	125
---	61	0	126
!!	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	56	3	167
cr	50	2	168
---	25	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	61	3	174
fl	61	3	175
en	50	0	177
\-	"
dg	56	2	178
dd	56	3	179
---	25	0	180
pg	56	3	182
---	61	0	183
---	25	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
??	44	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	56	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	94	2	225
---	33	2	227
---	61	2	232
---	83	2	233
---	94	2	234
---	33	2	235
---	74	0	241
---	33	0	245
---	33	2	248
---	56	0	249
---	78	0	250
---	56	3	251
0707070014231217151006440057030057030000010643260522627501200002300000003361post.src/devpost/Rname R
fontname Times-Roman
named in prologue
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	41	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	56	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	28	0	58
;	28	1	59
---	56	2	60
=	56	0	61
---	56	2	62
?	44	2	63
@	92	3	64
A	72	2	65
B	67	2	66
C	67	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	72	2	71
H	72	2	72
I	33	2	73
J	39	2	74
K	72	2	75
L	61	2	76
M	89	2	77
N	72	2	78
O	72	2	79
P	56	2	80
Q	72	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	72	2	85
V	72	2	86
W	94	2	87
X	72	2	88
Y	72	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	47	2	94
---	50	1	95
`	33	2	96
a	44	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	33	2	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	39	0	115
t	28	2	116
u	50	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
{	48	3	123
---	20	2	124
}	48	3	125
---	54	0	126
!!	33	1	161
ct	50	3	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	18	2	169
``	44	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	25	0	180
pg	45	3	182
---	35	0	183
---	33	1	184
---	44	1	185
''	44	2	186
---	50	0	187
---	100	0	188
---	100	2	189
??	44	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	89	2	225
---	28	2	227
---	61	2	232
---	72	2	233
---	89	2	234
---	31	2	235
---	67	0	241
---	28	0	245
---	28	2	248
---	50	2	249
---	72	0	250
---	50	2	251
0707070014231217161006440057030057030000010643400522627501200002300000004400post.src/devpost/Sname S
fontname Symbol
named in prologue
special
charset
---	33	2	33
fa	71	2	34
---	50	2	35
te	55	2	36
---	83	2	37
---	78	2	38
st	44	0	39
---	33	3	40
---	33	3	41
**	50	2	42
pl	55	0	43
---	25	1	44
mi	55	0	45
---	25	0	46
sl	28	2	47
---	50	2	48
---	50	2	49
---	50	2	50
---	50	2	51
---	50	2	52
---	50	2	53
---	50	2	54
---	50	2	55
---	50	2	56
---	50	2	57
---	28	0	58
---	28	1	59
<	55	0	60
eq	55	0	61
>	55	0	62
---	44	2	63
cg	55	0	64
*A	72	2	65
*B	67	2	66
*X	72	2	67
*D	61	2	68
*E	61	2	69
*F	76	2	70
*G	60	2	71
*Y	72	2	72
*I	33	2	73
---	63	2	74
*K	72	2	75
*L	69	2	76
*M	89	2	77
*N	72	2	78
*O	72	2	79
*P	77	2	80
*H	74	2	81
*R	56	2	82
*S	59	2	83
*T	61	2	84
*U	69	2	85
ts	44	1	86
*W	77	2	87
*C	65	2	88
*Q	80	2	89
*Z	61	2	90
---	33	3	91
tf	86	0	92
---	33	3	93
pp	66	2	94
ul	50	1	95
_	"
rn	50	2	96
*a	63	0	97
*b	55	3	98
*x	55	1	99
*d	49	2	100
*e	44	0	101
*f	52	3	102
*g	41	1	103
*y	60	1	104
*i	33	0	105
---	60	1	106
*k	55	0	107
*l	55	2	108
*m	58	1	109
*n	52	0	110
*o	55	0	111
*p	55	0	112
*h	52	2	113
*r	55	1	114
*s	60	0	115
*t	44	0	116
*u	58	0	117
---	71	2	118
*w	69	0	119
*c	49	3	120
*q	69	1	121
*z	49	3	122
---	48	3	123
or	20	3	124
---	48	3	125
ap	55	0	126
---	62	2	161
fm	25	2	162
<=	55	2	163
---	17	2	164
if	73	0	165
---	50	3	166
---	75	0	167
---	75	2	168
---	75	0	169
---	75	2	170
ab	104	0	171
<-	99	0	172
ua	60	2	173
->	99	0	174
da	60	2	175
de	40	2	176
+-	55	2	177
---	41	2	178
>=	55	2	179
mu	55	0	180
pt	71	0	181
pd	49	2	182
bu	46	0	183
di	55	0	184
!=	55	2	185
==	55	0	186
~~	55	0	187
el	100	0	188
av	60	3	189
ah	100	0	190
CR	66	2	191
af	82	2	192
If	69	2	193
Rf	80	2	194
ws	99	3	195
Ox	77	2	196
O+	77	2	197
es	82	2	198
ca	77	0	199
cu	77	0	200
sp	71	0	201
ip	71	1	202
!b	71	0	203
sb	71	0	204
ib	71	1	205
mo	71	0	206
!m	71	2	207
an	77	2	208
gr	71	2	209
rg	79	2	210
co	79	2	211
tm	89	2	212
---	82	2	213
sr	55	2	214
c.	25	0	215
no	71	0	216
l&	60	0	217
l|	60	0	218
---	104	0	219
---	99	0	220
---	60	2	221
---	99	0	222
---	60	2	223
lz	49	2	224
b<	33	3	225
RG	79	2	226
CO	79	2	227
TM	79	2	228
---	71	2	229
LT	38	3	230
br	0	3	231
LX	"
LB	38	3	232
lc	50	2	233
lx	38	2	234
lf	50	2	235
lt	49	2	236
lk	49	2	237
lb	49	2	238
bv	49	2	239
|	"
b>	33	3	241
is	50	3	242
---	69	2	243
---	69	2	244
---	69	2	245
RT	38	3	246
RX	38	2	247
RB	38	3	248
rc	38	2	249
rx	50	3	250
rf	38	2	251
rt	49	2	252
rk	49	2	253
rb	49	2	254
~=	55	0	1
0707070014231217171006440057030057030000010643430522627501200002400000000501post.src/devpost/S1# Times-Roman special font
name S1
fontname Times-Roman
named in prologue
special
charset
ru	50	0	95
ff	60	2	1
Fi	84	2	1
Fl	84	2	1
14	75	2	1
12	75	2	1
34	75	2	1
bx	50	2	1
ob	38	2	1
ci	75	0	1
sq	50	2	1
Sl	50	2	1
L1	110	1	1
LA	110	1	1
LV	110	3	1
LH	210	1	1
lh	100	0	1
rh	100	0	1
lH	100	0	1
rH	100	0	1
PC	220	2	1
DG	185	2	1
0707070014231217201006440057030057030000010643440522627501200002400000004134post.src/devpost/ZDname ZD
fontname ZapfDingbats
named in prologue
charset
!	97	2	33
"	96	2	34
#	97	2	35
$	98	3	36
%	72	2	37
&	79	3	38
'	79	3	39
(	79	3	40
)	69	2	41
*	96	2	42
+	94	2	43
,	55	3	44
-	86	2	45
.	91	2	46
/	93	2	47
0	91	2	48
1	94	2	49
2	97	2	50
3	76	3	51
4	85	3	52
5	76	2	53
6	76	2	54
7	57	3	55
8	68	3	56
9	76	2	57
:	76	2	58
;	76	2	59
<	75	3	60
=	49	2	61
>	55	2	62
?	54	3	63
@	58	2	64
A	69	3	65
B	79	3	66
C	79	3	67
D	79	3	68
E	79	3	69
F	79	3	70
G	79	3	71
H	82	3	72
I	82	3	73
J	79	3	74
K	84	3	75
L	82	3	76
M	83	3	77
N	82	3	78
O	83	3	79
P	92	3	80
Q	74	2	81
R	72	2	82
S	75	2	83
T	79	3	84
U	79	3	85
V	69	3	86
W	78	3	87
X	77	3	88
Y	79	3	89
Z	76	2	90
[	71	3	91
\	71	3	92
]	68	3	93
^	70	3	94
_	83	3	95
`	81	3	96
a	79	3	97
b	79	3	98
c	71	3	99
d	69	2	100
e	70	2	101
f	69	2	102
g	79	3	103
h	79	3	104
i	71	3	105
j	79	3	106
k	78	3	107
l	79	3	108
m	87	3	109
n	76	2	110
o	76	2	111
p	76	2	112
q	76	3	113
r	76	3	114
s	89	2	115
t	89	3	116
u	79	3	117
v	78	3	118
w	44	3	119
x	14	2	120
y	28	2	121
z	41	2	122
{	39	2	123
|	39	2	124
}	67	2	125
~	67	2	126
hy	73	3	161
em	54	3	162
de	54	3	163
\-	91	2	164
en	67	3	165
ff	76	3	166
fi	76	2	167
fl	78	2	168
Fi	60	3	169
Fl	69	3	170
fm	63	3	171
ru	79	3	172
dg	79	3	173
bu	79	3	174
14	79	3	175
34	79	3	176
12	79	3	177
ct	79	3	178
rg	79	3	179
sq	79	3	180
sl	79	3	181
ul	79	3	182
or	79	3	183
no	79	3	184
->	79	3	185
<-	79	3	186
da	79	3	187
lh	79	3	188
ua	79	3	189
ab	79	3	190
!b	79	3	191
aa	79	3	192
!m	79	3	193
ga	79	3	194
pl	79	3	195
mi	79	3	196
mu	79	3	197
di	79	3	198
eq	79	3	199
==	79	3	200
>=	79	3	201
<=	79	3	202
!=	79	3	203
+-	79	3	204
-+	79	3	205
ap	79	3	206
~=	79	3	207
gr	79	3	208
is	79	3	209
pd	79	3	210
if	79	3	211
sr	89	2	212
rn	84	2	213
sb	102	2	214
sp	46	3	215
cu	75	2	216
ca	92	2	217
ib	75	2	218
ip	92	2	219
mo	93	2	220
es	93	2	221
sc	93	2	222
dd	83	2	223
lc	87	2	224
rc	83	2	225
lf	92	2	226
rf	92	2	227
bv	92	2	228
**	93	2	229
br	93	2	230
ci	46	3	231
ts	88	2	232
co	84	2	233
lt	84	2	234
rt	87	2	235
lb	87	2	236
rb	70	2	237
lk	70	2	238
rk	87	2	239
rh	87	2	241
tm	76	2	242
Sl	95	2	243
ps	77	2	244
cs	86	2	245
cy	77	2	246
as	89	3	247
os	97	2	248
=.	89	3	249
ld	83	2	250
rd	87	2	251
le	93	2	252
ge	97	2	253
pp	92	2	254
0707070014231217211006440057030057030000010643600522627501200002400000003376post.src/devpost/ZIname ZI
fontname ZapfChancery-MediumItalic
named in prologue
ligatures fi fl 0
spacewidth 22
charset
!	28	2	33
"	22	2	34
dq	"
#	68	2	35
$	44	3	36
%	68	2	37
&	78	2	38
'	24	2	39
(	26	3	40
)	22	3	41
*	42	2	42
+	52	0	43
,	22	0	44
hy	28	0	45
-	"
.	22	0	46
/	34	3	47
0	44	2	48
1	44	2	49
2	44	2	50
3	44	2	51
4	44	2	52
5	44	2	53
6	44	2	54
7	44	2	55
8	44	2	56
9	44	2	57
:	26	0	58
;	24	0	59
---	52	0	60
=	52	0	61
---	52	0	62
?	38	2	63
@	70	2	64
A	62	2	65
B	60	2	66
C	52	2	67
D	70	2	68
E	62	2	69
F	58	2	70
G	62	3	71
H	68	2	72
I	38	2	73
J	40	2	74
K	66	3	75
L	58	2	76
M	84	2	77
N	70	3	78
O	60	2	79
P	54	2	80
Q	60	3	81
R	60	3	82
S	46	2	83
T	50	2	84
U	74	2	85
V	64	2	86
W	88	2	87
X	56	2	88
Y	56	3	89
Z	62	2	90
[	24	3	91
\	48	2	92
bs	"
]	32	3	93
---	52	2	94
---	50	1	95
`	24	2	96
a	42	0	97
b	42	2	98
c	34	0	99
d	44	2	100
e	34	0	101
f	32	3	102
g	40	1	103
h	44	2	104
i	24	2	105
j	22	3	106
k	44	3	107
l	24	2	108
m	62	0	109
n	46	0	110
o	40	0	111
p	44	1	112
q	40	3	113
r	30	0	114
s	32	0	115
t	32	2	116
u	46	0	117
v	44	0	118
w	68	0	119
x	42	1	120
y	40	1	121
z	44	0	122
{	24	3	123
---	52	2	124
}	24	3	125
---	52	0	126
!!	28	1	161
ct	44	2	162
ps	48	2	163
fr	6	2	164
yn	72	3	165
fn	40	3	166
sc	42	3	167
cr	60	2	168
---	16	2	169
``	34	2	170
---	34	0	171
---	24	0	172
---	26	0	173
fi	52	3	174
fl	52	3	175
en	50	0	177
\-	"
dg	46	3	178
dd	48	3	179
---	22	0	180
pg	50	3	182
---	60	2	183
---	18	0	184
---	28	0	185
''	36	2	186
---	38	0	187
---	100	0	188
---	96	2	189
??	40	1	191
ga	22	2	193
\`	"
aa	30	2	194
\'	"
^a	34	2	195
^	"
~a	44	2	196
~	"
-a	44	2	197
Ua	44	2	198
.a	22	2	199
:a	36	2	200
oa	30	2	202
,a	30	1	203
"a	40	2	205
Ca	28	1	206
va	34	2	207
em	100	0	208
---	74	2	225
---	26	2	227
---	58	2	232
---	66	3	233
---	82	2	234
---	26	2	235
---	54	0	241
---	24	0	245
---	30	2	248
---	44	3	249
---	56	0	250
---	42	3	251
0707070014230000050407550057030057030000020036570522627501400003100000000000post.src/devpost/charlib0707070014230001611006440057030057030000010072070522627501200003400000000421post.src/devpost/charlib/12/build_12 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (1) show
    rmoveto
    optsize R f
    (\244) show
    f
    (2) show

    optsize ofont f
} def
0707070014230001731006440057030057030000010032400522627501200003400000000421post.src/devpost/charlib/14/build_14 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (1) show
    rmoveto
    optsize R f
    (\244) show
    f
    (4) show

    optsize ofont f
} def
0707070014230001741006440057030057030000010032410522627501200003400000000421post.src/devpost/charlib/34/build_34 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (3) show
    rmoveto
    optsize R f
    (\244) show
    f
    (4) show

    optsize ofont f
} def
0707070014230005521006440057030057030000010073200522627501300003400000014726post.src/devpost/charlib/LV%
% PostScript 12 and 8 line logos - vertical configuration. Switch occurs
% automatically below point size 29. Code from Matthijs Melchior.
%

/LOGO-dict-mm where not {
	64 dict /LOGO-dict-mm exch def
}{pop} ifelse
LOGO-dict-mm begin      	% initialize dictionary


/globesetup {
/r exch def
/N exch def
/d 2 N r mul N 1 sub add div def
/h d r mul def
} def
/mkabs {
/yp exch def
/xl exch def
dup dup 0 get xl mul 0 exch put
dup dup 1 get h mul yp add 1 exch put
dup dup 2 get xl mul 2 exch put
dup dup 3 get h mul yp add 3 exch put
dup dup 4 get xl mul 4 exch put
dup dup 5 get h mul yp add 5 exch put
} def
/topsegment {
/n exch def
/y n r mul n .5 add add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 180 a sub /arc load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/botsegment {
/n exch 1 add def
/y n r mul n .5 sub add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 540 a sub /arcn load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/segment {
/n exch def
/dh exch 1 exch sub 2 div def
/ylb n r mul n 0.5 add add d mul def
/ylt ylb h add def
/yrb ylb h dh mul add def
/yrt ylt h dh mul sub def
/alb ylb 1 ylb dup mul sub sqrt atan def
/alt ylt 1 ylt dup mul sub sqrt atan def
/arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def
/art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def
/xlb alb cos def
/xlt alt cos def
/xrb arb cos def
/xrt art cos def
/c4 exch xrb abs ylb mkabs def
/ly2 exch h mul ylb add def
/lx2 exch xrb abs mul def
/c3 exch xrb abs ylb mkabs def
/c2 exch xrt abs ylt mkabs def
/ly1 exch h mul ylt add def
/lx1 exch xrt abs mul def
/c1 exch xrt abs ylt mkabs def
xlb ylb /moveto load
0 0 1 alb alt /arc load
c2 4 get c2 5 get /lineto load
c2 2 get c2 3 get
c2 0 get c2 1 get
lx1 ly1	/curveto load
c1 4 get c1 5 get /lineto load
c1 2 get c1 3 get
c1 0 get c1 1 get
xrt yrt /curveto load
0 0 1 art arb /arc load
c3 aload pop /curveto load
lx2 ly2 /lineto load
c4 aload pop /curveto load
/closepath load
} def
8 2.5 globesetup
/globe8 [
/newpath load
[ -.9   .1  -.6   .2  -.5   .2  ] -.5   .2  [ -.4   .2   .0  .0  .4  .0 ] 3 topsegment
[ -.9  -.35 -.85 -.35 -.8  -.35 ] -.1  -.35 [  .1  -.35  .3  .0  .5  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ] -.1   .35 [  .1   .35  .4  .0  .55 .0 ] .55 2 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .05 -.35 [  .2  -.35  .4  .0  .55 .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .05  .35 [  .2   .35  .45 .0  .6  .0 ] .7  1 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .0  -.35 [  .15 -.35  .4  .0  .6  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .0   .35 [  .15  .35  .4  .0  .6  .0 ] .7  0 segment
[ -.7  -.35 -.65 -.35 -.6  -.35 ] -.1  -.35 [  .05 -.35  .35 .0  .55 .0 ]
[ -.7   .35 -.65  .35 -.6   .35 ] -.1   .35 [  .05  .35  .25 .0  .4  .0 ] .8 -1 segment
[ -.65 -.2  -.55 -.2 -.45  -.2  ] -.3   -.2 [ -.2  -.2   .2  .0  .3  .0 ]
[ -.65  .1  -.55  .1 -.45   .1  ] -.45  .1  [ -.3   .1  -.1  .0  .0  .0 ] .96 -2 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]  1 -3 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -4 botsegment
] cvx def
12 3 globesetup
/globe12 [
/newpath load
[ -.8   .2  -.7  .25 -.5   .25 ] -.4  .25 [ -.2   .25  .0  .0  .2  .0 ] 5 topsegment
[ -.7  -.35 -.7 -.35 -.6  -.35 ] -.3 -.35 [ -.1  -.35  .3  .0  .55 .0 ]
[ -.7   .35 -.7  .35 -.6   .35 ] -.25 .35 [ -.05  .35  .4  .0  .55 .0 ] .6  4 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ] -.1 -.35 [  .1  -.35  .4  .0  .5  .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ] -.1  .35 [  .1   .35  .4  .0  .5  .0 ] .7  3 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ]  .0  .35 [  .15  .35  .4  .0  .5  .0 ] .8  2 segment
[ -.75 -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .2  -.35  .4  .0  .5  .0 ]
[ -.75  .35 -.7  .35 -.6   .35 ]  .0  .35 [  .2   .35  .45 .0  .55 .0 ] .9  1 segment
[ -.7  -.35 -.6 -.35 -.55 -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.7   .35 -.6  .35 -.55  .35 ]  .0  .35 [  .1   .35  .5  .0  .6  .0 ] .9  0 segment
] cvx
[
[ -.7 -.35 -.6 -.35 -.5  -.35 ] -.15 -.35 [  .0  -.35  .4  .0  .5  .0 ]
[ -.65 .35 -.55 .35 -.45  .35 ] -.15  .35 [  .0   .35  .35 .0  .45 .0 ] .9 -1 segment
[ -.8 -.1  -.5 -.3  -.4  -.3  ] -.2  -.3  [  .0  -.3   .3  .0  .4  .0 ]
[ -.8  .1  -.5  .3  -.4   .3  ] -.2   .3  [  .0   .3   .2  .0  .3  .0 ] 1 -2 segment
[ -.7 -.1  -.5 -.15 -.4  -.15 ] -.3  -.15 [ -.2  -.15  .0  .0  .2  .0 ]
[ -.7  .05 -.5  .1  -.4   .1  ] -.4   .1  [ -.3   .1   .0  .0  .2  .0 ] 1 -3 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -4 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -5 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -6 botsegment
] cvx
4 array cvx
dup 0 5 -1 roll put
dup 1 /exec load put
dup 2 4 -1 roll put
dup 3 /exec load put
def

/l {  lineto } def
/rl {  rlineto } def
/m {  moveto } def
/rm {  rmoveto } def
/C { closepath } def
/c {  curveto } def
/rc {  rcurveto } def
/T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def
/ATT {
newpath
1 36 div dup scale
0  0 m  12 36 rl  8 0 rl -11 -36 rl C
25  0 m -11 36 rl  8 0 rl  12 -36 rl C
10  7 m   0  7 rl 14 0 rl   0  -7 rl C
36  0 T
80  6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc
1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl
0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc
0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C
71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc
-4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc
9 0 14 6 14 11 rc 0 8 rl C
82  0 T
36 dup scale
} def

end

/build_LV { % standard ATT logo
    LOGO-dict-mm begin
	/w exch def
	ptsize 29 lt	% select globe, # lines depends on point size
		{ /globe /globe8 load def }
		{ /globe /globe12 load def } ifelse
	gsave
	 currentpoint translate
	 size 2 div dup scale
	 gsave
	  1.02 1 transform round exch round exch itransform
	  translate
	  globe fill
	 grestore
	 gsave
	  %2.15 .62 translate
	  -0.1 -1.0 translate
	  .78 dup scale
	  ATT fill
	 grestore
	grestore
    end
} def
0707070014230005531006440057030057030000010073270522627501300003400000000075post.src/devpost/charlib/Fi/build_Fi {
    pop
    size .05 mul neg 0 (ffi) ashow
} def
0707070014230005541006440057030057030000010041550522627501300003400000000075post.src/devpost/charlib/Fl/build_Fl {
    pop
    size .05 mul neg 0 (ffl) ashow
} def
0707070014230005551006440057030057030000010110620522627501300003400000012536post.src/devpost/charlib/L1/LOGO-dict-mm dup where not
{ dup 64 dict def currentdict } if
exch get
begin
/globesetup {
/r exch def
/N exch def
/d 2 N r mul N 1 sub add div def
/h d r mul def
} def
/mkabs {
/yp exch def
/xl exch def
dup dup 0 get xl mul 0 exch put
dup dup 1 get h mul yp add 1 exch put
dup dup 2 get xl mul 2 exch put
dup dup 3 get h mul yp add 3 exch put
dup dup 4 get xl mul 4 exch put
dup dup 5 get h mul yp add 5 exch put
} def
/topsegment {
/n exch def
/y n r mul n .5 add add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 180 a sub /arc load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/botsegment {
/n exch 1 add def
/y n r mul n .5 sub add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 540 a sub /arcn load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/segment {
/n exch def
/dh exch 1 exch sub 2 div def
/ylb n r mul n 0.5 add add d mul def
/ylt ylb h add def
/yrb ylb h dh mul add def
/yrt ylt h dh mul sub def
/alb ylb 1 ylb dup mul sub sqrt atan def
/alt ylt 1 ylt dup mul sub sqrt atan def
/arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def
/art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def
/xlb alb cos def
/xlt alt cos def
/xrb arb cos def
/xrt art cos def
/c4 exch xrb abs ylb mkabs def
/ly2 exch h mul ylb add def
/lx2 exch xrb abs mul def
/c3 exch xrb abs ylb mkabs def
/c2 exch xrt abs ylt mkabs def
/ly1 exch h mul ylt add def
/lx1 exch xrt abs mul def
/c1 exch xrt abs ylt mkabs def
xlb ylb /moveto load
0 0 1 alb alt /arc load
c2 4 get c2 5 get /lineto load
c2 2 get c2 3 get
c2 0 get c2 1 get
lx1 ly1	/curveto load
c1 4 get c1 5 get /lineto load
c1 2 get c1 3 get
c1 0 get c1 1 get
xrt yrt /curveto load
0 0 1 art arb /arc load
c3 aload pop /curveto load
lx2 ly2 /lineto load
c4 aload pop /curveto load
/closepath load
} def
8 2.5 globesetup
/globe8 [
/newpath load
[ -.9   .1  -.6   .2  -.5   .2  ] -.5   .2  [ -.4   .2   .0  .0  .4  .0 ] 3 topsegment
[ -.9  -.35 -.85 -.35 -.8  -.35 ] -.1  -.35 [  .1  -.35  .3  .0  .5  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ] -.1   .35 [  .1   .35  .4  .0  .55 .0 ] .55 2 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .05 -.35 [  .2  -.35  .4  .0  .55 .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .05  .35 [  .2   .35  .45 .0  .6  .0 ] .7  1 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .0  -.35 [  .15 -.35  .4  .0  .6  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .0   .35 [  .15  .35  .4  .0  .6  .0 ] .7  0 segment
[ -.7  -.35 -.65 -.35 -.6  -.35 ] -.1  -.35 [  .05 -.35  .35 .0  .55 .0 ]
[ -.7   .35 -.65  .35 -.6   .35 ] -.1   .35 [  .05  .35  .25 .0  .4  .0 ] .8 -1 segment
[ -.65 -.2  -.55 -.2 -.45  -.2  ] -.3   -.2 [ -.2  -.2   .2  .0  .3  .0 ]
[ -.65  .1  -.55  .1 -.45   .1  ] -.45  .1  [ -.3   .1  -.1  .0  .0  .0 ] .96 -2 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]  1 -3 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -4 botsegment
] cvx def
12 3 globesetup
/globe12 [
/newpath load
[ -.8   .2  -.7  .25 -.5   .25 ] -.4  .25 [ -.2   .25  .0  .0  .2  .0 ] 5 topsegment
[ -.7  -.35 -.7 -.35 -.6  -.35 ] -.3 -.35 [ -.1  -.35  .3  .0  .55 .0 ]
[ -.7   .35 -.7  .35 -.6   .35 ] -.25 .35 [ -.05  .35  .4  .0  .55 .0 ] .6  4 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ] -.1 -.35 [  .1  -.35  .4  .0  .5  .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ] -.1  .35 [  .1   .35  .4  .0  .5  .0 ] .7  3 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ]  .0  .35 [  .15  .35  .4  .0  .5  .0 ] .8  2 segment
[ -.75 -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .2  -.35  .4  .0  .5  .0 ]
[ -.75  .35 -.7  .35 -.6   .35 ]  .0  .35 [  .2   .35  .45 .0  .55 .0 ] .9  1 segment
[ -.7  -.35 -.6 -.35 -.55 -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.7   .35 -.6  .35 -.55  .35 ]  .0  .35 [  .1   .35  .5  .0  .6  .0 ] .9  0 segment
] cvx
[
[ -.7 -.35 -.6 -.35 -.5  -.35 ] -.15 -.35 [  .0  -.35  .4  .0  .5  .0 ]
[ -.65 .35 -.55 .35 -.45  .35 ] -.15  .35 [  .0   .35  .35 .0  .45 .0 ] .9 -1 segment
[ -.8 -.1  -.5 -.3  -.4  -.3  ] -.2  -.3  [  .0  -.3   .3  .0  .4  .0 ]
[ -.8  .1  -.5  .3  -.4   .3  ] -.2   .3  [  .0   .3   .2  .0  .3  .0 ] 1 -2 segment
[ -.7 -.1  -.5 -.15 -.4  -.15 ] -.3  -.15 [ -.2  -.15  .0  .0  .2  .0 ]
[ -.7  .05 -.5  .1  -.4   .1  ] -.4   .1  [ -.3   .1   .0  .0  .2  .0 ] 1 -3 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -4 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -5 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -6 botsegment
] cvx
4 array cvx
dup 0 5 -1 roll put
dup 1 /exec load put
dup 2 4 -1 roll put
dup 3 /exec load put
def
end
/build_L1 {
pop
LOGO-dict-mm begin
ptsize 29 lt
{ /globe /globe8 load def }
{ /globe /globe12 load def } ifelse
gsave
currentpoint translate
size 2 div dup scale
1.02 1 transform round exch round exch itransform
translate
globe fill
grestore
end
} def
0707070014230005561006440057030057030000010073400522627501300003400000014673post.src/devpost/charlib/LH%
% PostScript 12 and 8 line logos - horizontal configuration. Switch occurs
% automatically below point size 29. Code from Matthijs Melchior.
%

/LOGO-dict-mm where not {
	64 dict /LOGO-dict-mm exch def
}{pop} ifelse
LOGO-dict-mm begin		% initialize dictionary


/globesetup {
/r exch def
/N exch def
/d 2 N r mul N 1 sub add div def
/h d r mul def
} def
/mkabs {
/yp exch def
/xl exch def
dup dup 0 get xl mul 0 exch put
dup dup 1 get h mul yp add 1 exch put
dup dup 2 get xl mul 2 exch put
dup dup 3 get h mul yp add 3 exch put
dup dup 4 get xl mul 4 exch put
dup dup 5 get h mul yp add 5 exch put
} def
/topsegment {
/n exch def
/y n r mul n .5 add add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 180 a sub /arc load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/botsegment {
/n exch 1 add def
/y n r mul n .5 sub add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 540 a sub /arcn load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/segment {
/n exch def
/dh exch 1 exch sub 2 div def
/ylb n r mul n 0.5 add add d mul def
/ylt ylb h add def
/yrb ylb h dh mul add def
/yrt ylt h dh mul sub def
/alb ylb 1 ylb dup mul sub sqrt atan def
/alt ylt 1 ylt dup mul sub sqrt atan def
/arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def
/art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def
/xlb alb cos def
/xlt alt cos def
/xrb arb cos def
/xrt art cos def
/c4 exch xrb abs ylb mkabs def
/ly2 exch h mul ylb add def
/lx2 exch xrb abs mul def
/c3 exch xrb abs ylb mkabs def
/c2 exch xrt abs ylt mkabs def
/ly1 exch h mul ylt add def
/lx1 exch xrt abs mul def
/c1 exch xrt abs ylt mkabs def
xlb ylb /moveto load
0 0 1 alb alt /arc load
c2 4 get c2 5 get /lineto load
c2 2 get c2 3 get
c2 0 get c2 1 get
lx1 ly1	/curveto load
c1 4 get c1 5 get /lineto load
c1 2 get c1 3 get
c1 0 get c1 1 get
xrt yrt /curveto load
0 0 1 art arb /arc load
c3 aload pop /curveto load
lx2 ly2 /lineto load
c4 aload pop /curveto load
/closepath load
} def
8 2.5 globesetup
/globe8 [
/newpath load
[ -.9   .1  -.6   .2  -.5   .2  ] -.5   .2  [ -.4   .2   .0  .0  .4  .0 ] 3 topsegment
[ -.9  -.35 -.85 -.35 -.8  -.35 ] -.1  -.35 [  .1  -.35  .3  .0  .5  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ] -.1   .35 [  .1   .35  .4  .0  .55 .0 ] .55 2 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .05 -.35 [  .2  -.35  .4  .0  .55 .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .05  .35 [  .2   .35  .45 .0  .6  .0 ] .7  1 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .0  -.35 [  .15 -.35  .4  .0  .6  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .0   .35 [  .15  .35  .4  .0  .6  .0 ] .7  0 segment
[ -.7  -.35 -.65 -.35 -.6  -.35 ] -.1  -.35 [  .05 -.35  .35 .0  .55 .0 ]
[ -.7   .35 -.65  .35 -.6   .35 ] -.1   .35 [  .05  .35  .25 .0  .4  .0 ] .8 -1 segment
[ -.65 -.2  -.55 -.2 -.45  -.2  ] -.3   -.2 [ -.2  -.2   .2  .0  .3  .0 ]
[ -.65  .1  -.55  .1 -.45   .1  ] -.45  .1  [ -.3   .1  -.1  .0  .0  .0 ] .96 -2 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]  1 -3 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -4 botsegment
] cvx def
12 3 globesetup
/globe12 [
/newpath load
[ -.8   .2  -.7  .25 -.5   .25 ] -.4  .25 [ -.2   .25  .0  .0  .2  .0 ] 5 topsegment
[ -.7  -.35 -.7 -.35 -.6  -.35 ] -.3 -.35 [ -.1  -.35  .3  .0  .55 .0 ]
[ -.7   .35 -.7  .35 -.6   .35 ] -.25 .35 [ -.05  .35  .4  .0  .55 .0 ] .6  4 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ] -.1 -.35 [  .1  -.35  .4  .0  .5  .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ] -.1  .35 [  .1   .35  .4  .0  .5  .0 ] .7  3 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ]  .0  .35 [  .15  .35  .4  .0  .5  .0 ] .8  2 segment
[ -.75 -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .2  -.35  .4  .0  .5  .0 ]
[ -.75  .35 -.7  .35 -.6   .35 ]  .0  .35 [  .2   .35  .45 .0  .55 .0 ] .9  1 segment
[ -.7  -.35 -.6 -.35 -.55 -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.7   .35 -.6  .35 -.55  .35 ]  .0  .35 [  .1   .35  .5  .0  .6  .0 ] .9  0 segment
] cvx
[
[ -.7 -.35 -.6 -.35 -.5  -.35 ] -.15 -.35 [  .0  -.35  .4  .0  .5  .0 ]
[ -.65 .35 -.55 .35 -.45  .35 ] -.15  .35 [  .0   .35  .35 .0  .45 .0 ] .9 -1 segment
[ -.8 -.1  -.5 -.3  -.4  -.3  ] -.2  -.3  [  .0  -.3   .3  .0  .4  .0 ]
[ -.8  .1  -.5  .3  -.4   .3  ] -.2   .3  [  .0   .3   .2  .0  .3  .0 ] 1 -2 segment
[ -.7 -.1  -.5 -.15 -.4  -.15 ] -.3  -.15 [ -.2  -.15  .0  .0  .2  .0 ]
[ -.7  .05 -.5  .1  -.4   .1  ] -.4   .1  [ -.3   .1   .0  .0  .2  .0 ] 1 -3 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -4 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -5 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -6 botsegment
] cvx
4 array cvx
dup 0 5 -1 roll put
dup 1 /exec load put
dup 2 4 -1 roll put
dup 3 /exec load put
def

/l {  lineto } def
/rl {  rlineto } def
/m {  moveto } def
/rm {  rmoveto } def
/C { closepath } def
/c {  curveto } def
/rc {  rcurveto } def
/T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def
/ATT {
newpath
1 36 div dup scale
0  0 m  12 36 rl  8 0 rl -11 -36 rl C
25  0 m -11 36 rl  8 0 rl  12 -36 rl C
10  7 m   0  7 rl 14 0 rl   0  -7 rl C
36  0 T
80  6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc
1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl
0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc
0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C
71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc
-4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc
9 0 14 6 14 11 rc 0 8 rl C
82  0 T
36 dup scale
} def

end

/build_LH { % standard ATT logo
    LOGO-dict-mm begin
	/w exch def
	ptsize 29 lt	% select globe, # lines depends on point size
		{ /globe /globe8 load def }
		{ /globe /globe12 load def } ifelse
	gsave
	 currentpoint translate
	 size 2 div dup scale
	 gsave
	  1.02 1 transform round exch round exch itransform
	  translate
	  globe fill
	 grestore
	 gsave
	  2.15 .62 translate
	  .78 dup scale
	  ATT fill
	 grestore
	grestore
    end
} def
0707070014230005571006440057030057030000010041560522627501300004000000001173post.src/devpost/charlib/READMEPostscript definitions for special troff characters. File names are
the two character troff names. Each defines a PostScript procedure
that begins with build_ and ends with the character's name. The
build_?? procedure is called with the character width as it's only
argument. The .map files contain extra character data (e.g. image
data) that dpost downloads immediately after the build_?? call,
if the character's font table code field is 2 (rather than 1).

The following PostScript variables are available:

	font		current font
	ptsize		current point size
	size		actual font size - scaled up from ptsize

Don't overuse this stuff!

0707070014230005601006440057030057030000010041760522627501300003400000002631post.src/devpost/charlib/Sl/build_Sl {
pop
gsave
size .0022 mul dup scale
currentpoint translate
14 93 moveto
14 96 lineto
29 110 lineto
44 121 lineto
54 127 lineto
55 132 lineto
57 146 lineto
59 157 lineto
62 171 lineto
66 186 lineto
70 199 lineto
75 213 lineto
81 228 lineto
88 243 lineto
96 257 lineto
106 272 lineto
118 287 lineto
133 300 lineto
148 307 lineto
163 308 lineto
178 304 lineto
191 293 lineto
197 281 lineto
198 277 lineto
198 260 lineto
194 246 lineto
187 231 lineto
179 217 lineto
168 202 lineto
155 187 lineto
141 172 lineto
126 158 lineto
111 146 lineto
96 136 lineto
94 131 lineto
93 123 lineto
92 112 lineto
91 103 lineto
90 93 lineto
89 81 lineto
89 40 lineto
92 28 lineto
97 18 lineto
108 10 lineto
122 10 lineto
134 18 lineto
145 33 lineto
152 48 lineto
158 62 lineto
168 58 lineto
168 59 lineto
163 45 lineto
157 31 lineto
148 16 lineto
133 3 lineto
118 -1 lineto
103 0 lineto
88 5 lineto
73 18 lineto
64 31 lineto
58 46 lineto
55 59 lineto
53 73 lineto
52 111 lineto
37 101 lineto
22 86 lineto
14 93 lineto

97 152 moveto
97 153 lineto
99 166 lineto
101 178 lineto
103 190 lineto
106 205 lineto
109 218 lineto
113 232 lineto
118 246 lineto
124 261 lineto
132 275 lineto
144 290 lineto
157 298 lineto
171 298 lineto
181 291 lineto
186 283 lineto
187 279 lineto
187 264 lineto
186 260 lineto
181 246 lineto
174 233 lineto
165 218 lineto
155 204 lineto
142 190 lineto
127 175 lineto
112 162 lineto
97 152 lineto

eofill
grestore
} def
0707070014230005611006440057030057030000010073470522627501300003400000000264post.src/devpost/charlib/bx/build_bx {
    pop
    size 2 div /side exch def
    currentpoint
    newpath
    moveto
    0 side rlineto
    side 0 rlineto
    0 side neg rlineto
    closepath
    fill
} def
0707070014230005621006440057030057030000010044040522627501300003400000000221post.src/devpost/charlib/ci/build_ci {
    pop
    size 3 mul 8 div /rad exch def
    currentpoint
    newpath
    rad add exch rad add exch rad 0 360 arc
    stroke
} def
0707070014230005631006440057030057030000010044050522627501300003400000000074post.src/devpost/charlib/ff/build_ff {
    pop
    size .05 mul neg 0 (ff) ashow
} def
0707070014230005641006440057030057030000010073050522627501300003400000001716post.src/devpost/charlib/lc%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_lc {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 0 get bvbbox 1 get moveto
	bvbbox 0 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 3 get moveto
	bvbbox 4 get dup dup
	8 mul 0 rlineto
	0 exch neg rlineto
	8 mul neg 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230005651006440057030057030000010073060522627501300003400000001712post.src/devpost/charlib/lf%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_lf {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 0 get bvbbox 1 get moveto
	bvbbox 0 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 1 get moveto
	bvbbox 4 get dup dup
	8 mul 0 rlineto
	0 exch rlineto
	8 mul neg 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230005661006440057030057030000010073600522627501300003400000004412post.src/devpost/charlib/lh/build_lh {
pop
gsave
size .0022 mul dup scale
currentpoint translate

16 177 moveto
16 188 lineto
21 193 lineto
30 193 lineto
34 189 lineto
36 183 lineto
36 180 lineto
34 174 lineto
27 170 lineto
19 172 lineto
16 177 lineto
stroke

38 194 moveto
38 196 lineto
53 199 lineto
68 201 lineto
83 202 lineto
98 203 lineto
113 204 lineto
128 204 lineto
143 205 lineto
158 205 lineto
173 205 lineto
188 204 lineto
203 203 lineto
218 202 lineto
233 200 lineto
248 198 lineto
263 196 lineto
278 194 lineto
293 190 lineto
308 186 lineto
323 181 lineto
338 176 lineto
353 168 lineto
361 162 lineto
364 153 lineto
366 138 lineto
367 126 lineto
368 106 lineto
369 80 lineto
369 74 lineto
368 60 lineto
367 54 lineto
362 43 lineto
348 34 lineto
333 28 lineto
318 25 lineto
303 26 lineto
288 29 lineto
273 31 lineto
258 32 lineto
243 32 lineto
228 30 lineto
213 27 lineto
198 24 lineto
183 23 lineto
168 23 lineto
153 27 lineto
148 34 lineto
148 47 lineto
153 54 lineto
168 58 lineto
183 58 lineto
198 58 lineto
213 59 lineto
226 60 lineto
228 62 lineto
228 67 lineto
223 71 lineto
208 71 lineto
193 70 lineto
178 70 lineto
163 70 lineto
148 70 lineto
133 71 lineto
123 76 lineto
120 84 lineto
120 91 lineto
122 98 lineto
129 104 lineto
144 106 lineto
159 107 lineto
174 107 lineto
189 107 lineto
202 108 lineto
204 110 lineto
204 117 lineto
201 119 lineto
186 119 lineto
171 119 lineto
156 119 lineto
141 119 lineto
126 119 lineto
111 121 lineto
103 128 lineto
101 137 lineto
101 142 lineto
103 150 lineto
111 158 lineto
126 161 lineto
141 161 lineto
156 162 lineto
171 163 lineto
186 163 lineto
191 165 lineto
192 167 lineto
192 171 lineto
190 174 lineto
176 175 lineto
161 175 lineto
146 175 lineto
131 174 lineto
116 174 lineto
101 174 lineto
86 173 lineto
71 172 lineto
56 171 lineto
41 171 lineto
41 174 lineto
43 178 lineto
43 187 lineto
38 194 lineto
stroke

373 169 moveto
373 176 lineto
375 182 lineto
386 190 lineto
401 193 lineto
408 191 lineto
411 185 lineto
412 181 lineto
414 167 lineto
415 158 lineto
416 144 lineto
417 128 lineto
418 110 lineto
418 60 lineto
417 45 lineto
415 37 lineto
409 34 lineto
394 31 lineto
381 35 lineto
379 42 lineto
379 52 lineto
380 67 lineto
380 77 lineto
379 77 lineto
378 106 lineto
377 121 lineto
376 133 lineto
375 147 lineto
374 158 lineto
373 169 lineto

stroke
grestore
} def
0707070014230005671006440057030057030000010073070522627501300003400000000222post.src/devpost/charlib/ob/build_ob {
    pop
    size 3 mul 16 div /rad exch def
    currentpoint
    newpath
    rad add exch rad add exch rad 0 360 arc
    stroke
} def
0707070014230005701006440057030057030000010073630522627501300003400000001716post.src/devpost/charlib/rc%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_rc {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 2 get bvbbox 1 get moveto
	bvbbox 2 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 3 get moveto
	bvbbox 4 get dup dup
	8 mul neg 0 rlineto
	0 exch neg rlineto
	8 mul 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230005711006440057030057030000010073640522627501300003400000001712post.src/devpost/charlib/rf%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_rf {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 2 get bvbbox 1 get moveto
	bvbbox 2 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 1 get moveto
	bvbbox 4 get dup dup
	8 mul neg 0 rlineto
	0 exch rlineto
	8 mul 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230005721006440057030057030000010073650522627501300003400000004171post.src/devpost/charlib/rh/build_rh {
pop
gsave
size .0022 mul dup scale
currentpoint translate

15 66 moveto
15 86 lineto
16 131 lineto
17 146 lineto
18 158 lineto
19 167 lineto
21 181 lineto
24 190 lineto
34 193 lineto
49 189 lineto
58 182 lineto
60 177 lineto
60 166 lineto
59 156 lineto
58 143 lineto
57 130 lineto
56 117 lineto
55 102 lineto
54 42 lineto
53 39 lineto
49 35 lineto
34 34 lineto
19 39 lineto
16 47 lineto
15 66 lineto
stroke

65 60 moveto
65 111 lineto
66 127 lineto
67 139 lineto
69 153 lineto
72 163 lineto
83 171 lineto
98 177 lineto
113 182 lineto
128 187 lineto
143 190 lineto
158 194 lineto
173 196 lineto
188 199 lineto
203 201 lineto
218 203 lineto
233 205 lineto
248 205 lineto
263 206 lineto
278 206 lineto
293 206 lineto
308 206 lineto
323 206 lineto
338 205 lineto
353 203 lineto
368 202 lineto
383 200 lineto
394 197 lineto
389 190 lineto
389 180 lineto
391 176 lineto
391 173 lineto
380 173 lineto
365 173 lineto
350 174 lineto
335 175 lineto
320 176 lineto
305 176 lineto
290 176 lineto
275 177 lineto
260 177 lineto
245 177 lineto
240 173 lineto
240 170 lineto
245 165 lineto
260 164 lineto
275 164 lineto
290 164 lineto
305 163 lineto
320 160 lineto
327 155 lineto
330 149 lineto
330 134 lineto
328 129 lineto
323 124 lineto
309 121 lineto
294 121 lineto
279 121 lineto
264 121 lineto
249 121 lineto
234 121 lineto
228 118 lineto
228 112 lineto
234 109 lineto
249 109 lineto
264 109 lineto
279 108 lineto
294 108 lineto
306 104 lineto
311 97 lineto
312 91 lineto
312 88 lineto
311 82 lineto
305 74 lineto
290 72 lineto
275 72 lineto
260 72 lineto
245 73 lineto
230 73 lineto
215 73 lineto
205 70 lineto
205 63 lineto
217 60 lineto
232 60 lineto
247 60 lineto
262 60 lineto
277 57 lineto
283 52 lineto
285 44 lineto
285 41 lineto
284 35 lineto
280 30 lineto
268 26 lineto
253 25 lineto
238 26 lineto
223 28 lineto
208 31 lineto
193 33 lineto
178 34 lineto
163 33 lineto
148 31 lineto
133 28 lineto
118 27 lineto
103 28 lineto
88 34 lineto
73 43 lineto
67 52 lineto
65 60 lineto
stroke

396 180 moveto
396 188 lineto
399 194 lineto
410 196 lineto
416 190 lineto
416 180 lineto
415 177 lineto
411 173 lineto
400 173 lineto
396 180 lineto
stroke

grestore
} def
0707070014230005731006440057030057030000010074000522627501300003400000000320post.src/devpost/charlib/sq/build_sq {
    pop
    size 2 div /side exch def
    currentpoint
    newpath
    moveto
    0 side rlineto
    side 0 rlineto
    0 side neg rlineto
    closepath
    font B eq {fill} {stroke} ifelse
} def
0707070014230005741006440057030057030000010074010522627501400003400000000130post.src/devpost/charlib/~=/build_~= {
    pop
    (\176) stringwidth pop neg size -.15 mul (\176\055) ashow
} def
0707070014230005751006440057030057030000010074020522627501400003400000000327post.src/devpost/charlib/RC/build_RC {
    pop
    size 4 div /side exch def
    currentpoint
    newpath
    moveto
    0 side 1.5 mul rmoveto
    0 side rlineto
    side 2.5 mul 0 rlineto
    0 side neg rlineto
    closepath
    fill
} def
0707070014230005761006440057030057030000010074030522627501400003400000001051post.src/devpost/charlib/DG%
% UMDS danger sign - needs to be cleaned up!
%

/build_DG {
    /x0 1.5 6 div 72 mul def	% triangle length
    pop
    gsave
	currentpoint translate
	1 scaling div ptsize 10 div mul dup scale
	2 setlinewidth
	0 setlinecap
	newpath
	0 0 moveto
	x0 0 lineto
	x0 2 div x0 3 sqrt 2 div mul lineto
	closepath fill
	1 setgray
	/Helvetica-Bold findfont 12 scalefont setfont
	0 0 moveto
	(!) false charpath pathbbox
	exch 4 -1 roll add 2 div x0 2 div exch sub 0 moveto
	exch sub x0 3 sqrt 2 div mul exch sub 3 div 0 exch rmoveto
	(!) show
    grestore
} def

0707070014230005771006440057030057030000010074040522627501400003400000000735post.src/devpost/charlib/PC%
% UMDS pencil - needs to be cleaned up.
%

/build_PC {
    pop
    gsave
	currentpoint translate
	1 scaling div ptsize 10 div mul dup scale
	newpath
	0 setlinecap
	1 setlinejoin
	2 setlinewidth
	0 1 moveto 12 0 rlineto stroke
	0 5 moveto 12 0 rlineto stroke
	0 9 moveto 12 0 rlineto stroke
	1 setlinewidth
	12 .5 moveto 21.27362 5 lineto 12 9.5 lineto stroke
	21.27362 5 moveto
	.4 9.27362 mul neg .4 4 mul rlineto
	0 .8 4 mul neg rlineto
	closepath fill
    grestore
} def

0707070014230006001006440057030057030000010074050522627501400003400000004404post.src/devpost/charlib/lH/build_lH {
pop
gsave
size .0022 mul dup scale
currentpoint translate

16 177 moveto
16 188 lineto
21 193 lineto
30 193 lineto
34 189 lineto
36 183 lineto
36 180 lineto
34 174 lineto
27 170 lineto
19 172 lineto
16 177 lineto
fill

38 194 moveto
38 196 lineto
53 199 lineto
68 201 lineto
83 202 lineto
98 203 lineto
113 204 lineto
128 204 lineto
143 205 lineto
158 205 lineto
173 205 lineto
188 204 lineto
203 203 lineto
218 202 lineto
233 200 lineto
248 198 lineto
263 196 lineto
278 194 lineto
293 190 lineto
308 186 lineto
323 181 lineto
338 176 lineto
353 168 lineto
361 162 lineto
364 153 lineto
366 138 lineto
367 126 lineto
368 106 lineto
369 80 lineto
369 74 lineto
368 60 lineto
367 54 lineto
362 43 lineto
348 34 lineto
333 28 lineto
318 25 lineto
303 26 lineto
288 29 lineto
273 31 lineto
258 32 lineto
243 32 lineto
228 30 lineto
213 27 lineto
198 24 lineto
183 23 lineto
168 23 lineto
153 27 lineto
148 34 lineto
148 47 lineto
153 54 lineto
168 58 lineto
183 58 lineto
198 58 lineto
213 59 lineto
226 60 lineto
228 62 lineto
228 67 lineto
223 71 lineto
208 71 lineto
193 70 lineto
178 70 lineto
163 70 lineto
148 70 lineto
133 71 lineto
123 76 lineto
120 84 lineto
120 91 lineto
122 98 lineto
129 104 lineto
144 106 lineto
159 107 lineto
174 107 lineto
189 107 lineto
202 108 lineto
204 110 lineto
204 117 lineto
201 119 lineto
186 119 lineto
171 119 lineto
156 119 lineto
141 119 lineto
126 119 lineto
111 121 lineto
103 128 lineto
101 137 lineto
101 142 lineto
103 150 lineto
111 158 lineto
126 161 lineto
141 161 lineto
156 162 lineto
171 163 lineto
186 163 lineto
191 165 lineto
192 167 lineto
192 171 lineto
190 174 lineto
176 175 lineto
161 175 lineto
146 175 lineto
131 174 lineto
116 174 lineto
101 174 lineto
86 173 lineto
71 172 lineto
56 171 lineto
41 171 lineto
41 174 lineto
43 178 lineto
43 187 lineto
38 194 lineto
fill

373 169 moveto
373 176 lineto
375 182 lineto
386 190 lineto
401 193 lineto
408 191 lineto
411 185 lineto
412 181 lineto
414 167 lineto
415 158 lineto
416 144 lineto
417 128 lineto
418 110 lineto
418 60 lineto
417 45 lineto
415 37 lineto
409 34 lineto
394 31 lineto
381 35 lineto
379 42 lineto
379 52 lineto
380 67 lineto
380 77 lineto
379 77 lineto
378 106 lineto
377 121 lineto
376 133 lineto
375 147 lineto
374 158 lineto
373 169 lineto

fill
grestore
} def
0707070014230006011006440057030057030000010074200522627501400003400000004163post.src/devpost/charlib/rH/build_rH {
pop
gsave
size .0022 mul dup scale
currentpoint translate

15 66 moveto
15 86 lineto
16 131 lineto
17 146 lineto
18 158 lineto
19 167 lineto
21 181 lineto
24 190 lineto
34 193 lineto
49 189 lineto
58 182 lineto
60 177 lineto
60 166 lineto
59 156 lineto
58 143 lineto
57 130 lineto
56 117 lineto
55 102 lineto
54 42 lineto
53 39 lineto
49 35 lineto
34 34 lineto
19 39 lineto
16 47 lineto
15 66 lineto
fill

65 60 moveto
65 111 lineto
66 127 lineto
67 139 lineto
69 153 lineto
72 163 lineto
83 171 lineto
98 177 lineto
113 182 lineto
128 187 lineto
143 190 lineto
158 194 lineto
173 196 lineto
188 199 lineto
203 201 lineto
218 203 lineto
233 205 lineto
248 205 lineto
263 206 lineto
278 206 lineto
293 206 lineto
308 206 lineto
323 206 lineto
338 205 lineto
353 203 lineto
368 202 lineto
383 200 lineto
394 197 lineto
389 190 lineto
389 180 lineto
391 176 lineto
391 173 lineto
380 173 lineto
365 173 lineto
350 174 lineto
335 175 lineto
320 176 lineto
305 176 lineto
290 176 lineto
275 177 lineto
260 177 lineto
245 177 lineto
240 173 lineto
240 170 lineto
245 165 lineto
260 164 lineto
275 164 lineto
290 164 lineto
305 163 lineto
320 160 lineto
327 155 lineto
330 149 lineto
330 134 lineto
328 129 lineto
323 124 lineto
309 121 lineto
294 121 lineto
279 121 lineto
264 121 lineto
249 121 lineto
234 121 lineto
228 118 lineto
228 112 lineto
234 109 lineto
249 109 lineto
264 109 lineto
279 108 lineto
294 108 lineto
306 104 lineto
311 97 lineto
312 91 lineto
312 88 lineto
311 82 lineto
305 74 lineto
290 72 lineto
275 72 lineto
260 72 lineto
245 73 lineto
230 73 lineto
215 73 lineto
205 70 lineto
205 63 lineto
217 60 lineto
232 60 lineto
247 60 lineto
262 60 lineto
277 57 lineto
283 52 lineto
285 44 lineto
285 41 lineto
284 35 lineto
280 30 lineto
268 26 lineto
253 25 lineto
238 26 lineto
223 28 lineto
208 31 lineto
193 33 lineto
178 34 lineto
163 33 lineto
148 31 lineto
133 28 lineto
118 27 lineto
103 28 lineto
88 34 lineto
73 43 lineto
67 52 lineto
65 60 lineto
fill

396 180 moveto
396 188 lineto
399 194 lineto
410 196 lineto
416 190 lineto
416 180 lineto
415 177 lineto
411 173 lineto
400 173 lineto
396 180 lineto
fill

grestore
} def
0707070014230006021006440057030057030000010074230522627501400004400000010521post.src/devpost/charlib/LH.example%
% An example logo character. Building the PostScript program that prints
% your company logo is not addressed here; we assume you already have
% such a program, that it's relatively simple, and that it prints the
% logo by itself on a page. What you'll find here are instructions for
% converting that logo program into a character that can be accessed by
% troff and dpost.
%
% Building a new charlib character involves some PostScript programming.
% We've tried to isolate parameters that you'll need to change (Xoffset,
% Yoffset, and Scaling), but we can't guarantee things will work properly
% with every logo program. PostScript is a complex language and subtle
% interactions between your logo program and what we've done here can
% cause problems.
%
% Tuning the new character is an iterative process. You may want to adjust
% the size of the logo (via Scaling), it's position relative to adjacent
% characters and the baseline (Xoffset and Yoffset), and the distance troff
% moves after printing the character (width field in file ../S1). The steps
% to follow are:
%
%	1: Create a simple troff test file for the new character. Something
%	   like,
%
%		.sp 1i
%		.ps 10
%		size 10: \(LH
%		.sp 1i
%		.ps 18
%		size 18: \(LH
%		.sp 1i
%		.ps 36
%		size 36: \(LH
%		.sp 1i
%		.ps 10
%		four logo characters: \(LH\(LH\(LH\(LH
%
%	   is sufficient. The test file can go anywhere.
% 
%	2: Change into directory /usr/lib/font/devpost/charlib. All file
%	   pathnames will be relative to that directory.
%
%	3: Save a copy of the working LH logo file. Then replace LH with
%	   this file (i.e. LH.example). Changes described below should be
%	   be made in the new LH file (not in LH.example).
%
%	4: Your PostScript logo program will eventually replace whatever
%	   you find between the <<StartLogo>> and <<EndLogo>> comment lines
%	   in the PostScript build_LH procedure (below). What's there now
%	   prints an example logo that you can use until you understand the
%	   remaining steps.
%
%	5: Print your troff test file using (assuming your making changes
%	   in the devpost charlib directory),
%
%		troff -Tpost testfile | dpost | lp ...
%
%	6: Adjust the logo positioning by changing the numbers assigned to
%	   Xoffset and Yoffset (below). Both are in units of 72 per inch.
%	   Positive offsets should move the logo to the right and up the
%	   page.
%
%	7: Adjust the logo size by changing the the number assigned to
%	   Scaling. Unitsize also controls scaling, but there's no good
%	   reason to change both Scaling and Unitsize.
%
%	8: Control the horizontal distance troff moves after printing the
%	   new LH character by changing the width (i.e. the number in the
%	   second column) assigned to LH in file ../S1. Character width
%	   adjustments should probably wait until you're satisfied with
%	   the Scaling set in step 7.
%
%	9: Back to step 5 until your satisfied with the output.
%
% The remaining steps are suggested but not required:
%
%      10: Delete PostScript comments in your new LH charlib file - comments
%	   start with % and go to the end of the line.
%
%      11: Update the width field assigned to LH in file ../shell.lib. The
%	   new width should reflect what's currently in your S1 font file.
%
%      12: Make a similiar set of changes in /usr/lib/font/devLatin1/charlib.
%	   You can use the devpost version of LH to devLatin1/charlib/LH,
%	   but changes to files devLatin1/S1 and devLatin1/shell.lib must be
%	   entered by hand.
%

/Logo_Dict 100 dict dup begin
	/Xoffset 0 def			% 72 dpi with positive to the right
	/Yoffset 0 def			% 72 dpi with positive up the page
	/Scaling 1.0 def		% adjust this number to change the size
	/Unitsize 36 def		% for point size scaling - leave it be
	/showpage {} def
end def

/build_LH {				% don't bind this procedure
	Logo_Dict begin
		gsave
		/charwidth exch def
		currentpoint translate
		resolution 72 div dup scale
		Xoffset Yoffset translate
		Scaling Scaling scale
		ptsize Unitsize div dup scale

		%% Replace everything between the <<StartLogo>> and <<EndLogo>>
		%% comment lines by the PostScript program that prints your
		%% logo.

		%% <<StartLogo>>
			newpath
			.5 .5 scale
			0 0 moveto
			100 0 lineto
			100 100 lineto
			closepath
			.5 setgray
			fill
			0 setgray
			10 10 translate
			45 rotate
			0 5 moveto
			/Helvetica findfont 18 scalefont setfont
			(Example Logo) show
		%% <<EndLogo>>

		grestore
	end
} def

0707070014230006031006440057030057030000010074400522627501400003400000001725post.src/devpost/charlib/LA/LOGO-dict-mm dup where not
{ dup 64 dict def currentdict } if
exch get
begin
/l {  lineto } def
/rl {  rlineto } def
/m {  moveto } def
/rm {  rmoveto } def
/C { closepath } def
/c {  curveto } def
/rc {  rcurveto } def
/T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def
/ATT {
newpath
1 36 div dup scale
0  0 m  12 36 rl  8 0 rl -11 -36 rl C
25  0 m -11 36 rl  8 0 rl  12 -36 rl C
10  7 m   0  7 rl 14 0 rl   0  -7 rl C
36  0 T
80  6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc
1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl
0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc
0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C
71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc
-4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc
9 0 14 6 14 11 rc 0 8 rl C
82  0 T
36 dup scale
} def
end
/build_LA {
pop
LOGO-dict-mm begin
gsave
currentpoint translate
size 2.56 div dup scale		% was size 2.75 div dup scale
.02 0 translate
ATT fill
grestore
end
} def
0707070014231217221006440057030057030000010644200522627501400003300000035321post.src/devpost/shell.lib#
# Shell library - for building devpost tables. Original collection was
# built on a Version 47.0 PS-810.
#

RESOLUTION=720
UNITWIDTH=10

#
# BuiltinTables returns command lines that generate PostScript programs
# for building a typesetter description file and font width tables for
# a relatively standard collection of fonts. Use awk to select a command
# line or modify an existing command to build a width table for a new
# font.
#

BuiltinTables() {
	cat <<-'//End of BuiltinTables'
		Proportional	R	Times-Roman
		Proportional	I	Times-Italic
		Proportional	B	Times-Bold
		Proportional	BI	Times-BoldItalic
		Proportional	AB	AvantGarde-Demi
		Proportional	AI	AvantGarde-BookOblique
		Proportional	AR	AvantGarde-Book
		Proportional	AX	AvantGarde-DemiOblique
		Proportional	H	Helvetica
		Proportional	HB	Helvetica-Bold
		Proportional	HI	Helvetica-Oblique
		Proportional	HX	Helvetica-BoldOblique
		Proportional	Hb	Helvetica-Narrow-Bold
		Proportional	Hi	Helvetica-Narrow-Oblique
		Proportional	Hr	Helvetica-Narrow
		Proportional	Hx	Helvetica-Narrow-BoldOblique
		Proportional	KB	Bookman-Demi
		Proportional	KI	Bookman-LightItalic
		Proportional	KR	Bookman-Light
		Proportional	KX	Bookman-DemiItalic
		Proportional	NB	NewCenturySchlbk-Bold
		Proportional	NI	NewCenturySchlbk-Italic
		Proportional	NR	NewCenturySchlbk-Roman
		Proportional	NX	NewCenturySchlbk-BoldItalic
		Proportional	PA	Palatino-Roman
		Proportional	PB	Palatino-Bold
		Proportional	PI	Palatino-Italic
		Proportional	PX	Palatino-BoldItalic
		Proportional	ZI	ZapfChancery-MediumItalic
		FixedWidth	C	Courier
		FixedWidth	CB	Courier-Bold
		FixedWidth	CI	Courier-Oblique
		FixedWidth	CO	Courier
		FixedWidth	CW	Courier
		FixedWidth	CX	Courier-BoldOblique
		Dingbats	ZD	ZapfDingbats
		Greek		GR	Symbol
		Symbol		S	Symbol
		Special		S1	Times-Roman
		Description	DESC	---
	//End of BuiltinTables
}

#
# AllTables prints the complete list of builtin font names.
#

AllTables() {
	BuiltinTables | awk '{print $2}'
}

#
# Charset functions generate keyword/value pairs (as PostScript objects)
# that describe the character set available in a font. The keyword is a
# PostScript string that represents troff's name for the character. The
# value is usually the literal name (i.e. begins with a /) assigned to
# the character in the PostScript font. The value can also be an integer
# or a PostScript string. An integer value is used as an index in the
# current font's Encoding array. A string value is returned to the host
# unchanged when the entry for the character is constructed. Entries that
# have (") as their value are synonyms for the preceeding character.
#

StandardCharset() {
	cat <<-'//End of StandardCharset'
		(!)	/exclam
		(")	/quotedbl
		(dq)	(")
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(hy)	/hyphen
		(-)	(")			% synonym
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(bs)	(")
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(!!)	/exclamdown
		(ct)	/cent
		(ps)	/sterling
		(fr)	/fraction
		(yn)	/yen
		(fn)	/florin
		(sc)	/section
		(cr)	/currency
		(---)	/quotesingle
		(``)	/quotedblleft
		(---)	/guillemotleft
		(---)	/guilsinglleft
		(---)	/guilsinglright
		(fi)	/fi
		(fl)	/fl
		(en)	/endash
		(\\-)	(")
		(dg)	/dagger
		(dd)	/daggerdbl
		(---)	/periodcentered
		(pg)	/paragraph
		(---)	/bullet
		(---)	/quotesinglbase
		(---)	/quotedblbase
		('')	/quotedblright
		(---)	/guillemotright
		(---)	/ellipsis
		(---)	/perthousand
		(??)	/questiondown
		(ga)	/grave
		(\\`)	(")
		(aa)	/acute
		(\\')	(")
		(^a)	/circumflex
		(~a)	/tilde
		(-a)	/macron
		(Ua)	/breve
		(.a)	/dotaccent
		(:a)	/dieresis
		(oa)	/ring
		(,a)	/cedilla
		("a)	/hungarumlaut
		(Ca)	/ogonek
		(va)	/caron
		(em)	/emdash
		(---)	/AE
		(---)	/ordfeminine
		(---)	/Lslash
		(---)	/Oslash
		(---)	/OE
		(---)	/ordmasculine
		(---)	/ae
		(---)	/dotlessi
		(---)	/lslash
		(---)	/oslash
		(---)	/oe
		(---)	/germandbls
	//End of StandardCharset
}

SymbolCharset() {
	cat <<-'//End of SymbolCharset'
		(---)	/exclam
		(fa)	/universal
		(---)	/numbersign
		(te)	/existential
		(---)	/percent
		(---)	/ampersand
		(st)	/suchthat
		(---)	/parenleft
		(---)	/parenright
		(**)	/asteriskmath
		(pl)	/plus
		(---)	/comma
		(mi)	/minus
		(---)	/period
		(sl)	/slash
		(---)	/zero
		(---)	/one
		(---)	/two
		(---)	/three
		(---)	/four
		(---)	/five
		(---)	/six
		(---)	/seven
		(---)	/eight
		(---)	/nine
		(---)	/colon
		(---)	/semicolon
		(<)	/less
		(eq)	/equal
		(>)	/greater
		(---)	/question
		(cg)	/congruent
		(*A)	/Alpha
		(*B)	/Beta
		(*X)	/Chi
		(*D)	/Delta
		(*E)	/Epsilon
		(*F)	/Phi
		(*G)	/Gamma
		(*Y)	/Eta
		(*I)	/Iota
		(---)	/theta1
		(*K)	/Kappa
		(*L)	/Lambda
		(*M)	/Mu
		(*N)	/Nu
		(*O)	/Omicron
		(*P)	/Pi
		(*H)	/Theta
		(*R)	/Rho
		(*S)	/Sigma
		(*T)	/Tau
		(*U)	/Upsilon
		(ts)	/sigma1
		(*W)	/Omega
		(*C)	/Xi
		(*Q)	/Psi
		(*Z)	/Zeta
		(---)	/bracketleft
		(tf)	/therefore
		(---)	/bracketright
		(pp)	/perpendicular
		(ul)	/underscore
		(_)	(")			% synonym
		(rn)	/radicalex
		(*a)	/alpha
		(*b)	/beta
		(*x)	/chi
		(*d)	/delta
		(*e)	/epsilon
		(*f)	/phi
		(*g)	/gamma
		(*y)	/eta
		(*i)	/iota
		(---)	/phi1
		(*k)	/kappa
		(*l)	/lambda
		(*m)	/mu
		(*n)	/nu
		(*o)	/omicron
		(*p)	/pi
		(*h)	/theta
		(*r)	/rho
		(*s)	/sigma
		(*t)	/tau
		(*u)	/upsilon
		(---)	/omega1
		(*w)	/omega
		(*c)	/xi
		(*q)	/psi
		(*z)	/zeta
		(---)	/braceleft
		(or)	/bar
		(---)	/braceright
		(ap)	/similar
		(---)	/Upsilon1
		(fm)	/minute
		(<=)	/lessequal
		(---)	/fraction
		(if)	/infinity
		(---)	/florin
		(---)	/club
		(---)	/diamond
		(---)	/heart
		(---)	/spade
		(ab)	/arrowboth
		(<-)	/arrowleft
		(ua)	/arrowup
		(->)	/arrowright
		(da)	/arrowdown
		(de)	/degree
		(+-)	/plusminus
		(---)	/second
		(>=)	/greaterequal
		(mu)	/multiply
		(pt)	/proportional
		(pd)	/partialdiff
		(bu)	/bullet
		(di)	/divide
		(!=)	/notequal
		(==)	/equivalence
		(~~)	/approxequal
		(el)	/ellipsis
		(av)	/arrowvertex
		(ah)	/arrowhorizex
		(CR)	/carriagereturn
		(af)	/aleph
		(If)	/Ifraktur
		(Rf)	/Rfraktur
		(ws)	/weierstrass
		(Ox)	/circlemultiply
		(O+)	/circleplus
		(es)	/emptyset
		(ca)	/intersection
		(cu)	/union
		(sp)	/propersuperset
		(ip)	/reflexsuperset
		(!b)	/notsubset
		(sb)	/propersubset
		(ib)	/reflexsubset
		(mo)	/element
		(!m)	/notelement
		(an)	/angle
		(gr)	/gradient
		(rg)	/registerserif
		(co)	/copyrightserif
		(tm)	/trademarkserif
		(---)	/product
		(sr)	/radical
		(c.)	/dotmath
		(no)	/logicalnot
		(l&)	/logicaland
		(l|)	/logicalor
		(---)	/arrowdblboth
		(---)	/arrowdblleft
		(---)	/arrowdblup
		(---)	/arrowdblright
		(---)	/arrowdbldown
		(lz)	/lozenge
		(b<)	/angleleft
		(RG)	/registersans
		(CO)	/copyrightsans
		(TM)	/trademarksans
		(---)	/summation
		(LT)	/parenlefttp
		(br)	/parenleftex
		(LX)	(")			% synonym
		(LB)	/parenleftbt
		(lc)	/bracketlefttp
		(lx)	/bracketleftex
		(lf)	/bracketleftbt
		(lt)	/bracelefttp
		(lk)	/braceleftmid
		(lb)	/braceleftbt
		(bv)	/braceex
		(|)	(")			% synonym
		(b>)	/angleright
		(is)	/integral
		(---)	/integraltp
		(---)	/integralex
		(---)	/integralbt
		(RT)	/parenrighttp
		(RX)	/parenrightex
		(RB)	/parenrightbt
		(rc)	/bracketrighttp
		(rx)	/bracketrightex
		(rf)	/bracketrightbt
		(rt)	/bracerighttp
		(rk)	/bracerightmid
		(rb)	/bracerightbt
		(~=)	(55	0	1)	% charlib
	//End of SymbolCharset
}

SpecialCharset() {
	cat <<-'//End of SpecialCharset'
		(ru)	/underscore
		(ff)	(60	2	1)	% charlib
		(Fi)	(84	2	1)	% charlib
		(Fl)	(84	2	1)	% charlib
		(14)	(75	2	1)	% charlib
		(12)	(75	2	1)	% charlib
		(34)	(75	2	1)	% charlib
		(bx)	(50	2	1)	% charlib
		(ob)	(38	2	1)	% charlib
		(ci)	(75	0	1)	% charlib
		(sq)	(50	2	1)	% charlib
		(Sl)	(50	2	1)	% charlib
		(L1)	(110	1	1)	% charlib
		(LA)	(110	1	1)	% charlib
		(LV)	(110	3	1)	% charlib
		(LH)	(210	1	1)	% charlib
		(lh)	(100	0	1)	% charlib
		(rh)	(100	0	1)	% charlib
		(lH)	(100	0	1)	% charlib
		(rH)	(100	0	1)	% charlib
		(PC)	(220	2	1)	% charlib
		(DG)	(185	2	1)	% charlib
	//End of SpecialCharset
}

DingbatsCharset() {
	cat <<-'//End of DingbatsCharset'
		(!)	33
		(")	34
		(#)	35
		($)	36
		(%)	37
		(&)	38
		(')	39
		(\()	40
		(\))	41
		(*)	42
		(+)	43
		(,)	44
		(-)	45
		(.)	46
		(/)	47
		(0)	48
		(1)	49
		(2)	50
		(3)	51
		(4)	52
		(5)	53
		(6)	54
		(7)	55
		(8)	56
		(9)	57
		(:)	58
		(;)	59
		(<)	60
		(=)	61
		(>)	62
		(?)	63
		(@)	64
		(A)	65
		(B)	66
		(C)	67
		(D)	68
		(E)	69
		(F)	70
		(G)	71
		(H)	72
		(I)	73
		(J)	74
		(K)	75
		(L)	76
		(M)	77
		(N)	78
		(O)	79
		(P)	80
		(Q)	81
		(R)	82
		(S)	83
		(T)	84
		(U)	85
		(V)	86
		(W)	87
		(X)	88
		(Y)	89
		(Z)	90
		([)	91
		(\\)	92
		(])	93
		(^)	94
		(_)	95
		(`)	96
		(a)	97
		(b)	98
		(c)	99
		(d)	100
		(e)	101
		(f)	102
		(g)	103
		(h)	104
		(i)	105
		(j)	106
		(k)	107
		(l)	108
		(m)	109
		(n)	110
		(o)	111
		(p)	112
		(q)	113
		(r)	114
		(s)	115
		(t)	116
		(u)	117
		(v)	118
		(w)	119
		(x)	120
		(y)	121
		(z)	122
		({)	123
		(|)	124
		(})	125
		(~)	126
		(hy)	161
		(em)	162
		(de)	163
		(\\-)	164
		(en)	165
		(ff)	166
		(fi)	167
		(fl)	168
		(Fi)	169
		(Fl)	170
		(fm)	171
		(ru)	172
		(dg)	173
		(bu)	174
		(14)	175
		(34)	176
		(12)	177
		(ct)	178
		(rg)	179
		(sq)	180
		(sl)	181
		(ul)	182
		(or)	183
		(no)	184
		(->)	185
		(<-)	186
		(da)	187
		(lh)	188
		(ua)	189
		(ab)	190
		(!b)	191
		(aa)	192
		(!m)	193
		(ga)	194
		(pl)	195
		(mi)	196
		(mu)	197
		(di)	198
		(eq)	199
		(==)	200
		(>=)	201
		(<=)	202
		(!=)	203
		(+-)	204
		(-+)	205
		(ap)	206
		(~=)	207
		(gr)	208
		(is)	209
		(pd)	210
		(if)	211
		(sr)	212
		(rn)	213
		(sb)	214
		(sp)	215
		(cu)	216
		(ca)	217
		(ib)	218
		(ip)	219
		(mo)	220
		(es)	221
		(sc)	222
		(dd)	223
		(lc)	224
		(rc)	225
		(lf)	226
		(rf)	227
		(bv)	228
		(**)	229
		(br)	230
		(ci)	231
		(ts)	232
		(co)	233
		(lt)	234
		(rt)	235
		(lb)	236
		(rb)	237
		(lk)	238
		(rk)	239
		(rh)	241
		(tm)	242
		(Sl)	243
		(ps)	244
		(cs)	245
		(cy)	246
		(as)	247
		(os)	248
		(=.)	249
		(ld)	250
		(rd)	251
		(le)	252
		(ge)	253
		(pp)	254
	//End of DingbatsCharset
}

#
# Generating functions output PostScript programs that build font width
# tables or a typesetter description file. Send the program to a printer
# and the complete table will come back on the serial port. All write on
# stdout and assume the prologue and other required PostScript files are
# all available.
#

Proportional() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		# Get <>_ and | from S. Use accents for ascii ^ and ~.
		StandardCharset | awk '
			$1 == "(<)" && $2 == "/less" {$1 = "(---)"}
			$1 == "(>)" && $2 == "/greater" {$1 = "(---)"}
			$1 == "(_)" && $2 == "/underscore" {$1 = "(---)"}
			$1 == "(|)" && $2 == "/bar" {$1 = "(---)"}
			$1 == "(^)" && $2 == "/asciicircum" {$1 = "(---)"}
			$1 == "(~)" && $2 == "/asciitilde" {$1 = "(---)"}
			{printf "%s\t%s\n", $1, $2}
			$2 == "/circumflex" {printf "(^)\t(\")\n"}
			$2 == "/tilde" {printf "(~)\t(\")\n"}
		'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(ligatures fi fl 0\\\\n) Print"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

FixedWidth() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		# awk is not important - it's only here for compatibility
		StandardCharset | awk '
			$1 == "(fi)" || $1 == "(fl)" {next}
			{printf "%s\t%s\n", $1, $2}
			$2 == "/circumflex" {printf "(^)\t(\")\n"}
			$2 == "/tilde" {printf "(~)\t(\")\n"}
	'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Dingbats() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		DingbatsCharset
	echo "] def"

	echo "/$2 SelectFont"
	echo "(   ) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Greek() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Symbol() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Special() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SpecialCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S1 SelectFont"

	echo "(# Times-Roman special font\\\\n) Print"
	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

#
# The DESC file doesn't have to be built on a printer. It's only here for
# consistency.
#

Description() {
	echo "/charset ["	# awk - so the stack doesn't overflow
		StandardCharset | awk '$1 != "(---)" {print $1}'
		SymbolCharset | awk '$1 != "(---)" {print $1}'
		SpecialCharset | awk '$1 != "(---)" {print $1}'
		DingbatsCharset | awk '$1 != "(---)" {print $1}'
	echo "] def"

	cat <<-//DESC
		(#Device Description - original PostScript character set

		PDL PostScript

		fonts 10 R I B BI CW H HI HB S1 S
		sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
		23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
		48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
		120 125 130 135 140 145 150 155 160 0

		res $RESOLUTION
		hor 1
		vert 1
		unitwidth $UNITWIDTH

		) Print
	//DESC
	echo "(charset\\\\n) Print"
	echo "BuildDescCharset"
	echo "(\\\\n) Print"
}

0707070014231217231006440057030057030000010643620522627501400002400000003355post.src/devpost/HKname HK
fontname Helvetica-LightOblique
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	28	2	34
dq	"
#	56	2	35
$	56	2	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	66	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	50	2	63
@	80	2	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	2	81
R	67	2	82
S	61	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	89	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	66	2	94
---	50	1	95
`	22	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	28	2	102
g	61	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	22	2	124
}	33	3	125
---	66	0	126
!!	33	1	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	0	168
---	22	2	169
``	39	2	170
---	56	0	171
---	39	0	172
---	39	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	65	3	182
---	50	0	183
---	22	1	184
---	39	1	185
''	39	2	186
---	56	0	187
---	100	0	188
---	100	2	189
??	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	33	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	33	2	235
---	89	0	241
---	22	0	245
---	22	2	248
---	56	0	249
---	94	0	250
---	50	2	251
0707070014231217241006440057030057030000010643640522627501400002400000003346post.src/devpost/HLname HL
fontname Helvetica-Light
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	28	2	34
dq	"
#	56	2	35
$	56	2	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	66	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	50	2	63
@	80	2	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	2	81
R	67	2	82
S	61	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	89	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	66	2	94
---	50	1	95
`	22	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	28	2	102
g	61	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	22	2	124
}	33	3	125
---	66	0	126
!!	33	1	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	0	168
---	22	2	169
``	39	2	170
---	56	0	171
---	39	0	172
---	39	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	65	3	182
---	50	0	183
---	22	1	184
---	39	1	185
''	39	2	186
---	56	0	187
---	100	0	188
---	100	2	189
??	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	33	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	33	2	235
---	89	0	241
---	22	0	245
---	22	2	248
---	56	0	249
---	94	0	250
---	50	2	251
0707070014231215111006400057030057030000010554220522632552300002400000003362post.src/devpost/HMname H
fontname Helvetica
named in prologue
ligatures fi fl 0
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	56	2	63
@	102	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
\	28	2	92
bs	"
]	28	3	93
---	47	2	94
---	56	1	95
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	26	3	124
}	33	3	125
---	58	0	126
!!	33	1	161
ct	56	3	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	0	168
---	19	2	169
``	33	2	170
---	56	0	171
---	33	0	172
---	33	0	173
fi	50	2	174
fl	50	2	175
en	56	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	54	3	182
---	35	0	183
---	22	1	184
---	33	1	185
''	33	2	186
---	56	0	187
---	100	0	188
---	100	2	189
??	61	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	37	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	36	2	235
---	89	0	241
---	28	0	245
---	22	2	248
---	61	0	249
---	94	0	250
---	61	2	251
0707070014231217261006440057030057030000010644600522627501400003700000035275post.src/devpost/shell.lib.bak#
# Shell library - for building devpost tables. Original collection was
# built on a Version 47.0 PS-810.
#

RESOLUTION=720
UNITWIDTH=10

#
# BuiltinTables returns command lines that generate PostScript programs
# for building a typesetter description file and font width tables for
# a relatively standard collection of fonts. Use awk to select a command
# line or modify an existing command to build a width table for a new
# font.
#

BuiltinTables() {
	cat <<-'//End of BuiltinTables'
		Proportional	R	Times-Roman
		Proportional	I	Times-Italic
		Proportional	B	Times-Bold
		Proportional	BI	Times-BoldItalic
		Proportional	AB	AvantGarde-Demi
		Proportional	AI	AvantGarde-BookOblique
		Proportional	AR	AvantGarde-Book
		Proportional	AX	AvantGarde-DemiOblique
		Proportional	H	Helvetica
		Proportional	HB	Helvetica-Bold
		Proportional	HI	Helvetica-Oblique
		Proportional	HX	Helvetica-BoldOblique
		Proportional	Hb	Helvetica-Narrow-Bold
		Proportional	Hi	Helvetica-Narrow-Oblique
		Proportional	Hr	Helvetica-Narrow
		Proportional	Hx	Helvetica-Narrow-BoldOblique
		Proportional	KB	Bookman-Demi
		Proportional	KI	Bookman-LightItalic
		Proportional	KR	Bookman-Light
		Proportional	KX	Bookman-DemiItalic
		Proportional	NB	NewCenturySchlbk-Bold
		Proportional	NI	NewCenturySchlbk-Italic
		Proportional	NR	NewCenturySchlbk-Roman
		Proportional	NX	NewCenturySchlbk-BoldItalic
		Proportional	PA	Palatino-Roman
		Proportional	PB	Palatino-Bold
		Proportional	PI	Palatino-Italic
		Proportional	PX	Palatino-BoldItalic
		Proportional	ZI	ZapfChancery-MediumItalic
		FixedWidth	C	Courier
		FixedWidth	CB	Courier-Bold
		FixedWidth	CI	Courier-Oblique
		FixedWidth	CO	Courier
		FixedWidth	CW	Courier
		FixedWidth	CX	Courier-BoldOblique
		Dingbats	ZD	ZapfDingbats
		Greek		GR	Symbol
		Symbol		S	Symbol
		Special		S1	Times-Roman
		Description	DESC	---
	//End of BuiltinTables
}

#
# AllTables prints the complete list of builtin font names.
#

AllTables() {
	BuiltinTables | awk '{print $2}'
}

#
# Charset functions generate keyword/value pairs (as PostScript objects)
# that describe the character set available in a font. The keyword is a
# PostScript string that represents troff's name for the character. The
# value is usually the literal name (i.e. begins with a /) assigned to
# the character in the PostScript font. The value can also be an integer
# or a PostScript string. An integer value is used as an index in the
# current font's Encoding array. A string value is returned to the host
# unchanged when the entry for the character is constructed. Entries that
# have (") as their value are synonyms for the preceeding character.
#

StandardCharset() {
	cat <<-'//End of StandardCharset'
		(!)	/exclam
		(")	/quotedbl
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(hy)	/hyphen
		(-)	(")			% synonym
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(---)	/exclamdown
		(ct)	/cent
		(ps)	/sterling
		(fr)	/fraction
		(yn)	/yen
		(fn)	/florin
		(sc)	/section
		(cr)	/currency
		(---)	/quotesingle
		(``)	/quotedblleft
		(---)	/guillemotleft
		(---)	/guilsinglleft
		(---)	/guilsinglright
		(fi)	/fi
		(fl)	/fl
		(en)	/endash
		(\\-)	(")
		(dg)	/dagger
		(dd)	/daggerdbl
		(---)	/periodcentered
		(pg)	/paragraph
		(---)	/bullet
		(---)	/quotesinglbase
		(---)	/quotedblbase
		('')	/quotedblright
		(---)	/guillemotright
		(---)	/ellipsis
		(---)	/perthousand
		(---)	/questiondown
		(ga)	/grave
		(\\`)	(")
		(aa)	/acute
		(\\')	(")
		(^a)	/circumflex
		(~a)	/tilde
		(-a)	/macron
		(Ua)	/breve
		(.a)	/dotaccent
		(:a)	/dieresis
		(oa)	/ring
		(,a)	/cedilla
		("a)	/hungarumlaut
		(Ca)	/ogonek
		(va)	/caron
		(em)	/emdash
		(---)	/AE
		(---)	/ordfeminine
		(---)	/Lslash
		(---)	/Oslash
		(---)	/OE
		(---)	/ordmasculine
		(---)	/ae
		(---)	/dotlessi
		(---)	/lslash
		(---)	/oslash
		(---)	/oe
		(---)	/germandbls
	//End of StandardCharset
}

SymbolCharset() {
	cat <<-'//End of SymbolCharset'
		(---)	/exclam
		(fa)	/universal
		(---)	/numbersign
		(te)	/existential
		(---)	/percent
		(---)	/ampersand
		(st)	/suchthat
		(---)	/parenleft
		(---)	/parenright
		(**)	/asteriskmath
		(pl)	/plus
		(---)	/comma
		(mi)	/minus
		(---)	/period
		(sl)	/slash
		(---)	/zero
		(---)	/one
		(---)	/two
		(---)	/three
		(---)	/four
		(---)	/five
		(---)	/six
		(---)	/seven
		(---)	/eight
		(---)	/nine
		(---)	/colon
		(---)	/semicolon
		(<)	/less
		(eq)	/equal
		(>)	/greater
		(---)	/question
		(cg)	/congruent
		(*A)	/Alpha
		(*B)	/Beta
		(*X)	/Chi
		(*D)	/Delta
		(*E)	/Epsilon
		(*F)	/Phi
		(*G)	/Gamma
		(*Y)	/Eta
		(*I)	/Iota
		(---)	/theta1
		(*K)	/Kappa
		(*L)	/Lambda
		(*M)	/Mu
		(*N)	/Nu
		(*O)	/Omicron
		(*P)	/Pi
		(*H)	/Theta
		(*R)	/Rho
		(*S)	/Sigma
		(*T)	/Tau
		(*U)	/Upsilon
		(ts)	/sigma1
		(*W)	/Omega
		(*C)	/Xi
		(*Q)	/Psi
		(*Z)	/Zeta
		(---)	/bracketleft
		(tf)	/therefore
		(---)	/bracketright
		(pp)	/perpendicular
		(ul)	/underscore
		(_)	(")			% synonym
		(rn)	/radicalex
		(*a)	/alpha
		(*b)	/beta
		(*x)	/chi
		(*d)	/delta
		(*e)	/epsilon
		(*f)	/phi
		(*g)	/gamma
		(*y)	/eta
		(*i)	/iota
		(---)	/phi1
		(*k)	/kappa
		(*l)	/lambda
		(*m)	/mu
		(*n)	/nu
		(*o)	/omicron
		(*p)	/pi
		(*h)	/theta
		(*r)	/rho
		(*s)	/sigma
		(*t)	/tau
		(*u)	/upsilon
		(---)	/omega1
		(*w)	/omega
		(*c)	/xi
		(*q)	/psi
		(*z)	/zeta
		(---)	/braceleft
		(or)	/bar
		(---)	/braceright
		(ap)	/similar
		(---)	/Upsilon1
		(fm)	/minute
		(<=)	/lessequal
		(---)	/fraction
		(if)	/infinity
		(---)	/florin
		(---)	/club
		(---)	/diamond
		(---)	/heart
		(---)	/spade
		(ab)	/arrowboth
		(<-)	/arrowleft
		(ua)	/arrowup
		(->)	/arrowright
		(da)	/arrowdown
		(de)	/degree
		(+-)	/plusminus
		(---)	/second
		(>=)	/greaterequal
		(mu)	/multiply
		(pt)	/proportional
		(pd)	/partialdiff
		(bu)	/bullet
		(di)	/divide
		(!=)	/notequal
		(==)	/equivalence
		(~~)	/approxequal
		(el)	/ellipsis
		(av)	/arrowvertex
		(ah)	/arrowhorizex
		(CR)	/carriagereturn
		(af)	/aleph
		(If)	/Ifraktur
		(Rf)	/Rfraktur
		(ws)	/weierstrass
		(Ox)	/circlemultiply
		(O+)	/circleplus
		(es)	/emptyset
		(ca)	/intersection
		(cu)	/union
		(sp)	/propersuperset
		(ip)	/reflexsuperset
		(!b)	/notsubset
		(sb)	/propersubset
		(ib)	/reflexsubset
		(mo)	/element
		(!m)	/notelement
		(an)	/angle
		(gr)	/gradient
		(rg)	/registerserif
		(co)	/copyrightserif
		(tm)	/trademarkserif
		(---)	/product
		(sr)	/radical
		(c.)	/dotmath
		(no)	/logicalnot
		(l&)	/logicaland
		(l|)	/logicalor
		(---)	/arrowdblboth
		(---)	/arrowdblleft
		(---)	/arrowdblup
		(---)	/arrowdblright
		(---)	/arrowdbldown
		(lz)	/lozenge
		(b<)	/angleleft
		(RG)	/registersans
		(CO)	/copyrightsans
		(TM)	/trademarksans
		(---)	/summation
		(LT)	/parenlefttp
		(br)	/parenleftex
		(LX)	(")			% synonym
		(LB)	/parenleftbt
		(lc)	/bracketlefttp
		(lx)	/bracketleftex
		(lf)	/bracketleftbt
		(lt)	/bracelefttp
		(lk)	/braceleftmid
		(lb)	/braceleftbt
		(bv)	/braceex
		(|)	(")			% synonym
		(b>)	/angleright
		(is)	/integral
		(---)	/integraltp
		(---)	/integralex
		(---)	/integralbt
		(RT)	/parenrighttp
		(RX)	/parenrightex
		(RB)	/parenrightbt
		(rc)	/bracketrighttp
		(rx)	/bracketrightex
		(rf)	/bracketrightbt
		(rt)	/bracerighttp
		(rk)	/bracerightmid
		(rb)	/bracerightbt
		(~=)	(55	0	1)	% charlib
	//End of SymbolCharset
}

SpecialCharset() {
	cat <<-'//End of SpecialCharset'
		(ru)	/underscore
		(ff)	(60	2	1)	% charlib
		(Fi)	(84	2	1)	% charlib
		(Fl)	(84	2	1)	% charlib
		(14)	(75	2	1)	% charlib
		(12)	(75	2	1)	% charlib
		(34)	(75	2	1)	% charlib
		(bx)	(50	2	1)	% charlib
		(ob)	(38	2	1)	% charlib
		(ci)	(75	0	1)	% charlib
		(sq)	(50	2	1)	% charlib
		(Sl)	(50	2	1)	% charlib
		(L1)	(110	1	2)	% charlib
		(LA)	(110	1	2)	% charlib
		(LV)	(110	3	1)	% charlib
		(LH)	(210	1	1)	% charlib
		(lh)	(100	0	1)	% charlib
		(rh)	(100	0	1)	% charlib
		(lH)	(100	0	1)	% charlib
		(rH)	(100	0	1)	% charlib
		(PC)	(220	2	1)	% charlib
		(DG)	(185	2	1)	% charlib
	//End of SpecialCharset
}

DingbatsCharset() {
	cat <<-'//End of DingbatsCharset'
		(!)	33
		(")	34
		(#)	35
		($)	36
		(%)	37
		(&)	38
		(')	39
		(\()	40
		(\))	41
		(*)	42
		(+)	43
		(,)	44
		(-)	45
		(.)	46
		(/)	47
		(0)	48
		(1)	49
		(2)	50
		(3)	51
		(4)	52
		(5)	53
		(6)	54
		(7)	55
		(8)	56
		(9)	57
		(:)	58
		(;)	59
		(<)	60
		(=)	61
		(>)	62
		(?)	63
		(@)	64
		(A)	65
		(B)	66
		(C)	67
		(D)	68
		(E)	69
		(F)	70
		(G)	71
		(H)	72
		(I)	73
		(J)	74
		(K)	75
		(L)	76
		(M)	77
		(N)	78
		(O)	79
		(P)	80
		(Q)	81
		(R)	82
		(S)	83
		(T)	84
		(U)	85
		(V)	86
		(W)	87
		(X)	88
		(Y)	89
		(Z)	90
		([)	91
		(\\)	92
		(])	93
		(^)	94
		(_)	95
		(`)	96
		(a)	97
		(b)	98
		(c)	99
		(d)	100
		(e)	101
		(f)	102
		(g)	103
		(h)	104
		(i)	105
		(j)	106
		(k)	107
		(l)	108
		(m)	109
		(n)	110
		(o)	111
		(p)	112
		(q)	113
		(r)	114
		(s)	115
		(t)	116
		(u)	117
		(v)	118
		(w)	119
		(x)	120
		(y)	121
		(z)	122
		({)	123
		(|)	124
		(})	125
		(~)	126
		(hy)	161
		(em)	162
		(de)	163
		(\\-)	164
		(en)	165
		(ff)	166
		(fi)	167
		(fl)	168
		(Fi)	169
		(Fl)	170
		(fm)	171
		(ru)	172
		(dg)	173
		(bu)	174
		(14)	175
		(34)	176
		(12)	177
		(ct)	178
		(rg)	179
		(sq)	180
		(sl)	181
		(ul)	182
		(or)	183
		(no)	184
		(->)	185
		(<-)	186
		(da)	187
		(lh)	188
		(ua)	189
		(ab)	190
		(!b)	191
		(aa)	192
		(!m)	193
		(ga)	194
		(pl)	195
		(mi)	196
		(mu)	197
		(di)	198
		(eq)	199
		(==)	200
		(>=)	201
		(<=)	202
		(!=)	203
		(+-)	204
		(-+)	205
		(ap)	206
		(~=)	207
		(gr)	208
		(is)	209
		(pd)	210
		(if)	211
		(sr)	212
		(rn)	213
		(sb)	214
		(sp)	215
		(cu)	216
		(ca)	217
		(ib)	218
		(ip)	219
		(mo)	220
		(es)	221
		(sc)	222
		(dd)	223
		(lc)	224
		(rc)	225
		(lf)	226
		(rf)	227
		(bv)	228
		(**)	229
		(br)	230
		(ci)	231
		(ts)	232
		(co)	233
		(lt)	234
		(rt)	235
		(lb)	236
		(rb)	237
		(lk)	238
		(rk)	239
		(rh)	241
		(tm)	242
		(Sl)	243
		(ps)	244
		(cs)	245
		(cy)	246
		(as)	247
		(os)	248
		(=.)	249
		(ld)	250
		(rd)	251
		(le)	252
		(ge)	253
		(pp)	254
	//End of DingbatsCharset
}

#
# Generating functions output PostScript programs that build font width
# tables or a typesetter description file. Send the program to a printer
# and the complete table will come back on the serial port. All write on
# stdout and assume the prologue and other required PostScript files are
# all available.
#

Proportional() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		# Get <>_ and | from S. Use accents for ascii ^ and ~.
		StandardCharset | awk '
			$1 == "(<)" && $2 == "/less" {$1 = "(---)"}
			$1 == "(>)" && $2 == "/greater" {$1 = "(---)"}
			$1 == "(_)" && $2 == "/underscore" {$1 = "(---)"}
			$1 == "(|)" && $2 == "/bar" {$1 = "(---)"}
			$1 == "(^)" && $2 == "/asciicircum" {$1 = "(---)"}
			$1 == "(~)" && $2 == "/asciitilde" {$1 = "(---)"}
			{printf "%s\t%s\n", $1, $2}
			$2 == "/circumflex" {printf "(^)\t(\")\n"}
			$2 == "/tilde" {printf "(~)\t(\")\n"}
		'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(ligatures fi fl 0\\\\n) Print"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

FixedWidth() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		# awk is not important - it's only here for compatibility
		StandardCharset | awk '
			$1 == "(fi)" || $1 == "(fl)" {next}
			{printf "%s\t%s\n", $1, $2}
			$2 == "/circumflex" {printf "(^)\t(\")\n"}
			$2 == "/tilde" {printf "(~)\t(\")\n"}
	'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Dingbats() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		DingbatsCharset
	echo "] def"

	echo "/$2 SelectFont"
	echo "(   ) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Greek() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Symbol() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Special() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SpecialCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S1 SelectFont"

	echo "(# Times-Roman special font\\\\n) Print"
	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

#
# The DESC file doesn't have to be built on a printer. It's only here for
# consistency.
#

Description() {
	echo "/charset ["	# awk - so the stack doesn't overflow
		StandardCharset | awk '$1 != "(---)" {print $1}'
		SymbolCharset | awk '$1 != "(---)" {print $1}'
		SpecialCharset | awk '$1 != "(---)" {print $1}'
		DingbatsCharset | awk '$1 != "(---)" {print $1}'
	echo "] def"

	cat <<-//DESC
		(#Device Description - original PostScript character set

		PDL PostScript

		fonts 10 R I B BI CW H HI HB S1 S
		sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
		23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
		48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
		120 125 130 135 140 145 150 155 160 0

		res $RESOLUTION
		hor 1
		vert 1
		unitwidth $UNITWIDTH

		) Print
	//DESC
	echo "(charset\\\\n) Print"
	echo "BuildDescCharset"
	echo "(\\\\n) Print"
}

0707070014231217271006440057030057030000010643470522627501400003200000000111post.src/devpost/LINKFILE#
# Creates missing width tables from existing ones.
#

rm -f HM
cp H HM
0707070014231123360407550057030057030000030440450522633073400002300000000000post.src/devLatin10707070014231123371006440057030057030000010440600522627501500003500000053076post.src/devLatin1/shell.lib#
# Shell library - for building devLatin1 tables.
#
# The full ISO Latin1 alphabet appeared in Adobe's interpreter sometime
# around Version 50.0. Prior to that ROM resident Type 1 text fonts were
# missing 18 characters that are now part of the Latin1 standard. Width
# tables will not build on printers that lack full Latin1 support. Error
# message will likely reflect a missing ISOLatin1Encoding array.
#

RESOLUTION=720
UNITWIDTH=10

OCTALESCAPES=${OCTALESCAPES:-160}	# <= code means add \0ddd names
DOWNLOADVECTOR=FALSE			# TRUE can mean incomplete tables

#
# BuiltinTables returns command lines that generate PostScript programs
# for building a typesetter description file and font width tables for
# a relatively standard collection of fonts. Use awk to select a command
# line or modify an existing command to build a width table for a new
# font.
#

BuiltinTables() {
	cat <<-'//End of BuiltinTables'
		Proportional	R	Times-Roman
		Proportional	I	Times-Italic
		Proportional	B	Times-Bold
		Proportional	BI	Times-BoldItalic
		Proportional	AB	AvantGarde-Demi
		Proportional	AI	AvantGarde-BookOblique
		Proportional	AR	AvantGarde-Book
		Proportional	AX	AvantGarde-DemiOblique
		Proportional	H	Helvetica
		Proportional	HB	Helvetica-Bold
		Proportional	HI	Helvetica-Oblique
		Proportional	HX	Helvetica-BoldOblique
		Proportional	Hb	Helvetica-Narrow-Bold
		Proportional	Hi	Helvetica-Narrow-Oblique
		Proportional	Hr	Helvetica-Narrow
		Proportional	Hx	Helvetica-Narrow-BoldOblique
		Proportional	KB	Bookman-Demi
		Proportional	KI	Bookman-LightItalic
		Proportional	KR	Bookman-Light
		Proportional	KX	Bookman-DemiItalic
		Proportional	NB	NewCenturySchlbk-Bold
		Proportional	NI	NewCenturySchlbk-Italic
		Proportional	NR	NewCenturySchlbk-Roman
		Proportional	NX	NewCenturySchlbk-BoldItalic
		Proportional	PA	Palatino-Roman
		Proportional	PB	Palatino-Bold
		Proportional	PI	Palatino-Italic
		Proportional	PX	Palatino-BoldItalic
		Proportional	ZI	ZapfChancery-MediumItalic
		FixedWidth	C	Courier
		FixedWidth	CB	Courier-Bold
		FixedWidth	CI	Courier-Oblique
		FixedWidth	CO	Courier
		FixedWidth	CW	Courier
		FixedWidth	CX	Courier-BoldOblique
		Dingbats	ZD	ZapfDingbats
		Greek		GR	Symbol
		Symbol		S	Symbol
		Special		S1	Times-Roman
		Description	DESC	---
	//End of BuiltinTables
}

#
# AllTables prints the complete list of builtin font names.
#

AllTables() {
	BuiltinTables | awk '{print $2}'
}

#
# Charset functions generate keyword/value pairs (as PostScript objects)
# that describe the character set available in a font. The keyword is a
# PostScript string that represents troff's name for the character. The
# value is usually the literal name (i.e. begins with a /) assigned to
# the character in the PostScript font. The value can also be an integer
# or a PostScript string. An integer value is used as an index in the
# current font's Encoding array. A string value is returned to the host
# unchanged when the entry for the character is constructed. Entries that
# have (") as their value are synonyms for the preceeding character.
#
# The 18 characters missing from ROM resident fonts on older printers are
# flagged with the PostScript comment "% missing".
#

StandardCharset() {
	cat <<-'//End of StandardCharset'
		(!)	/exclam
		(")	/quotedbl
		(dq)	(")			% synonym
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(-)	/hyphen			% changed from minus by request
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(bs)	(")			% synonym
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(\\`)	/grave			% devpost character
		(ga)	(")			% synonym
		(!!)	/exclamdown
		(c|)	/cent
		(ct)	(")			% devpost synonym
		(L-)	/sterling
		(ps)	(")			% devpost synonym
		(xo)	/currency
		(cr)	(")			% devpost synonym
		(Y-)	/yen
		(yn)	(")			% devpost synonym
		(||)	/brokenbar		% missing
		(so)	/section
		(sc)	(")			% devpost synonym
		("")	/dieresis
		(:a)	(")			% devpost synonym
		(co)	/copyright
		(a_)	/ordfeminine
		(<<)	/guillemotleft
		(-,)	/logicalnot
		(hy)	/hyphen
		(--)	/minus
		(ro)	/registered
		(rg)	(")			% devpost synonym
		(-^)	/macron
		(-a)	(")			% devpost synonym
		(0^)	/degree			% missing
		(+-)	/plusminus		% missing
		(2^)	/twosuperior		% missing
		(3^)	/threesuperior		% missing
		(\\')	/acute
		(aa)	(")			% devpost synonym
		(/u)	/mu			% missing
		(P!)	/paragraph
		(pg)	(")			% devpost synonym
		(.^)	/periodcentered
		(,,)	/cedilla
		(,a)	(")			% devpost synonym
		(1^)	/onesuperior		% missing
		(o_)	/ordmasculine
		(>>)	/guillemotright
		(14)	/onequarter		% missing
		(12)	/onehalf		% missing
		(34)	/threequarters		% missing
		(??)	/questiondown
		(A`)	/Agrave
		(A')	/Aacute
		(A^)	/Acircumflex
		(A~)	/Atilde
		(A")	/Adieresis
		(A*)	/Aring
		(AE)	/AE
		(C,)	/Ccedilla
		(E`)	/Egrave
		(E')	/Eacute
		(E^)	/Ecircumflex
		(E")	/Edieresis
		(I`)	/Igrave
		(I')	/Iacute
		(I^)	/Icircumflex
		(I")	/Idieresis
		(D-)	/Eth			% missing
		(N~)	/Ntilde
		(O`)	/Ograve
		(O')	/Oacute
		(O^)	/Ocircumflex
		(O~)	/Otilde
		(O")	/Odieresis
		(xx)	/multiply		% missing
		(O/)	/Oslash
		(U`)	/Ugrave
		(U')	/Uacute
		(U^)	/Ucircumflex
		(U")	/Udieresis
		(Y')	/Yacute			% missing
		(TH)	/Thorn			% missing
		(ss)	/germandbls
		(a`)	/agrave
		(a')	/aacute
		(a^)	/acircumflex
		(a~)	/atilde
		(a")	/adieresis
		(a*)	/aring
		(ae)	/ae
		(c,)	/ccedilla
		(e`)	/egrave
		(e')	/eacute
		(e^)	/ecircumflex
		(e")	/edieresis
		(i`)	/igrave
		(i')	/iacute
		(i^)	/icircumflex
		(i")	/idieresis
		(d-)	/eth			% missing
		(n~)	/ntilde
		(o`)	/ograve
		(o')	/oacute
		(o^)	/ocircumflex
		(o~)	/otilde
		(o")	/odieresis
		(-:)	/divide			% missing
		(o/)	/oslash
		(u`)	/ugrave
		(u')	/uacute
		(u^)	/ucircumflex
		(u")	/udieresis
		(y')	/yacute			% missing
		(th)	/thorn			% missing
		(y")	/ydieresis
		(^a)	/circumflex		% devpost accent
		(~a)	/tilde			% devpost accent
		(Ua)	/breve			% devpost accent
		(.a)	/dotaccent		% devpost accent
		(oa)	/ring			% devpost accent
		("a)	/hungarumlaut		% devpost accent
		(Ca)	/ogonek			% devpost accent
		(va)	/caron			% devpost accent
	//End of StandardCharset
}

#
# DingbatsCharset guarantees changes in StandardCharset don't show up in ZD.
#

DingbatsCharset() {
	cat <<-'//End of DingbatsCharset'
		(!)	/exclam
		(")	/quotedbl
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(-)	/minus		% also hyphen in devpost
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(\\`)	/grave			% devpost character
		(!!)	/exclamdown
		(c|)	/cent
		(L-)	/sterling
		(xo)	/currency
		(Y-)	/yen
		(||)	/brokenbar		% missing
		(so)	/section
		("")	/dieresis
		(co)	/copyright
		(a_)	/ordfeminine
		(<<)	/guillemotleft
		(-,)	/logicalnot
		(hy)	/hyphen
		(ro)	/registered
		(-^)	/macron
		(0^)	/degree			% missing
		(+-)	/plusminus		% missing
		(2^)	/twosuperior		% missing
		(3^)	/threesuperior		% missing
		(\\')	/acute
		(/u)	/mu			% missing
		(P!)	/paragraph
		(.^)	/periodcentered
		(,,)	/cedilla
		(1^)	/onesuperior		% missing
		(o_)	/ordmasculine
		(>>)	/guillemotright
		(14)	/onequarter		% missing
		(12)	/onehalf		% missing
		(34)	/threequarters		% missing
		(??)	/questiondown
		(A`)	/Agrave
		(A')	/Aacute
		(A^)	/Acircumflex
		(A~)	/Atilde
		(A")	/Adieresis
		(A*)	/Aring
		(AE)	/AE
		(C,)	/Ccedilla
		(E`)	/Egrave
		(E')	/Eacute
		(E^)	/Ecircumflex
		(E")	/Edieresis
		(I`)	/Igrave
		(I')	/Iacute
		(I^)	/Icircumflex
		(I")	/Idieresis
		(D-)	/Eth			% missing
		(N~)	/Ntilde
		(O`)	/Ograve
		(O')	/Oacute
		(O^)	/Ocircumflex
		(O~)	/Otilde
		(O")	/Odieresis
		(xx)	/multiply		% missing
		(O/)	/Oslash
		(U`)	/Ugrave
		(U')	/Uacute
		(U^)	/Ucircumflex
		(U")	/Udieresis
		(Y')	/Yacute			% missing
		(TH)	/Thorn			% missing
		(ss)	/germandbls
		(a`)	/agrave
		(a')	/aacute
		(a^)	/acircumflex
		(a~)	/atilde
		(a")	/adieresis
		(a*)	/aring
		(ae)	/ae
		(c,)	/ccedilla
		(e`)	/egrave
		(e')	/eacute
		(e^)	/ecircumflex
		(e")	/edieresis
		(i`)	/igrave
		(i')	/iacute
		(i^)	/icircumflex
		(i")	/idieresis
		(d-)	/eth			% missing
		(n~)	/ntilde
		(o`)	/ograve
		(o')	/oacute
		(o^)	/ocircumflex
		(o~)	/otilde
		(o")	/odieresis
		(-:)	/divide			% missing
		(o/)	/oslash
		(u`)	/ugrave
		(u')	/uacute
		(u^)	/ucircumflex
		(u")	/udieresis
		(y')	/yacute			% missing
		(th)	/thorn			% missing
		(y")	/ydieresis
	//End of DingbatsCharset
}

SymbolCharset() {
	cat <<-'//End of SymbolCharset'
		(---)	/exclam
		(fa)	/universal
		(---)	/numbersign
		(te)	/existential
		(---)	/percent
		(---)	/ampersand
		(st)	/suchthat
		(---)	/parenleft
		(---)	/parenright
		(**)	/asteriskmath
		(pl)	/plus
		(---)	/comma
		(mi)	/minus
		(---)	/period
		(sl)	/slash
		(---)	/zero
		(---)	/one
		(---)	/two
		(---)	/three
		(---)	/four
		(---)	/five
		(---)	/six
		(---)	/seven
		(---)	/eight
		(---)	/nine
		(---)	/colon
		(---)	/semicolon
		(<)	/less
		(eq)	/equal
		(>)	/greater
		(---)	/question
		(cg)	/congruent
		(*A)	/Alpha
		(*B)	/Beta
		(*X)	/Chi
		(*D)	/Delta
		(*E)	/Epsilon
		(*F)	/Phi
		(*G)	/Gamma
		(*Y)	/Eta
		(*I)	/Iota
		(---)	/theta1
		(*K)	/Kappa
		(*L)	/Lambda
		(*M)	/Mu
		(*N)	/Nu
		(*O)	/Omicron
		(*P)	/Pi
		(*H)	/Theta
		(*R)	/Rho
		(*S)	/Sigma
		(*T)	/Tau
		(*U)	/Upsilon
		(ts)	/sigma1
		(*W)	/Omega
		(*C)	/Xi
		(*Q)	/Psi
		(*Z)	/Zeta
		(---)	/bracketleft
		(tf)	/therefore
		(---)	/bracketright
		(pp)	/perpendicular
		(ul)	/underscore
		(_)	(")			% synonym
		(rn)	/radicalex
		(*a)	/alpha
		(*b)	/beta
		(*x)	/chi
		(*d)	/delta
		(*e)	/epsilon
		(*f)	/phi
		(*g)	/gamma
		(*y)	/eta
		(*i)	/iota
		(---)	/phi1
		(*k)	/kappa
		(*l)	/lambda
		(*m)	/mu
		(*n)	/nu
		(*o)	/omicron
		(*p)	/pi
		(*h)	/theta
		(*r)	/rho
		(*s)	/sigma
		(*t)	/tau
		(*u)	/upsilon
		(---)	/omega1
		(*w)	/omega
		(*c)	/xi
		(*q)	/psi
		(*z)	/zeta
		(---)	/braceleft
		(or)	/bar
		(---)	/braceright
		(ap)	/similar
		(---)	/Upsilon1
		(fm)	/minute
		(<=)	/lessequal
		(fr)	/fraction		% devpost character
		(if)	/infinity
		(fn)	/florin			% devpost character
		(---)	/club
		(---)	/diamond
		(---)	/heart
		(---)	/spade
		(ab)	/arrowboth
		(<-)	/arrowleft
		(ua)	/arrowup
		(->)	/arrowright
		(da)	/arrowdown
		(de)	/degree
		(+-)	/plusminus
		(---)	/second
		(>=)	/greaterequal
		(mu)	/multiply
		(pt)	/proportional
		(pd)	/partialdiff
		(bu)	/bullet
		(di)	/divide
		(!=)	/notequal
		(==)	/equivalence
		(~~)	/approxequal
		(el)	/ellipsis
		(av)	/arrowvertex
		(ah)	/arrowhorizex
		(CR)	/carriagereturn
		(af)	/aleph
		(If)	/Ifraktur
		(Rf)	/Rfraktur
		(ws)	/weierstrass
		(Ox)	/circlemultiply
		(O+)	/circleplus
		(es)	/emptyset
		(ca)	/intersection
		(cu)	/union
		(sp)	/propersuperset
		(ip)	/reflexsuperset
		(!b)	/notsubset
		(sb)	/propersubset
		(ib)	/reflexsubset
		(mo)	/element
		(!m)	/notelement
		(an)	/angle
		(gr)	/gradient
		(rg)	/registerserif
		(co)	/copyrightserif
		(tm)	/trademarkserif
		(---)	/product
		(sr)	/radical
		(c.)	/dotmath
		(no)	/logicalnot
		(l&)	/logicaland
		(l|)	/logicalor
		(---)	/arrowdblboth
		(---)	/arrowdblleft
		(---)	/arrowdblup
		(---)	/arrowdblright
		(---)	/arrowdbldown
		(lz)	/lozenge
		(b<)	/angleleft
		(RG)	/registersans
		(CO)	/copyrightsans
		(TM)	/trademarksans
		(---)	/summation
		(LT)	/parenlefttp
		(br)	/parenleftex
		(LX)	(")			% synonym
		(LB)	/parenleftbt
		(lc)	/bracketlefttp
		(lx)	/bracketleftex
		(lf)	/bracketleftbt
		(lt)	/bracelefttp
		(lk)	/braceleftmid
		(lb)	/braceleftbt
		(bv)	/braceex
		(|)	(")			% synonym
		(b>)	/angleright
		(is)	/integral
		(---)	/integraltp
		(---)	/integralex
		(---)	/integralbt
		(RT)	/parenrighttp
		(RX)	/parenrightex
		(RB)	/parenrightbt
		(rc)	/bracketrighttp
		(rx)	/bracketrightex
		(rf)	/bracketrightbt
		(rt)	/bracerighttp
		(rk)	/bracerightmid
		(rb)	/bracerightbt
		(~=)	(55	0	1)	% charlib
	//End of SymbolCharset
}

SpecialCharset() {
	cat <<-'//End of SpecialCharset'
		(ru)	/underscore
		('')	/quotedblright		% devpost character
		(``)	/quotedblleft		% devpost character
		(dg)	/dagger			% devpost character
		(dd)	/daggerdbl		% devpost character
		(en)	/endash			% devpost character
		(\\-)	(")			% synonym
		(em)	/emdash
%		(ff)	(60	2	1)	% charlib
%		(Fi)	(84	2	1)	% charlib
%		(Fl)	(84	2	1)	% charlib
		(14)	(75	2	1)	% charlib
		(12)	(75	2	1)	% charlib
		(34)	(75	2	1)	% charlib
		(bx)	(50	2	1)	% charlib
		(ob)	(38	2	1)	% charlib
		(ci)	(75	0	1)	% charlib
		(sq)	(50	2	1)	% charlib
		(Sl)	(50	2	1)	% charlib
		(L1)	(110	1	1)	% charlib
		(LA)	(110	1	1)	% charlib
		(LV)	(110	3	1)	% charlib
		(LH)	(210	1	1)	% charlib
		(lh)	(100	0	1)	% charlib
		(rh)	(100	0	1)	% charlib
		(lH)	(100	0	1)	% charlib
		(rH)	(100	0	1)	% charlib
		(PC)	(220	2	1)	% charlib
		(DG)	(185	2	1)	% charlib
	//End of SpecialCharset
}

#
# Latin1 ensures a font uses the ISOLatin1Encoding vector, although only
# text fonts should be re-encoded. Downloading the Encoding vector doesn't
# often make sense. No ISOLatin1Encoding array likely means ROM based fonts
# on your printer are incomplete. Type 1 fonts with a full Latin1 character
# set appeared sometime after Version 50.0.
#

Latin1() {
	if [ "$DOWNLOADVECTOR" = TRUE ]; then
		cat <<-'//End of ISOLatin1Encoding'
			/ISOLatin1Encoding [
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/space
				/exclam
				/quotedbl
				/numbersign
				/dollar
				/percent
				/ampersand
				/quoteright
				/parenleft
				/parenright
				/asterisk
				/plus
				/comma
				/minus
				/period
				/slash
				/zero
				/one
				/two
				/three
				/four
				/five
				/six
				/seven
				/eight
				/nine
				/colon
				/semicolon
				/less
				/equal
				/greater
				/question
				/at
				/A
				/B
				/C
				/D
				/E
				/F
				/G
				/H
				/I
				/J
				/K
				/L
				/M
				/N
				/O
				/P
				/Q
				/R
				/S
				/T
				/U
				/V
				/W
				/X
				/Y
				/Z
				/bracketleft
				/backslash
				/bracketright
				/asciicircum
				/underscore
				/quoteleft
				/a
				/b
				/c
				/d
				/e
				/f
				/g
				/h
				/i
				/j
				/k
				/l
				/m
				/n
				/o
				/p
				/q
				/r
				/s
				/t
				/u
				/v
				/w
				/x
				/y
				/z
				/braceleft
				/bar
				/braceright
				/asciitilde
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/dotlessi
				/grave
				/acute
				/circumflex
				/tilde
				/macron
				/breve
				/dotaccent
				/dieresis
				/.notdef
				/ring
				/cedilla
				/.notdef
				/hungarumlaut
				/ogonek
				/caron
				/space
				/exclamdown
				/cent
				/sterling
				/currency
				/yen
				/brokenbar
				/section
				/dieresis
				/copyright
				/ordfeminine
				/guillemotleft
				/logicalnot
				/hyphen
				/registered
				/macron
				/degree
				/plusminus
				/twosuperior
				/threesuperior
				/acute
				/mu
				/paragraph
				/periodcentered
				/cedilla
				/onesuperior
				/ordmasculine
				/guillemotright
				/onequarter
				/onehalf
				/threequarters
				/questiondown
				/Agrave
				/Aacute
				/Acircumflex
				/Atilde
				/Adieresis
				/Aring
				/AE
				/Ccedilla
				/Egrave
				/Eacute
				/Ecircumflex
				/Edieresis
				/Igrave
				/Iacute
				/Icircumflex
				/Idieresis
				/Eth
				/Ntilde
				/Ograve
				/Oacute
				/Ocircumflex
				/Otilde
				/Odieresis
				/multiply
				/Oslash
				/Ugrave
				/Uacute
				/Ucircumflex
				/Udieresis
				/Yacute
				/Thorn
				/germandbls
				/agrave
				/aacute
				/acircumflex
				/atilde
				/adieresis
				/aring
				/ae
				/ccedilla
				/egrave
				/eacute
				/ecircumflex
				/edieresis
				/igrave
				/iacute
				/icircumflex
				/idieresis
				/eth
				/ntilde
				/ograve
				/oacute
				/ocircumflex
				/otilde
				/odieresis
				/divide
				/oslash
				/ugrave
				/uacute
				/ucircumflex
				/udieresis
				/yacute
				/thorn
				/ydieresis
			] def
		//End of ISOLatin1Encoding
	fi

	echo "ISOLatin1Encoding /$1 ReEncode"
}

#
# Generating functions output PostScript programs that build font width
# tables or a typesetter description file. Send the program to a printer
# and the complete table will come back on the serial port. All write on
# stdout and assume the prologue and other required PostScript files are
# all available.
#

Proportional() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		# Get <>_ and | from S. Use accents for ascii ^ and ~.
		StandardCharset | awk '
			$1 == "(<)" && $2 == "/less" {$1 = "(---)"}
			$1 == "(>)" && $2 == "/greater" {$1 = "(---)"}
			$1 == "(_)" && $2 == "/underscore" {$1 = "(---)"}
			$1 == "(|)" && $2 == "/bar" {$1 = "(---)"}
			$1 == "(^)" && $2 == "/asciicircum" {
				printf "(^)\t/circumflex\n"
				$1 = "(---)"
			}
			$1 == "(~)" && $2 == "/asciitilde" {
				printf "(~)\t/tilde\n"
				$1 = "(---)"
			}
			{printf "%s\t%s\n", $1, $2}
		'
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

FixedWidth() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		StandardCharset
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Dingbats() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		DingbatsCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ {
			printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2
		}'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(   ) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Greek() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Symbol() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Special() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SpecialCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S1 SelectFont"

	echo "(# Times-Roman special font\\\\n) Print"
	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

#
# The DESC file doesn't have to be built on a printer. It's only here for
# consistency.
#

Description() {
	echo "/charset ["	# awk - so the stack doesn't overflow
		StandardCharset | awk '{print $1}'
		SymbolCharset | awk '{print $1}'
		SpecialCharset | awk '{print $1}'
	echo "] def"

	cat <<-//DESC
		(#Device Description - Latin1 character set

		PDL PostScript
		Encoding Latin1

		fonts 10 R I B BI CW H HI HB S1 S
		sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
		23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
		48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
		120 125 130 135 140 145 150 155 160 0
		res $RESOLUTION
		hor 1
		vert 1
		unitwidth $UNITWIDTH

		) Print
	//DESC
	echo "(charset\\\\n) Print"
	echo "BuildDescCharset"
	echo "(\\\\n) Print"
}

0707070014231123401006440057030057030000010440460522627501500003400000000111post.src/devLatin1/LINKFILE#
# Creates missing width tables from existing ones.
#

rm -f HM
cp H HM
0707070014231123411006440057030057030000010440240522627501500002500000006137post.src/devLatin1/Rname R
fontname Times-Roman
named in prologue
spacewidth 25
charset
!	33	2	33
"	41	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	56	0	43
,	25	1	44
-	33	0	173
\0255	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	28	0	58
;	28	1	59
---	56	2	60
=	56	0	61
---	56	2	62
?	44	2	63
@	92	3	64
A	72	2	65
B	67	2	66
C	67	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	72	2	71
H	72	2	72
I	33	2	73
J	39	2	74
K	72	2	75
L	61	2	76
M	89	2	77
N	72	2	78
O	72	2	79
P	56	2	80
Q	72	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	72	2	85
V	72	2	86
W	94	2	87
X	72	2	88
Y	72	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
^	33	2	147
---	47	2	94
---	50	1	95
`	33	2	96
a	44	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	33	2	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	39	0	115
t	28	2	116
u	50	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
{	48	3	123
---	20	2	124
}	48	3	125
~	33	2	148
---	54	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	50	3	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	20	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	76	2	169
\0251	"
a_	28	2	170
\0252	"
<<	50	0	171
\0253	"
-,	56	0	172
\0254	"
hy	33	0	173
\0255	"
--	56	0	45
ro	76	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	56	2	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	50	1	181
\0265	"
P!	45	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	31	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	44	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	89	2	198
\0306	"
C,	67	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	33	2	204
\0314	"
I'	33	2	205
\0315	"
I^	33	2	206
\0316	"
I"	33	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	72	2	210
\0322	"
O'	72	2	211
\0323	"
O^	72	2	212
\0324	"
O~	72	2	213
\0325	"
O"	72	2	214
\0326	"
xx	56	0	215
\0327	"
O/	72	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	72	2	221
\0335	"
TH	56	2	222
\0336	"
ss	50	2	223
\0337	"
a`	44	2	224
\0340	"
a'	44	2	225
\0341	"
a^	44	2	226
\0342	"
a~	44	2	227
\0343	"
a"	44	2	228
\0344	"
a*	44	2	229
\0345	"
ae	67	0	230
\0346	"
c,	44	1	231
\0347	"
e`	44	2	232
\0350	"
e'	44	2	233
\0351	"
e^	44	2	234
\0352	"
e"	44	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	50	2	240
\0360	"
n~	50	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	56	0	247
\0367	"
o/	50	2	248
\0370	"
u`	50	2	249
\0371	"
u'	50	2	250
\0372	"
u^	50	2	251
\0373	"
u"	50	2	252
\0374	"
y'	50	3	253
\0375	"
th	50	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123421006440057030057030000010441400522627501500002500000006140post.src/devLatin1/Iname I
fontname Times-Italic
named in prologue
spacewidth 25
charset
!	33	2	33
"	42	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	68	2	43
,	25	1	44
-	33	0	173
\0255	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
---	68	2	60
=	68	0	61
---	68	2	62
?	50	2	63
@	92	3	64
A	61	2	65
B	61	2	66
C	67	2	67
D	72	2	68
E	61	2	69
F	61	2	70
G	72	2	71
H	72	2	72
I	33	2	73
J	44	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	67	2	78
O	72	2	79
P	61	2	80
Q	72	3	81
R	61	2	82
S	50	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	83	2	87
X	61	2	88
Y	56	2	89
Z	56	2	90
[	39	3	91
\	28	2	92
bs	"
]	39	3	93
^	33	2	147
---	42	2	94
---	50	1	95
`	33	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	28	3	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	72	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	28	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	40	3	123
---	28	3	124
}	40	3	125
~	33	2	148
---	54	0	126
\`	33	2	145
ga	"
!!	39	1	161
\0241	"
c|	50	3	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	28	3	166
\0246	"
so	50	2	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	76	2	169
\0251	"
a_	28	2	170
\0252	"
<<	50	0	171
\0253	"
-,	68	0	172
\0254	"
hy	33	0	173
\0255	"
--	68	0	45
ro	76	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	68	2	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	50	1	181
\0265	"
P!	52	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	31	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	50	1	191
\0277	"
A`	61	2	192
\0300	"
A'	61	2	193
\0301	"
A^	61	2	194
\0302	"
A~	61	2	195
\0303	"
A"	61	2	196
\0304	"
A*	61	2	197
\0305	"
AE	89	2	198
\0306	"
C,	67	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	33	2	204
\0314	"
I'	33	2	205
\0315	"
I^	33	2	206
\0316	"
I"	33	2	207
\0317	"
D-	72	2	208
\0320	"
N~	67	2	209
\0321	"
O`	72	2	210
\0322	"
O'	72	2	211
\0323	"
O^	72	2	212
\0324	"
O~	72	2	213
\0325	"
O"	72	2	214
\0326	"
xx	68	0	215
\0327	"
O/	72	3	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	56	2	221
\0335	"
TH	61	2	222
\0336	"
ss	50	3	223
\0337	"
a`	50	2	224
\0340	"
a'	50	2	225
\0341	"
a^	50	2	226
\0342	"
a~	50	2	227
\0343	"
a"	50	2	228
\0344	"
a*	50	2	229
\0345	"
ae	67	0	230
\0346	"
c,	44	1	231
\0347	"
e`	44	2	232
\0350	"
e'	44	2	233
\0351	"
e^	44	2	234
\0352	"
e"	44	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	50	2	240
\0360	"
n~	50	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	68	2	247
\0367	"
o/	50	3	248
\0370	"
u`	50	2	249
\0371	"
u'	50	2	250
\0372	"
u^	50	2	251
\0373	"
u"	50	2	252
\0374	"
y'	44	3	253
\0375	"
th	50	3	254
\0376	"
y"	44	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123431006440057030057030000010441440522627501500002500000006141post.src/devLatin1/Bname B
fontname Times-Bold
named in prologue
spacewidth 25
charset
!	33	2	33
"	56	2	34
dq	"
#	50	2	35
$	50	3	36
%	100	2	37
&	83	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	57	0	43
,	25	1	44
-	33	0	173
\0255	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
---	57	0	60
=	57	0	61
---	57	0	62
?	50	2	63
@	93	3	64
A	72	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	78	2	72
I	39	2	73
J	50	2	74
K	78	2	75
L	67	2	76
M	94	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	72	2	82
S	56	2	83
T	67	2	84
U	72	2	85
V	72	2	86
W	100	2	87
X	72	2	88
Y	72	2	89
Z	67	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
^	33	2	147
---	58	2	94
---	50	1	95
`	33	2	96
a	50	0	97
b	56	2	98
c	44	0	99
d	56	2	100
e	44	0	101
f	33	2	102
g	50	1	103
h	56	2	104
i	28	2	105
j	33	3	106
k	56	2	107
l	28	2	108
m	83	0	109
n	56	0	110
o	50	0	111
p	56	1	112
q	56	1	113
r	44	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
{	39	3	123
---	22	3	124
}	39	3	125
~	33	2	148
---	52	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	50	3	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	22	3	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	30	2	170
\0252	"
<<	50	0	171
\0253	"
-,	57	0	172
\0254	"
hy	33	0	173
\0255	"
--	57	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	57	2	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	54	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	33	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	50	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	67	2	200
\0310	"
E'	67	2	201
\0311	"
E^	67	2	202
\0312	"
E"	67	2	203
\0313	"
I`	39	2	204
\0314	"
I'	39	2	205
\0315	"
I^	39	2	206
\0316	"
I"	39	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	57	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	72	2	221
\0335	"
TH	61	2	222
\0336	"
ss	56	2	223
\0337	"
a`	50	2	224
\0340	"
a'	50	2	225
\0341	"
a^	50	2	226
\0342	"
a~	50	2	227
\0343	"
a"	50	2	228
\0344	"
a*	50	2	229
\0345	"
ae	72	0	230
\0346	"
c,	44	1	231
\0347	"
e`	44	2	232
\0350	"
e'	44	2	233
\0351	"
e^	44	2	234
\0352	"
e"	44	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	50	2	240
\0360	"
n~	56	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	57	0	247
\0367	"
o/	50	2	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	50	3	253
\0375	"
th	56	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123441006440057030057030000010441600522627501500002600000006145post.src/devLatin1/BIname BI
fontname Times-BoldItalic
named in prologue
spacewidth 25
charset
!	39	2	33
"	56	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	57	0	43
,	25	1	44
-	33	0	173
\0255	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
---	57	2	60
=	57	0	61
---	57	2	62
?	50	2	63
@	83	3	64
A	67	2	65
B	67	2	66
C	67	2	67
D	72	2	68
E	67	2	69
F	67	2	70
G	72	2	71
H	78	2	72
I	39	2	73
J	50	2	74
K	67	2	75
L	61	2	76
M	89	2	77
N	72	2	78
O	72	2	79
P	61	2	80
Q	72	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	89	2	87
X	67	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
^	33	2	147
---	57	2	94
---	50	1	95
`	33	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	33	3	102
g	50	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	28	2	116
u	56	0	117
v	44	0	118
w	67	0	119
x	50	0	120
y	44	1	121
z	39	0	122
{	35	3	123
---	22	2	124
}	35	3	125
~	33	2	148
---	57	0	126
\`	33	2	145
ga	"
!!	39	1	161
\0241	"
c|	50	3	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	22	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	27	2	170
\0252	"
<<	50	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	57	2	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	58	1	181
\0265	"
P!	50	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	30	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	50	1	191
\0277	"
A`	67	2	192
\0300	"
A'	67	2	193
\0301	"
A^	67	2	194
\0302	"
A~	67	2	195
\0303	"
A"	67	2	196
\0304	"
A*	67	2	197
\0305	"
AE	94	2	198
\0306	"
C,	67	3	199
\0307	"
E`	67	2	200
\0310	"
E'	67	2	201
\0311	"
E^	67	2	202
\0312	"
E"	67	2	203
\0313	"
I`	39	2	204
\0314	"
I'	39	2	205
\0315	"
I^	39	2	206
\0316	"
I"	39	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	72	2	210
\0322	"
O'	72	2	211
\0323	"
O^	72	2	212
\0324	"
O~	72	2	213
\0325	"
O"	72	2	214
\0326	"
xx	57	0	215
\0327	"
O/	72	3	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	61	2	221
\0335	"
TH	61	2	222
\0336	"
ss	50	3	223
\0337	"
a`	50	2	224
\0340	"
a'	50	2	225
\0341	"
a^	50	2	226
\0342	"
a~	50	2	227
\0343	"
a"	50	2	228
\0344	"
a*	50	2	229
\0345	"
ae	72	0	230
\0346	"
c,	44	1	231
\0347	"
e`	44	2	232
\0350	"
e'	44	2	233
\0351	"
e^	44	2	234
\0352	"
e"	44	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	50	2	240
\0360	"
n~	56	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	57	0	247
\0367	"
o/	50	3	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	44	3	253
\0375	"
th	50	3	254
\0376	"
y"	44	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123451006440057030057030000010441640522627501500002600000006145post.src/devLatin1/ABname AB
fontname AvantGarde-Demi
named in prologue
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	2	36
%	86	2	37
&	68	2	38
'	28	2	39
(	38	3	40
)	38	3	41
*	44	2	42
+	60	0	43
,	28	1	44
-	42	0	173
\0255	"
.	28	0	46
/	46	3	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	56	2	63
@	74	2	64
A	74	2	65
B	58	2	66
C	78	2	67
D	70	2	68
E	52	2	69
F	48	2	70
G	84	2	71
H	68	2	72
I	28	2	73
J	48	2	74
K	62	2	75
L	44	2	76
M	90	2	77
N	74	2	78
O	84	2	79
P	56	2	80
Q	84	2	81
R	58	2	82
S	52	2	83
T	42	2	84
U	64	2	85
V	70	2	86
W	90	2	87
X	68	2	88
Y	62	2	89
Z	50	2	90
[	32	3	91
\	64	2	92
bs	"
]	32	3	93
^	54	2	147
---	60	2	94
---	50	1	95
`	28	2	96
a	66	0	97
b	66	2	98
c	64	0	99
d	66	2	100
e	64	0	101
f	28	2	102
g	66	1	103
h	60	2	104
i	24	2	105
j	26	3	106
k	58	2	107
l	24	2	108
m	94	0	109
n	60	0	110
o	64	0	111
p	66	1	112
q	66	1	113
r	32	0	114
s	44	0	115
t	30	2	116
u	60	0	117
v	56	0	118
w	80	0	119
x	56	0	120
y	58	1	121
z	46	0	122
{	34	3	123
---	60	2	124
}	34	3	125
~	48	2	148
---	60	0	126
\`	42	2	145
ga	"
!!	28	1	161
\0241	"
c|	56	2	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	2	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	60	2	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	50	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	36	2	170
\0252	"
<<	46	0	171
\0253	"
-,	60	0	172
\0254	"
hy	42	0	173
\0255	"
--	60	0	45
ro	74	2	174
\0256	"
rg	"
-^	42	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	60	0	177
\0261	"
2^	34	2	178
\0262	"
3^	34	2	179
\0263	"
\'	42	2	180
\0264	"
aa	"
/u	58	1	181
\0265	"
P!	60	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	34	1	184
\0270	"
,a	"
1^	34	2	185
\0271	"
o_	36	2	186
\0272	"
>>	46	0	187
\0273	"
14	84	2	188
\0274	"
12	84	2	189
\0275	"
34	84	2	190
\0276	"
??	56	1	191
\0277	"
A`	74	2	192
\0300	"
A'	74	2	193
\0301	"
A^	74	2	194
\0302	"
A~	74	2	195
\0303	"
A"	74	2	196
\0304	"
A*	74	2	197
\0305	"
AE	90	2	198
\0306	"
C,	78	3	199
\0307	"
E`	52	2	200
\0310	"
E'	52	2	201
\0311	"
E^	52	2	202
\0312	"
E"	52	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	74	2	208
\0320	"
N~	74	2	209
\0321	"
O`	84	2	210
\0322	"
O'	84	2	211
\0323	"
O^	84	2	212
\0324	"
O~	84	2	213
\0325	"
O"	84	2	214
\0326	"
xx	60	0	215
\0327	"
O/	84	2	216
\0330	"
U`	64	2	217
\0331	"
U'	64	2	218
\0332	"
U^	64	2	219
\0333	"
U"	64	2	220
\0334	"
Y'	62	2	221
\0335	"
TH	56	2	222
\0336	"
ss	60	2	223
\0337	"
a`	66	2	224
\0340	"
a'	66	2	225
\0341	"
a^	66	2	226
\0342	"
a~	66	2	227
\0343	"
a"	66	2	228
\0344	"
a*	66	2	229
\0345	"
ae	108	0	230
\0346	"
c,	64	1	231
\0347	"
e`	64	2	232
\0350	"
e'	64	2	233
\0351	"
e^	64	2	234
\0352	"
e"	64	2	235
\0353	"
i`	24	2	236
\0354	"
i'	24	2	237
\0355	"
i^	24	2	238
\0356	"
i"	24	2	239
\0357	"
d-	64	2	240
\0360	"
n~	60	2	241
\0361	"
o`	64	2	242
\0362	"
o'	64	2	243
\0363	"
o^	64	2	244
\0364	"
o~	64	2	245
\0365	"
o"	64	2	246
\0366	"
-:	60	0	247
\0367	"
o/	66	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	58	3	253
\0375	"
th	66	3	254
\0376	"
y"	58	3	255
\0377	"
^a	54	2	147
~a	48	2	148
Ua	48	2	150
.a	28	2	151
oa	36	2	154
"a	70	2	157
Ca	34	1	158
va	54	2	159
0707070014231123461006440057030057030000010442000522627501500002600000006154post.src/devLatin1/AIname AI
fontname AvantGarde-BookOblique
named in prologue
spacewidth 28
charset
!	29	2	33
"	31	2	34
dq	"
#	55	2	35
$	55	2	36
%	78	2	37
&	76	2	38
'	35	2	39
(	37	3	40
)	37	3	41
*	43	2	42
+	61	0	43
,	28	0	44
-	33	0	173
\0255	"
.	28	0	46
/	44	3	47
0	55	2	48
1	55	2	49
2	55	2	50
3	55	2	51
4	55	2	52
5	55	2	53
6	55	2	54
7	55	2	55
8	55	2	56
9	55	2	57
:	28	0	58
;	28	0	59
---	61	0	60
=	61	0	61
---	61	0	62
?	59	2	63
@	87	2	64
A	74	2	65
B	57	2	66
C	81	2	67
D	74	2	68
E	54	2	69
F	49	2	70
G	87	2	71
H	68	2	72
I	23	2	73
J	48	2	74
K	59	2	75
L	46	2	76
M	92	2	77
N	74	2	78
O	87	2	79
P	59	2	80
Q	87	2	81
R	61	2	82
S	50	2	83
T	43	2	84
U	66	2	85
V	70	2	86
W	96	2	87
X	61	2	88
Y	59	2	89
Z	48	2	90
[	35	3	91
\	61	2	92
bs	"
]	35	3	93
^	50	2	147
---	61	2	94
---	50	1	95
`	35	2	96
a	68	0	97
b	68	2	98
c	65	0	99
d	69	2	100
e	65	0	101
f	31	2	102
g	67	1	103
h	61	2	104
i	20	2	105
j	20	3	106
k	50	2	107
l	20	2	108
m	94	0	109
n	61	0	110
o	66	0	111
p	68	1	112
q	68	1	113
r	30	0	114
s	39	0	115
t	34	2	116
u	61	0	117
v	55	0	118
w	83	0	119
x	48	0	120
y	54	1	121
z	43	0	122
{	35	3	123
---	67	2	124
}	35	3	125
~	44	2	148
---	61	0	126
\`	38	2	145
ga	"
!!	29	1	161
\0241	"
c|	55	2	162
\0242	"
ct	"
L-	55	2	163
\0243	"
ps	"
xo	55	0	164
\0244	"
cr	"
Y-	55	2	165
\0245	"
yn	"
||	67	2	166
\0246	"
so	62	3	167
\0247	"
sc	"
""	37	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	37	2	170
\0252	"
<<	43	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	49	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	38	2	180
\0264	"
aa	"
/u	61	1	181
\0265	"
P!	56	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	32	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	43	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	59	1	191
\0277	"
A`	74	2	192
\0300	"
A'	74	2	193
\0301	"
A^	74	2	194
\0302	"
A~	74	2	195
\0303	"
A"	74	2	196
\0304	"
A*	74	2	197
\0305	"
AE	99	2	198
\0306	"
C,	81	3	199
\0307	"
E`	54	2	200
\0310	"
E'	54	2	201
\0311	"
E^	54	2	202
\0312	"
E"	54	2	203
\0313	"
I`	23	2	204
\0314	"
I'	23	2	205
\0315	"
I^	23	2	206
\0316	"
I"	23	2	207
\0317	"
D-	79	2	208
\0320	"
N~	74	2	209
\0321	"
O`	87	2	210
\0322	"
O'	87	2	211
\0323	"
O^	87	2	212
\0324	"
O~	87	2	213
\0325	"
O"	87	2	214
\0326	"
xx	61	0	215
\0327	"
O/	87	2	216
\0330	"
U`	66	2	217
\0331	"
U'	66	2	218
\0332	"
U^	66	2	219
\0333	"
U"	66	2	220
\0334	"
Y'	59	2	221
\0335	"
TH	59	2	222
\0336	"
ss	55	2	223
\0337	"
a`	68	2	224
\0340	"
a'	68	2	225
\0341	"
a^	68	2	226
\0342	"
a~	68	2	227
\0343	"
a"	68	2	228
\0344	"
a*	68	2	229
\0345	"
ae	116	0	230
\0346	"
c,	65	1	231
\0347	"
e`	65	2	232
\0350	"
e'	65	2	233
\0351	"
e^	65	2	234
\0352	"
e"	65	2	235
\0353	"
i`	20	2	236
\0354	"
i'	20	2	237
\0355	"
i^	20	2	238
\0356	"
i"	20	2	239
\0357	"
d-	66	2	240
\0360	"
n~	61	2	241
\0361	"
o`	66	2	242
\0362	"
o'	66	2	243
\0363	"
o^	66	2	244
\0364	"
o~	66	2	245
\0365	"
o"	66	2	246
\0366	"
-:	61	0	247
\0367	"
o/	65	0	248
\0370	"
u`	61	2	249
\0371	"
u'	61	2	250
\0372	"
u^	61	2	251
\0373	"
u"	61	2	252
\0374	"
y'	54	3	253
\0375	"
th	68	3	254
\0376	"
y"	54	3	255
\0377	"
^a	50	2	147
~a	44	2	148
Ua	45	2	150
.a	22	2	151
oa	33	2	154
"a	55	2	157
Ca	30	1	158
va	50	2	159
0707070014231123471006440057030057030000010442040522627501500002600000006145post.src/devLatin1/ARname AR
fontname AvantGarde-Book
named in prologue
spacewidth 28
charset
!	29	2	33
"	31	2	34
dq	"
#	55	2	35
$	55	2	36
%	78	2	37
&	76	2	38
'	35	2	39
(	37	3	40
)	37	3	41
*	43	2	42
+	61	0	43
,	28	0	44
-	33	0	173
\0255	"
.	28	0	46
/	44	3	47
0	55	2	48
1	55	2	49
2	55	2	50
3	55	2	51
4	55	2	52
5	55	2	53
6	55	2	54
7	55	2	55
8	55	2	56
9	55	2	57
:	28	0	58
;	28	0	59
---	61	0	60
=	61	0	61
---	61	0	62
?	59	2	63
@	87	2	64
A	74	2	65
B	57	2	66
C	81	2	67
D	74	2	68
E	54	2	69
F	49	2	70
G	87	2	71
H	68	2	72
I	23	2	73
J	48	2	74
K	59	2	75
L	46	2	76
M	92	2	77
N	74	2	78
O	87	2	79
P	59	2	80
Q	87	2	81
R	61	2	82
S	50	2	83
T	43	2	84
U	66	2	85
V	70	2	86
W	96	2	87
X	61	2	88
Y	59	2	89
Z	48	2	90
[	35	3	91
\	61	2	92
bs	"
]	35	3	93
^	50	2	147
---	61	2	94
---	50	1	95
`	35	2	96
a	68	0	97
b	68	2	98
c	65	0	99
d	69	2	100
e	65	0	101
f	31	2	102
g	67	1	103
h	61	2	104
i	20	2	105
j	20	3	106
k	50	2	107
l	20	2	108
m	94	0	109
n	61	0	110
o	66	0	111
p	68	1	112
q	68	1	113
r	30	0	114
s	39	0	115
t	34	2	116
u	61	0	117
v	55	0	118
w	83	0	119
x	48	0	120
y	54	1	121
z	43	0	122
{	35	3	123
---	67	2	124
}	35	3	125
~	44	2	148
---	61	0	126
\`	38	2	145
ga	"
!!	29	1	161
\0241	"
c|	55	2	162
\0242	"
ct	"
L-	55	2	163
\0243	"
ps	"
xo	55	0	164
\0244	"
cr	"
Y-	55	2	165
\0245	"
yn	"
||	67	2	166
\0246	"
so	62	3	167
\0247	"
sc	"
""	37	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	37	2	170
\0252	"
<<	43	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	49	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	38	2	180
\0264	"
aa	"
/u	61	1	181
\0265	"
P!	56	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	32	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	43	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	59	1	191
\0277	"
A`	74	2	192
\0300	"
A'	74	2	193
\0301	"
A^	74	2	194
\0302	"
A~	74	2	195
\0303	"
A"	74	2	196
\0304	"
A*	74	2	197
\0305	"
AE	99	2	198
\0306	"
C,	81	3	199
\0307	"
E`	54	2	200
\0310	"
E'	54	2	201
\0311	"
E^	54	2	202
\0312	"
E"	54	2	203
\0313	"
I`	23	2	204
\0314	"
I'	23	2	205
\0315	"
I^	23	2	206
\0316	"
I"	23	2	207
\0317	"
D-	79	2	208
\0320	"
N~	74	2	209
\0321	"
O`	87	2	210
\0322	"
O'	87	2	211
\0323	"
O^	87	2	212
\0324	"
O~	87	2	213
\0325	"
O"	87	2	214
\0326	"
xx	61	0	215
\0327	"
O/	87	2	216
\0330	"
U`	66	2	217
\0331	"
U'	66	2	218
\0332	"
U^	66	2	219
\0333	"
U"	66	2	220
\0334	"
Y'	59	2	221
\0335	"
TH	59	2	222
\0336	"
ss	55	2	223
\0337	"
a`	68	2	224
\0340	"
a'	68	2	225
\0341	"
a^	68	2	226
\0342	"
a~	68	2	227
\0343	"
a"	68	2	228
\0344	"
a*	68	2	229
\0345	"
ae	116	0	230
\0346	"
c,	65	1	231
\0347	"
e`	65	2	232
\0350	"
e'	65	2	233
\0351	"
e^	65	2	234
\0352	"
e"	65	2	235
\0353	"
i`	20	2	236
\0354	"
i'	20	2	237
\0355	"
i^	20	2	238
\0356	"
i"	20	2	239
\0357	"
d-	66	2	240
\0360	"
n~	61	2	241
\0361	"
o`	66	2	242
\0362	"
o'	66	2	243
\0363	"
o^	66	2	244
\0364	"
o~	66	2	245
\0365	"
o"	66	2	246
\0366	"
-:	61	0	247
\0367	"
o/	65	0	248
\0370	"
u`	61	2	249
\0371	"
u'	61	2	250
\0372	"
u^	61	2	251
\0373	"
u"	61	2	252
\0374	"
y'	54	3	253
\0375	"
th	68	3	254
\0376	"
y"	54	3	255
\0377	"
^a	50	2	147
~a	44	2	148
Ua	45	2	150
.a	22	2	151
oa	33	2	154
"a	55	2	157
Ca	30	1	158
va	50	2	159
0707070014231123501006440057030057030000010442200522627501500002600000006154post.src/devLatin1/AXname AX
fontname AvantGarde-DemiOblique
named in prologue
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	2	36
%	86	2	37
&	68	2	38
'	28	2	39
(	38	3	40
)	38	3	41
*	44	2	42
+	60	0	43
,	28	1	44
-	42	0	173
\0255	"
.	28	0	46
/	46	3	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	56	2	63
@	74	2	64
A	74	2	65
B	58	2	66
C	78	2	67
D	70	2	68
E	52	2	69
F	48	2	70
G	84	2	71
H	68	2	72
I	28	2	73
J	48	2	74
K	62	2	75
L	44	2	76
M	90	2	77
N	74	2	78
O	84	2	79
P	56	2	80
Q	84	2	81
R	58	2	82
S	52	2	83
T	42	2	84
U	64	2	85
V	70	2	86
W	90	2	87
X	68	2	88
Y	62	2	89
Z	50	2	90
[	32	3	91
\	64	2	92
bs	"
]	32	3	93
^	54	2	147
---	60	2	94
---	50	1	95
`	28	2	96
a	66	0	97
b	66	2	98
c	64	0	99
d	66	2	100
e	64	0	101
f	28	2	102
g	66	1	103
h	60	2	104
i	24	2	105
j	26	3	106
k	58	2	107
l	24	2	108
m	94	0	109
n	60	0	110
o	64	0	111
p	66	1	112
q	66	1	113
r	32	0	114
s	44	0	115
t	30	2	116
u	60	0	117
v	56	0	118
w	80	0	119
x	56	0	120
y	58	1	121
z	46	0	122
{	34	3	123
---	60	2	124
}	34	3	125
~	48	2	148
---	60	0	126
\`	42	2	145
ga	"
!!	28	1	161
\0241	"
c|	56	2	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	2	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	60	2	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	50	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	36	2	170
\0252	"
<<	46	0	171
\0253	"
-,	60	0	172
\0254	"
hy	42	0	173
\0255	"
--	60	0	45
ro	74	2	174
\0256	"
rg	"
-^	42	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	60	0	177
\0261	"
2^	34	2	178
\0262	"
3^	34	2	179
\0263	"
\'	42	2	180
\0264	"
aa	"
/u	58	1	181
\0265	"
P!	60	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	34	1	184
\0270	"
,a	"
1^	34	2	185
\0271	"
o_	36	2	186
\0272	"
>>	46	0	187
\0273	"
14	84	2	188
\0274	"
12	84	2	189
\0275	"
34	84	2	190
\0276	"
??	56	1	191
\0277	"
A`	74	2	192
\0300	"
A'	74	2	193
\0301	"
A^	74	2	194
\0302	"
A~	74	2	195
\0303	"
A"	74	2	196
\0304	"
A*	74	2	197
\0305	"
AE	90	2	198
\0306	"
C,	78	3	199
\0307	"
E`	52	2	200
\0310	"
E'	52	2	201
\0311	"
E^	52	2	202
\0312	"
E"	52	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	74	2	208
\0320	"
N~	74	2	209
\0321	"
O`	84	2	210
\0322	"
O'	84	2	211
\0323	"
O^	84	2	212
\0324	"
O~	84	2	213
\0325	"
O"	84	2	214
\0326	"
xx	60	0	215
\0327	"
O/	84	2	216
\0330	"
U`	64	2	217
\0331	"
U'	64	2	218
\0332	"
U^	64	2	219
\0333	"
U"	64	2	220
\0334	"
Y'	62	2	221
\0335	"
TH	56	2	222
\0336	"
ss	60	2	223
\0337	"
a`	66	2	224
\0340	"
a'	66	2	225
\0341	"
a^	66	2	226
\0342	"
a~	66	2	227
\0343	"
a"	66	2	228
\0344	"
a*	66	2	229
\0345	"
ae	108	0	230
\0346	"
c,	64	1	231
\0347	"
e`	64	2	232
\0350	"
e'	64	2	233
\0351	"
e^	64	2	234
\0352	"
e"	64	2	235
\0353	"
i`	24	2	236
\0354	"
i'	24	2	237
\0355	"
i^	24	2	238
\0356	"
i"	24	2	239
\0357	"
d-	64	2	240
\0360	"
n~	60	2	241
\0361	"
o`	64	2	242
\0362	"
o'	64	2	243
\0363	"
o^	64	2	244
\0364	"
o~	64	2	245
\0365	"
o"	64	2	246
\0366	"
-:	60	0	247
\0367	"
o/	66	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	58	3	253
\0375	"
th	66	3	254
\0376	"
y"	58	3	255
\0377	"
^a	54	2	147
~a	48	2	148
Ua	48	2	150
.a	28	2	151
oa	36	2	154
"a	70	2	157
Ca	34	1	158
va	54	2	159
0707070014231123511006440057030057030000010442240522627501500002500000006137post.src/devLatin1/Hname H
fontname Helvetica
named in prologue
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	56	2	63
@	102	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
\	28	2	92
bs	"
]	28	3	93
^	33	2	147
---	47	2	94
---	56	1	95
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	26	3	124
}	33	3	125
~	33	2	148
---	58	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	0	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	26	3	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	37	2	170
\0252	"
<<	56	0	171
\0253	"
-,	58	0	172
\0254	"
hy	33	0	173
\0255	"
--	58	0	45
ro	74	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	58	2	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	54	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	56	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	61	1	191
\0277	"
A`	67	2	192
\0300	"
A'	67	2	193
\0301	"
A^	67	2	194
\0302	"
A~	67	2	195
\0303	"
A"	67	2	196
\0304	"
A*	67	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	67	2	200
\0310	"
E'	67	2	201
\0311	"
E^	67	2	202
\0312	"
E"	67	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	58	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	67	2	222
\0336	"
ss	61	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	89	0	230
\0346	"
c,	50	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	56	2	240
\0360	"
n~	56	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	58	0	247
\0367	"
o/	61	0	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	50	3	253
\0375	"
th	56	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123521006440057030057030000010442400522627501500002600000006144post.src/devLatin1/HBname HB
fontname Helvetica-Bold
named in prologue
spacewidth 28
charset
!	33	2	33
"	47	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	61	2	63
@	98	3	64
A	72	2	65
B	72	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	56	2	74
K	72	2	75
L	61	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
^	33	2	147
---	58	2	94
---	56	1	95
`	28	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	33	2	102
g	61	1	103
h	61	2	104
i	28	2	105
j	28	3	106
k	56	2	107
l	28	2	108
m	89	0	109
n	61	0	110
o	61	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	56	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	78	0	119
x	56	0	120
y	56	1	121
z	50	0	122
{	39	3	123
---	28	3	124
}	39	3	125
~	33	2	148
---	58	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	2	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	28	3	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	37	2	170
\0252	"
<<	56	0	171
\0253	"
-,	58	0	172
\0254	"
hy	33	0	173
\0255	"
--	58	0	45
ro	74	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	58	2	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	61	1	181
\0265	"
P!	56	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	56	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	61	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	67	2	200
\0310	"
E'	67	2	201
\0311	"
E^	67	2	202
\0312	"
E"	67	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	58	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	67	2	222
\0336	"
ss	61	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	89	0	230
\0346	"
c,	56	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	61	2	240
\0360	"
n~	61	2	241
\0361	"
o`	61	2	242
\0362	"
o'	61	2	243
\0363	"
o^	61	2	244
\0364	"
o~	61	2	245
\0365	"
o"	61	2	246
\0366	"
-:	58	0	247
\0367	"
o/	61	0	248
\0370	"
u`	61	2	249
\0371	"
u'	61	2	250
\0372	"
u^	61	2	251
\0373	"
u"	61	2	252
\0374	"
y'	56	3	253
\0375	"
th	61	3	254
\0376	"
y"	56	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123531006440057030057030000010442440522627501500002600000006150post.src/devLatin1/HIname HI
fontname Helvetica-Oblique
named in prologue
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	56	2	63
@	102	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
\	28	2	92
bs	"
]	28	3	93
^	33	2	147
---	47	2	94
---	56	1	95
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	26	3	124
}	33	3	125
~	33	2	148
---	58	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	0	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	26	3	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	37	2	170
\0252	"
<<	56	0	171
\0253	"
-,	58	0	172
\0254	"
hy	33	0	173
\0255	"
--	58	0	45
ro	74	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	58	2	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	54	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	56	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	61	1	191
\0277	"
A`	67	2	192
\0300	"
A'	67	2	193
\0301	"
A^	67	2	194
\0302	"
A~	67	2	195
\0303	"
A"	67	2	196
\0304	"
A*	67	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	67	2	200
\0310	"
E'	67	2	201
\0311	"
E^	67	2	202
\0312	"
E"	67	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	58	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	67	2	222
\0336	"
ss	61	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	89	0	230
\0346	"
c,	50	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	56	2	240
\0360	"
n~	56	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	58	0	247
\0367	"
o/	61	0	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	50	3	253
\0375	"
th	56	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123541006440057030057030000010442600522627501500002600000006153post.src/devLatin1/HXname HX
fontname Helvetica-BoldOblique
named in prologue
spacewidth 28
charset
!	33	2	33
"	47	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	61	2	63
@	98	3	64
A	72	2	65
B	72	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	56	2	74
K	72	2	75
L	61	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
^	33	2	147
---	58	2	94
---	56	1	95
`	28	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	33	2	102
g	61	1	103
h	61	2	104
i	28	2	105
j	28	3	106
k	56	2	107
l	28	2	108
m	89	0	109
n	61	0	110
o	61	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	56	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	78	0	119
x	56	0	120
y	56	1	121
z	50	0	122
{	39	3	123
---	28	3	124
}	39	3	125
~	33	2	148
---	58	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	2	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	28	3	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	37	2	170
\0252	"
<<	56	0	171
\0253	"
-,	58	0	172
\0254	"
hy	33	0	173
\0255	"
--	58	0	45
ro	74	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	58	2	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	61	1	181
\0265	"
P!	56	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	56	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	61	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	67	2	200
\0310	"
E'	67	2	201
\0311	"
E^	67	2	202
\0312	"
E"	67	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	58	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	67	2	222
\0336	"
ss	61	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	89	0	230
\0346	"
c,	56	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	61	2	240
\0360	"
n~	61	2	241
\0361	"
o`	61	2	242
\0362	"
o'	61	2	243
\0363	"
o^	61	2	244
\0364	"
o~	61	2	245
\0365	"
o"	61	2	246
\0366	"
-:	58	0	247
\0367	"
o/	61	0	248
\0370	"
u`	61	2	249
\0371	"
u'	61	2	250
\0372	"
u^	61	2	251
\0373	"
u"	61	2	252
\0374	"
y'	56	3	253
\0375	"
th	61	3	254
\0376	"
y"	56	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123551006440057030057030000010442640522627501600002600000006152post.src/devLatin1/Hbname Hb
fontname Helvetica-Narrow-Bold
named in prologue
spacewidth 23
charset
!	27	2	33
"	39	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	59	2	38
'	23	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
-	27	0	173
\0255	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	27	0	58
;	27	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	50	2	63
@	80	3	64
A	59	2	65
B	59	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	46	2	74
K	59	2	75
L	50	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	27	3	91
\	23	2	92
bs	"
]	27	3	93
^	27	2	147
---	48	2	94
---	46	1	95
`	23	2	96
a	46	0	97
b	50	2	98
c	46	0	99
d	50	2	100
e	46	0	101
f	27	2	102
g	50	1	103
h	50	2	104
i	23	2	105
j	23	3	106
k	46	2	107
l	23	2	108
m	73	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	32	0	114
s	46	0	115
t	27	2	116
u	50	0	117
v	46	0	118
w	64	0	119
x	46	0	120
y	46	1	121
z	41	0	122
{	32	3	123
---	23	3	124
}	32	3	125
~	27	2	148
---	48	0	126
\`	27	2	145
ga	"
!!	27	1	161
\0241	"
c|	46	3	162
\0242	"
ct	"
L-	46	2	163
\0243	"
ps	"
xo	46	2	164
\0244	"
cr	"
Y-	46	2	165
\0245	"
yn	"
||	23	3	166
\0246	"
so	46	3	167
\0247	"
sc	"
""	27	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	30	2	170
\0252	"
<<	46	0	171
\0253	"
-,	48	0	172
\0254	"
hy	27	0	173
\0255	"
--	48	0	45
ro	60	2	174
\0256	"
rg	"
-^	27	2	175
\0257	"
-a	"
0^	33	2	176
\0260	"
+-	48	2	177
\0261	"
2^	27	2	178
\0262	"
3^	27	2	179
\0263	"
\'	27	2	180
\0264	"
aa	"
/u	50	1	181
\0265	"
P!	46	3	182
\0266	"
pg	"
.^	23	0	183
\0267	"
,,	27	1	184
\0270	"
,a	"
1^	27	2	185
\0271	"
o_	30	2	186
\0272	"
>>	46	0	187
\0273	"
14	68	2	188
\0274	"
12	68	2	189
\0275	"
34	68	2	190
\0276	"
??	50	1	191
\0277	"
A`	59	2	192
\0300	"
A'	59	2	193
\0301	"
A^	59	2	194
\0302	"
A~	59	2	195
\0303	"
A"	59	2	196
\0304	"
A*	59	2	197
\0305	"
AE	82	2	198
\0306	"
C,	59	3	199
\0307	"
E`	55	2	200
\0310	"
E'	55	2	201
\0311	"
E^	55	2	202
\0312	"
E"	55	2	203
\0313	"
I`	23	2	204
\0314	"
I'	23	2	205
\0315	"
I^	23	2	206
\0316	"
I"	23	2	207
\0317	"
D-	59	2	208
\0320	"
N~	59	2	209
\0321	"
O`	64	2	210
\0322	"
O'	64	2	211
\0323	"
O^	64	2	212
\0324	"
O~	64	2	213
\0325	"
O"	64	2	214
\0326	"
xx	48	0	215
\0327	"
O/	64	2	216
\0330	"
U`	59	2	217
\0331	"
U'	59	2	218
\0332	"
U^	59	2	219
\0333	"
U"	59	2	220
\0334	"
Y'	55	2	221
\0335	"
TH	55	2	222
\0336	"
ss	50	2	223
\0337	"
a`	46	2	224
\0340	"
a'	46	2	225
\0341	"
a^	46	2	226
\0342	"
a~	46	2	227
\0343	"
a"	46	2	228
\0344	"
a*	46	2	229
\0345	"
ae	73	0	230
\0346	"
c,	46	1	231
\0347	"
e`	46	2	232
\0350	"
e'	46	2	233
\0351	"
e^	46	2	234
\0352	"
e"	46	2	235
\0353	"
i`	23	2	236
\0354	"
i'	23	2	237
\0355	"
i^	23	2	238
\0356	"
i"	23	2	239
\0357	"
d-	50	2	240
\0360	"
n~	50	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	48	0	247
\0367	"
o/	50	0	248
\0370	"
u`	50	2	249
\0371	"
u'	50	2	250
\0372	"
u^	50	2	251
\0373	"
u"	50	2	252
\0374	"
y'	46	3	253
\0375	"
th	50	3	254
\0376	"
y"	46	3	255
\0377	"
^a	27	2	147
~a	27	2	148
Ua	27	2	150
.a	27	2	151
oa	27	2	154
"a	27	2	157
Ca	27	1	158
va	27	2	159
0707070014231123561006440057030057030000010443000522627501600002600000006155post.src/devLatin1/Hiname Hi
fontname Helvetica-Narrow-Oblique
named in prologue
spacewidth 23
charset
!	23	2	33
"	29	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	55	2	38
'	18	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
-	27	0	173
\0255	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	23	0	58
;	23	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	46	2	63
@	83	3	64
A	55	2	65
B	55	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	41	2	74
K	55	2	75
L	46	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	23	3	91
\	23	2	92
bs	"
]	23	3	93
^	27	2	147
---	38	2	94
---	46	1	95
`	18	2	96
a	46	0	97
b	46	2	98
c	41	0	99
d	46	2	100
e	46	0	101
f	23	2	102
g	46	1	103
h	46	2	104
i	18	2	105
j	18	3	106
k	41	2	107
l	18	2	108
m	68	0	109
n	46	0	110
o	46	0	111
p	46	1	112
q	46	1	113
r	27	0	114
s	41	0	115
t	23	2	116
u	46	0	117
v	41	0	118
w	59	0	119
x	41	0	120
y	41	1	121
z	41	0	122
{	27	3	123
---	21	3	124
}	27	3	125
~	27	2	148
---	48	0	126
\`	27	2	145
ga	"
!!	27	1	161
\0241	"
c|	46	3	162
\0242	"
ct	"
L-	46	2	163
\0243	"
ps	"
xo	46	0	164
\0244	"
cr	"
Y-	46	2	165
\0245	"
yn	"
||	21	3	166
\0246	"
so	46	3	167
\0247	"
sc	"
""	27	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	30	2	170
\0252	"
<<	46	0	171
\0253	"
-,	48	0	172
\0254	"
hy	27	0	173
\0255	"
--	48	0	45
ro	60	2	174
\0256	"
rg	"
-^	27	2	175
\0257	"
-a	"
0^	33	2	176
\0260	"
+-	48	2	177
\0261	"
2^	27	2	178
\0262	"
3^	27	2	179
\0263	"
\'	27	2	180
\0264	"
aa	"
/u	46	1	181
\0265	"
P!	44	3	182
\0266	"
pg	"
.^	23	0	183
\0267	"
,,	27	1	184
\0270	"
,a	"
1^	27	2	185
\0271	"
o_	30	2	186
\0272	"
>>	46	0	187
\0273	"
14	68	2	188
\0274	"
12	68	2	189
\0275	"
34	68	2	190
\0276	"
??	50	1	191
\0277	"
A`	55	2	192
\0300	"
A'	55	2	193
\0301	"
A^	55	2	194
\0302	"
A~	55	2	195
\0303	"
A"	55	2	196
\0304	"
A*	55	2	197
\0305	"
AE	82	2	198
\0306	"
C,	59	3	199
\0307	"
E`	55	2	200
\0310	"
E'	55	2	201
\0311	"
E^	55	2	202
\0312	"
E"	55	2	203
\0313	"
I`	23	2	204
\0314	"
I'	23	2	205
\0315	"
I^	23	2	206
\0316	"
I"	23	2	207
\0317	"
D-	59	2	208
\0320	"
N~	59	2	209
\0321	"
O`	64	2	210
\0322	"
O'	64	2	211
\0323	"
O^	64	2	212
\0324	"
O~	64	2	213
\0325	"
O"	64	2	214
\0326	"
xx	48	0	215
\0327	"
O/	64	2	216
\0330	"
U`	59	2	217
\0331	"
U'	59	2	218
\0332	"
U^	59	2	219
\0333	"
U"	59	2	220
\0334	"
Y'	55	2	221
\0335	"
TH	55	2	222
\0336	"
ss	50	2	223
\0337	"
a`	46	2	224
\0340	"
a'	46	2	225
\0341	"
a^	46	2	226
\0342	"
a~	46	2	227
\0343	"
a"	46	2	228
\0344	"
a*	46	2	229
\0345	"
ae	73	0	230
\0346	"
c,	41	1	231
\0347	"
e`	46	2	232
\0350	"
e'	46	2	233
\0351	"
e^	46	2	234
\0352	"
e"	46	2	235
\0353	"
i`	23	2	236
\0354	"
i'	23	2	237
\0355	"
i^	23	2	238
\0356	"
i"	23	2	239
\0357	"
d-	46	2	240
\0360	"
n~	46	2	241
\0361	"
o`	46	2	242
\0362	"
o'	46	2	243
\0363	"
o^	46	2	244
\0364	"
o~	46	2	245
\0365	"
o"	46	2	246
\0366	"
-:	48	0	247
\0367	"
o/	50	0	248
\0370	"
u`	46	2	249
\0371	"
u'	46	2	250
\0372	"
u^	46	2	251
\0373	"
u"	46	2	252
\0374	"
y'	41	3	253
\0375	"
th	46	3	254
\0376	"
y"	41	3	255
\0377	"
^a	27	2	147
~a	27	2	148
Ua	27	2	150
.a	27	2	151
oa	27	2	154
"a	27	2	157
Ca	27	1	158
va	27	2	159
0707070014231123571006440057030057030000010443040522627501600002600000006145post.src/devLatin1/Hrname Hr
fontname Helvetica-Narrow
named in prologue
spacewidth 23
charset
!	23	2	33
"	29	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	55	2	38
'	18	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
-	27	0	173
\0255	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	23	0	58
;	23	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	46	2	63
@	83	3	64
A	55	2	65
B	55	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	41	2	74
K	55	2	75
L	46	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	23	3	91
\	23	2	92
bs	"
]	23	3	93
^	27	2	147
---	38	2	94
---	46	1	95
`	18	2	96
a	46	0	97
b	46	2	98
c	41	0	99
d	46	2	100
e	46	0	101
f	23	2	102
g	46	1	103
h	46	2	104
i	18	2	105
j	18	3	106
k	41	2	107
l	18	2	108
m	68	0	109
n	46	0	110
o	46	0	111
p	46	1	112
q	46	1	113
r	27	0	114
s	41	0	115
t	23	2	116
u	46	0	117
v	41	0	118
w	59	0	119
x	41	0	120
y	41	1	121
z	41	0	122
{	27	3	123
---	21	3	124
}	27	3	125
~	27	2	148
---	48	0	126
\`	27	2	145
ga	"
!!	27	1	161
\0241	"
c|	46	3	162
\0242	"
ct	"
L-	46	2	163
\0243	"
ps	"
xo	46	0	164
\0244	"
cr	"
Y-	46	2	165
\0245	"
yn	"
||	21	3	166
\0246	"
so	46	3	167
\0247	"
sc	"
""	27	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	30	2	170
\0252	"
<<	46	0	171
\0253	"
-,	48	0	172
\0254	"
hy	27	0	173
\0255	"
--	48	0	45
ro	60	2	174
\0256	"
rg	"
-^	27	2	175
\0257	"
-a	"
0^	33	2	176
\0260	"
+-	48	2	177
\0261	"
2^	27	2	178
\0262	"
3^	27	2	179
\0263	"
\'	27	2	180
\0264	"
aa	"
/u	46	1	181
\0265	"
P!	44	3	182
\0266	"
pg	"
.^	23	0	183
\0267	"
,,	27	1	184
\0270	"
,a	"
1^	27	2	185
\0271	"
o_	30	2	186
\0272	"
>>	46	0	187
\0273	"
14	68	2	188
\0274	"
12	68	2	189
\0275	"
34	68	2	190
\0276	"
??	50	1	191
\0277	"
A`	55	2	192
\0300	"
A'	55	2	193
\0301	"
A^	55	2	194
\0302	"
A~	55	2	195
\0303	"
A"	55	2	196
\0304	"
A*	55	2	197
\0305	"
AE	82	2	198
\0306	"
C,	59	3	199
\0307	"
E`	55	2	200
\0310	"
E'	55	2	201
\0311	"
E^	55	2	202
\0312	"
E"	55	2	203
\0313	"
I`	23	2	204
\0314	"
I'	23	2	205
\0315	"
I^	23	2	206
\0316	"
I"	23	2	207
\0317	"
D-	59	2	208
\0320	"
N~	59	2	209
\0321	"
O`	64	2	210
\0322	"
O'	64	2	211
\0323	"
O^	64	2	212
\0324	"
O~	64	2	213
\0325	"
O"	64	2	214
\0326	"
xx	48	0	215
\0327	"
O/	64	2	216
\0330	"
U`	59	2	217
\0331	"
U'	59	2	218
\0332	"
U^	59	2	219
\0333	"
U"	59	2	220
\0334	"
Y'	55	2	221
\0335	"
TH	55	2	222
\0336	"
ss	50	2	223
\0337	"
a`	46	2	224
\0340	"
a'	46	2	225
\0341	"
a^	46	2	226
\0342	"
a~	46	2	227
\0343	"
a"	46	2	228
\0344	"
a*	46	2	229
\0345	"
ae	73	0	230
\0346	"
c,	41	1	231
\0347	"
e`	46	2	232
\0350	"
e'	46	2	233
\0351	"
e^	46	2	234
\0352	"
e"	46	2	235
\0353	"
i`	23	2	236
\0354	"
i'	23	2	237
\0355	"
i^	23	2	238
\0356	"
i"	23	2	239
\0357	"
d-	46	2	240
\0360	"
n~	46	2	241
\0361	"
o`	46	2	242
\0362	"
o'	46	2	243
\0363	"
o^	46	2	244
\0364	"
o~	46	2	245
\0365	"
o"	46	2	246
\0366	"
-:	48	0	247
\0367	"
o/	50	0	248
\0370	"
u`	46	2	249
\0371	"
u'	46	2	250
\0372	"
u^	46	2	251
\0373	"
u"	46	2	252
\0374	"
y'	41	3	253
\0375	"
th	46	3	254
\0376	"
y"	41	3	255
\0377	"
^a	27	2	147
~a	27	2	148
Ua	27	2	150
.a	27	2	151
oa	27	2	154
"a	27	2	157
Ca	27	1	158
va	27	2	159
0707070014231123601006440057030057030000010443200522627501600002600000006161post.src/devLatin1/Hxname Hx
fontname Helvetica-Narrow-BoldOblique
named in prologue
spacewidth 23
charset
!	27	2	33
"	39	2	34
dq	"
#	46	2	35
$	46	3	36
%	73	2	37
&	59	2	38
'	23	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
-	27	0	173
\0255	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	27	0	58
;	27	1	59
---	48	0	60
=	48	0	61
---	48	0	62
?	50	2	63
@	80	3	64
A	59	2	65
B	59	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	46	2	74
K	59	2	75
L	50	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	27	3	91
\	23	2	92
bs	"
]	27	3	93
^	27	2	147
---	48	2	94
---	46	1	95
`	23	2	96
a	46	0	97
b	50	2	98
c	46	0	99
d	50	2	100
e	46	0	101
f	27	2	102
g	50	1	103
h	50	2	104
i	23	2	105
j	23	3	106
k	46	2	107
l	23	2	108
m	73	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	32	0	114
s	46	0	115
t	27	2	116
u	50	0	117
v	46	0	118
w	64	0	119
x	46	0	120
y	46	1	121
z	41	0	122
{	32	3	123
---	23	3	124
}	32	3	125
~	27	2	148
---	48	0	126
\`	27	2	145
ga	"
!!	27	1	161
\0241	"
c|	46	3	162
\0242	"
ct	"
L-	46	2	163
\0243	"
ps	"
xo	46	2	164
\0244	"
cr	"
Y-	46	2	165
\0245	"
yn	"
||	23	3	166
\0246	"
so	46	3	167
\0247	"
sc	"
""	27	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	30	2	170
\0252	"
<<	46	0	171
\0253	"
-,	48	0	172
\0254	"
hy	27	0	173
\0255	"
--	48	0	45
ro	60	2	174
\0256	"
rg	"
-^	27	2	175
\0257	"
-a	"
0^	33	2	176
\0260	"
+-	48	2	177
\0261	"
2^	27	2	178
\0262	"
3^	27	2	179
\0263	"
\'	27	2	180
\0264	"
aa	"
/u	50	1	181
\0265	"
P!	46	3	182
\0266	"
pg	"
.^	23	0	183
\0267	"
,,	27	1	184
\0270	"
,a	"
1^	27	2	185
\0271	"
o_	30	2	186
\0272	"
>>	46	0	187
\0273	"
14	68	2	188
\0274	"
12	68	2	189
\0275	"
34	68	2	190
\0276	"
??	50	1	191
\0277	"
A`	59	2	192
\0300	"
A'	59	2	193
\0301	"
A^	59	2	194
\0302	"
A~	59	2	195
\0303	"
A"	59	2	196
\0304	"
A*	59	2	197
\0305	"
AE	82	2	198
\0306	"
C,	59	3	199
\0307	"
E`	55	2	200
\0310	"
E'	55	2	201
\0311	"
E^	55	2	202
\0312	"
E"	55	2	203
\0313	"
I`	23	2	204
\0314	"
I'	23	2	205
\0315	"
I^	23	2	206
\0316	"
I"	23	2	207
\0317	"
D-	59	2	208
\0320	"
N~	59	2	209
\0321	"
O`	64	2	210
\0322	"
O'	64	2	211
\0323	"
O^	64	2	212
\0324	"
O~	64	2	213
\0325	"
O"	64	2	214
\0326	"
xx	48	0	215
\0327	"
O/	64	2	216
\0330	"
U`	59	2	217
\0331	"
U'	59	2	218
\0332	"
U^	59	2	219
\0333	"
U"	59	2	220
\0334	"
Y'	55	2	221
\0335	"
TH	55	2	222
\0336	"
ss	50	2	223
\0337	"
a`	46	2	224
\0340	"
a'	46	2	225
\0341	"
a^	46	2	226
\0342	"
a~	46	2	227
\0343	"
a"	46	2	228
\0344	"
a*	46	2	229
\0345	"
ae	73	0	230
\0346	"
c,	46	1	231
\0347	"
e`	46	2	232
\0350	"
e'	46	2	233
\0351	"
e^	46	2	234
\0352	"
e"	46	2	235
\0353	"
i`	23	2	236
\0354	"
i'	23	2	237
\0355	"
i^	23	2	238
\0356	"
i"	23	2	239
\0357	"
d-	50	2	240
\0360	"
n~	50	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	48	0	247
\0367	"
o/	50	0	248
\0370	"
u`	50	2	249
\0371	"
u'	50	2	250
\0372	"
u^	50	2	251
\0373	"
u"	50	2	252
\0374	"
y'	46	3	253
\0375	"
th	50	3	254
\0376	"
y"	46	3	255
\0377	"
^a	27	2	147
~a	27	2	148
Ua	27	2	150
.a	27	2	151
oa	27	2	154
"a	27	2	157
Ca	27	1	158
va	27	2	159
0707070014231123611006440057030057030000010443240522627501600002600000006143post.src/devLatin1/KBname KB
fontname Bookman-Demi
named in prologue
spacewidth 34
charset
!	36	2	33
"	42	2	34
dq	"
#	60	2	35
$	66	3	36
%	94	2	37
&	80	2	38
'	32	2	39
(	32	3	40
)	32	3	41
*	46	2	42
+	60	0	43
,	34	1	44
-	36	0	173
\0255	"
.	34	0	46
/	60	3	47
0	66	2	48
1	66	2	49
2	66	2	50
3	66	2	51
4	66	2	52
5	66	2	53
6	66	2	54
7	66	2	55
8	66	2	56
9	66	2	57
:	34	0	58
;	34	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	66	2	63
@	82	2	64
A	72	2	65
B	72	2	66
C	74	2	67
D	78	2	68
E	72	2	69
F	68	2	70
G	78	2	71
H	82	2	72
I	40	2	73
J	64	2	74
K	80	2	75
L	64	2	76
M	94	2	77
N	74	2	78
O	80	2	79
P	66	2	80
Q	80	3	81
R	78	2	82
S	66	2	83
T	70	2	84
U	74	2	85
V	72	2	86
W	94	2	87
X	78	2	88
Y	70	2	89
Z	64	2	90
[	30	3	91
\	60	2	92
bs	"
]	30	3	93
^	50	2	147
---	60	2	94
---	50	1	95
`	32	2	96
a	58	0	97
b	60	2	98
c	58	0	99
d	64	2	100
e	58	0	101
f	38	2	102
g	58	3	103
h	68	2	104
i	36	2	105
j	34	3	106
k	66	2	107
l	34	2	108
m	100	0	109
n	68	0	110
o	62	0	111
p	64	1	112
q	62	1	113
r	46	0	114
s	52	0	115
t	46	2	116
u	66	0	117
v	60	0	118
w	80	0	119
x	60	0	120
y	62	1	121
z	56	0	122
{	32	3	123
---	60	2	124
}	32	3	125
~	48	2	148
---	60	0	126
\`	40	2	145
ga	"
!!	36	1	161
\0241	"
c|	66	2	162
\0242	"
ct	"
L-	66	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	66	2	165
\0245	"
yn	"
||	60	2	166
\0246	"
so	60	3	167
\0247	"
sc	"
""	50	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	40	2	170
\0252	"
<<	40	0	171
\0253	"
-,	60	0	172
\0254	"
hy	36	0	173
\0255	"
--	60	0	45
ro	74	2	174
\0256	"
rg	"
-^	46	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	60	0	177
\0261	"
2^	40	2	178
\0262	"
3^	40	2	179
\0263	"
\'	40	2	180
\0264	"
aa	"
/u	66	1	181
\0265	"
P!	80	2	182
\0266	"
pg	"
.^	34	0	183
\0267	"
,,	36	1	184
\0270	"
,a	"
1^	40	2	185
\0271	"
o_	40	2	186
\0272	"
>>	40	0	187
\0273	"
14	99	2	188
\0274	"
12	99	2	189
\0275	"
34	99	2	190
\0276	"
??	66	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	114	2	198
\0306	"
C,	74	3	199
\0307	"
E`	72	2	200
\0310	"
E'	72	2	201
\0311	"
E^	72	2	202
\0312	"
E"	72	2	203
\0313	"
I`	40	2	204
\0314	"
I'	40	2	205
\0315	"
I^	40	2	206
\0316	"
I"	40	2	207
\0317	"
D-	78	2	208
\0320	"
N~	74	2	209
\0321	"
O`	80	2	210
\0322	"
O'	80	2	211
\0323	"
O^	80	2	212
\0324	"
O~	80	2	213
\0325	"
O"	80	2	214
\0326	"
xx	60	0	215
\0327	"
O/	80	3	216
\0330	"
U`	74	2	217
\0331	"
U'	74	2	218
\0332	"
U^	74	2	219
\0333	"
U"	74	2	220
\0334	"
Y'	70	2	221
\0335	"
TH	66	2	222
\0336	"
ss	66	2	223
\0337	"
a`	58	2	224
\0340	"
a'	58	2	225
\0341	"
a^	58	2	226
\0342	"
a~	58	2	227
\0343	"
a"	58	2	228
\0344	"
a*	58	2	229
\0345	"
ae	88	0	230
\0346	"
c,	58	1	231
\0347	"
e`	58	2	232
\0350	"
e'	58	2	233
\0351	"
e^	58	2	234
\0352	"
e"	58	2	235
\0353	"
i`	36	2	236
\0354	"
i'	36	2	237
\0355	"
i^	36	2	238
\0356	"
i"	36	2	239
\0357	"
d-	62	2	240
\0360	"
n~	68	2	241
\0361	"
o`	62	2	242
\0362	"
o'	62	2	243
\0363	"
o^	62	2	244
\0364	"
o~	62	2	245
\0365	"
o"	62	2	246
\0366	"
-:	60	0	247
\0367	"
o/	62	0	248
\0370	"
u`	66	2	249
\0371	"
u'	66	2	250
\0372	"
u^	66	2	251
\0373	"
u"	66	2	252
\0374	"
y'	62	3	253
\0375	"
th	64	3	254
\0376	"
y"	62	3	255
\0377	"
^a	50	2	147
~a	48	2	148
Ua	50	2	150
.a	32	2	151
oa	34	2	154
"a	44	2	157
Ca	32	1	158
va	50	2	159
0707070014231123621006440057030057030000010443400522627501600002600000006151post.src/devLatin1/KIname KI
fontname Bookman-LightItalic
named in prologue
spacewidth 30
charset
!	32	2	33
"	36	2	34
dq	"
#	60	2	35
$	62	2	36
%	80	2	37
&	82	2	38
'	28	2	39
(	28	3	40
)	28	3	41
*	44	2	42
+	60	2	43
,	30	1	44
-	32	0	173
\0255	"
.	30	0	46
/	60	3	47
0	62	2	48
1	62	2	49
2	62	2	50
3	62	2	51
4	62	2	52
5	62	2	53
6	62	2	54
7	62	2	55
8	62	2	56
9	62	2	57
:	30	0	58
;	30	1	59
---	60	2	60
=	60	0	61
---	60	2	62
?	54	2	63
@	78	2	64
A	70	2	65
B	72	2	66
C	72	2	67
D	74	2	68
E	68	2	69
F	62	2	70
G	76	2	71
H	80	2	72
I	32	2	73
J	56	2	74
K	72	2	75
L	58	2	76
M	86	2	77
N	72	2	78
O	76	2	79
P	60	2	80
Q	78	3	81
R	70	2	82
S	64	2	83
T	60	2	84
U	72	2	85
V	68	2	86
W	96	2	87
X	70	2	88
Y	66	2	89
Z	58	2	90
[	26	3	91
\	60	2	92
bs	"
]	26	3	93
^	44	2	147
---	60	2	94
---	50	1	95
`	28	2	96
a	62	0	97
b	60	2	98
c	48	0	99
d	64	2	100
e	54	0	101
f	34	3	102
g	56	1	103
h	62	2	104
i	28	2	105
j	28	3	106
k	60	2	107
l	28	2	108
m	88	0	109
n	62	0	110
o	54	0	111
p	60	1	112
q	56	1	113
r	40	0	114
s	54	0	115
t	34	2	116
u	62	0	117
v	54	0	118
w	88	0	119
x	54	0	120
y	60	1	121
z	52	0	122
{	36	3	123
---	60	2	124
}	38	3	125
~	44	2	148
---	60	0	126
\`	34	2	145
ga	"
!!	32	1	161
\0241	"
c|	62	2	162
\0242	"
ct	"
L-	62	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	62	2	165
\0245	"
yn	"
||	60	2	166
\0246	"
so	62	3	167
\0247	"
sc	"
""	42	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	44	2	170
\0252	"
<<	30	0	171
\0253	"
-,	60	0	172
\0254	"
hy	32	0	173
\0255	"
--	60	0	45
ro	74	2	174
\0256	"
rg	"
-^	44	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	60	2	177
\0261	"
2^	37	2	178
\0262	"
3^	37	2	179
\0263	"
\'	32	2	180
\0264	"
aa	"
/u	62	1	181
\0265	"
P!	62	2	182
\0266	"
pg	"
.^	30	0	183
\0267	"
,,	32	1	184
\0270	"
,a	"
1^	37	2	185
\0271	"
o_	40	2	186
\0272	"
>>	30	0	187
\0273	"
14	93	2	188
\0274	"
12	93	2	189
\0275	"
34	93	2	190
\0276	"
??	54	1	191
\0277	"
A`	70	2	192
\0300	"
A'	70	2	193
\0301	"
A^	70	2	194
\0302	"
A~	70	2	195
\0303	"
A"	70	2	196
\0304	"
A*	70	2	197
\0305	"
AE	122	2	198
\0306	"
C,	72	3	199
\0307	"
E`	68	2	200
\0310	"
E'	68	2	201
\0311	"
E^	68	2	202
\0312	"
E"	68	2	203
\0313	"
I`	32	2	204
\0314	"
I'	32	2	205
\0315	"
I^	32	2	206
\0316	"
I"	32	2	207
\0317	"
D-	74	2	208
\0320	"
N~	72	2	209
\0321	"
O`	76	2	210
\0322	"
O'	76	2	211
\0323	"
O^	76	2	212
\0324	"
O~	76	2	213
\0325	"
O"	76	2	214
\0326	"
xx	60	2	215
\0327	"
O/	76	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	66	2	221
\0335	"
TH	60	2	222
\0336	"
ss	62	3	223
\0337	"
a`	62	2	224
\0340	"
a'	62	2	225
\0341	"
a^	62	2	226
\0342	"
a~	62	2	227
\0343	"
a"	62	2	228
\0344	"
a*	62	2	229
\0345	"
ae	88	0	230
\0346	"
c,	48	1	231
\0347	"
e`	54	2	232
\0350	"
e'	54	2	233
\0351	"
e^	54	2	234
\0352	"
e"	54	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	54	2	240
\0360	"
n~	62	2	241
\0361	"
o`	54	2	242
\0362	"
o'	54	2	243
\0363	"
o^	54	2	244
\0364	"
o~	54	2	245
\0365	"
o"	54	2	246
\0366	"
-:	60	2	247
\0367	"
o/	54	0	248
\0370	"
u`	62	2	249
\0371	"
u'	62	2	250
\0372	"
u^	62	2	251
\0373	"
u"	62	2	252
\0374	"
y'	60	3	253
\0375	"
th	60	3	254
\0376	"
y"	60	3	255
\0377	"
^a	44	2	147
~a	44	2	148
Ua	44	2	150
.a	26	2	151
oa	30	2	154
"a	34	2	157
Ca	26	1	158
va	44	2	159
0707070014231123631006440057030057030000010443440522627501600002600000006143post.src/devLatin1/KRname KR
fontname Bookman-Light
named in prologue
spacewidth 32
charset
!	30	2	33
"	38	2	34
dq	"
#	60	2	35
$	62	2	36
%	90	2	37
&	80	2	38
'	22	2	39
(	30	3	40
)	30	3	41
*	44	2	42
+	60	0	43
,	32	1	44
-	40	0	173
\0255	"
.	32	0	46
/	60	3	47
0	62	2	48
1	62	2	49
2	62	2	50
3	62	2	51
4	62	2	52
5	62	2	53
6	62	2	54
7	62	2	55
8	62	2	56
9	62	2	57
:	32	0	58
;	32	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	54	2	63
@	82	2	64
A	68	2	65
B	74	2	66
C	74	2	67
D	80	2	68
E	72	2	69
F	64	2	70
G	80	2	71
H	80	2	72
I	34	2	73
J	60	2	74
K	72	2	75
L	60	2	76
M	92	2	77
N	74	2	78
O	80	2	79
P	62	2	80
Q	82	3	81
R	72	2	82
S	66	2	83
T	62	2	84
U	78	2	85
V	70	2	86
W	96	2	87
X	72	2	88
Y	64	2	89
Z	64	2	90
[	30	3	91
\	60	2	92
bs	"
]	30	3	93
^	42	2	147
---	60	2	94
---	50	1	95
`	22	2	96
a	58	0	97
b	62	2	98
c	52	0	99
d	62	2	100
e	52	0	101
f	32	2	102
g	54	3	103
h	66	2	104
i	30	2	105
j	30	3	106
k	62	2	107
l	30	2	108
m	94	0	109
n	66	0	110
o	56	0	111
p	62	1	112
q	58	1	113
r	44	0	114
s	52	0	115
t	38	2	116
u	68	0	117
v	52	0	118
w	78	0	119
x	56	0	120
y	54	1	121
z	48	0	122
{	28	3	123
---	60	2	124
}	28	3	125
~	44	2	148
---	60	0	126
\`	34	2	145
ga	"
!!	30	1	161
\0241	"
c|	62	2	162
\0242	"
ct	"
L-	62	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	62	2	165
\0245	"
yn	"
||	60	2	166
\0246	"
so	52	3	167
\0247	"
sc	"
""	42	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	42	2	170
\0252	"
<<	36	0	171
\0253	"
-,	60	0	172
\0254	"
hy	40	0	173
\0255	"
--	60	0	45
ro	74	2	174
\0256	"
rg	"
-^	44	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	60	0	177
\0261	"
2^	37	2	178
\0262	"
3^	37	2	179
\0263	"
\'	34	2	180
\0264	"
aa	"
/u	68	1	181
\0265	"
P!	60	2	182
\0266	"
pg	"
.^	32	0	183
\0267	"
,,	32	1	184
\0270	"
,a	"
1^	37	2	185
\0271	"
o_	42	2	186
\0272	"
>>	36	0	187
\0273	"
14	93	2	188
\0274	"
12	93	2	189
\0275	"
34	93	2	190
\0276	"
??	54	1	191
\0277	"
A`	68	2	192
\0300	"
A'	68	2	193
\0301	"
A^	68	2	194
\0302	"
A~	68	2	195
\0303	"
A"	68	2	196
\0304	"
A*	68	2	197
\0305	"
AE	126	2	198
\0306	"
C,	74	3	199
\0307	"
E`	72	2	200
\0310	"
E'	72	2	201
\0311	"
E^	72	2	202
\0312	"
E"	72	2	203
\0313	"
I`	34	2	204
\0314	"
I'	34	2	205
\0315	"
I^	34	2	206
\0316	"
I"	34	2	207
\0317	"
D-	80	2	208
\0320	"
N~	74	2	209
\0321	"
O`	80	2	210
\0322	"
O'	80	2	211
\0323	"
O^	80	2	212
\0324	"
O~	80	2	213
\0325	"
O"	80	2	214
\0326	"
xx	60	0	215
\0327	"
O/	80	2	216
\0330	"
U`	78	2	217
\0331	"
U'	78	2	218
\0332	"
U^	78	2	219
\0333	"
U"	78	2	220
\0334	"
Y'	64	2	221
\0335	"
TH	62	2	222
\0336	"
ss	66	2	223
\0337	"
a`	58	2	224
\0340	"
a'	58	2	225
\0341	"
a^	58	2	226
\0342	"
a~	58	2	227
\0343	"
a"	58	2	228
\0344	"
a*	58	2	229
\0345	"
ae	86	0	230
\0346	"
c,	52	1	231
\0347	"
e`	52	2	232
\0350	"
e'	52	2	233
\0351	"
e^	52	2	234
\0352	"
e"	52	2	235
\0353	"
i`	30	2	236
\0354	"
i'	30	2	237
\0355	"
i^	30	2	238
\0356	"
i"	30	2	239
\0357	"
d-	56	2	240
\0360	"
n~	66	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	60	0	247
\0367	"
o/	56	0	248
\0370	"
u`	68	2	249
\0371	"
u'	68	2	250
\0372	"
u^	68	2	251
\0373	"
u"	68	2	252
\0374	"
y'	54	3	253
\0375	"
th	62	3	254
\0376	"
y"	54	3	255
\0377	"
^a	42	2	147
~a	44	2	148
Ua	46	2	150
.a	26	2	151
oa	32	2	154
"a	38	2	157
Ca	32	1	158
va	42	2	159
0707070014231123641006440057030057030000010443600522627501600002600000006154post.src/devLatin1/KXname KX
fontname Bookman-DemiItalic
named in prologue
spacewidth 34
charset
!	32	2	33
"	38	2	34
dq	"
#	60	2	35
$	68	3	36
%	88	2	37
&	98	2	38
'	32	2	39
(	26	3	40
)	26	3	41
*	46	2	42
+	60	0	43
,	34	1	44
-	28	0	173
\0255	"
.	34	0	46
/	36	2	47
0	68	2	48
1	68	2	49
2	68	2	50
3	68	2	51
4	68	2	52
5	68	2	53
6	68	2	54
7	68	2	55
8	68	2	56
9	68	2	57
:	34	0	58
;	34	1	59
---	62	0	60
=	60	0	61
---	62	0	62
?	62	2	63
@	78	2	64
A	72	2	65
B	72	2	66
C	70	2	67
D	76	2	68
E	72	2	69
F	66	2	70
G	76	2	71
H	80	2	72
I	38	2	73
J	62	2	74
K	78	2	75
L	64	2	76
M	86	2	77
N	74	2	78
O	76	2	79
P	64	2	80
Q	76	3	81
R	74	2	82
S	70	2	83
T	70	2	84
U	74	2	85
V	66	2	86
W	100	2	87
X	74	2	88
Y	66	2	89
Z	68	2	90
[	26	3	91
\	58	2	92
bs	"
]	26	3	93
^	48	2	147
---	62	2	94
---	50	1	95
`	32	2	96
a	68	0	97
b	60	2	98
c	56	0	99
d	68	2	100
e	56	0	101
f	42	3	102
g	62	1	103
h	70	2	104
i	38	2	105
j	32	3	106
k	70	2	107
l	38	2	108
m	96	0	109
n	68	0	110
o	60	0	111
p	66	1	112
q	62	1	113
r	50	0	114
s	54	0	115
t	44	2	116
u	68	0	117
v	54	0	118
w	86	0	119
x	62	0	120
y	60	1	121
z	56	0	122
{	30	3	123
---	62	2	124
}	30	3	125
~	48	2	148
---	62	0	126
\`	38	2	145
ga	"
!!	32	1	161
\0241	"
c|	68	2	162
\0242	"
ct	"
L-	68	2	163
\0243	"
ps	"
xo	68	2	164
\0244	"
cr	"
Y-	68	2	165
\0245	"
yn	"
||	62	2	166
\0246	"
so	62	3	167
\0247	"
sc	"
""	52	2	168
\0250	"
:a	"
co	78	2	169
\0251	"
a_	44	2	170
\0252	"
<<	38	0	171
\0253	"
-,	62	0	172
\0254	"
hy	28	0	173
\0255	"
--	60	0	45
ro	78	2	174
\0256	"
rg	"
-^	48	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	60	0	177
\0261	"
2^	41	2	178
\0262	"
3^	41	2	179
\0263	"
\'	34	2	180
\0264	"
aa	"
/u	68	1	181
\0265	"
P!	68	3	182
\0266	"
pg	"
.^	34	0	183
\0267	"
,,	36	1	184
\0270	"
,a	"
1^	41	2	185
\0271	"
o_	44	2	186
\0272	"
>>	38	0	187
\0273	"
14	102	2	188
\0274	"
12	102	2	189
\0275	"
34	102	2	190
\0276	"
??	62	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	114	2	198
\0306	"
C,	70	3	199
\0307	"
E`	72	2	200
\0310	"
E'	72	2	201
\0311	"
E^	72	2	202
\0312	"
E"	72	2	203
\0313	"
I`	38	2	204
\0314	"
I'	38	2	205
\0315	"
I^	38	2	206
\0316	"
I"	38	2	207
\0317	"
D-	76	2	208
\0320	"
N~	74	2	209
\0321	"
O`	76	2	210
\0322	"
O'	76	2	211
\0323	"
O^	76	2	212
\0324	"
O~	76	2	213
\0325	"
O"	76	2	214
\0326	"
xx	60	0	215
\0327	"
O/	76	2	216
\0330	"
U`	74	2	217
\0331	"
U'	74	2	218
\0332	"
U^	74	2	219
\0333	"
U"	74	2	220
\0334	"
Y'	66	2	221
\0335	"
TH	64	2	222
\0336	"
ss	66	3	223
\0337	"
a`	68	2	224
\0340	"
a'	68	2	225
\0341	"
a^	68	2	226
\0342	"
a~	68	2	227
\0343	"
a"	68	2	228
\0344	"
a*	68	2	229
\0345	"
ae	88	0	230
\0346	"
c,	56	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	38	2	236
\0354	"
i'	38	2	237
\0355	"
i^	38	2	238
\0356	"
i"	38	2	239
\0357	"
d-	60	2	240
\0360	"
n~	68	2	241
\0361	"
o`	60	2	242
\0362	"
o'	60	2	243
\0363	"
o^	60	2	244
\0364	"
o~	60	2	245
\0365	"
o"	60	2	246
\0366	"
-:	60	0	247
\0367	"
o/	60	2	248
\0370	"
u`	68	2	249
\0371	"
u'	68	2	250
\0372	"
u^	68	2	251
\0373	"
u"	68	2	252
\0374	"
y'	60	3	253
\0375	"
th	66	3	254
\0376	"
y"	60	3	255
\0377	"
^a	48	2	147
~a	48	2	148
Ua	46	2	150
.a	38	2	151
oa	36	2	154
"a	56	2	157
Ca	32	1	158
va	48	2	159
0707070014231123651006440057030057030000010443640522627501600002600000006152post.src/devLatin1/NBname NB
fontname NewCenturySchlbk-Bold
named in prologue
spacewidth 29
charset
!	30	2	33
"	33	2	34
dq	"
#	57	2	35
$	57	3	36
%	83	2	37
&	85	2	38
'	24	2	39
(	39	3	40
)	39	3	41
*	50	2	42
+	61	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	57	2	48
1	57	2	49
2	57	2	50
3	57	2	51
4	57	2	52
5	57	2	53
6	57	2	54
7	57	2	55
8	57	2	56
9	57	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	50	2	63
@	75	2	64
A	76	2	65
B	78	2	66
C	78	2	67
D	83	2	68
E	76	2	69
F	72	2	70
G	83	2	71
H	87	2	72
I	44	2	73
J	65	2	74
K	82	2	75
L	72	2	76
M	98	2	77
N	83	2	78
O	83	2	79
P	76	2	80
Q	83	3	81
R	82	2	82
S	67	2	83
T	72	2	84
U	83	2	85
V	76	2	86
W	98	2	87
X	72	2	88
Y	72	2	89
Z	67	2	90
[	39	3	91
\	61	2	92
bs	"
]	39	3	93
^	33	2	147
---	61	2	94
---	50	1	95
`	24	2	96
a	61	0	97
b	65	2	98
c	56	0	99
d	67	2	100
e	57	0	101
f	39	2	102
g	61	1	103
h	69	2	104
i	37	2	105
j	35	3	106
k	67	2	107
l	35	2	108
m	96	0	109
n	69	0	110
o	61	0	111
p	67	1	112
q	65	1	113
r	52	0	114
s	50	0	115
t	43	2	116
u	69	0	117
v	61	0	118
w	89	0	119
x	61	0	120
y	61	1	121
z	54	0	122
{	39	3	123
---	61	2	124
}	39	3	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	30	1	161
\0241	"
c|	57	3	162
\0242	"
ct	"
L-	57	2	163
\0243	"
ps	"
xo	57	2	164
\0244	"
cr	"
Y-	57	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	50	2	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	37	2	170
\0252	"
<<	50	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	34	2	178
\0262	"
3^	34	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	69	1	181
\0265	"
P!	75	2	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	34	2	185
\0271	"
o_	37	2	186
\0272	"
>>	50	0	187
\0273	"
14	86	2	188
\0274	"
12	86	2	189
\0275	"
34	86	2	190
\0276	"
??	50	1	191
\0277	"
A`	76	2	192
\0300	"
A'	76	2	193
\0301	"
A^	76	2	194
\0302	"
A~	76	2	195
\0303	"
A"	76	2	196
\0304	"
A*	76	2	197
\0305	"
AE	98	2	198
\0306	"
C,	78	3	199
\0307	"
E`	76	2	200
\0310	"
E'	76	2	201
\0311	"
E^	76	2	202
\0312	"
E"	76	2	203
\0313	"
I`	44	2	204
\0314	"
I'	44	2	205
\0315	"
I^	44	2	206
\0316	"
I"	44	2	207
\0317	"
D-	83	2	208
\0320	"
N~	83	2	209
\0321	"
O`	83	2	210
\0322	"
O'	83	2	211
\0323	"
O^	83	2	212
\0324	"
O~	83	2	213
\0325	"
O"	83	2	214
\0326	"
xx	61	0	215
\0327	"
O/	83	2	216
\0330	"
U`	83	2	217
\0331	"
U'	83	2	218
\0332	"
U^	83	2	219
\0333	"
U"	83	2	220
\0334	"
Y'	72	2	221
\0335	"
TH	76	2	222
\0336	"
ss	61	2	223
\0337	"
a`	61	2	224
\0340	"
a'	61	2	225
\0341	"
a^	61	2	226
\0342	"
a~	61	2	227
\0343	"
a"	61	2	228
\0344	"
a*	61	2	229
\0345	"
ae	87	0	230
\0346	"
c,	56	1	231
\0347	"
e`	57	2	232
\0350	"
e'	57	2	233
\0351	"
e^	57	2	234
\0352	"
e"	57	2	235
\0353	"
i`	37	2	236
\0354	"
i'	37	2	237
\0355	"
i^	37	2	238
\0356	"
i"	37	2	239
\0357	"
d-	61	2	240
\0360	"
n~	69	2	241
\0361	"
o`	61	2	242
\0362	"
o'	61	2	243
\0363	"
o^	61	2	244
\0364	"
o~	61	2	245
\0365	"
o"	61	2	246
\0366	"
-:	61	0	247
\0367	"
o/	61	3	248
\0370	"
u`	69	2	249
\0371	"
u'	69	2	250
\0372	"
u^	69	2	251
\0373	"
u"	69	2	252
\0374	"
y'	61	3	253
\0375	"
th	67	3	254
\0376	"
y"	61	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123661006440057030057030000010444000522627501600002600000006154post.src/devLatin1/NIname NI
fontname NewCenturySchlbk-Italic
named in prologue
spacewidth 28
charset
!	33	2	33
"	40	2	34
dq	"
#	56	2	35
$	56	3	36
%	83	2	37
&	85	2	38
'	20	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	61	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	61	3	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	2	64
A	70	2	65
B	72	2	66
C	72	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	61	2	74
K	74	2	75
L	67	2	76
M	94	2	77
N	82	2	78
O	78	2	79
P	67	2	80
Q	78	3	81
R	74	2	82
S	67	2	83
T	69	2	84
U	82	2	85
V	70	2	86
W	93	2	87
X	70	2	88
Y	69	2	89
Z	67	2	90
[	33	3	91
\	61	2	92
bs	"
]	33	3	93
^	33	2	147
---	61	2	94
---	50	1	95
`	20	2	96
a	57	0	97
b	56	2	98
c	44	0	99
d	61	2	100
e	44	0	101
f	33	3	102
g	54	1	103
h	61	2	104
i	33	2	105
j	32	3	106
k	56	2	107
l	33	2	108
m	89	0	109
n	61	0	110
o	50	0	111
p	57	1	112
q	56	1	113
r	44	0	114
s	44	0	115
t	35	2	116
u	61	0	117
v	52	0	118
w	78	0	119
x	50	0	120
y	50	1	121
z	46	0	122
{	33	3	123
---	61	2	124
}	33	3	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	33	3	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	2	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	42	2	170
\0252	"
<<	43	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	61	1	181
\0265	"
P!	65	2	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	43	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	44	3	191
\0277	"
A`	70	2	192
\0300	"
A'	70	2	193
\0301	"
A^	70	2	194
\0302	"
A~	70	2	195
\0303	"
A"	70	2	196
\0304	"
A*	70	2	197
\0305	"
AE	87	2	198
\0306	"
C,	72	3	199
\0307	"
E`	72	2	200
\0310	"
E'	72	2	201
\0311	"
E^	72	2	202
\0312	"
E"	72	2	203
\0313	"
I`	41	2	204
\0314	"
I'	41	2	205
\0315	"
I^	41	2	206
\0316	"
I"	41	2	207
\0317	"
D-	78	2	208
\0320	"
N~	82	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	61	0	215
\0327	"
O/	78	2	216
\0330	"
U`	82	2	217
\0331	"
U'	82	2	218
\0332	"
U^	82	2	219
\0333	"
U"	82	2	220
\0334	"
Y'	69	2	221
\0335	"
TH	67	2	222
\0336	"
ss	56	3	223
\0337	"
a`	57	2	224
\0340	"
a'	57	2	225
\0341	"
a^	57	2	226
\0342	"
a~	57	2	227
\0343	"
a"	57	2	228
\0344	"
a*	57	2	229
\0345	"
ae	72	0	230
\0346	"
c,	44	1	231
\0347	"
e`	44	2	232
\0350	"
e'	44	2	233
\0351	"
e^	44	2	234
\0352	"
e"	44	2	235
\0353	"
i`	33	2	236
\0354	"
i'	33	2	237
\0355	"
i^	33	2	238
\0356	"
i"	33	2	239
\0357	"
d-	50	2	240
\0360	"
n~	61	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	61	0	247
\0367	"
o/	50	3	248
\0370	"
u`	61	2	249
\0371	"
u'	61	2	250
\0372	"
u^	61	2	251
\0373	"
u"	61	2	252
\0374	"
y'	50	3	253
\0375	"
th	57	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123671006440057030057030000010444040522627501600002600000006154post.src/devLatin1/NRname NR
fontname NewCenturySchlbk-Roman
named in prologue
spacewidth 28
charset
!	30	2	33
"	39	2	34
dq	"
#	56	2	35
$	56	3	36
%	83	2	37
&	82	2	38
'	20	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	61	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	74	2	64
A	72	2	65
B	72	2	66
C	72	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	56	2	74
K	78	2	75
L	67	2	76
M	94	2	77
N	82	2	78
O	78	2	79
P	67	2	80
Q	78	3	81
R	72	2	82
S	63	2	83
T	67	2	84
U	82	2	85
V	72	2	86
W	98	2	87
X	70	2	88
Y	70	2	89
Z	61	2	90
[	33	3	91
\	61	2	92
bs	"
]	33	3	93
^	33	2	147
---	61	2	94
---	50	1	95
`	20	2	96
a	56	0	97
b	56	2	98
c	44	0	99
d	57	2	100
e	50	0	101
f	33	2	102
g	54	1	103
h	61	2	104
i	32	2	105
j	30	3	106
k	59	2	107
l	32	2	108
m	89	0	109
n	61	0	110
o	50	0	111
p	57	1	112
q	56	1	113
r	44	0	114
s	46	0	115
t	39	2	116
u	61	0	117
v	54	0	118
w	78	0	119
x	54	0	120
y	54	1	121
z	48	0	122
{	33	3	123
---	61	2	124
}	33	3	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	30	3	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	2	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	33	2	170
\0252	"
<<	43	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	74	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	61	1	181
\0265	"
P!	61	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	30	2	186
\0272	"
>>	43	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	44	3	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	72	2	200
\0310	"
E'	72	2	201
\0311	"
E^	72	2	202
\0312	"
E"	72	2	203
\0313	"
I`	41	2	204
\0314	"
I'	41	2	205
\0315	"
I^	41	2	206
\0316	"
I"	41	2	207
\0317	"
D-	78	2	208
\0320	"
N~	82	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	61	0	215
\0327	"
O/	78	2	216
\0330	"
U`	82	2	217
\0331	"
U'	82	2	218
\0332	"
U^	82	2	219
\0333	"
U"	82	2	220
\0334	"
Y'	70	2	221
\0335	"
TH	67	2	222
\0336	"
ss	57	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	80	0	230
\0346	"
c,	44	1	231
\0347	"
e`	50	2	232
\0350	"
e'	50	2	233
\0351	"
e^	50	2	234
\0352	"
e"	50	2	235
\0353	"
i`	32	2	236
\0354	"
i'	32	2	237
\0355	"
i^	32	2	238
\0356	"
i"	32	2	239
\0357	"
d-	50	2	240
\0360	"
n~	61	2	241
\0361	"
o`	50	2	242
\0362	"
o'	50	2	243
\0363	"
o^	50	2	244
\0364	"
o~	50	2	245
\0365	"
o"	50	2	246
\0366	"
-:	61	0	247
\0367	"
o/	50	2	248
\0370	"
u`	61	2	249
\0371	"
u'	61	2	250
\0372	"
u^	61	2	251
\0373	"
u"	61	2	252
\0374	"
y'	54	3	253
\0375	"
th	57	3	254
\0376	"
y"	54	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123701006440057030057030000010444200522627501600002600000006160post.src/devLatin1/NXname NX
fontname NewCenturySchlbk-BoldItalic
named in prologue
spacewidth 29
charset
!	33	2	33
"	40	2	34
dq	"
#	57	2	35
$	57	3	36
%	89	2	37
&	89	2	38
'	26	2	39
(	41	3	40
)	41	3	41
*	50	2	42
+	61	0	43
,	29	1	44
-	33	0	173
\0255	"
.	29	0	46
/	28	2	47
0	57	2	48
1	57	2	49
2	57	2	50
3	57	2	51
4	57	2	52
5	57	2	53
6	57	2	54
7	57	2	55
8	57	2	56
9	57	2	57
:	29	0	58
;	29	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	48	2	63
@	75	2	64
A	74	2	65
B	76	2	66
C	76	2	67
D	83	2	68
E	74	2	69
F	70	2	70
G	82	2	71
H	87	2	72
I	44	2	73
J	67	2	74
K	78	2	75
L	70	2	76
M	94	2	77
N	85	2	78
O	83	2	79
P	74	2	80
Q	83	3	81
R	80	2	82
S	69	2	83
T	72	2	84
U	83	2	85
V	74	2	86
W	94	2	87
X	74	2	88
Y	70	2	89
Z	70	2	90
[	41	3	91
\	61	2	92
bs	"
]	41	3	93
^	33	2	147
---	61	2	94
---	50	1	95
`	26	2	96
a	67	0	97
b	61	2	98
c	54	0	99
d	67	2	100
e	52	0	101
f	39	3	102
g	61	1	103
h	69	2	104
i	39	2	105
j	37	3	106
k	65	2	107
l	39	2	108
m	94	0	109
n	69	0	110
o	57	0	111
p	65	1	112
q	63	1	113
r	52	0	114
s	48	0	115
t	41	2	116
u	69	0	117
v	56	0	118
w	83	0	119
x	57	0	120
y	52	1	121
z	52	0	122
{	41	3	123
---	61	2	124
}	41	3	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	33	3	161
\0241	"
c|	57	3	162
\0242	"
ct	"
L-	57	2	163
\0243	"
ps	"
xo	57	2	164
\0244	"
cr	"
Y-	57	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	41	2	170
\0252	"
<<	48	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	34	2	178
\0262	"
3^	34	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	69	1	181
\0265	"
P!	65	2	182
\0266	"
pg	"
.^	29	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	34	2	185
\0271	"
o_	36	2	186
\0272	"
>>	48	0	187
\0273	"
14	86	2	188
\0274	"
12	86	2	189
\0275	"
34	86	2	190
\0276	"
??	48	3	191
\0277	"
A`	74	2	192
\0300	"
A'	74	2	193
\0301	"
A^	74	2	194
\0302	"
A~	74	2	195
\0303	"
A"	74	2	196
\0304	"
A*	74	2	197
\0305	"
AE	89	2	198
\0306	"
C,	76	3	199
\0307	"
E`	74	2	200
\0310	"
E'	74	2	201
\0311	"
E^	74	2	202
\0312	"
E"	74	2	203
\0313	"
I`	44	2	204
\0314	"
I'	44	2	205
\0315	"
I^	44	2	206
\0316	"
I"	44	2	207
\0317	"
D-	83	2	208
\0320	"
N~	85	2	209
\0321	"
O`	83	2	210
\0322	"
O'	83	2	211
\0323	"
O^	83	2	212
\0324	"
O~	83	2	213
\0325	"
O"	83	2	214
\0326	"
xx	61	0	215
\0327	"
O/	83	2	216
\0330	"
U`	83	2	217
\0331	"
U'	83	2	218
\0332	"
U^	83	2	219
\0333	"
U"	83	2	220
\0334	"
Y'	70	2	221
\0335	"
TH	74	2	222
\0336	"
ss	57	3	223
\0337	"
a`	67	2	224
\0340	"
a'	67	2	225
\0341	"
a^	67	2	226
\0342	"
a~	67	2	227
\0343	"
a"	67	2	228
\0344	"
a*	67	2	229
\0345	"
ae	82	0	230
\0346	"
c,	54	1	231
\0347	"
e`	52	2	232
\0350	"
e'	52	2	233
\0351	"
e^	52	2	234
\0352	"
e"	52	2	235
\0353	"
i`	39	2	236
\0354	"
i'	39	2	237
\0355	"
i^	39	2	238
\0356	"
i"	39	2	239
\0357	"
d-	57	2	240
\0360	"
n~	69	2	241
\0361	"
o`	57	2	242
\0362	"
o'	57	2	243
\0363	"
o^	57	2	244
\0364	"
o~	57	2	245
\0365	"
o"	57	2	246
\0366	"
-:	61	0	247
\0367	"
o/	57	3	248
\0370	"
u`	69	2	249
\0371	"
u'	69	2	250
\0372	"
u^	69	2	251
\0373	"
u"	69	2	252
\0374	"
y'	52	3	253
\0375	"
th	65	3	254
\0376	"
y"	52	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123711006440057030057030000010444240522627501600002600000006144post.src/devLatin1/PAname PA
fontname Palatino-Roman
named in prologue
spacewidth 25
charset
!	28	2	33
"	37	2	34
dq	"
#	50	2	35
$	50	2	36
%	84	2	37
&	78	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	39	2	42
+	61	0	43
,	25	1	44
-	33	0	173
\0255	"
.	25	0	46
/	61	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	2	64
A	78	2	65
B	61	2	66
C	71	2	67
D	77	2	68
E	61	2	69
F	56	2	70
G	76	2	71
H	83	2	72
I	34	2	73
J	33	3	74
K	73	2	75
L	61	2	76
M	95	2	77
N	83	2	78
O	79	2	79
P	60	2	80
Q	79	3	81
R	67	2	82
S	53	2	83
T	61	2	84
U	78	2	85
V	72	2	86
W	100	2	87
X	67	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
^	33	2	147
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	55	2	98
c	44	0	99
d	61	2	100
e	48	0	101
f	33	2	102
g	56	1	103
h	58	2	104
i	29	2	105
j	23	3	106
k	56	2	107
l	29	2	108
m	88	0	109
n	58	0	110
o	55	0	111
p	60	1	112
q	56	1	113
r	40	0	114
s	42	0	115
t	33	2	116
u	60	0	117
v	57	0	118
w	83	0	119
x	52	0	120
y	56	1	121
z	50	0	122
{	33	2	123
---	61	2	124
}	33	2	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	28	1	161
\0241	"
c|	50	2	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	33	2	170
\0252	"
<<	50	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	60	1	181
\0265	"
P!	63	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	33	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	44	1	191
\0277	"
A`	78	2	192
\0300	"
A'	78	2	193
\0301	"
A^	78	2	194
\0302	"
A~	78	2	195
\0303	"
A"	78	2	196
\0304	"
A*	78	2	197
\0305	"
AE	94	2	198
\0306	"
C,	71	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	34	2	204
\0314	"
I'	34	2	205
\0315	"
I^	34	2	206
\0316	"
I"	34	2	207
\0317	"
D-	77	2	208
\0320	"
N~	83	2	209
\0321	"
O`	79	2	210
\0322	"
O'	79	2	211
\0323	"
O^	79	2	212
\0324	"
O~	79	2	213
\0325	"
O"	79	2	214
\0326	"
xx	61	0	215
\0327	"
O/	83	2	216
\0330	"
U`	78	2	217
\0331	"
U'	78	2	218
\0332	"
U^	78	2	219
\0333	"
U"	78	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	60	2	222
\0336	"
ss	56	2	223
\0337	"
a`	50	2	224
\0340	"
a'	50	2	225
\0341	"
a^	50	2	226
\0342	"
a~	50	2	227
\0343	"
a"	50	2	228
\0344	"
a*	50	2	229
\0345	"
ae	76	0	230
\0346	"
c,	44	1	231
\0347	"
e`	48	2	232
\0350	"
e'	48	2	233
\0351	"
e^	48	2	234
\0352	"
e"	48	2	235
\0353	"
i`	29	2	236
\0354	"
i'	29	2	237
\0355	"
i^	29	2	238
\0356	"
i"	29	2	239
\0357	"
d-	55	2	240
\0360	"
n~	58	2	241
\0361	"
o`	55	2	242
\0362	"
o'	55	2	243
\0363	"
o^	55	2	244
\0364	"
o~	55	2	245
\0365	"
o"	55	2	246
\0366	"
-:	61	0	247
\0367	"
o/	56	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	56	3	253
\0375	"
th	60	3	254
\0376	"
y"	56	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	25	2	151
oa	33	2	154
"a	38	2	157
Ca	31	1	158
va	33	2	159
0707070014231123721006440057030057030000010444400522627501600002600000006145post.src/devLatin1/PBname PB
fontname Palatino-Bold
named in prologue
spacewidth 25
charset
!	28	2	33
"	40	2	34
dq	"
#	50	2	35
$	50	2	36
%	89	2	37
&	83	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	44	2	42
+	61	0	43
,	25	1	44
-	33	0	173
\0255	"
.	25	0	46
/	30	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	2	64
A	78	2	65
B	67	2	66
C	72	2	67
D	83	2	68
E	61	2	69
F	56	2	70
G	83	2	71
H	83	2	72
I	39	2	73
J	39	3	74
K	78	2	75
L	61	2	76
M	100	2	77
N	83	2	78
O	83	2	79
P	61	2	80
Q	83	3	81
R	72	2	82
S	61	2	83
T	67	2	84
U	78	2	85
V	78	2	86
W	100	2	87
X	67	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
^	33	2	147
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	61	2	98
c	44	0	99
d	61	2	100
e	50	0	101
f	39	2	102
g	56	1	103
h	61	2	104
i	33	2	105
j	33	3	106
k	61	2	107
l	33	2	108
m	89	0	109
n	61	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	44	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	83	0	119
x	50	0	120
y	56	1	121
z	50	0	122
{	31	2	123
---	61	2	124
}	31	2	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	28	1	161
\0241	"
c|	50	2	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	44	2	170
\0252	"
<<	50	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	61	1	181
\0265	"
P!	64	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	49	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	44	1	191
\0277	"
A`	78	2	192
\0300	"
A'	78	2	193
\0301	"
A^	78	2	194
\0302	"
A~	78	2	195
\0303	"
A"	78	2	196
\0304	"
A*	78	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	39	2	204
\0314	"
I'	39	2	205
\0315	"
I^	39	2	206
\0316	"
I"	39	2	207
\0317	"
D-	83	2	208
\0320	"
N~	83	2	209
\0321	"
O`	83	2	210
\0322	"
O'	83	2	211
\0323	"
O^	83	2	212
\0324	"
O~	83	2	213
\0325	"
O"	83	2	214
\0326	"
xx	61	0	215
\0327	"
O/	83	2	216
\0330	"
U`	78	2	217
\0331	"
U'	78	2	218
\0332	"
U^	78	2	219
\0333	"
U"	78	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	61	2	222
\0336	"
ss	61	2	223
\0337	"
a`	50	2	224
\0340	"
a'	50	2	225
\0341	"
a^	50	2	226
\0342	"
a~	50	2	227
\0343	"
a"	50	2	228
\0344	"
a*	50	2	229
\0345	"
ae	78	0	230
\0346	"
c,	44	1	231
\0347	"
e`	50	2	232
\0350	"
e'	50	2	233
\0351	"
e^	50	2	234
\0352	"
e"	50	2	235
\0353	"
i`	33	2	236
\0354	"
i'	33	2	237
\0355	"
i^	33	2	238
\0356	"
i"	33	2	239
\0357	"
d-	56	2	240
\0360	"
n~	61	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	61	0	247
\0367	"
o/	56	0	248
\0370	"
u`	61	2	249
\0371	"
u'	61	2	250
\0372	"
u^	61	2	251
\0373	"
u"	61	2	252
\0374	"
y'	56	3	253
\0375	"
th	61	3	254
\0376	"
y"	56	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123731006440057030057030000010444440522627501600002600000006144post.src/devLatin1/PIname PI
fontname Palatino-Italic
named in prologue
spacewidth 25
charset
!	33	2	33
"	50	2	34
dq	"
#	50	2	35
$	50	2	36
%	89	2	37
&	78	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	39	2	42
+	61	0	43
,	25	1	44
-	33	0	173
\0255	"
.	25	0	46
/	30	3	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	50	2	63
@	75	2	64
A	72	2	65
B	61	2	66
C	67	2	67
D	78	2	68
E	61	2	69
F	56	2	70
G	72	2	71
H	78	2	72
I	33	2	73
J	33	3	74
K	67	2	75
L	56	2	76
M	94	2	77
N	78	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	78	2	85
V	72	2	86
W	94	2	87
X	72	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
^	33	2	147
---	61	2	94
---	50	1	95
`	28	2	96
a	44	0	97
b	46	2	98
c	41	0	99
d	50	2	100
e	39	0	101
f	28	3	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	44	0	111
p	50	1	112
q	46	1	113
r	39	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
{	33	2	123
---	61	2	124
}	33	2	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	50	2	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	50	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	33	2	170
\0252	"
<<	50	0	171
\0253	"
-,	61	0	172
\0254	"
hy	33	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	50	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	33	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	50	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	94	2	198
\0306	"
C,	67	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	33	2	204
\0314	"
I'	33	2	205
\0315	"
I^	33	2	206
\0316	"
I"	33	2	207
\0317	"
D-	78	2	208
\0320	"
N~	78	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	61	0	215
\0327	"
O/	78	2	216
\0330	"
U`	78	2	217
\0331	"
U'	78	2	218
\0332	"
U^	78	2	219
\0333	"
U"	78	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	61	2	222
\0336	"
ss	50	3	223
\0337	"
a`	44	2	224
\0340	"
a'	44	2	225
\0341	"
a^	44	2	226
\0342	"
a~	44	2	227
\0343	"
a"	44	2	228
\0344	"
a*	44	2	229
\0345	"
ae	64	0	230
\0346	"
c,	41	1	231
\0347	"
e`	39	2	232
\0350	"
e'	39	2	233
\0351	"
e^	39	2	234
\0352	"
e"	39	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	44	2	240
\0360	"
n~	56	2	241
\0361	"
o`	44	2	242
\0362	"
o'	44	2	243
\0363	"
o^	44	2	244
\0364	"
o~	44	2	245
\0365	"
o"	44	2	246
\0366	"
-:	61	0	247
\0367	"
o/	44	0	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	50	3	253
\0375	"
th	50	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123741006440057030057030000010444600522627501700002600000006151post.src/devLatin1/PXname PX
fontname Palatino-BoldItalic
named in prologue
spacewidth 25
charset
!	33	2	33
"	50	2	34
dq	"
#	50	2	35
$	50	2	36
%	89	2	37
&	83	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	44	2	42
+	61	0	43
,	25	1	44
-	39	0	173
\0255	"
.	25	0	46
/	32	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	83	2	64
A	72	2	65
B	67	2	66
C	69	2	67
D	78	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	78	2	72
I	39	2	73
J	39	3	74
K	72	2	75
L	61	2	76
M	94	2	77
N	78	2	78
O	83	2	79
P	67	2	80
Q	83	3	81
R	72	2	82
S	56	2	83
T	61	2	84
U	78	2	85
V	67	2	86
W	100	2	87
X	72	2	88
Y	61	2	89
Z	67	2	90
[	33	2	91
\	61	2	92
bs	"
]	33	2	93
^	33	2	147
---	61	2	94
---	50	1	95
`	28	2	96
a	56	0	97
b	54	2	98
c	44	0	99
d	56	2	100
e	44	0	101
f	33	3	102
g	50	1	103
h	56	2	104
i	33	2	105
j	33	3	106
k	56	2	107
l	33	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	54	1	113
r	39	0	114
s	44	0	115
t	39	2	116
u	56	0	117
v	56	0	118
w	83	0	119
x	50	0	120
y	56	1	121
z	50	0	122
{	33	2	123
---	61	2	124
}	33	2	125
~	33	2	148
---	61	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	50	2	162
\0242	"
ct	"
L-	50	2	163
\0243	"
ps	"
xo	50	2	164
\0244	"
cr	"
Y-	50	2	165
\0245	"
yn	"
||	61	2	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	75	2	169
\0251	"
a_	33	2	170
\0252	"
<<	50	0	171
\0253	"
-,	61	0	172
\0254	"
hy	39	0	173
\0255	"
--	61	0	45
ro	75	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	61	0	177
\0261	"
2^	30	2	178
\0262	"
3^	30	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	56	3	182
\0266	"
pg	"
.^	25	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	30	2	185
\0271	"
o_	33	2	186
\0272	"
>>	50	0	187
\0273	"
14	75	2	188
\0274	"
12	75	2	189
\0275	"
34	75	2	190
\0276	"
??	44	1	191
\0277	"
A`	72	2	192
\0300	"
A'	72	2	193
\0301	"
A^	72	2	194
\0302	"
A~	72	2	195
\0303	"
A"	72	2	196
\0304	"
A*	72	2	197
\0305	"
AE	94	2	198
\0306	"
C,	69	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	39	2	204
\0314	"
I'	39	2	205
\0315	"
I^	39	2	206
\0316	"
I"	39	2	207
\0317	"
D-	78	2	208
\0320	"
N~	78	2	209
\0321	"
O`	83	2	210
\0322	"
O'	83	2	211
\0323	"
O^	83	2	212
\0324	"
O~	83	2	213
\0325	"
O"	83	2	214
\0326	"
xx	61	0	215
\0327	"
O/	83	2	216
\0330	"
U`	78	2	217
\0331	"
U'	78	2	218
\0332	"
U^	78	2	219
\0333	"
U"	78	2	220
\0334	"
Y'	61	2	221
\0335	"
TH	67	2	222
\0336	"
ss	56	3	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	74	0	230
\0346	"
c,	44	1	231
\0347	"
e`	44	2	232
\0350	"
e'	44	2	233
\0351	"
e^	44	2	234
\0352	"
e"	44	2	235
\0353	"
i`	33	2	236
\0354	"
i'	33	2	237
\0355	"
i^	33	2	238
\0356	"
i"	33	2	239
\0357	"
d-	56	2	240
\0360	"
n~	56	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	61	0	247
\0367	"
o/	56	0	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	56	3	253
\0375	"
th	56	3	254
\0376	"
y"	56	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	56	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231123751006440057030057030000010444640522627501700002600000006156post.src/devLatin1/ZIname ZI
fontname ZapfChancery-MediumItalic
named in prologue
spacewidth 22
charset
!	28	2	33
"	22	2	34
dq	"
#	44	2	35
$	44	3	36
%	68	2	37
&	78	2	38
'	24	2	39
(	26	3	40
)	22	3	41
*	42	2	42
+	52	0	43
,	22	0	44
-	28	0	173
\0255	"
.	22	0	46
/	34	3	47
0	44	2	48
1	44	2	49
2	44	2	50
3	44	2	51
4	44	2	52
5	44	2	53
6	44	2	54
7	44	2	55
8	44	2	56
9	44	2	57
:	26	0	58
;	24	0	59
---	52	0	60
=	52	0	61
---	52	0	62
?	38	2	63
@	70	2	64
A	62	2	65
B	60	2	66
C	52	2	67
D	70	2	68
E	62	2	69
F	58	2	70
G	62	3	71
H	68	2	72
I	38	2	73
J	40	2	74
K	66	3	75
L	58	2	76
M	84	2	77
N	70	3	78
O	60	2	79
P	54	2	80
Q	60	3	81
R	60	3	82
S	46	2	83
T	50	2	84
U	74	2	85
V	64	2	86
W	88	2	87
X	56	2	88
Y	56	3	89
Z	62	2	90
[	24	3	91
\	48	2	92
bs	"
]	32	3	93
^	34	2	147
---	52	2	94
---	50	1	95
`	24	2	96
a	42	0	97
b	42	2	98
c	34	0	99
d	44	2	100
e	34	0	101
f	32	3	102
g	40	1	103
h	44	2	104
i	24	2	105
j	22	3	106
k	44	3	107
l	24	2	108
m	62	0	109
n	46	0	110
o	40	0	111
p	44	1	112
q	40	3	113
r	30	0	114
s	32	0	115
t	32	2	116
u	46	0	117
v	44	0	118
w	68	0	119
x	42	1	120
y	40	1	121
z	44	0	122
{	24	3	123
---	52	2	124
}	24	3	125
~	44	2	148
---	52	0	126
\`	22	2	145
ga	"
!!	28	1	161
\0241	"
c|	44	2	162
\0242	"
ct	"
L-	44	2	163
\0243	"
ps	"
xo	44	2	164
\0244	"
cr	"
Y-	44	2	165
\0245	"
yn	"
||	52	2	166
\0246	"
so	42	3	167
\0247	"
sc	"
""	36	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	26	2	170
\0252	"
<<	34	0	171
\0253	"
-,	52	0	172
\0254	"
hy	28	0	173
\0255	"
--	52	0	45
ro	74	2	174
\0256	"
rg	"
-^	44	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	52	0	177
\0261	"
2^	26	2	178
\0262	"
3^	26	2	179
\0263	"
\'	30	2	180
\0264	"
aa	"
/u	46	1	181
\0265	"
P!	50	3	182
\0266	"
pg	"
.^	22	0	183
\0267	"
,,	30	1	184
\0270	"
,a	"
1^	26	2	185
\0271	"
o_	26	2	186
\0272	"
>>	38	0	187
\0273	"
14	66	2	188
\0274	"
12	66	2	189
\0275	"
34	66	2	190
\0276	"
??	40	1	191
\0277	"
A`	62	2	192
\0300	"
A'	62	2	193
\0301	"
A^	62	2	194
\0302	"
A~	62	2	195
\0303	"
A"	62	2	196
\0304	"
A*	62	2	197
\0305	"
AE	74	2	198
\0306	"
C,	52	3	199
\0307	"
E`	62	2	200
\0310	"
E'	62	2	201
\0311	"
E^	62	2	202
\0312	"
E"	62	2	203
\0313	"
I`	38	2	204
\0314	"
I'	38	2	205
\0315	"
I^	38	2	206
\0316	"
I"	38	2	207
\0317	"
D-	70	2	208
\0320	"
N~	70	3	209
\0321	"
O`	60	2	210
\0322	"
O'	60	2	211
\0323	"
O^	60	2	212
\0324	"
O~	60	2	213
\0325	"
O"	60	2	214
\0326	"
xx	52	0	215
\0327	"
O/	66	3	216
\0330	"
U`	74	2	217
\0331	"
U'	74	2	218
\0332	"
U^	74	2	219
\0333	"
U"	74	2	220
\0334	"
Y'	56	3	221
\0335	"
TH	54	2	222
\0336	"
ss	42	3	223
\0337	"
a`	42	2	224
\0340	"
a'	42	2	225
\0341	"
a^	42	2	226
\0342	"
a~	42	2	227
\0343	"
a"	42	2	228
\0344	"
a*	42	2	229
\0345	"
ae	54	0	230
\0346	"
c,	34	1	231
\0347	"
e`	34	2	232
\0350	"
e'	34	2	233
\0351	"
e^	34	2	234
\0352	"
e"	34	2	235
\0353	"
i`	24	2	236
\0354	"
i'	24	2	237
\0355	"
i^	24	2	238
\0356	"
i"	24	2	239
\0357	"
d-	40	2	240
\0360	"
n~	46	2	241
\0361	"
o`	40	2	242
\0362	"
o'	40	2	243
\0363	"
o^	40	2	244
\0364	"
o~	40	2	245
\0365	"
o"	40	2	246
\0366	"
-:	52	0	247
\0367	"
o/	44	3	248
\0370	"
u`	46	2	249
\0371	"
u'	46	2	250
\0372	"
u^	46	2	251
\0373	"
u"	46	2	252
\0374	"
y'	40	3	253
\0375	"
th	44	3	254
\0376	"
y"	40	3	255
\0377	"
^a	34	2	147
~a	44	2	148
Ua	44	2	150
.a	22	2	151
oa	30	2	154
"a	40	2	157
Ca	28	1	158
va	34	2	159
0707070014231123761006440057030057030000010445000522627501700002500000006047post.src/devLatin1/Cname C
fontname Courier
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
-	60	0	173
\0255	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
\`	60	2	145
ga	"
!!	60	1	161
\0241	"
c|	60	2	162
\0242	"
ct	"
L-	60	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	60	2	165
\0245	"
yn	"
||	60	3	166
\0246	"
so	60	2	167
\0247	"
sc	"
""	60	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	60	2	170
\0252	"
<<	60	0	171
\0253	"
-,	60	0	172
\0254	"
hy	60	0	173
\0255	"
--	60	0	45
ro	60	2	174
\0256	"
rg	"
-^	60	2	175
\0257	"
-a	"
0^	60	2	176
\0260	"
+-	60	2	177
\0261	"
2^	60	2	178
\0262	"
3^	60	2	179
\0263	"
\'	60	2	180
\0264	"
aa	"
/u	60	1	181
\0265	"
P!	60	2	182
\0266	"
pg	"
.^	60	0	183
\0267	"
,,	60	1	184
\0270	"
,a	"
1^	60	2	185
\0271	"
o_	60	2	186
\0272	"
>>	60	0	187
\0273	"
14	60	2	188
\0274	"
12	60	2	189
\0275	"
34	60	2	190
\0276	"
??	60	1	191
\0277	"
A`	60	2	192
\0300	"
A'	60	2	193
\0301	"
A^	60	2	194
\0302	"
A~	60	2	195
\0303	"
A"	60	2	196
\0304	"
A*	60	2	197
\0305	"
AE	60	2	198
\0306	"
C,	60	3	199
\0307	"
E`	60	2	200
\0310	"
E'	60	2	201
\0311	"
E^	60	2	202
\0312	"
E"	60	2	203
\0313	"
I`	60	2	204
\0314	"
I'	60	2	205
\0315	"
I^	60	2	206
\0316	"
I"	60	2	207
\0317	"
D-	60	2	208
\0320	"
N~	60	2	209
\0321	"
O`	60	2	210
\0322	"
O'	60	2	211
\0323	"
O^	60	2	212
\0324	"
O~	60	2	213
\0325	"
O"	60	2	214
\0326	"
xx	60	0	215
\0327	"
O/	60	2	216
\0330	"
U`	60	2	217
\0331	"
U'	60	2	218
\0332	"
U^	60	2	219
\0333	"
U"	60	2	220
\0334	"
Y'	60	2	221
\0335	"
TH	60	2	222
\0336	"
ss	60	2	223
\0337	"
a`	60	2	224
\0340	"
a'	60	2	225
\0341	"
a^	60	2	226
\0342	"
a~	60	2	227
\0343	"
a"	60	2	228
\0344	"
a*	60	2	229
\0345	"
ae	60	0	230
\0346	"
c,	60	1	231
\0347	"
e`	60	2	232
\0350	"
e'	60	2	233
\0351	"
e^	60	2	234
\0352	"
e"	60	2	235
\0353	"
i`	60	2	236
\0354	"
i'	60	2	237
\0355	"
i^	60	2	238
\0356	"
i"	60	2	239
\0357	"
d-	60	2	240
\0360	"
n~	60	2	241
\0361	"
o`	60	2	242
\0362	"
o'	60	2	243
\0363	"
o^	60	2	244
\0364	"
o~	60	2	245
\0365	"
o"	60	2	246
\0366	"
-:	60	2	247
\0367	"
o/	60	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	60	3	253
\0375	"
th	60	3	254
\0376	"
y"	60	3	255
\0377	"
^a	60	2	147
~a	60	2	148
Ua	60	2	150
.a	60	2	151
oa	60	2	154
"a	60	2	157
Ca	60	1	158
va	60	2	159
0707070014231123771006440057030057030000010445040522627501700002600000006077post.src/devLatin1/CBname CB
fontname Courier-Bold
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
-	60	0	173
\0255	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
\`	60	2	145
ga	"
!!	60	1	161
\0241	"
c|	60	2	162
\0242	"
ct	"
L-	60	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	60	2	165
\0245	"
yn	"
||	60	3	166
\0246	"
so	60	2	167
\0247	"
sc	"
""	60	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	60	2	170
\0252	"
<<	60	0	171
\0253	"
-,	60	0	172
\0254	"
hy	60	0	173
\0255	"
--	60	0	45
ro	60	2	174
\0256	"
rg	"
-^	60	2	175
\0257	"
-a	"
0^	60	2	176
\0260	"
+-	60	2	177
\0261	"
2^	60	2	178
\0262	"
3^	60	2	179
\0263	"
\'	60	2	180
\0264	"
aa	"
/u	60	1	181
\0265	"
P!	60	2	182
\0266	"
pg	"
.^	60	0	183
\0267	"
,,	60	1	184
\0270	"
,a	"
1^	60	2	185
\0271	"
o_	60	2	186
\0272	"
>>	60	0	187
\0273	"
14	60	2	188
\0274	"
12	60	2	189
\0275	"
34	60	2	190
\0276	"
??	60	1	191
\0277	"
A`	60	2	192
\0300	"
A'	60	2	193
\0301	"
A^	60	2	194
\0302	"
A~	60	2	195
\0303	"
A"	60	2	196
\0304	"
A*	60	2	197
\0305	"
AE	60	2	198
\0306	"
C,	60	3	199
\0307	"
E`	60	2	200
\0310	"
E'	60	2	201
\0311	"
E^	60	2	202
\0312	"
E"	60	2	203
\0313	"
I`	60	2	204
\0314	"
I'	60	2	205
\0315	"
I^	60	2	206
\0316	"
I"	60	2	207
\0317	"
D-	60	2	208
\0320	"
N~	60	2	209
\0321	"
O`	60	2	210
\0322	"
O'	60	2	211
\0323	"
O^	60	2	212
\0324	"
O~	60	2	213
\0325	"
O"	60	2	214
\0326	"
xx	60	0	215
\0327	"
O/	60	2	216
\0330	"
U`	60	2	217
\0331	"
U'	60	2	218
\0332	"
U^	60	2	219
\0333	"
U"	60	2	220
\0334	"
Y'	60	2	221
\0335	"
TH	60	2	222
\0336	"
ss	60	2	223
\0337	"
a`	60	2	224
\0340	"
a'	60	2	225
\0341	"
a^	60	2	226
\0342	"
a~	60	2	227
\0343	"
a"	60	2	228
\0344	"
a*	60	2	229
\0345	"
ae	60	0	230
\0346	"
c,	60	1	231
\0347	"
e`	60	2	232
\0350	"
e'	60	2	233
\0351	"
e^	60	2	234
\0352	"
e"	60	2	235
\0353	"
i`	60	2	236
\0354	"
i'	60	2	237
\0355	"
i^	60	2	238
\0356	"
i"	60	2	239
\0357	"
d-	60	2	240
\0360	"
n~	60	2	241
\0361	"
o`	60	2	242
\0362	"
o'	60	2	243
\0363	"
o^	60	2	244
\0364	"
o~	60	2	245
\0365	"
o"	60	2	246
\0366	"
-:	60	2	247
\0367	"
o/	60	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	60	3	253
\0375	"
th	60	3	254
\0376	"
y"	60	3	255
\0377	"
^a	60	2	147
~a	60	2	148
Ua	60	2	150
.a	60	2	151
oa	60	2	154
"a	60	2	157
Ca	60	1	158
va	60	2	159
0707070014231124001006440057030057030000010445200522627501700002600000006102post.src/devLatin1/CIname CI
fontname Courier-Oblique
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
-	60	0	173
\0255	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
\`	60	2	145
ga	"
!!	60	1	161
\0241	"
c|	60	2	162
\0242	"
ct	"
L-	60	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	60	2	165
\0245	"
yn	"
||	60	3	166
\0246	"
so	60	2	167
\0247	"
sc	"
""	60	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	60	2	170
\0252	"
<<	60	0	171
\0253	"
-,	60	0	172
\0254	"
hy	60	0	173
\0255	"
--	60	0	45
ro	60	2	174
\0256	"
rg	"
-^	60	2	175
\0257	"
-a	"
0^	60	2	176
\0260	"
+-	60	2	177
\0261	"
2^	60	2	178
\0262	"
3^	60	2	179
\0263	"
\'	60	2	180
\0264	"
aa	"
/u	60	1	181
\0265	"
P!	60	2	182
\0266	"
pg	"
.^	60	0	183
\0267	"
,,	60	1	184
\0270	"
,a	"
1^	60	2	185
\0271	"
o_	60	2	186
\0272	"
>>	60	0	187
\0273	"
14	60	2	188
\0274	"
12	60	2	189
\0275	"
34	60	2	190
\0276	"
??	60	1	191
\0277	"
A`	60	2	192
\0300	"
A'	60	2	193
\0301	"
A^	60	2	194
\0302	"
A~	60	2	195
\0303	"
A"	60	2	196
\0304	"
A*	60	2	197
\0305	"
AE	60	2	198
\0306	"
C,	60	3	199
\0307	"
E`	60	2	200
\0310	"
E'	60	2	201
\0311	"
E^	60	2	202
\0312	"
E"	60	2	203
\0313	"
I`	60	2	204
\0314	"
I'	60	2	205
\0315	"
I^	60	2	206
\0316	"
I"	60	2	207
\0317	"
D-	60	2	208
\0320	"
N~	60	2	209
\0321	"
O`	60	2	210
\0322	"
O'	60	2	211
\0323	"
O^	60	2	212
\0324	"
O~	60	2	213
\0325	"
O"	60	2	214
\0326	"
xx	60	0	215
\0327	"
O/	60	2	216
\0330	"
U`	60	2	217
\0331	"
U'	60	2	218
\0332	"
U^	60	2	219
\0333	"
U"	60	2	220
\0334	"
Y'	60	2	221
\0335	"
TH	60	2	222
\0336	"
ss	60	2	223
\0337	"
a`	60	2	224
\0340	"
a'	60	2	225
\0341	"
a^	60	2	226
\0342	"
a~	60	2	227
\0343	"
a"	60	2	228
\0344	"
a*	60	2	229
\0345	"
ae	60	0	230
\0346	"
c,	60	1	231
\0347	"
e`	60	2	232
\0350	"
e'	60	2	233
\0351	"
e^	60	2	234
\0352	"
e"	60	2	235
\0353	"
i`	60	2	236
\0354	"
i'	60	2	237
\0355	"
i^	60	2	238
\0356	"
i"	60	2	239
\0357	"
d-	60	2	240
\0360	"
n~	60	2	241
\0361	"
o`	60	2	242
\0362	"
o'	60	2	243
\0363	"
o^	60	2	244
\0364	"
o~	60	2	245
\0365	"
o"	60	2	246
\0366	"
-:	60	2	247
\0367	"
o/	60	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	60	3	253
\0375	"
th	60	3	254
\0376	"
y"	60	3	255
\0377	"
^a	60	2	147
~a	60	2	148
Ua	60	2	150
.a	60	2	151
oa	60	2	154
"a	60	2	157
Ca	60	1	158
va	60	2	159
0707070014231124011006440057030057030000010445240522627501700002600000006072post.src/devLatin1/COname CO
fontname Courier
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
-	60	0	173
\0255	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
\`	60	2	145
ga	"
!!	60	1	161
\0241	"
c|	60	2	162
\0242	"
ct	"
L-	60	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	60	2	165
\0245	"
yn	"
||	60	3	166
\0246	"
so	60	2	167
\0247	"
sc	"
""	60	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	60	2	170
\0252	"
<<	60	0	171
\0253	"
-,	60	0	172
\0254	"
hy	60	0	173
\0255	"
--	60	0	45
ro	60	2	174
\0256	"
rg	"
-^	60	2	175
\0257	"
-a	"
0^	60	2	176
\0260	"
+-	60	2	177
\0261	"
2^	60	2	178
\0262	"
3^	60	2	179
\0263	"
\'	60	2	180
\0264	"
aa	"
/u	60	1	181
\0265	"
P!	60	2	182
\0266	"
pg	"
.^	60	0	183
\0267	"
,,	60	1	184
\0270	"
,a	"
1^	60	2	185
\0271	"
o_	60	2	186
\0272	"
>>	60	0	187
\0273	"
14	60	2	188
\0274	"
12	60	2	189
\0275	"
34	60	2	190
\0276	"
??	60	1	191
\0277	"
A`	60	2	192
\0300	"
A'	60	2	193
\0301	"
A^	60	2	194
\0302	"
A~	60	2	195
\0303	"
A"	60	2	196
\0304	"
A*	60	2	197
\0305	"
AE	60	2	198
\0306	"
C,	60	3	199
\0307	"
E`	60	2	200
\0310	"
E'	60	2	201
\0311	"
E^	60	2	202
\0312	"
E"	60	2	203
\0313	"
I`	60	2	204
\0314	"
I'	60	2	205
\0315	"
I^	60	2	206
\0316	"
I"	60	2	207
\0317	"
D-	60	2	208
\0320	"
N~	60	2	209
\0321	"
O`	60	2	210
\0322	"
O'	60	2	211
\0323	"
O^	60	2	212
\0324	"
O~	60	2	213
\0325	"
O"	60	2	214
\0326	"
xx	60	0	215
\0327	"
O/	60	2	216
\0330	"
U`	60	2	217
\0331	"
U'	60	2	218
\0332	"
U^	60	2	219
\0333	"
U"	60	2	220
\0334	"
Y'	60	2	221
\0335	"
TH	60	2	222
\0336	"
ss	60	2	223
\0337	"
a`	60	2	224
\0340	"
a'	60	2	225
\0341	"
a^	60	2	226
\0342	"
a~	60	2	227
\0343	"
a"	60	2	228
\0344	"
a*	60	2	229
\0345	"
ae	60	0	230
\0346	"
c,	60	1	231
\0347	"
e`	60	2	232
\0350	"
e'	60	2	233
\0351	"
e^	60	2	234
\0352	"
e"	60	2	235
\0353	"
i`	60	2	236
\0354	"
i'	60	2	237
\0355	"
i^	60	2	238
\0356	"
i"	60	2	239
\0357	"
d-	60	2	240
\0360	"
n~	60	2	241
\0361	"
o`	60	2	242
\0362	"
o'	60	2	243
\0363	"
o^	60	2	244
\0364	"
o~	60	2	245
\0365	"
o"	60	2	246
\0366	"
-:	60	2	247
\0367	"
o/	60	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	60	3	253
\0375	"
th	60	3	254
\0376	"
y"	60	3	255
\0377	"
^a	60	2	147
~a	60	2	148
Ua	60	2	150
.a	60	2	151
oa	60	2	154
"a	60	2	157
Ca	60	1	158
va	60	2	159
0707070014231124021006440057030057030000010445400522627501700002600000006072post.src/devLatin1/CWname CW
fontname Courier
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
-	60	0	173
\0255	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
\`	60	2	145
ga	"
!!	60	1	161
\0241	"
c|	60	2	162
\0242	"
ct	"
L-	60	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	60	2	165
\0245	"
yn	"
||	60	3	166
\0246	"
so	60	2	167
\0247	"
sc	"
""	60	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	60	2	170
\0252	"
<<	60	0	171
\0253	"
-,	60	0	172
\0254	"
hy	60	0	173
\0255	"
--	60	0	45
ro	60	2	174
\0256	"
rg	"
-^	60	2	175
\0257	"
-a	"
0^	60	2	176
\0260	"
+-	60	2	177
\0261	"
2^	60	2	178
\0262	"
3^	60	2	179
\0263	"
\'	60	2	180
\0264	"
aa	"
/u	60	1	181
\0265	"
P!	60	2	182
\0266	"
pg	"
.^	60	0	183
\0267	"
,,	60	1	184
\0270	"
,a	"
1^	60	2	185
\0271	"
o_	60	2	186
\0272	"
>>	60	0	187
\0273	"
14	60	2	188
\0274	"
12	60	2	189
\0275	"
34	60	2	190
\0276	"
??	60	1	191
\0277	"
A`	60	2	192
\0300	"
A'	60	2	193
\0301	"
A^	60	2	194
\0302	"
A~	60	2	195
\0303	"
A"	60	2	196
\0304	"
A*	60	2	197
\0305	"
AE	60	2	198
\0306	"
C,	60	3	199
\0307	"
E`	60	2	200
\0310	"
E'	60	2	201
\0311	"
E^	60	2	202
\0312	"
E"	60	2	203
\0313	"
I`	60	2	204
\0314	"
I'	60	2	205
\0315	"
I^	60	2	206
\0316	"
I"	60	2	207
\0317	"
D-	60	2	208
\0320	"
N~	60	2	209
\0321	"
O`	60	2	210
\0322	"
O'	60	2	211
\0323	"
O^	60	2	212
\0324	"
O~	60	2	213
\0325	"
O"	60	2	214
\0326	"
xx	60	0	215
\0327	"
O/	60	2	216
\0330	"
U`	60	2	217
\0331	"
U'	60	2	218
\0332	"
U^	60	2	219
\0333	"
U"	60	2	220
\0334	"
Y'	60	2	221
\0335	"
TH	60	2	222
\0336	"
ss	60	2	223
\0337	"
a`	60	2	224
\0340	"
a'	60	2	225
\0341	"
a^	60	2	226
\0342	"
a~	60	2	227
\0343	"
a"	60	2	228
\0344	"
a*	60	2	229
\0345	"
ae	60	0	230
\0346	"
c,	60	1	231
\0347	"
e`	60	2	232
\0350	"
e'	60	2	233
\0351	"
e^	60	2	234
\0352	"
e"	60	2	235
\0353	"
i`	60	2	236
\0354	"
i'	60	2	237
\0355	"
i^	60	2	238
\0356	"
i"	60	2	239
\0357	"
d-	60	2	240
\0360	"
n~	60	2	241
\0361	"
o`	60	2	242
\0362	"
o'	60	2	243
\0363	"
o^	60	2	244
\0364	"
o~	60	2	245
\0365	"
o"	60	2	246
\0366	"
-:	60	2	247
\0367	"
o/	60	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	60	3	253
\0375	"
th	60	3	254
\0376	"
y"	60	3	255
\0377	"
^a	60	2	147
~a	60	2	148
Ua	60	2	150
.a	60	2	151
oa	60	2	154
"a	60	2	157
Ca	60	1	158
va	60	2	159
0707070014231124031006440057030057030000010445440522627501700002600000006106post.src/devLatin1/CXname CX
fontname Courier-BoldOblique
named in prologue
spacewidth 60
charset
!	60	2	33
"	60	2	34
dq	"
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	2	43
,	60	1	44
-	60	0	173
\0255	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	0	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	2	92
bs	"
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
\`	60	2	145
ga	"
!!	60	1	161
\0241	"
c|	60	2	162
\0242	"
ct	"
L-	60	2	163
\0243	"
ps	"
xo	60	2	164
\0244	"
cr	"
Y-	60	2	165
\0245	"
yn	"
||	60	3	166
\0246	"
so	60	2	167
\0247	"
sc	"
""	60	2	168
\0250	"
:a	"
co	60	2	169
\0251	"
a_	60	2	170
\0252	"
<<	60	0	171
\0253	"
-,	60	0	172
\0254	"
hy	60	0	173
\0255	"
--	60	0	45
ro	60	2	174
\0256	"
rg	"
-^	60	2	175
\0257	"
-a	"
0^	60	2	176
\0260	"
+-	60	2	177
\0261	"
2^	60	2	178
\0262	"
3^	60	2	179
\0263	"
\'	60	2	180
\0264	"
aa	"
/u	60	1	181
\0265	"
P!	60	2	182
\0266	"
pg	"
.^	60	0	183
\0267	"
,,	60	1	184
\0270	"
,a	"
1^	60	2	185
\0271	"
o_	60	2	186
\0272	"
>>	60	0	187
\0273	"
14	60	2	188
\0274	"
12	60	2	189
\0275	"
34	60	2	190
\0276	"
??	60	1	191
\0277	"
A`	60	2	192
\0300	"
A'	60	2	193
\0301	"
A^	60	2	194
\0302	"
A~	60	2	195
\0303	"
A"	60	2	196
\0304	"
A*	60	2	197
\0305	"
AE	60	2	198
\0306	"
C,	60	3	199
\0307	"
E`	60	2	200
\0310	"
E'	60	2	201
\0311	"
E^	60	2	202
\0312	"
E"	60	2	203
\0313	"
I`	60	2	204
\0314	"
I'	60	2	205
\0315	"
I^	60	2	206
\0316	"
I"	60	2	207
\0317	"
D-	60	2	208
\0320	"
N~	60	2	209
\0321	"
O`	60	2	210
\0322	"
O'	60	2	211
\0323	"
O^	60	2	212
\0324	"
O~	60	2	213
\0325	"
O"	60	2	214
\0326	"
xx	60	0	215
\0327	"
O/	60	2	216
\0330	"
U`	60	2	217
\0331	"
U'	60	2	218
\0332	"
U^	60	2	219
\0333	"
U"	60	2	220
\0334	"
Y'	60	2	221
\0335	"
TH	60	2	222
\0336	"
ss	60	2	223
\0337	"
a`	60	2	224
\0340	"
a'	60	2	225
\0341	"
a^	60	2	226
\0342	"
a~	60	2	227
\0343	"
a"	60	2	228
\0344	"
a*	60	2	229
\0345	"
ae	60	0	230
\0346	"
c,	60	1	231
\0347	"
e`	60	2	232
\0350	"
e'	60	2	233
\0351	"
e^	60	2	234
\0352	"
e"	60	2	235
\0353	"
i`	60	2	236
\0354	"
i'	60	2	237
\0355	"
i^	60	2	238
\0356	"
i"	60	2	239
\0357	"
d-	60	2	240
\0360	"
n~	60	2	241
\0361	"
o`	60	2	242
\0362	"
o'	60	2	243
\0363	"
o^	60	2	244
\0364	"
o~	60	2	245
\0365	"
o"	60	2	246
\0366	"
-:	60	2	247
\0367	"
o/	60	0	248
\0370	"
u`	60	2	249
\0371	"
u'	60	2	250
\0372	"
u^	60	2	251
\0373	"
u"	60	2	252
\0374	"
y'	60	3	253
\0375	"
th	60	3	254
\0376	"
y"	60	3	255
\0377	"
^a	60	2	147
~a	60	2	148
Ua	60	2	150
.a	60	2	151
oa	60	2	154
"a	60	2	157
Ca	60	1	158
va	60	2	159
0707070014231124041006440057030057030000010445600522627501700002600000005570post.src/devLatin1/ZDname ZD
fontname ZapfDingbats
named in prologue
charset
!	97	2	33
"	96	2	34
#	97	2	35
$	98	3	36
%	72	2	37
&	79	3	38
'	79	3	39
(	79	3	40
)	69	2	41
*	96	2	42
+	94	2	43
,	55	3	44
-	86	2	45
.	91	2	46
/	93	2	47
0	91	2	48
1	95	2	49
2	97	2	50
3	76	3	51
4	85	3	52
5	76	2	53
6	76	2	54
7	57	3	55
8	68	3	56
9	76	2	57
:	76	2	58
;	76	2	59
<	75	3	60
=	49	2	61
>	55	2	62
?	54	3	63
@	58	2	64
A	69	3	65
B	79	3	66
C	79	3	67
D	79	3	68
E	79	3	69
F	79	3	70
G	79	3	71
H	82	3	72
I	82	3	73
J	79	3	74
K	84	3	75
L	82	3	76
M	83	3	77
N	82	3	78
O	83	3	79
P	92	3	80
Q	74	2	81
R	72	2	82
S	75	2	83
T	79	3	84
U	79	3	85
V	70	3	86
W	78	3	87
X	77	3	88
Y	79	3	89
Z	76	2	90
[	71	3	91
\	71	3	92
]	68	3	93
^	70	3	94
_	83	3	95
`	82	3	96
a	79	3	97
b	79	3	98
c	71	3	99
d	69	2	100
e	70	2	101
f	69	2	102
g	79	3	103
h	79	3	104
i	71	3	105
j	79	3	106
k	79	3	107
l	79	3	108
m	87	3	109
n	76	2	110
o	76	2	111
p	76	2	112
q	76	3	113
r	76	3	114
s	89	2	115
t	89	3	116
u	79	3	117
v	78	3	118
w	44	3	119
x	14	2	120
y	28	2	121
z	42	2	122
{	39	2	123
|	39	2	124
}	67	2	125
~	67	2	126
\`	28	0	145
!!	73	3	161
\0241	"
c|	54	3	162
\0242	"
L-	54	3	163
\0243	"
xo	91	2	164
\0244	"
Y-	67	3	165
\0245	"
||	76	3	166
\0246	"
so	76	2	167
\0247	"
""	78	2	168
\0250	"
co	60	3	169
\0251	"
a_	69	3	170
\0252	"
<<	63	3	171
\0253	"
-,	79	3	172
\0254	"
hy	79	3	173
\0255	"
ro	79	3	174
\0256	"
-^	79	3	175
\0257	"
0^	79	3	176
\0260	"
+-	79	3	177
\0261	"
2^	79	3	178
\0262	"
3^	79	3	179
\0263	"
\'	79	3	180
\0264	"
/u	79	3	181
\0265	"
P!	79	3	182
\0266	"
.^	79	3	183
\0267	"
,,	79	3	184
\0270	"
1^	79	3	185
\0271	"
o_	79	3	186
\0272	"
>>	79	3	187
\0273	"
14	79	3	188
\0274	"
12	79	3	189
\0275	"
34	79	3	190
\0276	"
??	79	3	191
\0277	"
A`	79	3	192
\0300	"
A'	79	3	193
\0301	"
A^	79	3	194
\0302	"
A~	79	3	195
\0303	"
A"	79	3	196
\0304	"
A*	79	3	197
\0305	"
AE	79	3	198
\0306	"
C,	79	3	199
\0307	"
E`	79	3	200
\0310	"
E'	79	3	201
\0311	"
E^	79	3	202
\0312	"
E"	79	3	203
\0313	"
I`	79	3	204
\0314	"
I'	79	3	205
\0315	"
I^	79	3	206
\0316	"
I"	79	3	207
\0317	"
D-	79	3	208
\0320	"
N~	79	3	209
\0321	"
O`	79	3	210
\0322	"
O'	79	3	211
\0323	"
O^	89	2	212
\0324	"
O~	84	2	213
\0325	"
O"	102	2	214
\0326	"
xx	46	3	215
\0327	"
O/	75	2	216
\0330	"
U`	92	2	217
\0331	"
U'	75	2	218
\0332	"
U^	92	2	219
\0333	"
U"	93	2	220
\0334	"
Y'	93	2	221
\0335	"
TH	93	2	222
\0336	"
ss	83	2	223
\0337	"
a`	87	2	224
\0340	"
a'	83	2	225
\0341	"
a^	92	2	226
\0342	"
a~	92	2	227
\0343	"
a"	92	2	228
\0344	"
a*	93	2	229
\0345	"
ae	93	2	230
\0346	"
c,	46	3	231
\0347	"
e`	88	2	232
\0350	"
e'	84	2	233
\0351	"
e^	84	2	234
\0352	"
e"	87	2	235
\0353	"
i`	87	2	236
\0354	"
i'	70	2	237
\0355	"
i^	70	2	238
\0356	"
i"	87	2	239
\0357	"
d-	28	0	240
\0360	"
n~	87	2	241
\0361	"
o`	76	2	242
\0362	"
o'	95	2	243
\0363	"
o^	77	2	244
\0364	"
o~	87	2	245
\0365	"
o"	77	2	246
\0366	"
-:	89	3	247
\0367	"
o/	97	2	248
\0370	"
u`	89	3	249
\0371	"
u'	83	2	250
\0372	"
u^	87	2	251
\0373	"
u"	93	2	252
\0374	"
y'	97	2	253
\0375	"
th	92	2	254
\0376	"
y"	28	0	255
\0377	"
0707070014231124051006440057030057030000010440470522627501700002600000001145post.src/devLatin1/GRname GR
fontname Symbol
named in prologue
spacewidth 25
charset
*A	72	2	65
*B	67	2	66
*X	72	2	67
*D	61	2	68
*E	61	2	69
*F	76	2	70
*G	60	2	71
*Y	72	2	72
*I	33	2	73
*K	72	2	75
*L	69	2	76
*M	89	2	77
*N	72	2	78
*O	72	2	79
*P	77	2	80
*H	74	2	81
*R	56	2	82
*S	59	2	83
*T	61	2	84
*U	69	2	85
*W	77	2	87
*C	65	2	88
*Q	80	2	89
*Z	61	2	90
*a	63	0	97
*b	55	3	98
*x	55	1	99
*d	49	2	100
*e	44	0	101
*f	52	3	102
*g	41	1	103
*y	60	1	104
*i	33	0	105
*k	55	0	107
*l	55	2	108
*m	58	1	109
*n	52	0	110
*o	55	0	111
*p	55	0	112
*h	52	2	113
*r	55	1	114
*s	60	0	115
*t	44	0	116
*u	58	0	117
*w	69	0	119
*c	49	3	120
*q	69	1	121
*z	49	3	122
0707070014231124061006440057030057030000010445630522627501700002500000004376post.src/devLatin1/Sname S
fontname Symbol
named in prologue
special
charset
---	33	2	33
fa	71	2	34
---	50	2	35
te	55	2	36
---	83	2	37
---	78	2	38
st	44	0	39
---	33	3	40
---	33	3	41
**	50	2	42
pl	55	0	43
---	25	1	44
mi	55	0	45
---	25	0	46
sl	28	2	47
---	50	2	48
---	50	2	49
---	50	2	50
---	50	2	51
---	50	2	52
---	50	2	53
---	50	2	54
---	50	2	55
---	50	2	56
---	50	2	57
---	28	0	58
---	28	1	59
<	55	0	60
eq	55	0	61
>	55	0	62
---	44	2	63
cg	55	0	64
*A	72	2	65
*B	67	2	66
*X	72	2	67
*D	61	2	68
*E	61	2	69
*F	76	2	70
*G	60	2	71
*Y	72	2	72
*I	33	2	73
---	63	2	74
*K	72	2	75
*L	69	2	76
*M	89	2	77
*N	72	2	78
*O	72	2	79
*P	77	2	80
*H	74	2	81
*R	56	2	82
*S	59	2	83
*T	61	2	84
*U	69	2	85
ts	44	1	86
*W	77	2	87
*C	65	2	88
*Q	80	2	89
*Z	61	2	90
---	33	3	91
tf	86	0	92
---	33	3	93
pp	66	2	94
ul	50	1	95
_	"
rn	50	2	96
*a	63	0	97
*b	55	3	98
*x	55	1	99
*d	49	2	100
*e	44	0	101
*f	52	3	102
*g	41	1	103
*y	60	1	104
*i	33	0	105
---	60	1	106
*k	55	0	107
*l	55	2	108
*m	58	1	109
*n	52	0	110
*o	55	0	111
*p	55	0	112
*h	52	2	113
*r	55	1	114
*s	60	0	115
*t	44	0	116
*u	58	0	117
---	71	2	118
*w	69	0	119
*c	49	3	120
*q	69	1	121
*z	49	3	122
---	48	3	123
or	20	3	124
---	48	3	125
ap	55	0	126
---	62	2	161
fm	25	2	162
<=	55	2	163
fr	17	2	164
if	73	0	165
fn	50	3	166
---	75	0	167
---	75	2	168
---	75	0	169
---	75	2	170
ab	104	0	171
<-	99	0	172
ua	60	2	173
->	99	0	174
da	60	2	175
de	40	2	176
+-	55	2	177
---	41	2	178
>=	55	2	179
mu	55	0	180
pt	71	0	181
pd	49	2	182
bu	46	0	183
di	55	0	184
!=	55	2	185
==	55	0	186
~~	55	0	187
el	100	0	188
av	60	3	189
ah	100	0	190
CR	66	2	191
af	82	2	192
If	69	2	193
Rf	80	2	194
ws	99	3	195
Ox	77	2	196
O+	77	2	197
es	82	2	198
ca	77	0	199
cu	77	0	200
sp	71	0	201
ip	71	1	202
!b	71	0	203
sb	71	0	204
ib	71	1	205
mo	71	0	206
!m	71	2	207
an	77	2	208
gr	71	2	209
rg	79	2	210
co	79	2	211
tm	89	2	212
---	82	2	213
sr	55	2	214
c.	25	0	215
no	71	0	216
l&	60	0	217
l|	60	0	218
---	104	0	219
---	99	0	220
---	60	2	221
---	99	0	222
---	60	2	223
lz	49	2	224
b<	33	3	225
RG	79	2	226
CO	79	2	227
TM	79	2	228
---	71	2	229
LT	38	3	230
br	0	3	231
LX	"
LB	38	3	232
lc	50	2	233
lx	38	2	234
lf	50	2	235
lt	49	2	236
lk	49	2	237
lb	49	2	238
bv	49	2	239
|	"
b>	33	3	241
is	50	3	242
---	69	2	243
---	69	2	244
---	69	2	245
RT	38	3	246
RX	38	2	247
RB	38	3	248
rc	38	2	249
rx	50	3	250
rf	38	2	251
rt	49	2	252
rk	49	2	253
rb	49	2	254
~=	55	0	1
0707070014231124071006440057030057030000010441260522627501700002600000000561post.src/devLatin1/S1# Times-Roman special font
name S1
fontname Times-Roman
named in prologue
special
charset
ru	50	0	95
''	44	0	186
``	44	0	170
dg	50	0	178
dd	50	0	179
en	65	0	177
\-	"
em	100	0	208
14	75	2	1
12	75	2	1
34	75	2	1
bx	50	2	1
ob	38	2	1
ci	75	0	1
sq	50	2	1
Sl	50	2	1
L1	110	1	1
LA	110	1	1
LV	110	3	1
LH	210	1	1
lh	100	0	1
rh	100	0	1
lH	100	0	1
rH	100	0	1
PC	220	2	1
DG	185	2	1
0707070014231124101006440057030057030000010445660522627501700003000000002272post.src/devLatin1/DESC#Device Description - Latin1 character set

PDL PostScript
Encoding Latin1

fonts 10 R I B BI CW H HI HB S1 S
sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
120 125 130 135 140 145 150 155 160 0
res 720
hor 1
vert 1
unitwidth 10

charset
dq bs \` ga !! c| ct L- ps xo cr Y- yn || so sc "" :a co a_
<< -, hy -- ro rg -^ -a 0^ +- 2^ 3^ \' aa /u P! pg .^ ,, ,a
1^ o_ >> 14 12 34 ?? A` A' A^ A~ A" A* AE C, E` E' E^ E" I`
I' I^ I" D- N~ O` O' O^ O~ O" xx O/ U` U' U^ U" Y' TH ss a`
a' a^ a~ a" a* ae c, e` e' e^ e" i` i' i^ i" d- n~ o` o' o^
o~ o" -: o/ u` u' u^ u" y' th y" ^a ~a Ua .a oa "a Ca va fa
te st ** pl mi sl eq cg *A *B *X *D *E *F *G *Y *I *K *L *M
*N *O *P *H *R *S *T *U ts *W *C *Q *Z tf pp ul rn *a *b *x
*d *e *f *g *y *i *k *l *m *n *o *p *h *r *s *t *u *w *c *q
*z or ap fm <= fr if fn ab <- ua -> da de >= mu pt pd bu di
!= == ~~ el av ah CR af If Rf ws Ox O+ es ca cu sp ip !b sb
ib mo !m an gr tm sr c. no l& l| lz b< RG CO TM LT br LX LB
lc lx lf lt lk lb bv b> is RT RX RB rc rx rf rt rk rb ~= ru
'' `` dg dd en \- em bx ob ci sq Sl L1 LA LV LH lh rh lH rH
PC DG 
0707070014231122341006400057030057030000010446060522633073400004000000003061post.src/devLatin1/devLatin1.mkMAKE=/bin/make
MAKEFILE=devLatin1.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
FONTFILES=DESC ? ?? [A-Z]??* shell.lib

all :
	@if [ -r LINKFILE ]; then sh LINKFILE; fi;

install : all
	@if [ ! -d $(FONTDIR) ]; then \
	    mkdir $(FONTDIR); \
	    chmod 755 $(FONTDIR); \
	    chgrp $(GROUP) $(FONTDIR); \
	    chown $(OWNER) $(FONTDIR); \
	fi
	@if [ ! -d $(FONTDIR)/devLatin1 ]; then \
	    mkdir $(FONTDIR)/devLatin1; \
	    chmod 755 $(FONTDIR)/devLatin1; \
	    chgrp $(GROUP) $(FONTDIR)/devLatin1; \
	    chown $(OWNER) $(FONTDIR)/devLatin1; \
	fi
	@if [ ! -d $(FONTDIR)/devLatin1/charlib ]; then \
	    mkdir $(FONTDIR)/devLatin1/charlib; \
	    chmod 755 $(FONTDIR)/devLatin1/charlib; \
	    chgrp $(GROUP) $(FONTDIR)/devLatin1/charlib; \
	    chown $(OWNER) $(FONTDIR)/devLatin1/charlib; \
	fi
	cp $(FONTFILES) $(FONTDIR)/devLatin1
	@for i in $(FONTFILES); do \
	    chmod 644 $(FONTDIR)/devLatin1/$$i; \
	    chgrp $(GROUP) $(FONTDIR)/devLatin1/$$i; \
	    chown $(OWNER) $(FONTDIR)/devLatin1/$$i; \
	done
	cp charlib/* $(FONTDIR)/devLatin1/charlib
	@for i in charlib/*; do \
	    chmod 644 $(FONTDIR)/devLatin1/$$i; \
	    chgrp $(GROUP) $(FONTDIR)/devLatin1/$$i; \
	    chown $(OWNER) $(FONTDIR)/devLatin1/$$i; \
	done

clean :

clobber : clean

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014230454610407550057030057030000021337270522627502100003300000000000post.src/devLatin1/charlib0707070014230454621006440057030057030000011340060522627501700003600000000421post.src/devLatin1/charlib/12/build_12 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (1) show
    rmoveto
    optsize R f
    (\244) show
    f
    (2) show

    optsize ofont f
} def
0707070014230454631006440057030057030000011340070522627502000003600000000421post.src/devLatin1/charlib/14/build_14 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (1) show
    rmoveto
    optsize R f
    (\244) show
    f
    (4) show

    optsize ofont f
} def
0707070014230454641006440057030057030000011347160522627502000003600000000421post.src/devLatin1/charlib/34/build_34 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (3) show
    rmoveto
    optsize R f
    (\244) show
    f
    (4) show

    optsize ofont f
} def
0707070014230454651006440057030057030000011347300522627502000003600000012536post.src/devLatin1/charlib/L1/LOGO-dict-mm dup where not
{ dup 64 dict def currentdict } if
exch get
begin
/globesetup {
/r exch def
/N exch def
/d 2 N r mul N 1 sub add div def
/h d r mul def
} def
/mkabs {
/yp exch def
/xl exch def
dup dup 0 get xl mul 0 exch put
dup dup 1 get h mul yp add 1 exch put
dup dup 2 get xl mul 2 exch put
dup dup 3 get h mul yp add 3 exch put
dup dup 4 get xl mul 4 exch put
dup dup 5 get h mul yp add 5 exch put
} def
/topsegment {
/n exch def
/y n r mul n .5 add add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 180 a sub /arc load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/botsegment {
/n exch 1 add def
/y n r mul n .5 sub add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 540 a sub /arcn load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/segment {
/n exch def
/dh exch 1 exch sub 2 div def
/ylb n r mul n 0.5 add add d mul def
/ylt ylb h add def
/yrb ylb h dh mul add def
/yrt ylt h dh mul sub def
/alb ylb 1 ylb dup mul sub sqrt atan def
/alt ylt 1 ylt dup mul sub sqrt atan def
/arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def
/art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def
/xlb alb cos def
/xlt alt cos def
/xrb arb cos def
/xrt art cos def
/c4 exch xrb abs ylb mkabs def
/ly2 exch h mul ylb add def
/lx2 exch xrb abs mul def
/c3 exch xrb abs ylb mkabs def
/c2 exch xrt abs ylt mkabs def
/ly1 exch h mul ylt add def
/lx1 exch xrt abs mul def
/c1 exch xrt abs ylt mkabs def
xlb ylb /moveto load
0 0 1 alb alt /arc load
c2 4 get c2 5 get /lineto load
c2 2 get c2 3 get
c2 0 get c2 1 get
lx1 ly1	/curveto load
c1 4 get c1 5 get /lineto load
c1 2 get c1 3 get
c1 0 get c1 1 get
xrt yrt /curveto load
0 0 1 art arb /arc load
c3 aload pop /curveto load
lx2 ly2 /lineto load
c4 aload pop /curveto load
/closepath load
} def
8 2.5 globesetup
/globe8 [
/newpath load
[ -.9   .1  -.6   .2  -.5   .2  ] -.5   .2  [ -.4   .2   .0  .0  .4  .0 ] 3 topsegment
[ -.9  -.35 -.85 -.35 -.8  -.35 ] -.1  -.35 [  .1  -.35  .3  .0  .5  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ] -.1   .35 [  .1   .35  .4  .0  .55 .0 ] .55 2 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .05 -.35 [  .2  -.35  .4  .0  .55 .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .05  .35 [  .2   .35  .45 .0  .6  .0 ] .7  1 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .0  -.35 [  .15 -.35  .4  .0  .6  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .0   .35 [  .15  .35  .4  .0  .6  .0 ] .7  0 segment
[ -.7  -.35 -.65 -.35 -.6  -.35 ] -.1  -.35 [  .05 -.35  .35 .0  .55 .0 ]
[ -.7   .35 -.65  .35 -.6   .35 ] -.1   .35 [  .05  .35  .25 .0  .4  .0 ] .8 -1 segment
[ -.65 -.2  -.55 -.2 -.45  -.2  ] -.3   -.2 [ -.2  -.2   .2  .0  .3  .0 ]
[ -.65  .1  -.55  .1 -.45   .1  ] -.45  .1  [ -.3   .1  -.1  .0  .0  .0 ] .96 -2 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]  1 -3 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -4 botsegment
] cvx def
12 3 globesetup
/globe12 [
/newpath load
[ -.8   .2  -.7  .25 -.5   .25 ] -.4  .25 [ -.2   .25  .0  .0  .2  .0 ] 5 topsegment
[ -.7  -.35 -.7 -.35 -.6  -.35 ] -.3 -.35 [ -.1  -.35  .3  .0  .55 .0 ]
[ -.7   .35 -.7  .35 -.6   .35 ] -.25 .35 [ -.05  .35  .4  .0  .55 .0 ] .6  4 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ] -.1 -.35 [  .1  -.35  .4  .0  .5  .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ] -.1  .35 [  .1   .35  .4  .0  .5  .0 ] .7  3 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ]  .0  .35 [  .15  .35  .4  .0  .5  .0 ] .8  2 segment
[ -.75 -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .2  -.35  .4  .0  .5  .0 ]
[ -.75  .35 -.7  .35 -.6   .35 ]  .0  .35 [  .2   .35  .45 .0  .55 .0 ] .9  1 segment
[ -.7  -.35 -.6 -.35 -.55 -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.7   .35 -.6  .35 -.55  .35 ]  .0  .35 [  .1   .35  .5  .0  .6  .0 ] .9  0 segment
] cvx
[
[ -.7 -.35 -.6 -.35 -.5  -.35 ] -.15 -.35 [  .0  -.35  .4  .0  .5  .0 ]
[ -.65 .35 -.55 .35 -.45  .35 ] -.15  .35 [  .0   .35  .35 .0  .45 .0 ] .9 -1 segment
[ -.8 -.1  -.5 -.3  -.4  -.3  ] -.2  -.3  [  .0  -.3   .3  .0  .4  .0 ]
[ -.8  .1  -.5  .3  -.4   .3  ] -.2   .3  [  .0   .3   .2  .0  .3  .0 ] 1 -2 segment
[ -.7 -.1  -.5 -.15 -.4  -.15 ] -.3  -.15 [ -.2  -.15  .0  .0  .2  .0 ]
[ -.7  .05 -.5  .1  -.4   .1  ] -.4   .1  [ -.3   .1   .0  .0  .2  .0 ] 1 -3 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -4 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -5 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -6 botsegment
] cvx
4 array cvx
dup 0 5 -1 roll put
dup 1 /exec load put
dup 2 4 -1 roll put
dup 3 /exec load put
def
end
/build_L1 {
pop
LOGO-dict-mm begin
ptsize 29 lt
{ /globe /globe8 load def }
{ /globe /globe12 load def } ifelse
gsave
currentpoint translate
size 2 div dup scale
1.02 1 transform round exch round exch itransform
translate
globe fill
grestore
end
} def
0707070014230454661006440057030057030000011347170522627502000003600000000075post.src/devLatin1/charlib/Fi/build_Fi {
    pop
    size .05 mul neg 0 (ffi) ashow
} def
0707070014230454671006440057030057030000011347360522627502000003600000000075post.src/devLatin1/charlib/Fl/build_Fl {
    pop
    size .05 mul neg 0 (ffl) ashow
} def
0707070014230454701006440057030057030000011347370522627502000003600000001725post.src/devLatin1/charlib/LA/LOGO-dict-mm dup where not
{ dup 64 dict def currentdict } if
exch get
begin
/l {  lineto } def
/rl {  rlineto } def
/m {  moveto } def
/rm {  rmoveto } def
/C { closepath } def
/c {  curveto } def
/rc {  rcurveto } def
/T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def
/ATT {
newpath
1 36 div dup scale
0  0 m  12 36 rl  8 0 rl -11 -36 rl C
25  0 m -11 36 rl  8 0 rl  12 -36 rl C
10  7 m   0  7 rl 14 0 rl   0  -7 rl C
36  0 T
80  6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc
1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl
0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc
0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C
71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc
-4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc
9 0 14 6 14 11 rc 0 8 rl C
82  0 T
36 dup scale
} def
end
/build_LA {
pop
LOGO-dict-mm begin
gsave
currentpoint translate
size 2.56 div dup scale		% was size 2.75 div dup scale
.02 0 translate
ATT fill
grestore
end
} def
0707070014230454711006440057030057030000011347500522627502000003600000014673post.src/devLatin1/charlib/LH%
% PostScript 12 and 8 line logos - horizontal configuration. Switch occurs
% automatically below point size 29. Code from Matthijs Melchior.
%

/LOGO-dict-mm where not {
	64 dict /LOGO-dict-mm exch def
}{pop} ifelse
LOGO-dict-mm begin		% initialize dictionary


/globesetup {
/r exch def
/N exch def
/d 2 N r mul N 1 sub add div def
/h d r mul def
} def
/mkabs {
/yp exch def
/xl exch def
dup dup 0 get xl mul 0 exch put
dup dup 1 get h mul yp add 1 exch put
dup dup 2 get xl mul 2 exch put
dup dup 3 get h mul yp add 3 exch put
dup dup 4 get xl mul 4 exch put
dup dup 5 get h mul yp add 5 exch put
} def
/topsegment {
/n exch def
/y n r mul n .5 add add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 180 a sub /arc load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/botsegment {
/n exch 1 add def
/y n r mul n .5 sub add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 540 a sub /arcn load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/segment {
/n exch def
/dh exch 1 exch sub 2 div def
/ylb n r mul n 0.5 add add d mul def
/ylt ylb h add def
/yrb ylb h dh mul add def
/yrt ylt h dh mul sub def
/alb ylb 1 ylb dup mul sub sqrt atan def
/alt ylt 1 ylt dup mul sub sqrt atan def
/arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def
/art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def
/xlb alb cos def
/xlt alt cos def
/xrb arb cos def
/xrt art cos def
/c4 exch xrb abs ylb mkabs def
/ly2 exch h mul ylb add def
/lx2 exch xrb abs mul def
/c3 exch xrb abs ylb mkabs def
/c2 exch xrt abs ylt mkabs def
/ly1 exch h mul ylt add def
/lx1 exch xrt abs mul def
/c1 exch xrt abs ylt mkabs def
xlb ylb /moveto load
0 0 1 alb alt /arc load
c2 4 get c2 5 get /lineto load
c2 2 get c2 3 get
c2 0 get c2 1 get
lx1 ly1	/curveto load
c1 4 get c1 5 get /lineto load
c1 2 get c1 3 get
c1 0 get c1 1 get
xrt yrt /curveto load
0 0 1 art arb /arc load
c3 aload pop /curveto load
lx2 ly2 /lineto load
c4 aload pop /curveto load
/closepath load
} def
8 2.5 globesetup
/globe8 [
/newpath load
[ -.9   .1  -.6   .2  -.5   .2  ] -.5   .2  [ -.4   .2   .0  .0  .4  .0 ] 3 topsegment
[ -.9  -.35 -.85 -.35 -.8  -.35 ] -.1  -.35 [  .1  -.35  .3  .0  .5  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ] -.1   .35 [  .1   .35  .4  .0  .55 .0 ] .55 2 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .05 -.35 [  .2  -.35  .4  .0  .55 .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .05  .35 [  .2   .35  .45 .0  .6  .0 ] .7  1 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .0  -.35 [  .15 -.35  .4  .0  .6  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .0   .35 [  .15  .35  .4  .0  .6  .0 ] .7  0 segment
[ -.7  -.35 -.65 -.35 -.6  -.35 ] -.1  -.35 [  .05 -.35  .35 .0  .55 .0 ]
[ -.7   .35 -.65  .35 -.6   .35 ] -.1   .35 [  .05  .35  .25 .0  .4  .0 ] .8 -1 segment
[ -.65 -.2  -.55 -.2 -.45  -.2  ] -.3   -.2 [ -.2  -.2   .2  .0  .3  .0 ]
[ -.65  .1  -.55  .1 -.45   .1  ] -.45  .1  [ -.3   .1  -.1  .0  .0  .0 ] .96 -2 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]  1 -3 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -4 botsegment
] cvx def
12 3 globesetup
/globe12 [
/newpath load
[ -.8   .2  -.7  .25 -.5   .25 ] -.4  .25 [ -.2   .25  .0  .0  .2  .0 ] 5 topsegment
[ -.7  -.35 -.7 -.35 -.6  -.35 ] -.3 -.35 [ -.1  -.35  .3  .0  .55 .0 ]
[ -.7   .35 -.7  .35 -.6   .35 ] -.25 .35 [ -.05  .35  .4  .0  .55 .0 ] .6  4 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ] -.1 -.35 [  .1  -.35  .4  .0  .5  .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ] -.1  .35 [  .1   .35  .4  .0  .5  .0 ] .7  3 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ]  .0  .35 [  .15  .35  .4  .0  .5  .0 ] .8  2 segment
[ -.75 -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .2  -.35  .4  .0  .5  .0 ]
[ -.75  .35 -.7  .35 -.6   .35 ]  .0  .35 [  .2   .35  .45 .0  .55 .0 ] .9  1 segment
[ -.7  -.35 -.6 -.35 -.55 -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.7   .35 -.6  .35 -.55  .35 ]  .0  .35 [  .1   .35  .5  .0  .6  .0 ] .9  0 segment
] cvx
[
[ -.7 -.35 -.6 -.35 -.5  -.35 ] -.15 -.35 [  .0  -.35  .4  .0  .5  .0 ]
[ -.65 .35 -.55 .35 -.45  .35 ] -.15  .35 [  .0   .35  .35 .0  .45 .0 ] .9 -1 segment
[ -.8 -.1  -.5 -.3  -.4  -.3  ] -.2  -.3  [  .0  -.3   .3  .0  .4  .0 ]
[ -.8  .1  -.5  .3  -.4   .3  ] -.2   .3  [  .0   .3   .2  .0  .3  .0 ] 1 -2 segment
[ -.7 -.1  -.5 -.15 -.4  -.15 ] -.3  -.15 [ -.2  -.15  .0  .0  .2  .0 ]
[ -.7  .05 -.5  .1  -.4   .1  ] -.4   .1  [ -.3   .1   .0  .0  .2  .0 ] 1 -3 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -4 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -5 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -6 botsegment
] cvx
4 array cvx
dup 0 5 -1 roll put
dup 1 /exec load put
dup 2 4 -1 roll put
dup 3 /exec load put
def

/l {  lineto } def
/rl {  rlineto } def
/m {  moveto } def
/rm {  rmoveto } def
/C { closepath } def
/c {  curveto } def
/rc {  rcurveto } def
/T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def
/ATT {
newpath
1 36 div dup scale
0  0 m  12 36 rl  8 0 rl -11 -36 rl C
25  0 m -11 36 rl  8 0 rl  12 -36 rl C
10  7 m   0  7 rl 14 0 rl   0  -7 rl C
36  0 T
80  6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc
1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl
0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc
0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C
71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc
-4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc
9 0 14 6 14 11 rc 0 8 rl C
82  0 T
36 dup scale
} def

end

/build_LH { % standard ATT logo
    LOGO-dict-mm begin
	/w exch def
	ptsize 29 lt	% select globe, # lines depends on point size
		{ /globe /globe8 load def }
		{ /globe /globe12 load def } ifelse
	gsave
	 currentpoint translate
	 size 2 div dup scale
	 gsave
	  1.02 1 transform round exch round exch itransform
	  translate
	  globe fill
	 grestore
	 gsave
	  2.15 .62 translate
	  .78 dup scale
	  ATT fill
	 grestore
	grestore
    end
} def
0707070014230454721006440057030057030000011347700522627502000003600000014726post.src/devLatin1/charlib/LV%
% PostScript 12 and 8 line logos - vertical configuration. Switch occurs
% automatically below point size 29. Code from Matthijs Melchior.
%

/LOGO-dict-mm where not {
	64 dict /LOGO-dict-mm exch def
}{pop} ifelse
LOGO-dict-mm begin      	% initialize dictionary


/globesetup {
/r exch def
/N exch def
/d 2 N r mul N 1 sub add div def
/h d r mul def
} def
/mkabs {
/yp exch def
/xl exch def
dup dup 0 get xl mul 0 exch put
dup dup 1 get h mul yp add 1 exch put
dup dup 2 get xl mul 2 exch put
dup dup 3 get h mul yp add 3 exch put
dup dup 4 get xl mul 4 exch put
dup dup 5 get h mul yp add 5 exch put
} def
/topsegment {
/n exch def
/y n r mul n .5 add add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 180 a sub /arc load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/botsegment {
/n exch 1 add def
/y n r mul n .5 sub add d mul def
/a y 1 y dup mul sub sqrt atan def
/x a cos def
/c2 exch x y mkabs def
/ly1 exch h mul y add def
/lx1 exch x abs mul def
/c1 exch x y mkabs def
x y /moveto load
0 0 1 a 540 a sub /arcn load
c1 aload pop /curveto load
lx1 ly1 /lineto load
c2 aload pop /curveto load
/closepath load
} def
/segment {
/n exch def
/dh exch 1 exch sub 2 div def
/ylb n r mul n 0.5 add add d mul def
/ylt ylb h add def
/yrb ylb h dh mul add def
/yrt ylt h dh mul sub def
/alb ylb 1 ylb dup mul sub sqrt atan def
/alt ylt 1 ylt dup mul sub sqrt atan def
/arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def
/art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def
/xlb alb cos def
/xlt alt cos def
/xrb arb cos def
/xrt art cos def
/c4 exch xrb abs ylb mkabs def
/ly2 exch h mul ylb add def
/lx2 exch xrb abs mul def
/c3 exch xrb abs ylb mkabs def
/c2 exch xrt abs ylt mkabs def
/ly1 exch h mul ylt add def
/lx1 exch xrt abs mul def
/c1 exch xrt abs ylt mkabs def
xlb ylb /moveto load
0 0 1 alb alt /arc load
c2 4 get c2 5 get /lineto load
c2 2 get c2 3 get
c2 0 get c2 1 get
lx1 ly1	/curveto load
c1 4 get c1 5 get /lineto load
c1 2 get c1 3 get
c1 0 get c1 1 get
xrt yrt /curveto load
0 0 1 art arb /arc load
c3 aload pop /curveto load
lx2 ly2 /lineto load
c4 aload pop /curveto load
/closepath load
} def
8 2.5 globesetup
/globe8 [
/newpath load
[ -.9   .1  -.6   .2  -.5   .2  ] -.5   .2  [ -.4   .2   .0  .0  .4  .0 ] 3 topsegment
[ -.9  -.35 -.85 -.35 -.8  -.35 ] -.1  -.35 [  .1  -.35  .3  .0  .5  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ] -.1   .35 [  .1   .35  .4  .0  .55 .0 ] .55 2 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .05 -.35 [  .2  -.35  .4  .0  .55 .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .05  .35 [  .2   .35  .45 .0  .6  .0 ] .7  1 segment
[ -.8  -.35 -.75 -.35 -.7  -.35 ]  .0  -.35 [  .15 -.35  .4  .0  .6  .0 ]
[ -.8   .35 -.75  .35 -.7   .35 ]  .0   .35 [  .15  .35  .4  .0  .6  .0 ] .7  0 segment
[ -.7  -.35 -.65 -.35 -.6  -.35 ] -.1  -.35 [  .05 -.35  .35 .0  .55 .0 ]
[ -.7   .35 -.65  .35 -.6   .35 ] -.1   .35 [  .05  .35  .25 .0  .4  .0 ] .8 -1 segment
[ -.65 -.2  -.55 -.2 -.45  -.2  ] -.3   -.2 [ -.2  -.2   .2  .0  .3  .0 ]
[ -.65  .1  -.55  .1 -.45   .1  ] -.45  .1  [ -.3   .1  -.1  .0  .0  .0 ] .96 -2 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]  1 -3 segment
[  .0   .0   .0   .0  .0    .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -4 botsegment
] cvx def
12 3 globesetup
/globe12 [
/newpath load
[ -.8   .2  -.7  .25 -.5   .25 ] -.4  .25 [ -.2   .25  .0  .0  .2  .0 ] 5 topsegment
[ -.7  -.35 -.7 -.35 -.6  -.35 ] -.3 -.35 [ -.1  -.35  .3  .0  .55 .0 ]
[ -.7   .35 -.7  .35 -.6   .35 ] -.25 .35 [ -.05  .35  .4  .0  .55 .0 ] .6  4 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ] -.1 -.35 [  .1  -.35  .4  .0  .5  .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ] -.1  .35 [  .1   .35  .4  .0  .5  .0 ] .7  3 segment
[ -.8  -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.8   .35 -.7  .35 -.6   .35 ]  .0  .35 [  .15  .35  .4  .0  .5  .0 ] .8  2 segment
[ -.75 -.35 -.7 -.35 -.6  -.35 ]  .0 -.35 [  .2  -.35  .4  .0  .5  .0 ]
[ -.75  .35 -.7  .35 -.6   .35 ]  .0  .35 [  .2   .35  .45 .0  .55 .0 ] .9  1 segment
[ -.7  -.35 -.6 -.35 -.55 -.35 ]  .0 -.35 [  .1  -.35  .45 .0  .55 .0 ]
[ -.7   .35 -.6  .35 -.55  .35 ]  .0  .35 [  .1   .35  .5  .0  .6  .0 ] .9  0 segment
] cvx
[
[ -.7 -.35 -.6 -.35 -.5  -.35 ] -.15 -.35 [  .0  -.35  .4  .0  .5  .0 ]
[ -.65 .35 -.55 .35 -.45  .35 ] -.15  .35 [  .0   .35  .35 .0  .45 .0 ] .9 -1 segment
[ -.8 -.1  -.5 -.3  -.4  -.3  ] -.2  -.3  [  .0  -.3   .3  .0  .4  .0 ]
[ -.8  .1  -.5  .3  -.4   .3  ] -.2   .3  [  .0   .3   .2  .0  .3  .0 ] 1 -2 segment
[ -.7 -.1  -.5 -.15 -.4  -.15 ] -.3  -.15 [ -.2  -.15  .0  .0  .2  .0 ]
[ -.7  .05 -.5  .1  -.4   .1  ] -.4   .1  [ -.3   .1   .0  .0  .2  .0 ] 1 -3 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -4 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ]
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] 1 -5 segment
[  .0  .0   .0  .0   .0   .0  ]  .0   .0  [  .0   .0   .0  .0  .0  .0 ] -6 botsegment
] cvx
4 array cvx
dup 0 5 -1 roll put
dup 1 /exec load put
dup 2 4 -1 roll put
dup 3 /exec load put
def

/l {  lineto } def
/rl {  rlineto } def
/m {  moveto } def
/rm {  rmoveto } def
/C { closepath } def
/c {  curveto } def
/rc {  rcurveto } def
/T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def
/ATT {
newpath
1 36 div dup scale
0  0 m  12 36 rl  8 0 rl -11 -36 rl C
25  0 m -11 36 rl  8 0 rl  12 -36 rl C
10  7 m   0  7 rl 14 0 rl   0  -7 rl C
36  0 T
80  6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc
1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl
0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc
0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C
71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc
-4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc
9 0 14 6 14 11 rc 0 8 rl C
82  0 T
36 dup scale
} def

end

/build_LV { % standard ATT logo
    LOGO-dict-mm begin
	/w exch def
	ptsize 29 lt	% select globe, # lines depends on point size
		{ /globe /globe8 load def }
		{ /globe /globe12 load def } ifelse
	gsave
	 currentpoint translate
	 size 2 div dup scale
	 gsave
	  1.02 1 transform round exch round exch itransform
	  translate
	  globe fill
	 grestore
	 gsave
	  %2.15 .62 translate
	  -0.1 -1.0 translate
	  .78 dup scale
	  ATT fill
	 grestore
	grestore
    end
} def
0707070014230454731006440057030057030000011347570522627502000004200000001173post.src/devLatin1/charlib/READMEPostscript definitions for special troff characters. File names are
the two character troff names. Each defines a PostScript procedure
that begins with build_ and ends with the character's name. The
build_?? procedure is called with the character width as it's only
argument. The .map files contain extra character data (e.g. image
data) that dpost downloads immediately after the build_?? call,
if the character's font table code field is 2 (rather than 1).

The following PostScript variables are available:

	font		current font
	ptsize		current point size
	size		actual font size - scaled up from ptsize

Don't overuse this stuff!

0707070014230454741006440057030057030000011261550522627502000003600000002631post.src/devLatin1/charlib/Sl/build_Sl {
pop
gsave
size .0022 mul dup scale
currentpoint translate
14 93 moveto
14 96 lineto
29 110 lineto
44 121 lineto
54 127 lineto
55 132 lineto
57 146 lineto
59 157 lineto
62 171 lineto
66 186 lineto
70 199 lineto
75 213 lineto
81 228 lineto
88 243 lineto
96 257 lineto
106 272 lineto
118 287 lineto
133 300 lineto
148 307 lineto
163 308 lineto
178 304 lineto
191 293 lineto
197 281 lineto
198 277 lineto
198 260 lineto
194 246 lineto
187 231 lineto
179 217 lineto
168 202 lineto
155 187 lineto
141 172 lineto
126 158 lineto
111 146 lineto
96 136 lineto
94 131 lineto
93 123 lineto
92 112 lineto
91 103 lineto
90 93 lineto
89 81 lineto
89 40 lineto
92 28 lineto
97 18 lineto
108 10 lineto
122 10 lineto
134 18 lineto
145 33 lineto
152 48 lineto
158 62 lineto
168 58 lineto
168 59 lineto
163 45 lineto
157 31 lineto
148 16 lineto
133 3 lineto
118 -1 lineto
103 0 lineto
88 5 lineto
73 18 lineto
64 31 lineto
58 46 lineto
55 59 lineto
53 73 lineto
52 111 lineto
37 101 lineto
22 86 lineto
14 93 lineto

97 152 moveto
97 153 lineto
99 166 lineto
101 178 lineto
103 190 lineto
106 205 lineto
109 218 lineto
113 232 lineto
118 246 lineto
124 261 lineto
132 275 lineto
144 290 lineto
157 298 lineto
171 298 lineto
181 291 lineto
186 283 lineto
187 279 lineto
187 264 lineto
186 260 lineto
181 246 lineto
174 233 lineto
165 218 lineto
155 204 lineto
142 190 lineto
127 175 lineto
112 162 lineto
97 152 lineto

eofill
grestore
} def
0707070014230454751006440057030057030000011261570522627502000003600000000264post.src/devLatin1/charlib/bx/build_bx {
    pop
    size 2 div /side exch def
    currentpoint
    newpath
    moveto
    0 side rlineto
    side 0 rlineto
    0 side neg rlineto
    closepath
    fill
} def
0707070014230454761006440057030057030000011347770522627502000003600000000221post.src/devLatin1/charlib/ci/build_ci {
    pop
    size 3 mul 8 div /rad exch def
    currentpoint
    newpath
    rad add exch rad add exch rad 0 360 arc
    stroke
} def
0707070014230454771006440057030057030000011261650522627502000003600000000074post.src/devLatin1/charlib/ff/build_ff {
    pop
    size .05 mul neg 0 (ff) ashow
} def
0707070014230455001006440057030057030000011261660522627502000003600000001716post.src/devLatin1/charlib/lc%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_lc {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 0 get bvbbox 1 get moveto
	bvbbox 0 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 3 get moveto
	bvbbox 4 get dup dup
	8 mul 0 rlineto
	0 exch neg rlineto
	8 mul neg 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230455011006440057030057030000011261670522627502000003600000001712post.src/devLatin1/charlib/lf%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_lf {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 0 get bvbbox 1 get moveto
	bvbbox 0 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 1 get moveto
	bvbbox 4 get dup dup
	8 mul 0 rlineto
	0 exch rlineto
	8 mul neg 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230455021006440057030057030000011262000522627502000003600000004412post.src/devLatin1/charlib/lh/build_lh {
pop
gsave
size .0022 mul dup scale
currentpoint translate

16 177 moveto
16 188 lineto
21 193 lineto
30 193 lineto
34 189 lineto
36 183 lineto
36 180 lineto
34 174 lineto
27 170 lineto
19 172 lineto
16 177 lineto
stroke

38 194 moveto
38 196 lineto
53 199 lineto
68 201 lineto
83 202 lineto
98 203 lineto
113 204 lineto
128 204 lineto
143 205 lineto
158 205 lineto
173 205 lineto
188 204 lineto
203 203 lineto
218 202 lineto
233 200 lineto
248 198 lineto
263 196 lineto
278 194 lineto
293 190 lineto
308 186 lineto
323 181 lineto
338 176 lineto
353 168 lineto
361 162 lineto
364 153 lineto
366 138 lineto
367 126 lineto
368 106 lineto
369 80 lineto
369 74 lineto
368 60 lineto
367 54 lineto
362 43 lineto
348 34 lineto
333 28 lineto
318 25 lineto
303 26 lineto
288 29 lineto
273 31 lineto
258 32 lineto
243 32 lineto
228 30 lineto
213 27 lineto
198 24 lineto
183 23 lineto
168 23 lineto
153 27 lineto
148 34 lineto
148 47 lineto
153 54 lineto
168 58 lineto
183 58 lineto
198 58 lineto
213 59 lineto
226 60 lineto
228 62 lineto
228 67 lineto
223 71 lineto
208 71 lineto
193 70 lineto
178 70 lineto
163 70 lineto
148 70 lineto
133 71 lineto
123 76 lineto
120 84 lineto
120 91 lineto
122 98 lineto
129 104 lineto
144 106 lineto
159 107 lineto
174 107 lineto
189 107 lineto
202 108 lineto
204 110 lineto
204 117 lineto
201 119 lineto
186 119 lineto
171 119 lineto
156 119 lineto
141 119 lineto
126 119 lineto
111 121 lineto
103 128 lineto
101 137 lineto
101 142 lineto
103 150 lineto
111 158 lineto
126 161 lineto
141 161 lineto
156 162 lineto
171 163 lineto
186 163 lineto
191 165 lineto
192 167 lineto
192 171 lineto
190 174 lineto
176 175 lineto
161 175 lineto
146 175 lineto
131 174 lineto
116 174 lineto
101 174 lineto
86 173 lineto
71 172 lineto
56 171 lineto
41 171 lineto
41 174 lineto
43 178 lineto
43 187 lineto
38 194 lineto
stroke

373 169 moveto
373 176 lineto
375 182 lineto
386 190 lineto
401 193 lineto
408 191 lineto
411 185 lineto
412 181 lineto
414 167 lineto
415 158 lineto
416 144 lineto
417 128 lineto
418 110 lineto
418 60 lineto
417 45 lineto
415 37 lineto
409 34 lineto
394 31 lineto
381 35 lineto
379 42 lineto
379 52 lineto
380 67 lineto
380 77 lineto
379 77 lineto
378 106 lineto
377 121 lineto
376 133 lineto
375 147 lineto
374 158 lineto
373 169 lineto

stroke
grestore
} def
0707070014230455031006440057030057030000011263050522627502000003600000000222post.src/devLatin1/charlib/ob/build_ob {
    pop
    size 3 mul 16 div /rad exch def
    currentpoint
    newpath
    rad add exch rad add exch rad 0 360 arc
    stroke
} def
0707070014230455041006440057030057030000011263060522627502100003600000001716post.src/devLatin1/charlib/rc%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_rc {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 2 get bvbbox 1 get moveto
	bvbbox 2 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 3 get moveto
	bvbbox 4 get dup dup
	8 mul neg 0 rlineto
	0 exch neg rlineto
	8 mul 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230455051006440057030057030000011263070522627502100003600000001712post.src/devLatin1/charlib/rf%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_rf {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 2 get bvbbox 1 get moveto
	bvbbox 2 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 1 get moveto
	bvbbox 4 get dup dup
	8 mul neg 0 rlineto
	0 exch rlineto
	8 mul 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230455061006440057030057030000011327350522627502100003600000004171post.src/devLatin1/charlib/rh/build_rh {
pop
gsave
size .0022 mul dup scale
currentpoint translate

15 66 moveto
15 86 lineto
16 131 lineto
17 146 lineto
18 158 lineto
19 167 lineto
21 181 lineto
24 190 lineto
34 193 lineto
49 189 lineto
58 182 lineto
60 177 lineto
60 166 lineto
59 156 lineto
58 143 lineto
57 130 lineto
56 117 lineto
55 102 lineto
54 42 lineto
53 39 lineto
49 35 lineto
34 34 lineto
19 39 lineto
16 47 lineto
15 66 lineto
stroke

65 60 moveto
65 111 lineto
66 127 lineto
67 139 lineto
69 153 lineto
72 163 lineto
83 171 lineto
98 177 lineto
113 182 lineto
128 187 lineto
143 190 lineto
158 194 lineto
173 196 lineto
188 199 lineto
203 201 lineto
218 203 lineto
233 205 lineto
248 205 lineto
263 206 lineto
278 206 lineto
293 206 lineto
308 206 lineto
323 206 lineto
338 205 lineto
353 203 lineto
368 202 lineto
383 200 lineto
394 197 lineto
389 190 lineto
389 180 lineto
391 176 lineto
391 173 lineto
380 173 lineto
365 173 lineto
350 174 lineto
335 175 lineto
320 176 lineto
305 176 lineto
290 176 lineto
275 177 lineto
260 177 lineto
245 177 lineto
240 173 lineto
240 170 lineto
245 165 lineto
260 164 lineto
275 164 lineto
290 164 lineto
305 163 lineto
320 160 lineto
327 155 lineto
330 149 lineto
330 134 lineto
328 129 lineto
323 124 lineto
309 121 lineto
294 121 lineto
279 121 lineto
264 121 lineto
249 121 lineto
234 121 lineto
228 118 lineto
228 112 lineto
234 109 lineto
249 109 lineto
264 109 lineto
279 108 lineto
294 108 lineto
306 104 lineto
311 97 lineto
312 91 lineto
312 88 lineto
311 82 lineto
305 74 lineto
290 72 lineto
275 72 lineto
260 72 lineto
245 73 lineto
230 73 lineto
215 73 lineto
205 70 lineto
205 63 lineto
217 60 lineto
232 60 lineto
247 60 lineto
262 60 lineto
277 57 lineto
283 52 lineto
285 44 lineto
285 41 lineto
284 35 lineto
280 30 lineto
268 26 lineto
253 25 lineto
238 26 lineto
223 28 lineto
208 31 lineto
193 33 lineto
178 34 lineto
163 33 lineto
148 31 lineto
133 28 lineto
118 27 lineto
103 28 lineto
88 34 lineto
73 43 lineto
67 52 lineto
65 60 lineto
stroke

396 180 moveto
396 188 lineto
399 194 lineto
410 196 lineto
416 190 lineto
416 180 lineto
415 177 lineto
411 173 lineto
400 173 lineto
396 180 lineto
stroke

grestore
} def
0707070014230455071006440057030057030000011331250522627502100003600000000320post.src/devLatin1/charlib/sq/build_sq {
    pop
    size 2 div /side exch def
    currentpoint
    newpath
    moveto
    0 side rlineto
    side 0 rlineto
    0 side neg rlineto
    closepath
    font B eq {fill} {stroke} ifelse
} def
0707070014230455101006440057030057030000011331260522627502100003600000000130post.src/devLatin1/charlib/~=/build_~= {
    pop
    (\176) stringwidth pop neg size -.15 mul (\176\055) ashow
} def
0707070014230455111006440057030057030000011331270522627502100003600000000327post.src/devLatin1/charlib/RC/build_RC {
    pop
    size 4 div /side exch def
    currentpoint
    newpath
    moveto
    0 side 1.5 mul rmoveto
    0 side rlineto
    side 2.5 mul 0 rlineto
    0 side neg rlineto
    closepath
    fill
} def
0707070014230455121006440057030057030000011331750522627502100003600000001051post.src/devLatin1/charlib/DG%
% UMDS danger sign - needs to be cleaned up!
%

/build_DG {
    /x0 1.5 6 div 72 mul def	% triangle length
    pop
    gsave
	currentpoint translate
	1 scaling div ptsize 10 div mul dup scale
	2 setlinewidth
	0 setlinecap
	newpath
	0 0 moveto
	x0 0 lineto
	x0 2 div x0 3 sqrt 2 div mul lineto
	closepath fill
	1 setgray
	/Helvetica-Bold findfont 12 scalefont setfont
	0 0 moveto
	(!) false charpath pathbbox
	exch 4 -1 roll add 2 div x0 2 div exch sub 0 moveto
	exch sub x0 3 sqrt 2 div mul exch sub 3 div 0 exch rmoveto
	(!) show
    grestore
} def

0707070014230455131006440057030057030000011331760522627502100003600000000735post.src/devLatin1/charlib/PC%
% UMDS pencil - needs to be cleaned up.
%

/build_PC {
    pop
    gsave
	currentpoint translate
	1 scaling div ptsize 10 div mul dup scale
	newpath
	0 setlinecap
	1 setlinejoin
	2 setlinewidth
	0 1 moveto 12 0 rlineto stroke
	0 5 moveto 12 0 rlineto stroke
	0 9 moveto 12 0 rlineto stroke
	1 setlinewidth
	12 .5 moveto 21.27362 5 lineto 12 9.5 lineto stroke
	21.27362 5 moveto
	.4 9.27362 mul neg .4 4 mul rlineto
	0 .8 4 mul neg rlineto
	closepath fill
    grestore
} def

0707070014230455141006440057030057030000011333450522627502100003600000004404post.src/devLatin1/charlib/lH/build_lH {
pop
gsave
size .0022 mul dup scale
currentpoint translate

16 177 moveto
16 188 lineto
21 193 lineto
30 193 lineto
34 189 lineto
36 183 lineto
36 180 lineto
34 174 lineto
27 170 lineto
19 172 lineto
16 177 lineto
fill

38 194 moveto
38 196 lineto
53 199 lineto
68 201 lineto
83 202 lineto
98 203 lineto
113 204 lineto
128 204 lineto
143 205 lineto
158 205 lineto
173 205 lineto
188 204 lineto
203 203 lineto
218 202 lineto
233 200 lineto
248 198 lineto
263 196 lineto
278 194 lineto
293 190 lineto
308 186 lineto
323 181 lineto
338 176 lineto
353 168 lineto
361 162 lineto
364 153 lineto
366 138 lineto
367 126 lineto
368 106 lineto
369 80 lineto
369 74 lineto
368 60 lineto
367 54 lineto
362 43 lineto
348 34 lineto
333 28 lineto
318 25 lineto
303 26 lineto
288 29 lineto
273 31 lineto
258 32 lineto
243 32 lineto
228 30 lineto
213 27 lineto
198 24 lineto
183 23 lineto
168 23 lineto
153 27 lineto
148 34 lineto
148 47 lineto
153 54 lineto
168 58 lineto
183 58 lineto
198 58 lineto
213 59 lineto
226 60 lineto
228 62 lineto
228 67 lineto
223 71 lineto
208 71 lineto
193 70 lineto
178 70 lineto
163 70 lineto
148 70 lineto
133 71 lineto
123 76 lineto
120 84 lineto
120 91 lineto
122 98 lineto
129 104 lineto
144 106 lineto
159 107 lineto
174 107 lineto
189 107 lineto
202 108 lineto
204 110 lineto
204 117 lineto
201 119 lineto
186 119 lineto
171 119 lineto
156 119 lineto
141 119 lineto
126 119 lineto
111 121 lineto
103 128 lineto
101 137 lineto
101 142 lineto
103 150 lineto
111 158 lineto
126 161 lineto
141 161 lineto
156 162 lineto
171 163 lineto
186 163 lineto
191 165 lineto
192 167 lineto
192 171 lineto
190 174 lineto
176 175 lineto
161 175 lineto
146 175 lineto
131 174 lineto
116 174 lineto
101 174 lineto
86 173 lineto
71 172 lineto
56 171 lineto
41 171 lineto
41 174 lineto
43 178 lineto
43 187 lineto
38 194 lineto
fill

373 169 moveto
373 176 lineto
375 182 lineto
386 190 lineto
401 193 lineto
408 191 lineto
411 185 lineto
412 181 lineto
414 167 lineto
415 158 lineto
416 144 lineto
417 128 lineto
418 110 lineto
418 60 lineto
417 45 lineto
415 37 lineto
409 34 lineto
394 31 lineto
381 35 lineto
379 42 lineto
379 52 lineto
380 67 lineto
380 77 lineto
379 77 lineto
378 106 lineto
377 121 lineto
376 133 lineto
375 147 lineto
374 158 lineto
373 169 lineto

fill
grestore
} def
0707070014230455151006440057030057030000011336450522627502100003600000004163post.src/devLatin1/charlib/rH/build_rH {
pop
gsave
size .0022 mul dup scale
currentpoint translate

15 66 moveto
15 86 lineto
16 131 lineto
17 146 lineto
18 158 lineto
19 167 lineto
21 181 lineto
24 190 lineto
34 193 lineto
49 189 lineto
58 182 lineto
60 177 lineto
60 166 lineto
59 156 lineto
58 143 lineto
57 130 lineto
56 117 lineto
55 102 lineto
54 42 lineto
53 39 lineto
49 35 lineto
34 34 lineto
19 39 lineto
16 47 lineto
15 66 lineto
fill

65 60 moveto
65 111 lineto
66 127 lineto
67 139 lineto
69 153 lineto
72 163 lineto
83 171 lineto
98 177 lineto
113 182 lineto
128 187 lineto
143 190 lineto
158 194 lineto
173 196 lineto
188 199 lineto
203 201 lineto
218 203 lineto
233 205 lineto
248 205 lineto
263 206 lineto
278 206 lineto
293 206 lineto
308 206 lineto
323 206 lineto
338 205 lineto
353 203 lineto
368 202 lineto
383 200 lineto
394 197 lineto
389 190 lineto
389 180 lineto
391 176 lineto
391 173 lineto
380 173 lineto
365 173 lineto
350 174 lineto
335 175 lineto
320 176 lineto
305 176 lineto
290 176 lineto
275 177 lineto
260 177 lineto
245 177 lineto
240 173 lineto
240 170 lineto
245 165 lineto
260 164 lineto
275 164 lineto
290 164 lineto
305 163 lineto
320 160 lineto
327 155 lineto
330 149 lineto
330 134 lineto
328 129 lineto
323 124 lineto
309 121 lineto
294 121 lineto
279 121 lineto
264 121 lineto
249 121 lineto
234 121 lineto
228 118 lineto
228 112 lineto
234 109 lineto
249 109 lineto
264 109 lineto
279 108 lineto
294 108 lineto
306 104 lineto
311 97 lineto
312 91 lineto
312 88 lineto
311 82 lineto
305 74 lineto
290 72 lineto
275 72 lineto
260 72 lineto
245 73 lineto
230 73 lineto
215 73 lineto
205 70 lineto
205 63 lineto
217 60 lineto
232 60 lineto
247 60 lineto
262 60 lineto
277 57 lineto
283 52 lineto
285 44 lineto
285 41 lineto
284 35 lineto
280 30 lineto
268 26 lineto
253 25 lineto
238 26 lineto
223 28 lineto
208 31 lineto
193 33 lineto
178 34 lineto
163 33 lineto
148 31 lineto
133 28 lineto
118 27 lineto
103 28 lineto
88 34 lineto
73 43 lineto
67 52 lineto
65 60 lineto
fill

396 180 moveto
396 188 lineto
399 194 lineto
410 196 lineto
416 190 lineto
416 180 lineto
415 177 lineto
411 173 lineto
400 173 lineto
396 180 lineto
fill

grestore
} def
0707070014230455161006440057030057030000011263100522627502100004600000010521post.src/devLatin1/charlib/LH.example%
% An example logo character. Building the PostScript program that prints
% your company logo is not addressed here; we assume you already have
% such a program, that it's relatively simple, and that it prints the
% logo by itself on a page. What you'll find here are instructions for
% converting that logo program into a character that can be accessed by
% troff and dpost.
%
% Building a new charlib character involves some PostScript programming.
% We've tried to isolate parameters that you'll need to change (Xoffset,
% Yoffset, and Scaling), but we can't guarantee things will work properly
% with every logo program. PostScript is a complex language and subtle
% interactions between your logo program and what we've done here can
% cause problems.
%
% Tuning the new character is an iterative process. You may want to adjust
% the size of the logo (via Scaling), it's position relative to adjacent
% characters and the baseline (Xoffset and Yoffset), and the distance troff
% moves after printing the character (width field in file ../S1). The steps
% to follow are:
%
%	1: Create a simple troff test file for the new character. Something
%	   like,
%
%		.sp 1i
%		.ps 10
%		size 10: \(LH
%		.sp 1i
%		.ps 18
%		size 18: \(LH
%		.sp 1i
%		.ps 36
%		size 36: \(LH
%		.sp 1i
%		.ps 10
%		four logo characters: \(LH\(LH\(LH\(LH
%
%	   is sufficient. The test file can go anywhere.
% 
%	2: Change into directory /usr/lib/font/devpost/charlib. All file
%	   pathnames will be relative to that directory.
%
%	3: Save a copy of the working LH logo file. Then replace LH with
%	   this file (i.e. LH.example). Changes described below should be
%	   be made in the new LH file (not in LH.example).
%
%	4: Your PostScript logo program will eventually replace whatever
%	   you find between the <<StartLogo>> and <<EndLogo>> comment lines
%	   in the PostScript build_LH procedure (below). What's there now
%	   prints an example logo that you can use until you understand the
%	   remaining steps.
%
%	5: Print your troff test file using (assuming your making changes
%	   in the devpost charlib directory),
%
%		troff -Tpost testfile | dpost | lp ...
%
%	6: Adjust the logo positioning by changing the numbers assigned to
%	   Xoffset and Yoffset (below). Both are in units of 72 per inch.
%	   Positive offsets should move the logo to the right and up the
%	   page.
%
%	7: Adjust the logo size by changing the the number assigned to
%	   Scaling. Unitsize also controls scaling, but there's no good
%	   reason to change both Scaling and Unitsize.
%
%	8: Control the horizontal distance troff moves after printing the
%	   new LH character by changing the width (i.e. the number in the
%	   second column) assigned to LH in file ../S1. Character width
%	   adjustments should probably wait until you're satisfied with
%	   the Scaling set in step 7.
%
%	9: Back to step 5 until your satisfied with the output.
%
% The remaining steps are suggested but not required:
%
%      10: Delete PostScript comments in your new LH charlib file - comments
%	   start with % and go to the end of the line.
%
%      11: Update the width field assigned to LH in file ../shell.lib. The
%	   new width should reflect what's currently in your S1 font file.
%
%      12: Make a similiar set of changes in /usr/lib/font/devLatin1/charlib.
%	   You can use the devpost version of LH to devLatin1/charlib/LH,
%	   but changes to files devLatin1/S1 and devLatin1/shell.lib must be
%	   entered by hand.
%

/Logo_Dict 100 dict dup begin
	/Xoffset 0 def			% 72 dpi with positive to the right
	/Yoffset 0 def			% 72 dpi with positive up the page
	/Scaling 1.0 def		% adjust this number to change the size
	/Unitsize 36 def		% for point size scaling - leave it be
	/showpage {} def
end def

/build_LH {				% don't bind this procedure
	Logo_Dict begin
		gsave
		/charwidth exch def
		currentpoint translate
		resolution 72 div dup scale
		Xoffset Yoffset translate
		Scaling Scaling scale
		ptsize Unitsize div dup scale

		%% Replace everything between the <<StartLogo>> and <<EndLogo>>
		%% comment lines by the PostScript program that prints your
		%% logo.

		%% <<StartLogo>>
			newpath
			.5 .5 scale
			0 0 moveto
			100 0 lineto
			100 100 lineto
			closepath
			.5 setgray
			fill
			0 setgray
			10 10 translate
			45 rotate
			0 5 moveto
			/Helvetica findfont 18 scalefont setfont
			(Example Logo) show
		%% <<EndLogo>>

		grestore
	end
} def

0707070014231124121006440057030057030000010446020522627502100002600000006132post.src/devLatin1/HKname HK
fontname Helvetica-LightOblique
spacewidth 28
charset
!	33	2	33
"	28	2	34
dq	"
#	56	2	35
$	56	2	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	66	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	50	2	63
@	80	2	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	2	81
R	67	2	82
S	61	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	89	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
^	33	2	147
---	66	2	94
---	50	1	95
`	22	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	28	2	102
g	61	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	22	2	124
}	33	3	125
~	33	2	148
---	66	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	0	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	22	2	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	80	2	169
\0251	"
a_	33	2	170
\0252	"
<<	56	0	171
\0253	"
-,	66	0	172
\0254	"
hy	33	0	173
\0255	"
--	66	0	45
ro	80	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	66	0	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	65	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	33	2	186
\0272	"
>>	56	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	50	1	191
\0277	"
A`	67	2	192
\0300	"
A'	67	2	193
\0301	"
A^	67	2	194
\0302	"
A~	67	2	195
\0303	"
A"	67	2	196
\0304	"
A*	67	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	66	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	61	2	221
\0335	"
TH	61	2	222
\0336	"
ss	50	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	89	0	230
\0346	"
c,	56	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	22	2	236
\0354	"
i'	22	2	237
\0355	"
i^	22	2	238
\0356	"
i"	22	2	239
\0357	"
d-	56	2	240
\0360	"
n~	56	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	66	0	247
\0367	"
o/	56	0	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	50	3	253
\0375	"
th	61	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231124131006440057030057030000010446200522627502100002600000006123post.src/devLatin1/HLname HL
fontname Helvetica-Light
spacewidth 28
charset
!	33	2	33
"	28	2	34
dq	"
#	56	2	35
$	56	2	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	66	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	50	2	63
@	80	2	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	2	81
R	67	2	82
S	61	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	89	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
^	33	2	147
---	66	2	94
---	50	1	95
`	22	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	28	2	102
g	61	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	22	2	124
}	33	3	125
~	33	2	148
---	66	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	0	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	22	2	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	80	2	169
\0251	"
a_	33	2	170
\0252	"
<<	56	0	171
\0253	"
-,	66	0	172
\0254	"
hy	33	0	173
\0255	"
--	66	0	45
ro	80	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	66	0	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	65	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	33	2	186
\0272	"
>>	56	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	50	1	191
\0277	"
A`	67	2	192
\0300	"
A'	67	2	193
\0301	"
A^	67	2	194
\0302	"
A~	67	2	195
\0303	"
A"	67	2	196
\0304	"
A*	67	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	61	2	200
\0310	"
E'	61	2	201
\0311	"
E^	61	2	202
\0312	"
E"	61	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	66	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	61	2	221
\0335	"
TH	61	2	222
\0336	"
ss	50	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	89	0	230
\0346	"
c,	56	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	22	2	236
\0354	"
i'	22	2	237
\0355	"
i^	22	2	238
\0356	"
i"	22	2	239
\0357	"
d-	56	2	240
\0360	"
n~	56	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	66	0	247
\0367	"
o/	56	0	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	50	3	253
\0375	"
th	61	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014231124141006440057030057030000010446400522627502100004200000053476post.src/devLatin1/shell.lib.last#
# Shell library - for building devLatin1 tables.
#
# The full ISO Latin1 alphabet appeared in Adobe's interpreter sometime
# around Version 50.0. Prior to that ROM resident Type 1 text fonts were
# missing 18 characters that are now part of the Latin1 standard. Width
# tables will not build on printers that lack full Latin1 support. Error
# message will likely reflect a missing ISOLatin1Encoding array.
#

RESOLUTION=720
UNITWIDTH=10

OCTALESCAPES=${OCTALESCAPES:-160}	# <= code means add \0ddd names
DOWNLOADVECTOR=FALSE			# TRUE can mean incomplete tables

#
# BuiltinTables returns command lines that generate PostScript programs
# for building a typesetter description file and font width tables for
# a relatively standard collection of fonts. Use awk to select a command
# line or modify an existing command to build a width table for a new
# font.
#

BuiltinTables() {
	cat <<-'//End of BuiltinTables'
		Proportional	R	Times-Roman
		Proportional	I	Times-Italic
		Proportional	B	Times-Bold
		Proportional	BI	Times-BoldItalic
		Proportional	AB	AvantGarde-Demi
		Proportional	AI	AvantGarde-BookOblique
		Proportional	AR	AvantGarde-Book
		Proportional	AX	AvantGarde-DemiOblique
		Proportional	H	Helvetica
		Proportional	HB	Helvetica-Bold
		Proportional	HI	Helvetica-Oblique
		Proportional	HX	Helvetica-BoldOblique
		Proportional	Hb	Helvetica-Narrow-Bold
		Proportional	Hi	Helvetica-Narrow-Oblique
		Proportional	Hr	Helvetica-Narrow
		Proportional	Hx	Helvetica-Narrow-BoldOblique
		Proportional	KB	Bookman-Demi
		Proportional	KI	Bookman-LightItalic
		Proportional	KR	Bookman-Light
		Proportional	KX	Bookman-DemiItalic
		Proportional	NB	NewCenturySchlbk-Bold
		Proportional	NI	NewCenturySchlbk-Italic
		Proportional	NR	NewCenturySchlbk-Roman
		Proportional	NX	NewCenturySchlbk-BoldItalic
		Proportional	PA	Palatino-Roman
		Proportional	PB	Palatino-Bold
		Proportional	PI	Palatino-Italic
		Proportional	PX	Palatino-BoldItalic
		Proportional	ZI	ZapfChancery-MediumItalic
		FixedWidth	C	Courier
		FixedWidth	CB	Courier-Bold
		FixedWidth	CI	Courier-Oblique
		FixedWidth	CO	Courier
		FixedWidth	CW	Courier
		FixedWidth	CX	Courier-BoldOblique
		Dingbats	ZD	ZapfDingbats
		Greek		GR	Symbol
		Symbol		S	Symbol
		Special		S1	Times-Roman
		Description	DESC	---
	//End of BuiltinTables
}

#
# AllTables prints the complete list of builtin font names.
#

AllTables() {
	BuiltinTables | awk '{print $2}'
}

#
# Charset functions generate keyword/value pairs (as PostScript objects)
# that describe the character set available in a font. The keyword is a
# PostScript string that represents troff's name for the character. The
# value is usually the literal name (i.e. begins with a /) assigned to
# the character in the PostScript font. The value can also be an integer
# or a PostScript string. An integer value is used as an index in the
# current font's Encoding array. A string value is returned to the host
# unchanged when the entry for the character is constructed. Entries that
# have (") as their value are synonyms for the preceeding character.
#
# The 18 characters missing from ROM resident fonts on older printers are
# flagged with the PostScript comment "% missing".
#

StandardCharset() {
	cat <<-'//End of StandardCharset'
		(!)	/exclam
		(")	/quotedbl
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(-)	/hyphen		% changed from minus by request
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(\\`)	/grave			% devpost character
		(ga)	(")			% synonym
		(!!)	/exclamdown
		(c|)	/cent
		(ct)	(")			% devpost synonym
		(L-)	/sterling
		(ps)	(")			% devpost synonym
		(xo)	/currency
		(cr)	(")			% devpost synonym
		(Y-)	/yen
		(yn)	(")			% devpost synonym
		(||)	/brokenbar		% missing
		(so)	/section
		(sc)	(")			% devpost synonym
		("")	/dieresis
		(:a)	(")			% devpost synonym
		(co)	/copyright
		(a_)	/ordfeminine
		(<<)	/guillemotleft
		(-,)	/logicalnot
		(hy)	/hyphen
		(--)	(")			% synonym
		(ro)	/registered
		(rg)	(")			% devpost synonym
		(-^)	/macron
		(-a)	(")			% devpost synonym
		(0^)	/degree			% missing
		(+-)	/plusminus		% missing
		(2^)	/twosuperior		% missing
		(3^)	/threesuperior		% missing
		(\\')	/acute
		(aa)	(")			% devpost synonym
		(/u)	/mu			% missing
		(P!)	/paragraph
		(pg)	(")			% devpost synonym
		(.^)	/periodcentered
		(,,)	/cedilla
		(,a)	(")			% devpost synonym
		(1^)	/onesuperior		% missing
		(o_)	/ordmasculine
		(>>)	/guillemotright
		(14)	/onequarter		% missing
		(12)	/onehalf		% missing
		(34)	/threequarters		% missing
		(??)	/questiondown
		(A`)	/Agrave
		(A')	/Aacute
		(A^)	/Acircumflex
		(A~)	/Atilde
		(A")	/Adieresis
		(A*)	/Aring
		(AE)	/AE
		(C,)	/Ccedilla
		(E`)	/Egrave
		(E')	/Eacute
		(E^)	/Ecircumflex
		(E")	/Edieresis
		(I`)	/Igrave
		(I')	/Iacute
		(I^)	/Icircumflex
		(I")	/Idieresis
		(D-)	/Eth			% missing
		(N~)	/Ntilde
		(O`)	/Ograve
		(O')	/Oacute
		(O^)	/Ocircumflex
		(O~)	/Otilde
		(O")	/Odieresis
		(xx)	/multiply		% missing
		(O/)	/Oslash
		(U`)	/Ugrave
		(U')	/Uacute
		(U^)	/Ucircumflex
		(U")	/Udieresis
		(Y')	/Yacute			% missing
		(TH)	/Thorn			% missing
		(ss)	/germandbls
		(a`)	/agrave
		(a')	/aacute
		(a^)	/acircumflex
		(a~)	/atilde
		(a")	/adieresis
		(a*)	/aring
		(ae)	/ae
		(c,)	/ccedilla
		(e`)	/egrave
		(e')	/eacute
		(e^)	/ecircumflex
		(e")	/edieresis
		(i`)	/igrave
		(i')	/iacute
		(i^)	/icircumflex
		(i")	/idieresis
		(d-)	/eth			% missing
		(n~)	/ntilde
		(o`)	/ograve
		(o')	/oacute
		(o^)	/ocircumflex
		(o~)	/otilde
		(o")	/odieresis
		(-:)	/divide			% missing
		(o/)	/oslash
		(u`)	/ugrave
		(u')	/uacute
		(u^)	/ucircumflex
		(u")	/udieresis
		(y')	/yacute			% missing
		(th)	/thorn			% missing
		(y")	/ydieresis
		(^a)	/circumflex		% devpost accent
		(~a)	/tilde			% devpost accent
		(Ua)	/breve			% devpost accent
		(.a)	/dotaccent		% devpost accent
		(oa)	/ring			% devpost accent
		("a)	/hungarumlaut		% devpost accent
		(Ca)	/ogonek			% devpost accent
		(va)	/caron			% devpost accent
	//End of StandardCharset
}

#
# DingbatsCharset guarantees changes in StandardCharset don't show up in ZD.
#

DingbatsCharset() {
	cat <<-'//End of DingbatsCharset'
		(!)	/exclam
		(")	/quotedbl
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(-)	/minus		% also hyphen in devpost
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(\\`)	/grave			% devpost character
		(ga)	(")			% synonym
		(!!)	/exclamdown
		(c|)	/cent
		(ct)	(")			% devpost synonym
		(L-)	/sterling
		(ps)	(")			% devpost synonym
		(xo)	/currency
		(cr)	(")			% devpost synonym
		(Y-)	/yen
		(yn)	(")			% devpost synonym
		(||)	/brokenbar		% missing
		(so)	/section
		(sc)	(")			% devpost synonym
		("")	/dieresis
		(co)	/copyright
		(a_)	/ordfeminine
		(<<)	/guillemotleft
		(-,)	/logicalnot
		(hy)	/hyphen
		(--)	(")			% synonym
		(ro)	/registered
		(rg)	(")			% devpost synonym
		(-^)	/macron
		(0^)	/degree			% missing
		(+-)	/plusminus		% missing
		(2^)	/twosuperior		% missing
		(3^)	/threesuperior		% missing
		(\\')	/acute
		(aa)	(")			% devpost synonym
		(/u)	/mu			% missing
		(P!)	/paragraph
		(pg)	(")			% devpost synonym
		(.^)	/periodcentered
		(,,)	/cedilla
		(1^)	/onesuperior		% missing
		(o_)	/ordmasculine
		(>>)	/guillemotright
		(14)	/onequarter		% missing
		(12)	/onehalf		% missing
		(34)	/threequarters		% missing
		(??)	/questiondown
		(A`)	/Agrave
		(A')	/Aacute
		(A^)	/Acircumflex
		(A~)	/Atilde
		(A")	/Adieresis
		(A*)	/Aring
		(AE)	/AE
		(C,)	/Ccedilla
		(E`)	/Egrave
		(E')	/Eacute
		(E^)	/Ecircumflex
		(E")	/Edieresis
		(I`)	/Igrave
		(I')	/Iacute
		(I^)	/Icircumflex
		(I")	/Idieresis
		(D-)	/Eth			% missing
		(N~)	/Ntilde
		(O`)	/Ograve
		(O')	/Oacute
		(O^)	/Ocircumflex
		(O~)	/Otilde
		(O")	/Odieresis
		(xx)	/multiply		% missing
		(O/)	/Oslash
		(U`)	/Ugrave
		(U')	/Uacute
		(U^)	/Ucircumflex
		(U")	/Udieresis
		(Y')	/Yacute			% missing
		(TH)	/Thorn			% missing
		(ss)	/germandbls
		(a`)	/agrave
		(a')	/aacute
		(a^)	/acircumflex
		(a~)	/atilde
		(a")	/adieresis
		(a*)	/aring
		(ae)	/ae
		(c,)	/ccedilla
		(e`)	/egrave
		(e')	/eacute
		(e^)	/ecircumflex
		(e")	/edieresis
		(i`)	/igrave
		(i')	/iacute
		(i^)	/icircumflex
		(i")	/idieresis
		(d-)	/eth			% missing
		(n~)	/ntilde
		(o`)	/ograve
		(o')	/oacute
		(o^)	/ocircumflex
		(o~)	/otilde
		(o")	/odieresis
		(-:)	/divide			% missing
		(o/)	/oslash
		(u`)	/ugrave
		(u')	/uacute
		(u^)	/ucircumflex
		(u")	/udieresis
		(y')	/yacute			% missing
		(th)	/thorn			% missing
		(y")	/ydieresis
	//End of DingbatsCharset
}

SymbolCharset() {
	cat <<-'//End of SymbolCharset'
		(---)	/exclam
		(fa)	/universal
		(---)	/numbersign
		(te)	/existential
		(---)	/percent
		(---)	/ampersand
		(st)	/suchthat
		(---)	/parenleft
		(---)	/parenright
		(**)	/asteriskmath
		(pl)	/plus
		(---)	/comma
		(mi)	/minus
		(---)	/period
		(sl)	/slash
		(---)	/zero
		(---)	/one
		(---)	/two
		(---)	/three
		(---)	/four
		(---)	/five
		(---)	/six
		(---)	/seven
		(---)	/eight
		(---)	/nine
		(---)	/colon
		(---)	/semicolon
		(<)	/less
		(eq)	/equal
		(>)	/greater
		(---)	/question
		(cg)	/congruent
		(*A)	/Alpha
		(*B)	/Beta
		(*X)	/Chi
		(*D)	/Delta
		(*E)	/Epsilon
		(*F)	/Phi
		(*G)	/Gamma
		(*Y)	/Eta
		(*I)	/Iota
		(---)	/theta1
		(*K)	/Kappa
		(*L)	/Lambda
		(*M)	/Mu
		(*N)	/Nu
		(*O)	/Omicron
		(*P)	/Pi
		(*H)	/Theta
		(*R)	/Rho
		(*S)	/Sigma
		(*T)	/Tau
		(*U)	/Upsilon
		(ts)	/sigma1
		(*W)	/Omega
		(*C)	/Xi
		(*Q)	/Psi
		(*Z)	/Zeta
		(---)	/bracketleft
		(tf)	/therefore
		(---)	/bracketright
		(pp)	/perpendicular
		(ul)	/underscore
		(_)	(")			% synonym
		(rn)	/radicalex
		(*a)	/alpha
		(*b)	/beta
		(*x)	/chi
		(*d)	/delta
		(*e)	/epsilon
		(*f)	/phi
		(*g)	/gamma
		(*y)	/eta
		(*i)	/iota
		(---)	/phi1
		(*k)	/kappa
		(*l)	/lambda
		(*m)	/mu
		(*n)	/nu
		(*o)	/omicron
		(*p)	/pi
		(*h)	/theta
		(*r)	/rho
		(*s)	/sigma
		(*t)	/tau
		(*u)	/upsilon
		(---)	/omega1
		(*w)	/omega
		(*c)	/xi
		(*q)	/psi
		(*z)	/zeta
		(---)	/braceleft
		(or)	/bar
		(---)	/braceright
		(ap)	/similar
		(---)	/Upsilon1
		(fm)	/minute
		(<=)	/lessequal
		(fr)	/fraction		% devpost character
		(if)	/infinity
		(fn)	/florin			% devpost character
		(---)	/club
		(---)	/diamond
		(---)	/heart
		(---)	/spade
		(ab)	/arrowboth
		(<-)	/arrowleft
		(ua)	/arrowup
		(->)	/arrowright
		(da)	/arrowdown
		(de)	/degree
		(+-)	/plusminus
		(---)	/second
		(>=)	/greaterequal
		(mu)	/multiply
		(pt)	/proportional
		(pd)	/partialdiff
		(bu)	/bullet
		(di)	/divide
		(!=)	/notequal
		(==)	/equivalence
		(~~)	/approxequal
		(el)	/ellipsis
		(av)	/arrowvertex
		(ah)	/arrowhorizex
		(CR)	/carriagereturn
		(af)	/aleph
		(If)	/Ifraktur
		(Rf)	/Rfraktur
		(ws)	/weierstrass
		(Ox)	/circlemultiply
		(O+)	/circleplus
		(es)	/emptyset
		(ca)	/intersection
		(cu)	/union
		(sp)	/propersuperset
		(ip)	/reflexsuperset
		(!b)	/notsubset
		(sb)	/propersubset
		(ib)	/reflexsubset
		(mo)	/element
		(!m)	/notelement
		(an)	/angle
		(gr)	/gradient
		(rg)	/registerserif
		(co)	/copyrightserif
		(tm)	/trademarkserif
		(---)	/product
		(sr)	/radical
		(c.)	/dotmath
		(no)	/logicalnot
		(l&)	/logicaland
		(l|)	/logicalor
		(---)	/arrowdblboth
		(---)	/arrowdblleft
		(---)	/arrowdblup
		(---)	/arrowdblright
		(---)	/arrowdbldown
		(lz)	/lozenge
		(b<)	/angleleft
		(RG)	/registersans
		(CO)	/copyrightsans
		(TM)	/trademarksans
		(---)	/summation
		(LT)	/parenlefttp
		(br)	/parenleftex
		(LX)	(")			% synonym
		(LB)	/parenleftbt
		(lc)	/bracketlefttp
		(lx)	/bracketleftex
		(lf)	/bracketleftbt
		(lt)	/bracelefttp
		(lk)	/braceleftmid
		(lb)	/braceleftbt
		(bv)	/braceex
		(|)	(")			% synonym
		(b>)	/angleright
		(is)	/integral
		(---)	/integraltp
		(---)	/integralex
		(---)	/integralbt
		(RT)	/parenrighttp
		(RX)	/parenrightex
		(RB)	/parenrightbt
		(rc)	/bracketrighttp
		(rx)	/bracketrightex
		(rf)	/bracketrightbt
		(rt)	/bracerighttp
		(rk)	/bracerightmid
		(rb)	/bracerightbt
		(~=)	(55	0	1)	% charlib
	//End of SymbolCharset
}

SpecialCharset() {
	cat <<-'//End of SpecialCharset'
		(ru)	/underscore
		('')	/quotedblright		% devpost character
		(``)	/quotedblleft		% devpost character
		(dg)	/dagger			% devpost character
		(dd)	/daggerdbl		% devpost character
		(en)	/endash			% devpost character
		(\\-)	(")			% synonym
		(em)	/emdash
%		(ff)	(60	2	1)	% charlib
%		(Fi)	(84	2	1)	% charlib
%		(Fl)	(84	2	1)	% charlib
		(14)	(75	2	1)	% charlib
		(12)	(75	2	1)	% charlib
		(34)	(75	2	1)	% charlib
		(bx)	(50	2	1)	% charlib
		(ob)	(38	2	1)	% charlib
		(ci)	(75	0	1)	% charlib
		(sq)	(50	2	1)	% charlib
		(Sl)	(50	2	1)	% charlib
		(L1)	(110	1	2)	% charlib
		(LA)	(110	1	2)	% charlib
		(LV)	(110	3	1)	% charlib
		(LH)	(210	1	1)	% charlib
		(lh)	(100	0	1)	% charlib
		(rh)	(100	0	1)	% charlib
		(lH)	(100	0	1)	% charlib
		(rH)	(100	0	1)	% charlib
		(PC)	(220	2	1)	% charlib
		(DG)	(185	2	1)	% charlib
	//End of SpecialCharset
}

#
# Latin1 ensures a font uses the ISOLatin1Encoding vector, although only
# text fonts should be re-encoded. Downloading the Encoding vector doesn't
# often make sense. No ISOLatin1Encoding array likely means ROM based fonts
# on your printer are incomplete. Type 1 fonts with a full Latin1 character
# set appeared sometime after Version 50.0.
#

Latin1() {
	if [ "$DOWNLOADVECTOR" = TRUE ]; then
		cat <<-'//End of ISOLatin1Encoding'
			/ISOLatin1Encoding [
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/space
				/exclam
				/quotedbl
				/numbersign
				/dollar
				/percent
				/ampersand
				/quoteright
				/parenleft
				/parenright
				/asterisk
				/plus
				/comma
				/minus
				/period
				/slash
				/zero
				/one
				/two
				/three
				/four
				/five
				/six
				/seven
				/eight
				/nine
				/colon
				/semicolon
				/less
				/equal
				/greater
				/question
				/at
				/A
				/B
				/C
				/D
				/E
				/F
				/G
				/H
				/I
				/J
				/K
				/L
				/M
				/N
				/O
				/P
				/Q
				/R
				/S
				/T
				/U
				/V
				/W
				/X
				/Y
				/Z
				/bracketleft
				/backslash
				/bracketright
				/asciicircum
				/underscore
				/quoteleft
				/a
				/b
				/c
				/d
				/e
				/f
				/g
				/h
				/i
				/j
				/k
				/l
				/m
				/n
				/o
				/p
				/q
				/r
				/s
				/t
				/u
				/v
				/w
				/x
				/y
				/z
				/braceleft
				/bar
				/braceright
				/asciitilde
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/dotlessi
				/grave
				/acute
				/circumflex
				/tilde
				/macron
				/breve
				/dotaccent
				/dieresis
				/.notdef
				/ring
				/cedilla
				/.notdef
				/hungarumlaut
				/ogonek
				/caron
				/space
				/exclamdown
				/cent
				/sterling
				/currency
				/yen
				/brokenbar
				/section
				/dieresis
				/copyright
				/ordfeminine
				/guillemotleft
				/logicalnot
				/hyphen
				/registered
				/macron
				/degree
				/plusminus
				/twosuperior
				/threesuperior
				/acute
				/mu
				/paragraph
				/periodcentered
				/cedilla
				/onesuperior
				/ordmasculine
				/guillemotright
				/onequarter
				/onehalf
				/threequarters
				/questiondown
				/Agrave
				/Aacute
				/Acircumflex
				/Atilde
				/Adieresis
				/Aring
				/AE
				/Ccedilla
				/Egrave
				/Eacute
				/Ecircumflex
				/Edieresis
				/Igrave
				/Iacute
				/Icircumflex
				/Idieresis
				/Eth
				/Ntilde
				/Ograve
				/Oacute
				/Ocircumflex
				/Otilde
				/Odieresis
				/multiply
				/Oslash
				/Ugrave
				/Uacute
				/Ucircumflex
				/Udieresis
				/Yacute
				/Thorn
				/germandbls
				/agrave
				/aacute
				/acircumflex
				/atilde
				/adieresis
				/aring
				/ae
				/ccedilla
				/egrave
				/eacute
				/ecircumflex
				/edieresis
				/igrave
				/iacute
				/icircumflex
				/idieresis
				/eth
				/ntilde
				/ograve
				/oacute
				/ocircumflex
				/otilde
				/odieresis
				/divide
				/oslash
				/ugrave
				/uacute
				/ucircumflex
				/udieresis
				/yacute
				/thorn
				/ydieresis
			] def
		//End of ISOLatin1Encoding
	fi

	echo "ISOLatin1Encoding /$1 ReEncode"
}

#
# Generating functions output PostScript programs that build font width
# tables or a typesetter description file. Send the program to a printer
# and the complete table will come back on the serial port. All write on
# stdout and assume the prologue and other required PostScript files are
# all available.
#

Proportional() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		# Get <>_ and | from S. Use accents for ascii ^ and ~.
		StandardCharset | awk '
			$1 == "(<)" && $2 == "/less" {$1 = "(---)"}
			$1 == "(>)" && $2 == "/greater" {$1 = "(---)"}
			$1 == "(_)" && $2 == "/underscore" {$1 = "(---)"}
			$1 == "(|)" && $2 == "/bar" {$1 = "(---)"}
			$1 == "(^)" && $2 == "/asciicircum" {
				printf "(^)\t/circumflex\n"
				$1 = "(---)"
			}
			$1 == "(~)" && $2 == "/asciitilde" {
				printf "(~)\t/tilde\n"
				$1 = "(---)"
			}
			{printf "%s\t%s\n", $1, $2}
		'
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

FixedWidth() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		StandardCharset
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Dingbats() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		DingbatsCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ {
			printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2
		}'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(   ) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Greek() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Symbol() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Special() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SpecialCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S1 SelectFont"

	echo "(# Times-Roman special font\\\\n) Print"
	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

#
# The DESC file doesn't have to be built on a printer. It's only here for
# consistency.
#

Description() {
	echo "/charset ["	# awk - so the stack doesn't overflow
		StandardCharset | awk '{print $1}'
		SymbolCharset | awk '{print $1}'
		SpecialCharset | awk '{print $1}'
	echo "] def"

	cat <<-//DESC
		(#Device Description - Latin1 character set

		PDL PostScript
		Encoding Latin1

		fonts 10 R I B BI CW H HI HB S1 S
		sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
		23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
		48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
		120 125 130 135 140 145 150 155 160 0
		res $RESOLUTION
		hor 1
		vert 1
		unitwidth $UNITWIDTH

		) Print
	//DESC
	echo "(charset\\\\n) Print"
	echo "BuildDescCharset"
	echo "(\\\\n) Print"
}

0707070014231124151006440057030057030000010447200522627502100004100000044161post.src/devLatin1/shell.lib.old#
# Shell library - for building devLatin1 tables.
#
# The full ISO Latin1 alphabet appeared in Adobe's interpreter sometime
# around Version 50.0. Prior to that ROM resident Type 1 text fonts were
# missing 18 characters that are now part of the Latin1 standard. Width
# tables will not build on printers that lack full Latin1 support. Error
# message will likely reflect a missing ISOLatin1Encoding array.
#

RESOLUTION=720
UNITWIDTH=10

OCTALESCAPES=${OCTALESCAPES:-160}	# <= code means add \0ddd names
DOWNLOADVECTOR=FALSE			# TRUE can mean incomplete tables

#
# BuiltinTables returns command lines that generate PostScript programs
# for building a typesetter description file and font width tables for
# a relatively standard collection of fonts. Use awk to select a command
# line or modify an existing command to build a width table for a new
# font.
#

BuiltinTables() {
	cat <<-'//End of BuiltinTables'
		Proportional	R	Times-Roman
		Proportional	I	Times-Italic
		Proportional	B	Times-Bold
		Proportional	BI	Times-BoldItalic
		Proportional	AB	AvantGarde-Demi
		Proportional	AI	AvantGarde-BookOblique
		Proportional	AR	AvantGarde-Book
		Proportional	AX	AvantGarde-DemiOblique
		Proportional	H	Helvetica
		Proportional	HB	Helvetica-Bold
		Proportional	HI	Helvetica-Oblique
		Proportional	HX	Helvetica-BoldOblique
		Proportional	Hb	Helvetica-Narrow-Bold
		Proportional	Hi	Helvetica-Narrow-Oblique
		Proportional	Hr	Helvetica-Narrow
		Proportional	Hx	Helvetica-Narrow-BoldOblique
		Proportional	KB	Bookman-Demi
		Proportional	KI	Bookman-LightItalic
		Proportional	KR	Bookman-Light
		Proportional	KX	Bookman-DemiItalic
		Proportional	NB	NewCenturySchlbk-Bold
		Proportional	NI	NewCenturySchlbk-Italic
		Proportional	NR	NewCenturySchlbk-Roman
		Proportional	NX	NewCenturySchlbk-BoldItalic
		Proportional	PA	Palatino-Roman
		Proportional	PB	Palatino-Bold
		Proportional	PI	Palatino-Italic
		Proportional	PX	Palatino-BoldItalic
		Proportional	ZI	ZapfChancery-MediumItalic
		FixedWidth	C	Courier
		FixedWidth	CB	Courier-Bold
		FixedWidth	CI	Courier-Oblique
		FixedWidth	CO	Courier
		FixedWidth	CW	Courier
		FixedWidth	CX	Courier-BoldOblique
		Dingbats	ZD	ZapfDingbats
		Greek		GR	Symbol
		Symbol		S	Symbol
		Special		S1	Times-Roman
		Description	DESC	---
	//End of BuiltinTables
}

#
# AllTables prints the complete list of builtin font names.
#

AllTables() {
	BuiltinTables | awk '{print $2}'
}

#
# Charset functions generate keyword/value pairs (as PostScript objects)
# that describe the character set available in a font. The keyword is a
# PostScript string that represents troff's name for the character. The
# value is usually the literal name (i.e. begins with a /) assigned to
# the character in the PostScript font. The value can also be an integer
# or a PostScript string. An integer value is used as an index in the
# current font's Encoding array. A string value is returned to the host
# unchanged when the entry for the character is constructed. Entries that
# have (") as their value are synonyms for the preceeding character.
#
# The 18 characters missing from ROM resident fonts on older printers are
# flagged with the PostScript comment "% missing".
#

StandardCharset() {
	cat <<-'//End of StandardCharset'
		(!)	/exclam
		(")	/quotedbl
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(-)	/minus		% also hyphen in devpost
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(\\`)	/grave			% devpost character
		(ga)	(")			% synonym
		(!!)	/exclamdown
		(c|)	/cent
		(ct)	(")			% devpost synonym
		(L-)	/sterling
		(ps)	(")			% devpost synonym
		(xo)	/currency
		(cr)	(")			% devpost synonym
		(Y-)	/yen
		(yn)	(")			% devpost synonym
		(||)	/brokenbar		% missing
		(so)	/section
		(sc)	(")			% devpost synonym
		("")	/dieresis
		(co)	/copyright
		(a_)	/ordfeminine
		(<<)	/guillemotleft
		(-,)	/logicalnot
		(hy)	/hyphen
		(--)	(")			% synonym
		(ro)	/registered
		(rg)	(")			% devpost synonym
		(-^)	/macron
		(0^)	/degree			% missing
		(+-)	/plusminus		% missing
		(2^)	/twosuperior		% missing
		(3^)	/threesuperior		% missing
		(\\')	/acute
		(aa)	(")			% devpost synonym
		(/u)	/mu			% missing
		(P!)	/paragraph
		(pg)	(")			% devpost synonym
		(.^)	/periodcentered
		(,,)	/cedilla
		(1^)	/onesuperior		% missing
		(o_)	/ordmasculine
		(>>)	/guillemotright
		(14)	/onequarter		% missing
		(12)	/onehalf		% missing
		(34)	/threequarters		% missing
		(??)	/questiondown
		(A`)	/Agrave
		(A')	/Aacute
		(A^)	/Acircumflex
		(A~)	/Atilde
		(A")	/Adieresis
		(A*)	/Aring
		(AE)	/AE
		(C,)	/Ccedilla
		(E`)	/Egrave
		(E')	/Eacute
		(E^)	/Ecircumflex
		(E")	/Edieresis
		(I`)	/Igrave
		(I')	/Iacute
		(I^)	/Icircumflex
		(I")	/Idieresis
		(D-)	/Eth			% missing
		(N~)	/Ntilde
		(O`)	/Ograve
		(O')	/Oacute
		(O^)	/Ocircumflex
		(O~)	/Otilde
		(O")	/Odieresis
		(xx)	/multiply		% missing
		(O/)	/Oslash
		(U`)	/Ugrave
		(U')	/Uacute
		(U^)	/Ucircumflex
		(U")	/Udieresis
		(Y')	/Yacute			% missing
		(TH)	/Thorn			% missing
		(ss)	/germandbls
		(a`)	/agrave
		(a')	/aacute
		(a^)	/acircumflex
		(a~)	/atilde
		(a")	/adieresis
		(a*)	/aring
		(ae)	/ae
		(c,)	/ccedilla
		(e`)	/egrave
		(e')	/eacute
		(e^)	/ecircumflex
		(e")	/edieresis
		(i`)	/igrave
		(i')	/iacute
		(i^)	/icircumflex
		(i")	/idieresis
		(d-)	/eth			% missing
		(n~)	/ntilde
		(o`)	/ograve
		(o')	/oacute
		(o^)	/ocircumflex
		(o~)	/otilde
		(o")	/odieresis
		(-:)	/divide			% missing
		(o/)	/oslash
		(u`)	/ugrave
		(u')	/uacute
		(u^)	/ucircumflex
		(u")	/udieresis
		(y')	/yacute			% missing
		(th)	/thorn			% missing
		(y")	/ydieresis
	//End of StandardCharset
}

SymbolCharset() {
	cat <<-'//End of SymbolCharset'
		(---)	/exclam
		(fa)	/universal
		(---)	/numbersign
		(te)	/existential
		(---)	/percent
		(---)	/ampersand
		(st)	/suchthat
		(---)	/parenleft
		(---)	/parenright
		(**)	/asteriskmath
		(pl)	/plus
		(---)	/comma
		(mi)	/minus
		(---)	/period
		(sl)	/slash
		(---)	/zero
		(---)	/one
		(---)	/two
		(---)	/three
		(---)	/four
		(---)	/five
		(---)	/six
		(---)	/seven
		(---)	/eight
		(---)	/nine
		(---)	/colon
		(---)	/semicolon
		(<)	/less
		(eq)	/equal
		(>)	/greater
		(---)	/question
		(cg)	/congruent
		(*A)	/Alpha
		(*B)	/Beta
		(*X)	/Chi
		(*D)	/Delta
		(*E)	/Epsilon
		(*F)	/Phi
		(*G)	/Gamma
		(*Y)	/Eta
		(*I)	/Iota
		(---)	/theta1
		(*K)	/Kappa
		(*L)	/Lambda
		(*M)	/Mu
		(*N)	/Nu
		(*O)	/Omicron
		(*P)	/Pi
		(*H)	/Theta
		(*R)	/Rho
		(*S)	/Sigma
		(*T)	/Tau
		(*U)	/Upsilon
		(ts)	/sigma1
		(*W)	/Omega
		(*C)	/Xi
		(*Q)	/Psi
		(*Z)	/Zeta
		(---)	/bracketleft
		(tf)	/therefore
		(---)	/bracketright
		(pp)	/perpendicular
		(ul)	/underscore
		(_)	(")			% synonym
		(rn)	/radicalex
		(*a)	/alpha
		(*b)	/beta
		(*x)	/chi
		(*d)	/delta
		(*e)	/epsilon
		(*f)	/phi
		(*g)	/gamma
		(*y)	/eta
		(*i)	/iota
		(---)	/phi1
		(*k)	/kappa
		(*l)	/lambda
		(*m)	/mu
		(*n)	/nu
		(*o)	/omicron
		(*p)	/pi
		(*h)	/theta
		(*r)	/rho
		(*s)	/sigma
		(*t)	/tau
		(*u)	/upsilon
		(---)	/omega1
		(*w)	/omega
		(*c)	/xi
		(*q)	/psi
		(*z)	/zeta
		(---)	/braceleft
		(or)	/bar
		(---)	/braceright
		(ap)	/similar
		(---)	/Upsilon1
		(fm)	/minute
		(<=)	/lessequal
		(fr)	/fraction		% devpost character
		(if)	/infinity
		(fn)	/florin			% devpost character
		(---)	/club
		(---)	/diamond
		(---)	/heart
		(---)	/spade
		(ab)	/arrowboth
		(<-)	/arrowleft
		(ua)	/arrowup
		(->)	/arrowright
		(da)	/arrowdown
		(de)	/degree
		(+-)	/plusminus
		(---)	/second
		(>=)	/greaterequal
		(mu)	/multiply
		(pt)	/proportional
		(pd)	/partialdiff
		(bu)	/bullet
		(di)	/divide
		(!=)	/notequal
		(==)	/equivalence
		(~~)	/approxequal
		(el)	/ellipsis
		(av)	/arrowvertex
		(ah)	/arrowhorizex
		(CR)	/carriagereturn
		(af)	/aleph
		(If)	/Ifraktur
		(Rf)	/Rfraktur
		(ws)	/weierstrass
		(Ox)	/circlemultiply
		(O+)	/circleplus
		(es)	/emptyset
		(ca)	/intersection
		(cu)	/union
		(sp)	/propersuperset
		(ip)	/reflexsuperset
		(!b)	/notsubset
		(sb)	/propersubset
		(ib)	/reflexsubset
		(mo)	/element
		(!m)	/notelement
		(an)	/angle
		(gr)	/gradient
		(rg)	/registerserif
		(co)	/copyrightserif
		(tm)	/trademarkserif
		(---)	/product
		(sr)	/radical
		(c.)	/dotmath
		(no)	/logicalnot
		(l&)	/logicaland
		(l|)	/logicalor
		(---)	/arrowdblboth
		(---)	/arrowdblleft
		(---)	/arrowdblup
		(---)	/arrowdblright
		(---)	/arrowdbldown
		(lz)	/lozenge
		(b<)	/angleleft
		(RG)	/registersans
		(CO)	/copyrightsans
		(TM)	/trademarksans
		(---)	/summation
		(LT)	/parenlefttp
		(br)	/parenleftex
		(LX)	(")			% synonym
		(LB)	/parenleftbt
		(lc)	/bracketlefttp
		(lx)	/bracketleftex
		(lf)	/bracketleftbt
		(lt)	/bracelefttp
		(lk)	/braceleftmid
		(lb)	/braceleftbt
		(bv)	/braceex
		(|)	(")			% synonym
		(b>)	/angleright
		(is)	/integral
		(---)	/integraltp
		(---)	/integralex
		(---)	/integralbt
		(RT)	/parenrighttp
		(RX)	/parenrightex
		(RB)	/parenrightbt
		(rc)	/bracketrighttp
		(rx)	/bracketrightex
		(rf)	/bracketrightbt
		(rt)	/bracerighttp
		(rk)	/bracerightmid
		(rb)	/bracerightbt
		(~=)	(55	0	1)	% charlib
	//End of SymbolCharset
}

SpecialCharset() {
	cat <<-'//End of SpecialCharset'
		(ru)	/underscore
		('')	/quotedblright		% devpost character
		(``)	/quotedblleft		% devpost character
		(dg)	/dagger			% devpost character
		(dd)	/daggerdbl		% devpost character
		(en)	/endash			% devpost character
		(\\-)	(")			% synonym
		(em)	/emdash
%		(ff)	(60	2	1)	% charlib
%		(Fi)	(84	2	1)	% charlib
%		(Fl)	(84	2	1)	% charlib
		(14)	(75	2	1)	% charlib
		(12)	(75	2	1)	% charlib
		(34)	(75	2	1)	% charlib
		(bx)	(50	2	1)	% charlib
		(ob)	(38	2	1)	% charlib
		(ci)	(75	0	1)	% charlib
		(sq)	(50	2	1)	% charlib
		(Sl)	(50	2	1)	% charlib
		(L1)	(110	1	2)	% charlib
		(LA)	(110	1	2)	% charlib
		(LV)	(110	3	1)	% charlib
		(LH)	(210	1	1)	% charlib
		(lh)	(100	0	1)	% charlib
		(rh)	(100	0	1)	% charlib
		(lH)	(100	0	1)	% charlib
		(rH)	(100	0	1)	% charlib
		(PC)	(220	2	1)	% charlib
		(DG)	(185	2	1)	% charlib
	//End of SpecialCharset
}

#
# Latin1 ensures a font uses the ISOLatin1Encoding vector, although only
# text fonts should be re-encoded. Downloading the Encoding vector doesn't
# often make sense. No ISOLatin1Encoding array likely means ROM based fonts
# on your printer are incomplete. Type 1 fonts with a full Latin1 character
# set appeared sometime after Version 50.0.
#

Latin1() {
	if [ "$DOWNLOADVECTOR" = TRUE ]; then
		cat <<-'//End of ISOLatin1Encoding'
			/ISOLatin1Encoding [
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/space
				/exclam
				/quotedbl
				/numbersign
				/dollar
				/percent
				/ampersand
				/quoteright
				/parenleft
				/parenright
				/asterisk
				/plus
				/comma
				/minus
				/period
				/slash
				/zero
				/one
				/two
				/three
				/four
				/five
				/six
				/seven
				/eight
				/nine
				/colon
				/semicolon
				/less
				/equal
				/greater
				/question
				/at
				/A
				/B
				/C
				/D
				/E
				/F
				/G
				/H
				/I
				/J
				/K
				/L
				/M
				/N
				/O
				/P
				/Q
				/R
				/S
				/T
				/U
				/V
				/W
				/X
				/Y
				/Z
				/bracketleft
				/backslash
				/bracketright
				/asciicircum
				/underscore
				/quoteleft
				/a
				/b
				/c
				/d
				/e
				/f
				/g
				/h
				/i
				/j
				/k
				/l
				/m
				/n
				/o
				/p
				/q
				/r
				/s
				/t
				/u
				/v
				/w
				/x
				/y
				/z
				/braceleft
				/bar
				/braceright
				/asciitilde
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/.notdef
				/dotlessi
				/grave
				/acute
				/circumflex
				/tilde
				/macron
				/breve
				/dotaccent
				/dieresis
				/.notdef
				/ring
				/cedilla
				/.notdef
				/hungarumlaut
				/ogonek
				/caron
				/space
				/exclamdown
				/cent
				/sterling
				/currency
				/yen
				/brokenbar
				/section
				/dieresis
				/copyright
				/ordfeminine
				/guillemotleft
				/logicalnot
				/hyphen
				/registered
				/macron
				/degree
				/plusminus
				/twosuperior
				/threesuperior
				/acute
				/mu
				/paragraph
				/periodcentered
				/cedilla
				/onesuperior
				/ordmasculine
				/guillemotright
				/onequarter
				/onehalf
				/threequarters
				/questiondown
				/Agrave
				/Aacute
				/Acircumflex
				/Atilde
				/Adieresis
				/Aring
				/AE
				/Ccedilla
				/Egrave
				/Eacute
				/Ecircumflex
				/Edieresis
				/Igrave
				/Iacute
				/Icircumflex
				/Idieresis
				/Eth
				/Ntilde
				/Ograve
				/Oacute
				/Ocircumflex
				/Otilde
				/Odieresis
				/multiply
				/Oslash
				/Ugrave
				/Uacute
				/Ucircumflex
				/Udieresis
				/Yacute
				/Thorn
				/germandbls
				/agrave
				/aacute
				/acircumflex
				/atilde
				/adieresis
				/aring
				/ae
				/ccedilla
				/egrave
				/eacute
				/ecircumflex
				/edieresis
				/igrave
				/iacute
				/icircumflex
				/idieresis
				/eth
				/ntilde
				/ograve
				/oacute
				/ocircumflex
				/otilde
				/odieresis
				/divide
				/oslash
				/ugrave
				/uacute
				/ucircumflex
				/udieresis
				/yacute
				/thorn
				/ydieresis
			] def
		//End of ISOLatin1Encoding
	fi

	echo "ISOLatin1Encoding /$1 ReEncode"
}

#
# Generating functions output PostScript programs that build font width
# tables or a typesetter description file. Send the program to a printer
# and the complete table will come back on the serial port. All write on
# stdout and assume the prologue and other required PostScript files are
# all available.
#

Proportional() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		# Get <>_ and | from S. Use accents for ascii ^ and ~.
		StandardCharset | awk '
			$1 == "(<)" && $2 == "/less" {$1 = "(---)"}
			$1 == "(>)" && $2 == "/greater" {$1 = "(---)"}
			$1 == "(_)" && $2 == "/underscore" {$1 = "(---)"}
			$1 == "(|)" && $2 == "/bar" {$1 = "(---)"}
			$1 == "(^)" && $2 == "/asciicircum" {
				printf "(^)\t/circumflex\n"
				$1 = "(---)"
			}
			$1 == "(~)" && $2 == "/asciitilde" {
				printf "(~)\t/tilde\n"
				$1 = "(---)"
			}
			{printf "%s\t%s\n", $1, $2}
		'
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

FixedWidth() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		StandardCharset
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Dingbats() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		StandardCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ {
			printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2
		}'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(   ) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Greek() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset | awk '$1 ~ /\(\*[a-zA-Z]\)/'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Symbol() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Special() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SpecialCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S1 SelectFont"

	echo "(# Times-Roman special font\\\\n) Print"
	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

#
# The DESC file doesn't have to be built on a printer. It's only here for
# consistency.
#

Description() {
	echo "/charset ["	# awk - so the stack doesn't overflow
		StandardCharset | awk '{print $1}'
		SymbolCharset | awk '{print $1}'
		SpecialCharset | awk '{print $1}'
	echo "] def"

	cat <<-//DESC
		(#Device Description - Latin1 character set

		PDL PostScript
		Encoding Latin1

		fonts 10 R I B BI CW H HI HB S1 S
		sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
		23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
		48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
		120 125 130 135 140 145 150 155 160 0
		res $RESOLUTION
		hor 1
		vert 1
		unitwidth $UNITWIDTH

		) Print
	//DESC
	echo "(charset\\\\n) Print"
	echo "BuildDescCharset"
	echo "(\\\\n) Print"
}

0707070014231122351006400057030057030000010447600522632546000002600000006137post.src/devLatin1/HMname H
fontname Helvetica
named in prologue
spacewidth 28
charset
!	28	2	33
"	36	2	34
dq	"
#	56	2	35
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
-	33	0	173
\0255	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	58	0	60
=	58	0	61
---	58	0	62
?	56	2	63
@	102	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
\	28	2	92
bs	"
]	28	3	93
^	33	2	147
---	47	2	94
---	56	1	95
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	26	3	124
}	33	3	125
~	33	2	148
---	58	0	126
\`	33	2	145
ga	"
!!	33	1	161
\0241	"
c|	56	3	162
\0242	"
ct	"
L-	56	2	163
\0243	"
ps	"
xo	56	0	164
\0244	"
cr	"
Y-	56	2	165
\0245	"
yn	"
||	26	3	166
\0246	"
so	56	3	167
\0247	"
sc	"
""	33	2	168
\0250	"
:a	"
co	74	2	169
\0251	"
a_	37	2	170
\0252	"
<<	56	0	171
\0253	"
-,	58	0	172
\0254	"
hy	33	0	173
\0255	"
--	58	0	45
ro	74	2	174
\0256	"
rg	"
-^	33	2	175
\0257	"
-a	"
0^	40	2	176
\0260	"
+-	58	2	177
\0261	"
2^	33	2	178
\0262	"
3^	33	2	179
\0263	"
\'	33	2	180
\0264	"
aa	"
/u	56	1	181
\0265	"
P!	54	3	182
\0266	"
pg	"
.^	28	0	183
\0267	"
,,	33	1	184
\0270	"
,a	"
1^	33	2	185
\0271	"
o_	37	2	186
\0272	"
>>	56	0	187
\0273	"
14	83	2	188
\0274	"
12	83	2	189
\0275	"
34	83	2	190
\0276	"
??	61	1	191
\0277	"
A`	67	2	192
\0300	"
A'	67	2	193
\0301	"
A^	67	2	194
\0302	"
A~	67	2	195
\0303	"
A"	67	2	196
\0304	"
A*	67	2	197
\0305	"
AE	100	2	198
\0306	"
C,	72	3	199
\0307	"
E`	67	2	200
\0310	"
E'	67	2	201
\0311	"
E^	67	2	202
\0312	"
E"	67	2	203
\0313	"
I`	28	2	204
\0314	"
I'	28	2	205
\0315	"
I^	28	2	206
\0316	"
I"	28	2	207
\0317	"
D-	72	2	208
\0320	"
N~	72	2	209
\0321	"
O`	78	2	210
\0322	"
O'	78	2	211
\0323	"
O^	78	2	212
\0324	"
O~	78	2	213
\0325	"
O"	78	2	214
\0326	"
xx	58	0	215
\0327	"
O/	78	2	216
\0330	"
U`	72	2	217
\0331	"
U'	72	2	218
\0332	"
U^	72	2	219
\0333	"
U"	72	2	220
\0334	"
Y'	67	2	221
\0335	"
TH	67	2	222
\0336	"
ss	61	2	223
\0337	"
a`	56	2	224
\0340	"
a'	56	2	225
\0341	"
a^	56	2	226
\0342	"
a~	56	2	227
\0343	"
a"	56	2	228
\0344	"
a*	56	2	229
\0345	"
ae	89	0	230
\0346	"
c,	50	1	231
\0347	"
e`	56	2	232
\0350	"
e'	56	2	233
\0351	"
e^	56	2	234
\0352	"
e"	56	2	235
\0353	"
i`	28	2	236
\0354	"
i'	28	2	237
\0355	"
i^	28	2	238
\0356	"
i"	28	2	239
\0357	"
d-	56	2	240
\0360	"
n~	56	2	241
\0361	"
o`	56	2	242
\0362	"
o'	56	2	243
\0363	"
o^	56	2	244
\0364	"
o~	56	2	245
\0365	"
o"	56	2	246
\0366	"
-:	58	0	247
\0367	"
o/	61	0	248
\0370	"
u`	56	2	249
\0371	"
u'	56	2	250
\0372	"
u^	56	2	251
\0373	"
u"	56	2	252
\0374	"
y'	50	3	253
\0375	"
th	56	3	254
\0376	"
y"	50	3	255
\0377	"
^a	33	2	147
~a	33	2	148
Ua	33	2	150
.a	33	2	151
oa	33	2	154
"a	33	2	157
Ca	33	1	158
va	33	2	159
0707070014230547600407550057030057030000021525670522633100200002100000000000post.src/psfiles0707070014230550011006400057030057030000011527600522633100200003400000001421post.src/psfiles/psfiles.mkMAKE=/bin/make
MAKEFILE=psfiles.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

POSTLIB=/usr/lib/postscript

all :

install :
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp *.ps ps.* $(POSTLIB)
	@for i in *.ps ps.*; do \
	    chmod 644 $(POSTLIB)/$$i; \
	    chgrp $(GROUP) $(POSTLIB)/$$i; \
	    chown $(OWNER) $(POSTLIB)/$$i; \
	done

clean :

clobber : clean

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014230547621006440057030057030000011527060522627502200003500000000540post.src/psfiles/ps.requests%
% Keywords begin with an @ in the first column. The value follows on the next
% line and includes everything up to next keyword line, except for comments
% which are lines that begin with % in the first column.
%

@manualfeed
	statusdict begin
		/manualfeedtimeout 300 def
		/manualfeed true def
	end

@ledgertray
	statusdict begin
		ledgertray
	end
0707070014230547631006440057030057030000011527100522627502200003200000013654post.src/psfiles/forms.ps%
% Procedures that let you print any number of pages on each sheet of paper. It's
% far from perfect and won't handle everything (eg. it's not recursive), but should
% be good enough for now. Assumes the default page coordinate system has been set
% up before setupforms is called. lastpage makes certain the last page is printed,
% and should be called immediately after the %%Trailer comment.
%
% Three lines of code needed for page image clipping have been commented out for
% now. It works, but can really slow things down on some versions of PostScript.
% Uncomment them if you want to clip pages.
%

/setupforms {
    /formsperpage exch def

    /currentform 0 def
    /slop 5 def
    /min {2 copy gt {exch} if pop} def

%
% Save the current environment so the real showpage can be restored when we're all
% done. Occasionally helps when a banner page is included with the job.
%

    /saveobj save def

%
% Number of rows and columns we'll need - may exchange them later.
%

    /columns formsperpage sqrt ceiling cvi def
    /rows formsperpage columns div ceiling cvi def

%
% Slop leaves a little room around the edge so page images can be outlined and have
% the borders show up. Distance is in default coordinates, so we need to figure out
% how it maps into user coordinates.
%

    6 array defaultmatrix
    6 array currentmatrix
    6 array invertmatrix
    6 array concatmatrix
    /tempmatrix exch def

    0 slop tempmatrix dtransform dup mul exch dup mul add sqrt
    /slop exch def

%
% Determine how big the image area is, using the clipping path bounding box minus
% a little and leave the coordinates of the lower left corner of the clipping path
% on the stack. Also temporarily set the size of each page (ie. formheight and
% formwidth) from the clipping path - just in case old software uses this stuff.
% Only works for coordinate systems that have been rotated by a multiple of 90
% degrees.
%

    newpath clippath pathbbox
    2 index sub dup /formheight exch def slop 2 mul sub /pageheight exch def
    2 index sub dup /formwidth exch def slop 2 mul sub /pagewidth exch def

%
% New translators all store the size of each page in default coordinates in the
% pagebbox array and it can be different than the size determined by the clipping
% path. If we can find pagebbox use it to set the real dimensions of each page.
% Leaves the coordinates of the lower left corner on the stack, (either from
% pagebbox or clippath) so four numbers are there when we're done.
%

    userdict /gotpagebbox known userdict /pagebbox known and {
	newpath
	pagebbox 0 get pagebbox 1 get tempmatrix transform moveto
	pagebbox 0 get pagebbox 3 get tempmatrix transform lineto
	pagebbox 2 get pagebbox 3 get tempmatrix transform lineto
	pagebbox 2 get pagebbox 1 get tempmatrix transform lineto
	closepath pathbbox
	2 index sub /formheight exch def
	2 index sub /formwidth exch def
    } {2 copy} ifelse

%
% Top two numbers are the displacement from the job's origin to the lower left
% corner of each page image when we finish setting up the new coordinate system.
%

    /ycorner exch def
    /xcorner exch def

%
% The two numbers left on the stack are the coordinates of the lower left corner
% of the clipping path. Go there and then up a bit so page images can be outlined.
%

    translate
    slop slop translate

%
% If the page is wider than high we may be able to do better if we exchange rows
% and columns. Won't make a difference in the current orientation or if rows and
% columns are the same.
%

    pagewidth pageheight gt {
	rows columns /rows exch def /columns exch def
    } if

%
% Find the orientation and scaling that makes things as large as possible. More
% than what's really needed. First calculation essentially finds the minimum of
% 1/rows and 1/columns.
%

    pagewidth formwidth columns mul div pageheight formheight rows mul div min
    pageheight formwidth columns mul div pagewidth formheight rows mul div min

    2 copy lt {
	rotation 1 eq {
	    landscape {
		0 pageheight translate
		-90 rotate
	    }{
		pagewidth 0 translate
		90 rotate
	    } ifelse
	}{
	    landscape {
		pagewidth 0 translate
		90 rotate
	    }{
		0 pageheight translate
		-90 rotate
	    } ifelse
	} ifelse
	pagewidth pageheight /pagewidth exch def /pageheight exch def
	exch
    } if

%
% Second number from the top is the best choice. Scale so everything will fit on
% the current page, go back to the original origin, and then get ready for the
% first page - which goes in the upper left corner.
%

    pop dup dup scale
    xcorner neg ycorner neg translate
    0 rows 1 sub formheight mul translate

%
% Try to center everything on the page - scaling we used is on top of the stack.
%

    dup pagewidth exch div formwidth columns mul sub 2 div
    exch pageheight exch div formheight rows mul sub 2 div translate

%
% Redefine showpage.
%

    /!PreForms~showpage~ /showpage load def		% save current showpage

    /showpage {
	saveobj restore
%	initclip
	formsperpage 1 gt {
	    gsave .1 setlinewidth outlineform stroke grestore
	} if
	formwidth 0 translate
	/currentform currentform 1 add def
	currentform columns mod 0 eq {
	    columns formwidth mul neg formheight neg translate
	} if
	currentform formsperpage mod 0 eq {
	    gsave !PreForms~showpage~ grestore
	    currentform columns mod formwidth mul neg
	    formsperpage columns idiv formheight mul translate
	    /currentform 0 def
	} if
%	outlineform clip newpath
	/saveobj save def
    } bind def

    /outlineform {
	newpath
	xcorner ycorner moveto
	formwidth 0 rlineto
	0 formheight rlineto
	formwidth neg 0 rlineto
	closepath
    } bind def

    /lastpage {
	formsperpage 1 gt {
	    currentform 0 ne {
		/saveobj save def
		0 1 formsperpage currentform sub formsperpage mod {
		    pop showpage
		} for
		saveobj restore
	    } if
	    saveobj restore
	    saveobj restore
	} if
    } def

%
% Clip the first page image and save the environment we just set up, including
% the redefined showpage.
%

%   outlineform clip
    newpath
    /saveobj save def
} def
0707070014230547641006440057030057030000011527200522627502200003500000005107post.src/psfiles/baseline.ps%
% Stuff used to draw or set text along a baseline specified by parametric equations
% for x and y.
%

/left -1 def
/center 0 def
/right 1 def

/baselinedict 50 dict def

/newbaseline {
	baselinedict begin
		/g' exch bind def
		/f' exch bind def
		/g  exch bind def
		/f  exch bind def

		counttomark 2 eq {/hoffset exch def} if
		/res exch def

		/t 0 def
		/s 0 def
		/voffset false def
		cleartomark
	end
} bind def

/drawfunnytext {
	baselinedict begin
		/t exch def
		/mode exch def
		/str exch def

		mode left eq {
			/leftstring emptystring def
			/rightstring str def
		} if

		mode right eq {
			/leftstring str reversestring def
			/rightstring emptystring def
		} if

		mode center eq {
			str splitstring
			/rightstring exch def
			/leftstring exch reversestring def
		} if

		gsave currentpoint translate leftstring left t baselineshow grestore
		gsave currentpoint translate rightstring right t baselineshow grestore

		/t 0 def
		/s 0 def
		/voffset false def
		cleartomark
	end
} bind def

/setfunnytext {
	baselinedict begin
		/vpos exch def
		/hpos exch def
		/str  exch def

		voffset vpos ne {
			/voffset vpos def
			/t 0 def
			/s hoffset def
		} if

		gsave
			hoffset voffset translate
			0 0 moveto
			/ds hpos s sub def
			/dt ds t f' dup mul t g' dup mul add sqrt res mul div def
			/s s ds add def
			/t t dt add def
			str right t baselineshow
		grestore
	end
} bind def

baselinedict begin

/f  {} bind def
/g  {pop 0} bind def
/f' {pop 1} bind def
/g' {pop 0} bind def

/s 0 def
/t 0 def
/res 72 def

/onecharstring ( ) def
/emptystring () def

/baselineshow {
	/t exch def
	/mode exch def
	/str exch def

	gsave
		t f res mul t g res mul translate
		0 0 moveto
		t g' t f' atan rotate
		{
			mode right eq {pop} if
			grestore gsave
			onecharstring 0 3 -1 roll put onecharstring stringwidth pop
			/ds exch mode mul def
			/dt ds t f' dup mul t g' dup mul add sqrt res mul div def
			/t t dt add def
			/s s ds add def
			t f res mul t g res mul translate
			0 0 moveto
			t g' t f' atan rotate
			mode left eq {pop} if
		} str kshow
	grestore
} bind def

/reversestring {
	/str1 exch def

	/str2 str1 length string def
	/i 0 def
	/n str1 length 1 sub def

	{
		str1 n get str2 exch i exch put
		/i i 1 add def
		/n n 1 sub def
		n 0 lt {exit} if
	} loop
	str2
} bind def

/splitstring {
	/str1 exch def

	/len str1 stringwidth pop def
	/s 0 def
	/n 0 def
	str1 length {
		str1 n get onecharstring exch 0 exch put
		/s onecharstring stringwidth pop s add def
		s len 2 div ge {exit} if
		/n n 1 add def
	} repeat
	str1 0 n 1 add getinterval
	str1 n str1 length n sub getinterval
} bind def

end
0707070014230547651006440057030057030000011527160522627502200003200000002540post.src/psfiles/color.ps%
% Color and reverse video support for dpost. A call made to setcolor with two
% arguments implies reverse video printing.
%

/rgb {setrgbcolor} bind def
/hsb {sethsbcolor} bind def

/colordict 50 dict dup begin
	/red			{ 1 0 0 } def
	/green			{ 0 1 0 } def
	/blue			{ 0 0 1 } def
	/cyan			{ 0 1 1 } def
	/magenta		{ 1 0 1 } def
	/yellow			{ 1 1 0 } def
	/white			{ 1 1 1 } def
	/black			{ 0 0 0 } def
end def

/setcolor {
	counttomark 1 eq {
		dup colordict exch known not {pop /black} if
		colordict exch get exec setrgbcolor
	} if
	counttomark 2 eq {
		/backcolor exch def
		/textcolor exch def
		colordict backcolor known not colordict textcolor known not or {
			/backcolor colordict /black get def
			/textcolor colordict /white get def
		} if
		/backcolor colordict backcolor get def
		/textcolor colordict textcolor get def
		/dY1 0 def
		/dY2 0 def
		textcolor exec setrgbcolor
	} if
} bind def

/drawrvbox {
	/x2 exch def
	/x1 exch def

	currentpoint dup
	/y1 exch def
	/y2 exch def pop

	dY1 0 eq dY2 0 eq and {
		currentfont /FontBBox get aload pop
		currentfont /FontMatrix get dtransform /dY2 exch def pop
		currentfont /FontMatrix get dtransform /dY1 exch def pop
	} if

	/y1 y1 dY1 add def
	/y2 y2 dY2 add def

	backcolor exec setrgbcolor
	newpath
	x1 y1 moveto
	x2 y1 lineto
	x2 y2 lineto
	x1 y2 lineto
	closepath fill
	textcolor exec setrgbcolor
} bind def
0707070014230547661006440057030057030000011527070522627502200003200000001611post.src/psfiles/shade.ps%
% Shading support - primarily for ASCII file translators.
%

/grays [0.98 0.9 0.75 0.6] def

/setshade {
	/level exch def
	level 0 le {
		/textgray 0 def
		/backgray 1 def
	}{
		/backgray level grays length gt
			{/textgray 1 def 0}
			{/textgray 0 def grays level 1 sub get}
		ifelse def
	} ifelse
	textgray setgray
	/dY1 0 def
	/dY2 0 def
} bind def

/drawrvbox {
	/x2 exch charwidth mul def
	/x1 exch charwidth mul def

	x1 x2 lt {
		dup		% expects y on top
		/y1 exch linespace mul def
		/y2 y1 def

		dY1 0 eq dY2 0 eq and {
			currentfont /FontBBox get aload pop
			160 sub
			currentfont /FontMatrix get dtransform /dY2 exch def pop
			100 add
			currentfont /FontMatrix get dtransform /dY1 exch def pop
		} if

		/y1 y1 dY1 add def
		/y2 y2 dY2 add def

		backgray setgray
		newpath
		x1 y1 moveto
		x2 y1 lineto
		x2 y2 lineto
		x1 y2 lineto
		closepath fill
	} if
	textgray setgray
} bind def
0707070014230547671006440057030057030000011527230522627502200003600000001267post.src/psfiles/roundpage.ps%
% Tries to round clipping path dimensions, as stored in array pagebbox, so they
% match one of the known sizes in the papersizes array. Lower left coordinates
% are always set to 0.
%

/roundpagebbox {
    7 dict begin
	/papersizes [8.5 inch 11 inch 14 inch 17 inch] def

	/mappapersize {
		/val exch def
		/slop .5 inch def
		/diff slop def
		/j 0 def
		0 1 papersizes length 1 sub {
			/i exch def
			papersizes i get val sub abs
			dup diff le {/diff exch def /j i def} {pop} ifelse
		} for
		diff slop lt {papersizes j get} {val} ifelse
	} def

	pagebbox 0 0 put
	pagebbox 1 0 put
	pagebbox dup 2 get mappapersize 2 exch put
	pagebbox dup 3 get mappapersize 3 exch put
    end
} bind def

0707070014230547701006440057030057030000011527240522627502200003700000001356post.src/psfiles/fatcourier.ps%
% Fat versions of the stroked Courier and Courier-Oblique - from Johnathan Shopiro.
% Can be selectively pulled in using the -C option that's available with all the
% PostScript translators or permanently added to any of the prologues. Helps on
% Linotronic typesetters, where Courier and Courier-Oblique are too light!
%

/newdict /Courier findfont length 1 add dict def
/Courier findfont {
	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
newdict /StrokeWidth 60 put
/Courier newdict definefont pop

/newdict /Courier-Oblique findfont length 1 add dict def
/Courier-Oblique findfont {
	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
newdict /StrokeWidth 60 put
/Courier-Oblique newdict definefont pop
0707070014230547711006440057030057030000011527300522627502200003000000006066post.src/psfiles/aps.ps%
% Tune things up so Linotronic output looks more like the APS-5. Pull this file
% into dpost output using the -C option. To get the best looking output run dpost
% with the -e2 option and use special font files that look like the APS tables but
% have character codes (ie. the fourth column in the width tables) appropriate for
% PostScript fonts. Widths in these tables must be for APS fonts!
%
% Start with fat versions of the stroked Courier and Courier-Oblique fonts - from
% Johnathan Shopiro.
%

/newdict /Courier findfont length dict def
/Courier findfont {
	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
newdict /StrokeWidth 65 put
/Courier newdict definefont pop

/newdict /Courier-Oblique findfont length dict def
/Courier-Oblique findfont {
	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
newdict /StrokeWidth 65 put
/Courier-Oblique newdict definefont pop

%
% Scaled down versions of the Helvetica font family.
%

/newdict /Helvetica findfont length dict def
/Helvetica findfont {
	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Helvetica newdict definefont pop

/newdict /Helvetica-Oblique findfont length dict def
/Helvetica-Oblique findfont {
	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Helvetica-Oblique newdict definefont pop

/newdict /Helvetica-Bold findfont length dict def
/Helvetica-Bold findfont {
	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Helvetica-Bold newdict definefont pop

/newdict /Helvetica-BoldOblique findfont length dict def
/Helvetica-BoldOblique findfont {
	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Helvetica-BoldOblique newdict definefont pop

%
% Scaled up versions of the Times font family.
%

/newdict /Times-Roman findfont length dict def
/Times-Roman findfont {
	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Times-Roman newdict definefont pop

/newdict /Times-Italic findfont length dict def
/Times-Italic findfont {
	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Times-Italic newdict definefont pop

/newdict /Times-Bold findfont length dict def
/Times-Bold findfont {
	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Times-Bold newdict definefont pop

/newdict /Times-BoldItalic findfont length dict def
/Times-BoldItalic findfont {
	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if

	1 index /FID ne
		{newdict 3 1 roll put}
		{pop pop}
	ifelse
} forall
/Times-BoldItalic newdict definefont pop

0707070014230547721006440057030057030000011527250522627502200003300000001715post.src/psfiles/banner.ps%
% Simple program to print a banner page
%

/banner {
	/saveobj save def
	erasepage initgraphics

	/#copies 1 def
	/inch {72 mul} bind def
	/pagebbox [clippath pathbbox newpath] def

	/font /Helvetica def
	/size 20 def
	/height pagebbox 3 get def
	/width pagebbox 2 get .09 mul def

	.92 setgray
	pagebbox 0 get pagebbox 1 get moveto
	width 0 rlineto 0 height rlineto width neg 0 rlineto closepath eofill
	pagebbox 2 get pagebbox 1 get moveto
	width neg 0 rlineto 0 height rlineto width 0 rlineto closepath eofill
	0 setgray

	font findfont size scalefont setfont
	/linesp size size .15 mul add neg def
	/tab (Destination) stringwidth pop 1.5 mul def
	/nextline {0 0 moveto show tab 0 moveto show 0 linesp translate} def

	pagebbox 0 get 1.5 width mul add pagebbox 3 get 2.0 width mul sub translate
	(Bin)  nextline
	(Name) nextline
	(Owner) nextline
	(File) nextline
	(Account) nextline
	(Destination) nextline
	(Spooldate) nextline
	showpage
	saveobj restore
} bind def
0707070014230547731006440057030057030000011527260522627502200003000000001156post.src/psfiles/READMEPostScript files that go in $(POSTLIB). Several, like forms.ps, are
used by most translators supplied in this package. Most PostScript
files only used by a single translator (e.g. the prologue) have been 
been moved into the appropriate source directory. Files that end in
.enc support alternate character sets (e.g. ISO Latin 1 alphabet).
The implementation is left open, but typically redefines findfont.
That approach works because findfont is a procedure rather than an
operator, so it's not affected by bind. Also can't depend on having
a systemdict definition for findfont. It's in userdict on Version
48.0 VT600s.

0707070014230547741006440057030057030000011527270522627502200003300000001016post.src/psfiles/unbind.ps%
% Unbind the operators in an executable array or packedarray. Leaves the
% unbound array or the original object on the stack.
%

/unbind {
	0 index xcheck
	1 index type /arraytype eq
	2 index type /packedarraytype eq or and {
		dup length array copy cvx
		dup 0 exch {
			dup type /operatortype eq {
				(                          ) cvs cvn cvx
			} if

			0 index xcheck
			1 index type /arraytype eq
			2 index type /packedarraytype eq or and {
				unbind
			} if

			3 copy put pop
			1 add
		} forall
		pop
	} if
} def

0707070014230547751006440057030057030000011527340522627502200003700000000437post.src/psfiles/Nroundpage.ps%
% A version of roundpage.ps that assumes a symmetric clipping path. Thanks
% to Matthijs Melchior for the suggestion.
%

/roundpagebbox {
	pagebbox dup 0 get pagebbox 2 get add 2 exch put
	pagebbox dup 1 get pagebbox 3 get add 3 exch put
	pagebbox 0 0 put
	pagebbox 1 0 put
} bind def
0707070014230361610407550057030057030000021040770522633073000002500000000000post.src/buildtables0707070014230361621006440057030057030000011041300522627502300003400000000353post.src/buildtables/READMEPrograms for building troff width tables on a PostScript printer.
Assumes you have direct access to the printer's serial port. Also
needs a special table dependent shell library file to build the
tables (e.g. ../devLatin1/shell.lib).

0707070014230357571006400057030057030000011040340522633072700004400000003013post.src/buildtables/buildtables.mkMAKE=/bin/make
MAKEFILE=buildtables.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript
MAN1DIR=/tmp

all : buildtables

install : all
	@if [ ! -d $(POSTBIN) ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	cp buildtables $(POSTBIN)/buildtables
	@chmod 755 $(POSTBIN)/buildtables
	@chgrp $(GROUP) $(POSTBIN)/buildtables
	@chown $(OWNER) $(POSTBIN)/buildtables
	cp buildtables.1 $(MAN1DIR)/buildtables.1
	@chmod 644 $(MAN1DIR)/buildtables.1
	@chgrp $(GROUP) $(MAN1DIR)/buildtables.1
	@chown $(OWNER) $(MAN1DIR)/buildtables.1

clean :

clobber : clean
	rm -f buildtables

buildtables : buildtables.sh
	sed \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	buildtables.sh >buildtables
	@chmod 755 buildtables

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dF.*'.ds dF $(FONTDIR)'" \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	buildtables.1 >XXX.1; \
	mv XXX.1 buildtables.1

0707070014230361641006440057030057030000011041330522627502300004400000003771post.src/buildtables/buildtables.sh#
# Builds one or more font width tables or the typesetter description
# file on a PostScript printer. Assumes you have direct access to the
# printer's serial port. No arguments means build a standard collection
# of tables - usually the LaserWriter Plus set. See trofftable and the
# shell library files /usr/lib/font/dev*/shell.lib for more details.
#

set -e

POSTBIN=/usr/lbin/postscript
POSTLIB=/usr/lib/postscript
FONTDIR=/usr/lib/font

POSTIO=$POSTBIN/postio
TROFFTABLE=$POSTBIN/trofftable

BAUDRATE=
DEVICE=
LIBRARY=

while [ -n "$1" ]; do
    case $1 in
	-C)  shift; OPTIONS="$OPTIONS -C$1";;
	-C*) OPTIONS="$OPTIONS $1";;

	-F)  shift; FONTDIR=$1;;
	-F*) FONTDIR=`echo $1 | sed s/-F//`;;

	-H)  shift; OPTIONS="$OPTIONS -H$1";;
	-H*) OPTIONS="$OPTIONS $1";;

	-S)  shift; LIBRARY=$1;;
	-S*) LIBRARY=`echo $1 | sed s/-S//`;;

	-T)  shift; DEVICE=$1;;
	-T*) DEVICE=`echo $1 | sed s/-T//`;;

	-b)  shift; BAUDRATE=$1;;
	-b*) BAUDRATE=`echo $1 | sed s/-b//`;;

	-c)  shift; OPTIONS="$OPTIONS -c$1";;
	-c*) OPTIONS="$OPTIONS $1";;

	-l)  shift; LINE=$1;;
	-l*) LINE=`echo $1 | sed s/-l//`;;

	-s)  shift; OPTIONS="$OPTIONS -s$1";;
	-s*) OPTIONS="$OPTIONS $1";;

	-t)  shift; OPTIONS="$OPTIONS -t$1";;
	-t*) OPTIONS="$OPTIONS $1";;

	-?)  OPTIONS="$OPTIONS $1$2"; shift;;
	-?*) OPTIONS="$OPTIONS $1";;

	*)   break;;
    esac
    shift
done

if [ ! "$DEVICE" -a ! "$LIBRARY" ]; then
    echo "$0: no device or shell library" >&2
    exit 1
fi

LIBRARY=${LIBRARY:-${FONTDIR}/dev${DEVICE}/shell.lib}

#
# No arguments means build everything return by the AllTables function.
#

if [ $# -eq 0 ]; then
    . $LIBRARY
    set -- `AllTables`
fi

for i do
    SHORT=`echo $i | awk '{print $1}'`
    LONG=`echo $i | awk '{print $2}'`

    if [ "$LINE" ]
	then echo "==== Building table $SHORT ===="
	else echo "==== Creating table program $SHORT.ps ===="
    fi

    $TROFFTABLE -S$LIBRARY $OPTIONS $SHORT $LONG >$SHORT.ps

    if [ "$LINE" ]; then
	$POSTIO -t -l$LINE ${BAUDRATE:+-b${BAUDRATE}} $SHORT.ps >$SHORT
	rm -f $SHORT.ps
    fi
done

0707070014230357601006400057030057030000011024300522633073000004300000010314post.src/buildtables/buildtables.1.ds dF /usr/lib/font
.ds dQ /usr/lib/postscript
.TH BUILDTABLES 1 "DWB 3.2"
.SH NAME
.B buildtables
\- build
.B troff
tables on a PostScript printer
.SH SYNOPSIS
\*(mBbuildtables\f1
.OP "" options []
.OP "" "name \(el" []
.SH DESCRIPTION
.B buildtables
builds font width tables or the typesetter description
file on a PostScript printer.
No arguments means build a default set of tables;
usually a superset of the LaserWriter Plus collection.
The following
.I options
are understood:
.TP 1.0i
.OP \-b speed
Transmit data over
.I line
at baud rate
.I speed.
Recognized baud rates are 1200, 2400, 4800, 9600, and 19200.
The default
.I speed
is 9600 baud.
.TP 1.0i
.OP \-l line
Build the tables on the PostScript printer attached to
.I line.
There is no default.
.TP 1.0i
.OP \-t name
Use
.I name
as the template for fonts not in the default set.
Choose
.MW R
for proportionally spaced fonts and
.MW CW
for fixed width fonts.
Try
.MW ZD
(ZapfDingbats) if the font has a non-standard
character set.
The default is
.MR R .
.TP 1.0i
.OP \-C file
Copy
.I file
into each PostScript table program;
.I file
must contain legitimate PostScript.
.TP 1.0i
.OP \-H hostdir
Use
.I hostdir
as the host-resident font directory.
A file in
.I hostdir
that matches the name of the
.B troff
font is assumed to be a host-resident font program and is included
in the PostScript width table program.
There is no default.
.TP 1.0i
.OP \-S file
Use
.I file
as the shell library file.
Overrides the choice made with the
.OP \-T
option.
.TP 1.0i
.OP \-T name
Set the target device to
.I name.
.br
Device
.I name
means
.ft 2
.MI \*(dF/dev name /shell.lib
.ft 1
is the shell library file.
There is no default.
.PP
If
.OP \-l
is omitted output files are the PostScript programs that
build the tables, rather than the tables themselves.
One of
.OP \-T
or
.OP \-S
is required.
If both are given
.OP \-S
wins.
Although
.OP \-H
is the preferred mechanism for including host-resident font files,
.OP \-C
makes sense when only one width table is built.
.PP
The shell library file defines a collection of functions used to
build
.BR troff (1)
tables.
The default set of tables is the list of names returned by the
.MW AllTables
function.
Changes to the default list can be made by updating the
.MW BuiltinTables
function.
.PP
Each
.B buildtables
argument
must be a default table name, or a pair of names enclosed in quotes.
If the argument is a pair, the first name is the
.B troff
font and the second is the full PostScript font name.
Tables are created in the current directory.
Each is assigned a name that matches the
.B troff
table name.
.PP
The PostScript table programs created by
.BR trofftable (1)
are written to files that have
.MW .ps
appended to the
.B troff
table name.
The
.MW .ps
file is deleted after the table is built.
Options not listed above are passed to
.B trofftable.
The PostScript table programs return data to the host computer using
PostScript's
.MW print
operator.
See
.BR hardcopy (1)
if you do not have access to the printer's serial port.
.SH EXAMPLES
.PP
Build the default collection of devpost tables on the printer
connected to
.MW /dev/tty00
(no font name arguments):
.EX
buildtables -l/dev/tty00 -Tpost
.EE
To do the same and to restrict the tables that are built,
Add
.B troff
font names (or
.MR DESC )
to restrict the tables built on the printer connected to
.MR /dev/tty00 :
.EX
buildtables -l/dev/tty00 -Tpost R I B BI DESC S
.EE
Enclose the
.B troff
and PostScript font names in quotes to
build the width table for a font not in the default set
(also on the printer connected to
.MR /dev/tty00 ):
.EX
buildtables -l/dev/tty00 -TLatin1 "GL Garamond-Light"
.EE
A font must be available on the printer when the table is built.
Use
.OP \-H
or
.OP \-C
to include host-resident fonts.
.SH WARNINGS
.PP
A width table will not build properly if the printer cannot access
the PostScript font.
.PP
The
.OP \-TLatin1
option only works on PostScript printers that support the full
.SM ISO
Latin-1 character set.
The error message from older printers will likely indicate a missing
.MW ISOLatin1Encoding
array.
.SH FILES
.MW \*(dF/dev*/shell.lib
.br
.MW \*(dQ/dpost.ps
.br
.MW \*(dQ/trofftable.ps
.br
.SH SEE ALSO
.BR dpost (1),
.BR hardcopy (1),
.BR postio (1),
.BR troff (1),
.BR trofftable (1),
.BR font (5)
0707070014231030650407550057030057030000020303460522633073300002300000000000post.src/cropmarks0707070014231030661006440057030057030000010303050522627502300004000000005727post.src/cropmarks/cropmarks.ps%
% Center pages, based on pageheight and pagewidth, and redefine showpage
% to put cropmarks at each corner. Device dependent code to expand the
% paper size goes in procedure expandpagesize. Currently only supports
% a Linotronic 200P typesetter using 12 inch wide paper. You'll have to
% add code to expandpagesize to support different typesetters or even a
% 200P that's running differently.
%

/CropmarkDict 40 dict dup begin

/expandpage true def
/magnification 1 def
/pageheight 11.0 def
/pagewidth 8.5 def
/scaletofit false def
/scaling 1 def

/marklength .3 def	% inches
/markstart .125 def	% inches
/markend .04 def	% inches
/marklinewidth .25 def	% points

/inch {72 mul} def
/min {2 copy gt {exch} if pop} def
/max {2 copy lt {exch} if pop} def

/setup {
	/markspace markstart marklength add markend add inch marklinewidth add def
	/totalheight pageheight inch markspace 2 mul add def
	/totalwidth pagewidth inch markspace 2 mul add def

	pagedimensions
	checkpagesize
	/scaling getscaling def
	xcenter ycenter translate
	scaling scaling scale
	pagewidth inch 2 div neg pageheight inch 2 div neg translate
	clippage
} def

/pagedimensions {
	clippath pathbbox newpath
	4 -1 roll exch 4 1 roll 4 copy
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
} def

/checkpagesize {
	height totalheight lt width totalwidth lt or expandpage and {
		expandpagesize
		pagedimensions
	} if
} def

/expandpagesize {	% device dependent code
	/Product statusdict begin /product where {pop product}{()} ifelse end def

	Product (Linotype) eq {		% Linotronic 200P and other models?
		statusdict /setpageparams known {
			/maxwidth 12.0 inch def		% 12 inch wide paper?
			totalheight maxwidth le {
				totalheight
				totalwidth
				maxwidth totalheight sub 2 div
				0
			}{
				totalwidth maxwidth min
				totalheight
				maxwidth totalwidth maxwidth min sub 2 div
				1
			} ifelse
			statusdict /setpageparams get exec
		} if
	} if
} def

/getscaling {
	scaletofit
		{height totalheight div width totalwidth div min 1 min}
		{1}
	ifelse
} def

/clippage {
	newpath
	0 0 moveto
	pagewidth inch 0 rlineto
	0 pageheight inch rlineto
	pagewidth neg inch 0 rlineto
	closepath clip
	newpath
} def

/cropmark {
	gsave
	translate
	rotate
	marklinewidth dup translate
	0 0 transform round exch round exch itransform translate
	markstart inch 0 moveto marklength inch 0 rlineto stroke
	0 markstart inch moveto 0 marklength inch rlineto stroke
	grestore
} bind def

/@PreviousShowpage /showpage load def

end def

%
% Cropmarks - in the default coordinate system.
%

/showpage {
	gsave
	CropmarkDict begin
		initgraphics
		marklinewidth setlinewidth
		xcenter ycenter translate
		scaling scaling scale
		0 pagewidth inch 2 div pageheight inch 2 div cropmark
		90 pagewidth inch neg 2 div pageheight inch 2 div cropmark
		180 pagewidth inch neg 2 div pageheight inch 2 div neg cropmark
		270 pagewidth inch 2 div pageheight inch 2 div neg cropmark
		@PreviousShowpage
	end
	grestore
} bind def

0707070014231030671006440057030057030000010304060522627502300004000000003350post.src/cropmarks/cropmarks.sh#
# Center pages and put cropmarks at each corner. Physical page size
# is set with -w and -h. The default is 8.5 by 11.0 inches. Device
# dependent code to change paper size (e.g. with setpageparams) goes
# in the prologue. You may need to customize the device dependent
# code that we distribute. By default it only supports variable page
# sizes on Linotronic typesetters, and assumes those typesetters are
# using 12 inch wide paper. Use -d to disable execution of device
# dependent PostScript code.
#
# What's here was written quickly and will likely be very different
# in our next release. It should be part of a more general program!!
# 

POSTLIB=/usr/lib/postscript
PROLOGUE=$POSTLIB/cropmarks.ps

EXPANDPAGE=true
PAGEWIDTH=8.5
PAGEHEIGHT=11.0
SCALETOFIT=false
XOFFSET=0.0
YOFFSET=0.0

NONCONFORMING="%!PS"
ENDPROLOG="%%EndProlog"
BEGINSETUP="%%BeginSetup"
ENDSETUP="%%EndSetup"

while [ -n "$1" ]; do
    case $1 in
	-d)  EXPANDPAGE=false;;

	-h)  shift; PAGEHEIGHT=$1;;
	-h*) PAGEHEIGHT=`echo $1 | sed s/-h//`;;

	-s)  SCALETOFIT=true;;

	-w)  shift; PAGEWIDTH=$1;;
	-w*) PAGEWIDTH=`echo $1 | sed s/-w//`;;

	-x)  shift; XOFFSET=$1;;
	-x*) XOFFSET=`echo $1 | sed s/-x//`;;

	-y)  shift; YOFFSET=$1;;
	-y*) YOFFSET=`echo $1 | sed s/-y//`;;

	-L)  shift; PROLOGUE=$1;;
	-L*) PROLOGUE=`echo $1 | sed s/-L//`;;

	--)  shift; break;;

	-*)  echo "$0: illegal option $1" >&2; exit 1;;

	*)   break;;
    esac
    shift
done

echo $NONCONFORMING
cat $PROLOGUE
echo $ENDPROLOG
echo $BEGINSETUP
echo "CropmarkDict begin"
echo "/pageheight $PAGEHEIGHT def"
echo "/pagewidth $PAGEWIDTH def"
echo "/expandpage $EXPANDPAGE def"
echo "/scaletofit $SCALETOFIT def"
echo "/xoffset $XOFFSET def"
echo "/yoffset $YOFFSET def"
echo "setup"
echo "end"
echo $ENDSETUP

cat $*

0707070014231027421006400057030057030000010230260522633073300004000000003045post.src/cropmarks/cropmarks.mkMAKE=/bin/make
MAKEFILE=cropmarks.mk

OWNER=bin
GROUP=bin

MAN1DIR=/tmp
MAN5DIR=/usr/man/p_man/man5
POSTLIB=/usr/lib/postscript
POSTBIN=/usr/bin/postscript

all : cropmarks

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp cropmarks $(POSTBIN)/cropmarks
	@chmod 755 $(POSTBIN)/cropmarks
	@chgrp $(GROUP) $(POSTBIN)/cropmarks
	@chown $(OWNER) $(POSTBIN)/cropmarks
	cp cropmarks.ps $(POSTLIB)/cropmarks.ps
	@chmod 644 $(POSTLIB)/cropmarks.ps
	@chgrp $(GROUP) $(POSTLIB)/cropmarks.ps
	@chown $(OWNER) $(POSTLIB)/cropmarks.ps
	cp cropmarks.1 $(MAN1DIR)/cropmarks.1
	@chmod 644 $(MAN1DIR)/cropmarks.1
	@chgrp $(GROUP) $(MAN1DIR)/cropmarks.1
	@chown $(OWNER) $(MAN1DIR)/cropmarks.1

clean :

clobber : clean
	rm -f cropmarks

cropmarks : cropmarks.sh
	sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" cropmarks.sh >cropmarks
	@chmod 755 cropmarks

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	cropmarks.1 >XXX.1; \
	mv XXX.1 cropmarks.1

0707070014231027431006400057030057030000010303640522633073300003700000004373post.src/cropmarks/cropmarks.1.ds dQ /usr/lib/postscript
.TH CROPMARKS 1 "DWB 3.2"
.SH NAME
.B cropmarks
\- add cropmarks to PostScript files
.SH SYNOPSIS
\*(mBcropmarks\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B Cropmarks
surrounds PostScript
.I files
with code that centers each page and adds cropmarks to the four
corners.
The results are written on the standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.I files,
the standard input is read.
The following
.I options
are understood:
.TP 1.0i
.OP \-d
Disable the device-dependent PostScript code that expands page sizes.
.TP 1.0i
.OP \-h num
Set the height of each page to
.I num
inches.
The default is 11.0 inches.
.TP 1.0i
.OP \-s
Scale pages so cropmarks always show up.
Primarily for debugging and development on devices that don't adjust
page sizes.
.TP 1.0i
.OP \-w num
Set the width of each page to
.I num
inches.
The default is 8.5 inches.
.TP 1.0i
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/cropmarks.ps .
.PP
Height and width set with the
.OP \-h
and
.OP \-w
options adjust the size of the image area available on each sheet
of paper.
Neither suggests anything about the orientation of output in that area.
Cropmarks are printed at each corner just outside the image area.
.SH EXAMPLES
.PP
Print text in a 6.5\(mu8.0-inch area centered on each sheet of paper:
.EX
troff -mm \f2file\fP | dpost | cropmarks -w6.5 -h8.0 | \f2spool
.EE
Print landscape text in exactly the same 6.5\(mu8.0-inch area:
.EX
troff -mm \f2file\fP | dpost -pland | cropmarks -w6.5 -h8.0 | \f2spool
.EE
In both examples,
.I spool
is the spooling command used to send PostScript output to a local printer.
.SH WARNINGS
.PP
Device-dependent PostScript code to automatically expand page sizes may
only work on Linotronic 200P typesetters that use 12-inch-wide paper.
Local changes to the printer-dependent code can be made in the
.MW expandpagesize
procedure defined in
.MR \*(dQ/cropmarks.ps .
.PP
The PostScript
.I files
must be reasonably well behaved.
There are no guarantees, particularly if the input
.I files
redefine the
.MW showpage
operator.
.PP
The program is unsupported and may not be included in future releases.
.SH FILES
.MW \*(dQ/cropmarks.ps
.SH SEE ALSO
.BR dpost (1),
.BRpostio (1),
.BR troff (1)
0707070014230361660407550057030057030000031041350522627502700002200000000000post.src/devopost0707070014230361671006440057030057030000011041360522627502300002500000002037post.src/devopost/AB# AvantGarde-Demi
name AB
internalname 27
ligatures fi fl 0
charset
!	28	2	33
$	56	2	36
%	86	2	37
&	68	2	38
'	28	2	39
(	38	3	40
)	38	3	41
*	44	2	42
+	60	0	43
,	28	1	44
hy	42	0	45
-	"
.	28	0	46
/	46	3	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
=	60	0	61
?	56	2	63
A	74	2	65
B	58	2	66
C	78	2	67
D	70	2	68
E	52	2	69
F	48	2	70
G	84	2	71
H	68	2	72
I	28	2	73
J	48	2	74
K	62	2	75
L	44	2	76
M	90	2	77
N	74	2	78
O	84	2	79
P	56	2	80
Q	84	2	81
R	58	2	82
S	52	2	83
T	42	2	84
U	64	2	85
V	70	2	86
W	90	2	87
X	68	2	88
Y	62	2	89
Z	50	2	90
[	32	3	91
]	32	3	93
`	28	2	96
a	66	0	97
b	66	2	98
c	64	0	99
d	66	2	100
e	64	0	101
f	28	2	102
g	66	1	103
h	60	2	104
i	24	2	105
j	26	3	106
k	58	2	107
l	24	2	108
m	94	0	109
n	60	0	110
o	64	0	111
p	66	1	112
q	66	1	113
r	32	0	114
s	44	0	115
t	30	2	116
u	60	0	117
v	56	0	118
w	80	0	119
x	56	0	120
y	58	1	121
z	46	0	122
ct	56	2	162
fi	52	2	174
fl	52	2	175
dg	56	3	178
bu	60	0	183
de	36	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	48	2	170
''	48	2	186
0707070014230361701006440057030057030000011041550522627502300002500000002046post.src/devopost/AI# AvantGarde-BookOblique
name AI
internalname 26
ligatures fi fl 0
charset
!	29	2	33
$	55	2	36
%	77	2	37
&	76	2	38
'	35	2	39
(	37	3	40
)	37	3	41
*	42	2	42
+	61	0	43
,	28	0	44
hy	33	0	45
-	"
.	28	0	46
/	44	3	47
0	55	2	48
1	55	2	49
2	55	2	50
3	55	2	51
4	55	2	52
5	55	2	53
6	55	2	54
7	55	2	55
8	55	2	56
9	55	2	57
:	28	0	58
;	28	0	59
=	61	0	61
?	59	2	63
A	74	2	65
B	57	2	66
C	81	2	67
D	74	2	68
E	54	2	69
F	49	2	70
G	87	2	71
H	68	2	72
I	23	2	73
J	48	2	74
K	59	2	75
L	46	2	76
M	92	2	77
N	74	2	78
O	87	2	79
P	59	2	80
Q	87	2	81
R	61	2	82
S	50	2	83
T	43	2	84
U	66	2	85
V	70	2	86
W	96	2	87
X	61	2	88
Y	59	2	89
Z	48	2	90
[	35	3	91
]	35	3	93
`	35	2	96
a	68	0	97
b	68	2	98
c	65	0	99
d	69	2	100
e	65	0	101
f	31	2	102
g	67	1	103
h	61	2	104
i	20	2	105
j	20	3	106
k	50	2	107
l	20	2	108
m	94	0	109
n	61	0	110
o	66	0	111
p	68	1	112
q	68	1	113
r	30	0	114
s	39	0	115
t	34	2	116
u	61	0	117
v	55	0	118
w	83	0	119
x	48	0	120
y	54	1	121
z	42	0	122
ct	55	2	162
fi	49	2	174
fl	49	2	175
dg	55	3	178
bu	61	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230361711006440057030057030000011041700522627502300002500000002037post.src/devopost/AR# AvantGarde-Book
name AR
internalname 25
ligatures fi fl 0
charset
!	29	2	33
$	55	2	36
%	77	2	37
&	76	2	38
'	35	2	39
(	37	3	40
)	37	3	41
*	42	2	42
+	61	0	43
,	28	0	44
hy	33	0	45
-	"
.	28	0	46
/	44	3	47
0	55	2	48
1	55	2	49
2	55	2	50
3	55	2	51
4	55	2	52
5	55	2	53
6	55	2	54
7	55	2	55
8	55	2	56
9	55	2	57
:	28	0	58
;	28	0	59
=	61	0	61
?	59	2	63
A	74	2	65
B	57	2	66
C	81	2	67
D	74	2	68
E	54	2	69
F	49	2	70
G	87	2	71
H	68	2	72
I	23	2	73
J	48	2	74
K	59	2	75
L	46	2	76
M	92	2	77
N	74	2	78
O	87	2	79
P	59	2	80
Q	87	2	81
R	61	2	82
S	50	2	83
T	43	2	84
U	66	2	85
V	70	2	86
W	96	2	87
X	61	2	88
Y	59	2	89
Z	48	2	90
[	35	3	91
]	35	3	93
`	35	2	96
a	68	0	97
b	68	2	98
c	65	0	99
d	69	2	100
e	65	0	101
f	31	2	102
g	67	1	103
h	61	2	104
i	20	2	105
j	20	3	106
k	50	2	107
l	20	2	108
m	94	0	109
n	61	0	110
o	66	0	111
p	68	1	112
q	68	1	113
r	30	0	114
s	39	0	115
t	34	2	116
u	61	0	117
v	55	0	118
w	83	0	119
x	48	0	120
y	54	1	121
z	42	0	122
ct	55	2	162
fi	49	2	174
fl	49	2	175
dg	55	3	178
bu	61	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230361721006440057030057030000011041720522627502300002500000002046post.src/devopost/AX# AvantGarde-DemiOblique
name AX
internalname 28
ligatures fi fl 0
charset
!	28	2	33
$	56	2	36
%	86	2	37
&	68	2	38
'	28	2	39
(	38	3	40
)	38	3	41
*	44	2	42
+	60	0	43
,	28	1	44
hy	42	0	45
-	"
.	28	0	46
/	46	3	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
=	60	0	61
?	56	2	63
A	74	2	65
B	58	2	66
C	78	2	67
D	70	2	68
E	52	2	69
F	48	2	70
G	84	2	71
H	68	2	72
I	28	2	73
J	48	2	74
K	62	2	75
L	44	2	76
M	90	2	77
N	74	2	78
O	84	2	79
P	56	2	80
Q	84	2	81
R	58	2	82
S	52	2	83
T	42	2	84
U	64	2	85
V	70	2	86
W	90	2	87
X	68	2	88
Y	62	2	89
Z	50	2	90
[	32	3	91
]	32	3	93
`	28	2	96
a	66	0	97
b	66	2	98
c	64	0	99
d	66	2	100
e	64	0	101
f	28	2	102
g	66	1	103
h	60	2	104
i	24	2	105
j	26	3	106
k	58	2	107
l	24	2	108
m	94	0	109
n	60	0	110
o	64	0	111
p	66	1	112
q	66	1	113
r	32	0	114
s	44	0	115
t	30	2	116
u	60	0	117
v	56	0	118
w	80	0	119
x	56	0	120
y	58	1	121
z	46	0	122
ct	56	2	162
fi	52	2	174
fl	52	2	175
dg	56	3	178
bu	60	0	183
de	36	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	48	2	170
''	48	2	186
0707070014230361731006440057030057030000011041740522627502300002400000002102post.src/devopost/B# Times-Bold
name B
internalname 3
ligatures fi fl 0
charset
!	33	2	33
$	50	3	36
%	100	2	37
&	83	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	57	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
=	57	0	61
?	50	2	63
A	72	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	78	2	72
I	39	2	73
J	50	2	74
K	78	2	75
L	67	2	76
M	94	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	72	2	82
S	56	2	83
T	67	2	84
U	72	2	85
V	72	2	86
W	100	2	87
X	72	2	88
Y	72	2	89
Z	67	2	90
[	33	3	91
]	33	3	93
`	33	2	96
a	50	0	97
b	56	2	98
c	44	0	99
d	56	2	100
e	44	0	101
f	33	2	102
g	50	1	103
h	56	2	104
i	28	2	105
j	33	3	106
k	56	2	107
l	28	2	108
m	83	0	109
n	56	0	110
o	50	0	111
p	56	1	112
q	56	1	113
r	44	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
ct	50	3	162
fi	56	2	174
fl	56	2	175
ff	60	2	1
Fi	84	2	1
Fl	84	2	1
dg	50	3	178
bu	35	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
sq	50	2	1
``	50	2	170
''	50	2	186
0707070014230361741006440057030057030000011041760522627502400002500000002037post.src/devopost/BI# Times-BoldItalic
name BI
internalname 4
ligatures fi fl 0
charset
!	39	2	33
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	57	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
=	57	0	61
?	50	2	63
A	67	2	65
B	67	2	66
C	67	2	67
D	72	2	68
E	67	2	69
F	67	2	70
G	72	2	71
H	78	2	72
I	39	2	73
J	50	2	74
K	67	2	75
L	61	2	76
M	89	2	77
N	72	2	78
O	72	2	79
P	61	2	80
Q	72	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	89	2	87
X	67	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
]	33	3	93
`	33	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	33	3	102
g	50	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	28	2	116
u	56	0	117
v	44	0	118
w	67	0	119
x	50	0	120
y	44	1	121
z	39	0	122
ct	50	3	162
fi	56	3	174
fl	56	3	175
dg	50	3	178
bu	35	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230361751006440057030057030000011042300522627502400002500000002213post.src/devopost/CB# Courier-Bold
name CB
internalname 7
spacewidth 60
charset
!	60	2	33
"	60	2	34
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	0	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	1	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	3	92
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
ct	60	2	162
\-	60	0	177
en	"
dg	60	3	178
bu	60	0	183
de	60	2	202
em	60	0	208
14	60	2	1
34	60	2	1
12	60	2	1
``	60	2	170
''	60	2	186
0707070014230361761006440057030057030000011042320522627502400002500000002216post.src/devopost/CI# Courier-Oblique
name CI
internalname 6
spacewidth 60
charset
!	60	2	33
"	60	2	34
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	0	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	1	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	3	92
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
ct	60	2	162
\-	60	0	177
en	"
dg	60	3	178
bu	60	0	183
de	60	2	202
em	60	0	208
14	60	2	1
34	60	2	1
12	60	2	1
``	60	2	170
''	60	2	186
0707070014230361771006440057030057030000011042340522627502400002500000002206post.src/devopost/CO# Courier
name CW
internalname 5
spacewidth 60
charset
!	60	2	33
"	60	2	34
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	0	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	1	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	3	92
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
ct	60	2	162
\-	60	0	177
en	"
dg	60	3	178
bu	60	0	183
de	60	2	202
em	60	0	208
14	60	2	1
34	60	2	1
12	60	2	1
``	60	2	170
''	60	2	186
0707070014230362001006440057030057030000011042360522627502400002500000002206post.src/devopost/CW# Courier
name CW
internalname 5
spacewidth 60
charset
!	60	2	33
"	60	2	34
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	0	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	1	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	3	92
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
ct	60	2	162
\-	60	0	177
en	"
dg	60	3	178
bu	60	0	183
de	60	2	202
em	60	0	208
14	60	2	1
34	60	2	1
12	60	2	1
``	60	2	170
''	60	2	186
0707070014230362011006440057030057030000011042500522627502400002500000002222post.src/devopost/CX# Courier-BoldOblique
name CX
internalname 8
spacewidth 60
charset
!	60	2	33
"	60	2	34
#	60	2	35
$	60	2	36
%	60	2	37
&	60	2	38
'	60	2	39
(	60	3	40
)	60	3	41
*	60	2	42
+	60	0	43
,	60	1	44
hy	60	0	45
-	"
.	60	0	46
/	60	2	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	60	0	58
;	60	1	59
<	60	2	60
=	60	0	61
>	60	2	62
?	60	2	63
@	60	2	64
A	60	2	65
B	60	2	66
C	60	2	67
D	60	2	68
E	60	2	69
F	60	2	70
G	60	2	71
H	60	2	72
I	60	2	73
J	60	2	74
K	60	2	75
L	60	2	76
M	60	2	77
N	60	2	78
O	60	2	79
P	60	2	80
Q	60	3	81
R	60	2	82
S	60	2	83
T	60	2	84
U	60	2	85
V	60	2	86
W	60	2	87
X	60	2	88
Y	60	2	89
Z	60	2	90
[	60	3	91
\	60	3	92
]	60	3	93
^	60	2	94
_	60	1	95
`	60	2	96
a	60	0	97
b	60	2	98
c	60	0	99
d	60	2	100
e	60	0	101
f	60	2	102
g	60	1	103
h	60	2	104
i	60	2	105
j	60	3	106
k	60	2	107
l	60	2	108
m	60	0	109
n	60	0	110
o	60	0	111
p	60	1	112
q	60	1	113
r	60	0	114
s	60	0	115
t	60	2	116
u	60	0	117
v	60	0	118
w	60	0	119
x	60	0	120
y	60	1	121
z	60	0	122
{	60	3	123
|	60	3	124
}	60	3	125
~	60	0	126
ct	60	2	162
\-	60	0	177
en	"
dg	60	3	178
bu	60	0	183
de	60	2	202
em	60	0	208
14	60	2	1
34	60	2	1
12	60	2	1
``	60	2	170
''	60	2	186
0707070014230362021006440057030057030000011041570522627502400002700000001431post.src/devopost/DESC#
# Original PostScript tables - now obsolete and unsupported.
#

PDL PostScript

fonts 10 R I B BI CW H HB HX S1 S
sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 44 48 54 60 72 0

res 720
hor 1
vert 1
unitwidth 10
biggestfont 200

charset
hy ct fi fl ff Fi Fl dg em 14 34 12 \- en \' aa
\` ga ru sc dd -> \e br Sl ps cs cy as os =. ld
rd le ge pp -+
sq bx ci fa te ** pl mi \< eq \> ~= *A *B *X *D
*E *F *G *Y *I *K *L *M *N *O *P *R *H *S *T *U
*W *C *Q *Z ul \_ rn *a *b *x *d *e *f *g *y *i
*k *l *m *n *o *p *h *r *s *t *u *w *c *q *z \{
\| \} ap fm <= sl if <- ua da de +- >= mu pt pd
bu di != == ~~ al Ox O+ es ca cu sp ip sb ib mo
gr rg co tm sr no \^ or lc lf lt lk lb bv is rc
rf rt rk rb ts lh rh LV LH Lb L1 LA `` '' ob vr
0707070014230362031006440057030057030000011042520522627502400002500000001125post.src/devopost/GR# Greek
name GR
internalname 33
special
charset
*a	63	0	97
*b	55	3	98
*g	41	1	103
*d	49	2	100
*e	44	0	101
*z	49	3	122
*y	60	1	104
*h	52	2	113
*i	33	0	105
*k	55	0	107
*l	55	2	108
*m	58	1	109
*n	52	0	110
*c	49	3	120
*o	55	0	111
*p	55	0	112
*r	55	1	114
*s	60	0	115
*t	44	0	116
*u	58	0	117
*f	52	3	102
*x	55	1	99
*q	69	1	121
*w	69	0	119
*A	72	2	65
*B	67	2	66
*G	60	2	71
*D	61	2	68
*E	61	2	69
*Z	61	2	90
*Y	72	2	72
*H	74	2	81
*R	56	2	82
*I	33	2	73
*K	72	2	75
*L	69	2	76
*M	89	2	77
*N	72	2	78
*C	65	2	88
*O	72	2	79
*P	77	2	80
*S	59	2	83
*T	61	2	84
*U	69	2	85
*F	76	2	70
*X	72	2	67
*Q	80	2	89
*W	77	2	87
0707070014230362041006440057030057030000011042530522627502400002400000002027post.src/devopost/H# Helvetica
name H
internalname 9
ligatures fi fl 0
charset
!	28	2	33
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
=	58	0	61
?	56	2	63
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
]	28	3	93
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
ct	56	3	162
fi	50	2	174
fl	50	2	175
dg	56	3	178
bu	35	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	33	2	170
''	33	2	186
0707070014230362051006440057030057030000011042550522627502400002500000002036post.src/devopost/HB# Helvetica-Bold
name HB
internalname 11
ligatures fi fl 0
charset
!	33	2	33
$	56	3	36
%	89	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
=	58	0	61
?	61	2	63
A	72	2	65
B	72	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	56	2	74
K	72	2	75
L	61	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	33	3	91
]	33	3	93
`	28	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	33	2	102
g	61	1	103
h	61	2	104
i	28	2	105
j	28	3	106
k	56	2	107
l	28	2	108
m	89	0	109
n	61	0	110
o	61	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	56	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	78	0	119
x	56	0	120
y	56	1	121
z	50	0	122
ct	56	3	162
fi	61	2	174
fl	61	2	175
dg	56	3	178
bu	35	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230362061006440057030057030000011042700522627502400002500000002041post.src/devopost/HI# Helvetica-Oblique
name HI
internalname 10
ligatures fi fl 0
charset
!	28	2	33
$	56	3	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
=	58	0	61
?	56	2	63
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	28	3	91
]	28	3	93
`	22	2	96
a	56	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	56	0	101
f	28	2	102
g	56	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
ct	56	3	162
fi	50	2	174
fl	50	2	175
dg	56	3	178
bu	35	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	33	2	170
''	33	2	186
0707070014230362071006440057030057030000011042720522627502400002500000002045post.src/devopost/HX# Helvetica-BoldOblique
name HX
internalname 12
ligatures fi fl 0
charset
!	33	2	33
$	56	3	36
%	89	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	58	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
=	58	0	61
?	61	2	63
A	72	2	65
B	72	2	66
C	72	2	67
D	72	2	68
E	67	2	69
F	61	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	56	2	74
K	72	2	75
L	61	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	67	2	80
Q	78	2	81
R	72	2	82
S	67	2	83
T	61	2	84
U	72	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	67	2	89
Z	61	2	90
[	33	3	91
]	33	3	93
`	28	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	33	2	102
g	61	1	103
h	61	2	104
i	28	2	105
j	28	3	106
k	56	2	107
l	28	2	108
m	89	0	109
n	61	0	110
o	61	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	56	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	78	0	119
x	56	0	120
y	56	1	121
z	50	0	122
ct	56	3	162
fi	61	2	174
fl	61	2	175
dg	56	3	178
bu	35	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230362101006440057030057030000011042740522627502400002500000002044post.src/devopost/Hb# Helvetica-Narrow-Bold
name Hb
internalname 19
ligatures fi fl 0
charset
!	27	2	33
$	46	3	36
%	73	2	37
&	59	2	38
'	23	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	27	0	58
;	27	1	59
=	48	0	61
?	50	2	63
A	59	2	65
B	59	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	46	2	74
K	59	2	75
L	50	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	27	3	91
]	27	3	93
`	23	2	96
a	46	0	97
b	50	2	98
c	46	0	99
d	50	2	100
e	46	0	101
f	27	2	102
g	50	1	103
h	50	2	104
i	23	2	105
j	23	3	106
k	46	2	107
l	23	2	108
m	73	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	32	0	114
s	46	0	115
t	27	2	116
u	50	0	117
v	46	0	118
w	64	0	119
x	46	0	120
y	46	1	121
z	41	0	122
ct	46	3	162
fi	50	2	174
fl	50	2	175
dg	46	3	178
bu	29	0	183
de	27	2	202
em	82	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	41	2	170
''	41	2	186
0707070014230362111006440057030057030000011042760522627502400002500000002047post.src/devopost/Hi# Helvetica-Narrow-Oblique
name Hi
internalname 18
ligatures fi fl 0
charset
!	23	2	33
$	46	3	36
%	73	2	37
&	55	2	38
'	18	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	23	0	58
;	23	1	59
=	48	0	61
?	46	2	63
A	55	2	65
B	55	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	41	2	74
K	55	2	75
L	46	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	23	3	91
]	23	3	93
`	18	2	96
a	46	0	97
b	46	2	98
c	41	0	99
d	46	2	100
e	46	0	101
f	23	2	102
g	46	1	103
h	46	2	104
i	18	2	105
j	18	3	106
k	41	2	107
l	18	2	108
m	68	0	109
n	46	0	110
o	46	0	111
p	46	1	112
q	46	1	113
r	27	0	114
s	41	0	115
t	23	2	116
u	46	0	117
v	41	0	118
w	59	0	119
x	41	0	120
y	41	1	121
z	41	0	122
ct	46	3	162
fi	41	2	174
fl	41	2	175
dg	46	3	178
bu	29	0	183
de	27	2	202
em	82	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	27	2	170
''	27	2	186
0707070014230362121006440057030057030000011043300522627502400002500000002037post.src/devopost/Hr# Helvetica-Narrow
name Hr
internalname 17
ligatures fi fl 0
charset
!	23	2	33
$	46	3	36
%	73	2	37
&	55	2	38
'	18	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	23	0	58
;	23	1	59
=	48	0	61
?	46	2	63
A	55	2	65
B	55	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	41	2	74
K	55	2	75
L	46	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	23	3	91
]	23	3	93
`	18	2	96
a	46	0	97
b	46	2	98
c	41	0	99
d	46	2	100
e	46	0	101
f	23	2	102
g	46	1	103
h	46	2	104
i	18	2	105
j	18	3	106
k	41	2	107
l	18	2	108
m	68	0	109
n	46	0	110
o	46	0	111
p	46	1	112
q	46	1	113
r	27	0	114
s	41	0	115
t	23	2	116
u	46	0	117
v	41	0	118
w	59	0	119
x	41	0	120
y	41	1	121
z	41	0	122
ct	46	3	162
fi	41	2	174
fl	41	2	175
dg	46	3	178
bu	29	0	183
de	27	2	202
em	82	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	27	2	170
''	27	2	186
0707070014230362131006440057030057030000011043320522627502400002500000002053post.src/devopost/Hx# Helvetica-Narrow-BoldOblique
name Hx
internalname 20
ligatures fi fl 0
charset
!	27	2	33
$	46	3	36
%	73	2	37
&	59	2	38
'	23	2	39
(	27	3	40
)	27	3	41
*	32	2	42
+	48	0	43
,	23	1	44
hy	27	0	45
-	"
.	23	0	46
/	23	2	47
0	46	2	48
1	46	2	49
2	46	2	50
3	46	2	51
4	46	2	52
5	46	2	53
6	46	2	54
7	46	2	55
8	46	2	56
9	46	2	57
:	27	0	58
;	27	1	59
=	48	0	61
?	50	2	63
A	59	2	65
B	59	2	66
C	59	2	67
D	59	2	68
E	55	2	69
F	50	2	70
G	64	2	71
H	59	2	72
I	23	2	73
J	46	2	74
K	59	2	75
L	50	2	76
M	68	2	77
N	59	2	78
O	64	2	79
P	55	2	80
Q	64	2	81
R	59	2	82
S	55	2	83
T	50	2	84
U	59	2	85
V	55	2	86
W	77	2	87
X	55	2	88
Y	55	2	89
Z	50	2	90
[	27	3	91
]	27	3	93
`	23	2	96
a	46	0	97
b	50	2	98
c	46	0	99
d	50	2	100
e	46	0	101
f	27	2	102
g	50	1	103
h	50	2	104
i	23	2	105
j	23	3	106
k	46	2	107
l	23	2	108
m	73	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	32	0	114
s	46	0	115
t	27	2	116
u	50	0	117
v	46	0	118
w	64	0	119
x	46	0	120
y	46	1	121
z	41	0	122
ct	46	3	162
fi	50	2	174
fl	50	2	175
dg	46	3	178
bu	29	0	183
de	27	2	202
em	82	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	41	2	170
''	41	2	186
0707070014230362141006440057030057030000011043340522627502400002400000002101post.src/devopost/I# Times-Italic
name I
internalname 2
ligatures fi fl 0
charset
!	33	2	33
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	68	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
=	68	0	61
?	50	2	63
A	61	2	65
B	61	2	66
C	67	2	67
D	72	2	68
E	61	2	69
F	61	2	70
G	72	2	71
H	72	2	72
I	33	2	73
J	44	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	67	2	78
O	72	2	79
P	61	2	80
Q	72	3	81
R	61	2	82
S	50	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	83	2	87
X	61	2	88
Y	56	2	89
Z	56	2	90
[	39	3	91
]	39	3	93
`	33	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	28	3	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	72	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	28	0	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
ct	50	3	162
fi	50	3	174
fl	50	3	175
ff	50	2	1
Fi	72	2	1
Fl	72	2	1
dg	50	2	178
bu	35	0	183
de	33	2	202
em	89	0	208
14	75	2	1
34	75	2	1
12	75	2	1
sq	50	2	1
``	56	2	170
''	56	2	186
0707070014230362151006440057030057030000011043360522627502400002500000002035post.src/devopost/KB# Bookman-Demi
name KB
internalname 23
ligatures fi fl 0
charset
!	36	2	33
$	66	3	36
%	94	2	37
&	80	2	38
'	32	2	39
(	32	3	40
)	32	3	41
*	46	2	42
+	60	0	43
,	34	1	44
hy	36	0	45
-	"
.	34	0	46
/	60	3	47
0	66	2	48
1	66	2	49
2	66	2	50
3	66	2	51
4	66	2	52
5	66	2	53
6	66	2	54
7	66	2	55
8	66	2	56
9	66	2	57
:	34	0	58
;	34	1	59
=	60	0	61
?	66	2	63
A	72	2	65
B	72	2	66
C	74	2	67
D	78	2	68
E	72	2	69
F	68	2	70
G	78	2	71
H	82	2	72
I	40	2	73
J	64	2	74
K	80	2	75
L	64	2	76
M	94	2	77
N	74	2	78
O	80	2	79
P	66	2	80
Q	80	3	81
R	78	2	82
S	66	2	83
T	70	2	84
U	74	2	85
V	72	2	86
W	94	2	87
X	78	2	88
Y	70	2	89
Z	64	2	90
[	30	3	91
]	30	3	93
`	32	2	96
a	58	0	97
b	60	2	98
c	58	0	99
d	64	2	100
e	58	0	101
f	38	2	102
g	58	3	103
h	68	2	104
i	36	2	105
j	34	3	106
k	66	2	107
l	34	2	108
m	100	0	109
n	68	0	110
o	62	0	111
p	64	1	112
q	62	1	113
r	46	0	114
s	52	0	115
t	46	2	116
u	66	0	117
v	60	0	118
w	80	0	119
x	60	0	120
y	62	1	121
z	56	0	122
ct	66	2	162
fi	74	2	174
fl	74	2	175
dg	44	3	178
bu	46	0	183
de	34	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	54	2	170
''	54	2	186
0707070014230362161006440057030057030000011043500522627502400002500000002043post.src/devopost/KI# Bookman-LightItalic
name KI
internalname 22
ligatures fi fl 0
charset
!	32	2	33
$	62	2	36
%	80	2	37
&	82	2	38
'	28	2	39
(	28	3	40
)	28	3	41
*	44	2	42
+	60	0	43
,	30	1	44
hy	32	0	45
-	"
.	30	0	46
/	60	3	47
0	62	2	48
1	62	2	49
2	62	2	50
3	62	2	51
4	62	2	52
5	62	2	53
6	62	2	54
7	62	2	55
8	62	2	56
9	62	2	57
:	30	0	58
;	30	1	59
=	60	0	61
?	54	2	63
A	70	2	65
B	72	2	66
C	72	2	67
D	74	2	68
E	68	2	69
F	62	2	70
G	76	2	71
H	80	2	72
I	32	2	73
J	56	2	74
K	72	2	75
L	58	2	76
M	86	2	77
N	72	2	78
O	76	2	79
P	60	2	80
Q	78	3	81
R	70	2	82
S	64	2	83
T	60	2	84
U	72	2	85
V	68	2	86
W	96	2	87
X	70	2	88
Y	66	2	89
Z	58	2	90
[	26	3	91
]	26	3	93
`	28	2	96
a	62	0	97
b	60	2	98
c	48	0	99
d	64	2	100
e	54	0	101
f	34	3	102
g	56	1	103
h	62	2	104
i	28	2	105
j	28	3	106
k	60	2	107
l	28	2	108
m	88	0	109
n	62	0	110
o	54	0	111
p	60	1	112
q	56	1	113
r	40	0	114
s	54	0	115
t	34	2	116
u	62	0	117
v	54	0	118
w	88	0	119
x	54	0	120
y	60	1	121
z	52	0	122
ct	62	2	162
fi	64	3	174
fl	66	3	175
dg	62	3	178
bu	46	0	183
de	30	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	44	2	170
''	44	2	186
0707070014230362171006440057030057030000011043520522627502500002500000002035post.src/devopost/KR# Bookman-Light
name KR
internalname 21
ligatures fi fl 0
charset
!	30	2	33
$	62	2	36
%	90	2	37
&	80	2	38
'	22	2	39
(	30	3	40
)	30	3	41
*	44	2	42
+	60	0	43
,	32	1	44
hy	40	0	45
-	"
.	32	0	46
/	60	3	47
0	62	2	48
1	62	2	49
2	62	2	50
3	62	2	51
4	62	2	52
5	62	2	53
6	62	2	54
7	62	2	55
8	62	2	56
9	62	2	57
:	32	0	58
;	32	1	59
=	60	0	61
?	54	2	63
A	68	2	65
B	74	2	66
C	74	2	67
D	80	2	68
E	72	2	69
F	64	2	70
G	80	2	71
H	80	2	72
I	34	2	73
J	60	2	74
K	72	2	75
L	60	2	76
M	92	2	77
N	74	2	78
O	80	2	79
P	62	2	80
Q	82	3	81
R	72	2	82
S	66	2	83
T	62	2	84
U	78	2	85
V	70	2	86
W	96	2	87
X	72	2	88
Y	64	2	89
Z	64	2	90
[	30	3	91
]	30	3	93
`	22	2	96
a	58	0	97
b	62	2	98
c	52	0	99
d	62	2	100
e	52	0	101
f	32	2	102
g	54	3	103
h	66	2	104
i	30	2	105
j	30	3	106
k	62	2	107
l	30	2	108
m	94	0	109
n	66	0	110
o	56	0	111
p	62	1	112
q	58	1	113
r	44	0	114
s	52	0	115
t	38	2	116
u	68	0	117
v	52	0	118
w	78	0	119
x	56	0	120
y	54	1	121
z	48	0	122
ct	62	2	162
fi	62	2	174
fl	62	2	175
dg	54	3	178
bu	46	0	183
de	32	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	40	2	170
''	40	2	186
0707070014230362201006440057030057030000011043540522627502500002500000002043post.src/devopost/KX# Bookman-DemiItalic
name KX
internalname 24
ligatures fi fl 0
charset
!	32	2	33
$	68	3	36
%	88	2	37
&	98	2	38
'	32	2	39
(	26	3	40
)	26	3	41
*	46	2	42
+	60	0	43
,	34	1	44
hy	28	0	45
-	"
.	34	0	46
/	36	2	47
0	68	2	48
1	68	2	49
2	68	2	50
3	68	2	51
4	68	2	52
5	68	2	53
6	68	2	54
7	68	2	55
8	68	2	56
9	68	2	57
:	34	0	58
;	34	1	59
=	60	0	61
?	62	2	63
A	72	2	65
B	72	2	66
C	70	2	67
D	76	2	68
E	72	2	69
F	66	2	70
G	76	2	71
H	80	2	72
I	38	2	73
J	62	2	74
K	78	2	75
L	64	2	76
M	86	2	77
N	74	2	78
O	76	2	79
P	64	2	80
Q	76	3	81
R	74	2	82
S	70	2	83
T	70	2	84
U	74	2	85
V	66	2	86
W	100	2	87
X	74	2	88
Y	66	2	89
Z	68	2	90
[	26	3	91
]	26	3	93
`	32	2	96
a	68	0	97
b	60	2	98
c	56	0	99
d	68	2	100
e	56	0	101
f	42	3	102
g	62	1	103
h	70	2	104
i	38	2	105
j	32	3	106
k	70	2	107
l	38	2	108
m	96	0	109
n	68	0	110
o	60	0	111
p	66	1	112
q	62	1	113
r	50	0	114
s	54	0	115
t	44	2	116
u	68	0	117
v	54	0	118
w	86	0	119
x	62	0	120
y	60	1	121
z	56	0	122
ct	68	2	162
fi	82	3	174
fl	82	3	175
dg	42	3	178
bu	36	0	183
de	36	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	52	2	170
''	52	2	186
0707070014230362211006440057030057030000011043560522627502500002500000002045post.src/devopost/NB# NewCenturySchlbk-Bold
name NB
internalname 31
ligatures fi fl 0
charset
!	30	2	33
$	57	3	36
%	83	2	37
&	85	2	38
'	24	2	39
(	39	3	40
)	39	3	41
*	50	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	57	2	48
1	57	2	49
2	57	2	50
3	57	2	51
4	57	2	52
5	57	2	53
6	57	2	54
7	57	2	55
8	57	2	56
9	57	2	57
:	28	0	58
;	28	1	59
=	61	0	61
?	50	2	63
A	76	2	65
B	78	2	66
C	78	2	67
D	83	2	68
E	76	2	69
F	72	2	70
G	83	2	71
H	87	2	72
I	44	2	73
J	65	2	74
K	81	2	75
L	72	2	76
M	98	2	77
N	83	2	78
O	83	2	79
P	76	2	80
Q	83	3	81
R	81	2	82
S	67	2	83
T	72	2	84
U	83	2	85
V	76	2	86
W	98	2	87
X	72	2	88
Y	72	2	89
Z	67	2	90
[	39	3	91
]	39	3	93
`	24	2	96
a	61	0	97
b	65	2	98
c	56	0	99
d	67	2	100
e	57	0	101
f	39	2	102
g	61	1	103
h	69	2	104
i	37	2	105
j	35	3	106
k	67	2	107
l	35	2	108
m	96	0	109
n	69	0	110
o	61	0	111
p	67	1	112
q	65	1	113
r	52	0	114
s	50	0	115
t	43	2	116
u	69	0	117
v	61	0	118
w	89	0	119
x	61	0	120
y	61	1	121
z	54	0	122
ct	57	3	162
fi	69	2	174
fl	69	2	175
dg	50	2	178
bu	61	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	48	2	170
''	48	2	186
0707070014230362221006440057030057030000011043700522627502500002500000002047post.src/devopost/NI# NewCenturySchlbk-Italic
name NI
internalname 30
ligatures fi fl 0
charset
!	33	2	33
$	56	3	36
%	83	2	37
&	85	2	38
'	20	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	61	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
=	61	0	61
?	44	2	63
A	70	2	65
B	72	2	66
C	72	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	61	2	74
K	74	2	75
L	67	2	76
M	94	2	77
N	81	2	78
O	78	2	79
P	67	2	80
Q	78	3	81
R	74	2	82
S	67	2	83
T	69	2	84
U	81	2	85
V	70	2	86
W	93	2	87
X	70	2	88
Y	69	2	89
Z	67	2	90
[	33	3	91
]	33	3	93
`	20	2	96
a	57	0	97
b	56	2	98
c	44	0	99
d	61	2	100
e	44	0	101
f	33	3	102
g	54	1	103
h	61	2	104
i	33	2	105
j	32	3	106
k	56	2	107
l	33	2	108
m	89	0	109
n	61	0	110
o	50	0	111
p	57	1	112
q	56	1	113
r	44	0	114
s	44	0	115
t	35	2	116
u	61	0	117
v	52	0	118
w	78	0	119
x	50	0	120
y	50	1	121
z	46	0	122
ct	56	3	162
fi	61	3	174
fl	61	3	175
dg	50	3	178
bu	61	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	39	2	170
''	39	2	186
0707070014230362231006440057030057030000011043720522627502500002500000002046post.src/devopost/NR# NewCenturySchlbk-Roman
name NR
internalname 29
ligatures fi fl 0
charset
!	30	2	33
$	56	3	36
%	83	2	37
&	81	2	38
'	20	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
=	61	0	61
?	44	2	63
A	72	2	65
B	72	2	66
C	72	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	56	2	74
K	78	2	75
L	67	2	76
M	94	2	77
N	81	2	78
O	78	2	79
P	67	2	80
Q	78	3	81
R	72	2	82
S	63	2	83
T	67	2	84
U	81	2	85
V	72	2	86
W	98	2	87
X	70	2	88
Y	70	2	89
Z	61	2	90
[	33	3	91
]	33	3	93
`	20	2	96
a	56	0	97
b	56	2	98
c	44	0	99
d	57	2	100
e	50	0	101
f	33	2	102
g	54	1	103
h	61	2	104
i	32	2	105
j	30	3	106
k	59	2	107
l	32	2	108
m	89	0	109
n	61	0	110
o	50	0	111
p	57	1	112
q	56	1	113
r	44	0	114
s	46	0	115
t	39	2	116
u	61	0	117
v	54	0	118
w	78	0	119
x	54	0	120
y	54	1	121
z	48	0	122
ct	56	3	162
fi	61	2	174
fl	61	2	175
dg	50	3	178
bu	61	2	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	39	2	170
''	39	2	186
0707070014230362241006440057030057030000011043740522627502500002500000002053post.src/devopost/NX# NewCenturySchlbk-BoldItalic
name NX
internalname 32
ligatures fi fl 0
charset
!	33	2	33
$	57	3	36
%	89	2	37
&	89	2	38
'	26	2	39
(	41	3	40
)	41	3	41
*	50	2	42
+	61	0	43
,	29	1	44
hy	33	0	45
-	"
.	29	0	46
/	28	2	47
0	57	2	48
1	57	2	49
2	57	2	50
3	57	2	51
4	57	2	52
5	57	2	53
6	57	2	54
7	57	2	55
8	57	2	56
9	57	2	57
:	29	0	58
;	29	1	59
=	61	0	61
?	48	2	63
A	74	2	65
B	76	2	66
C	76	2	67
D	83	2	68
E	74	2	69
F	70	2	70
G	81	2	71
H	87	2	72
I	44	2	73
J	67	2	74
K	78	2	75
L	70	2	76
M	94	2	77
N	85	2	78
O	83	2	79
P	74	2	80
Q	83	3	81
R	80	2	82
S	69	2	83
T	72	2	84
U	83	2	85
V	74	2	86
W	94	2	87
X	74	2	88
Y	70	2	89
Z	70	2	90
[	41	3	91
]	41	3	93
`	26	2	96
a	67	0	97
b	61	2	98
c	54	0	99
d	67	2	100
e	52	0	101
f	39	3	102
g	61	1	103
h	69	2	104
i	39	2	105
j	37	3	106
k	65	2	107
l	39	2	108
m	94	0	109
n	69	0	110
o	57	0	111
p	65	1	112
q	63	1	113
r	52	0	114
s	48	0	115
t	41	2	116
u	69	0	117
v	56	0	118
w	83	0	119
x	57	0	120
y	52	1	121
z	52	0	122
ct	57	3	162
fi	69	3	174
fl	69	3	175
dg	50	3	178
bu	61	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	48	2	170
''	48	2	186
0707070014230362251006440057030057030000011043760522627502500002500000002037post.src/devopost/PA# Palatino-Roman
name PA
internalname 13
ligatures fi fl 0
charset
!	28	2	33
$	50	2	36
%	84	2	37
&	78	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	39	2	42
+	61	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	61	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
=	61	0	61
?	44	2	63
A	78	2	65
B	61	2	66
C	71	2	67
D	77	2	68
E	61	2	69
F	56	2	70
G	76	2	71
H	83	2	72
I	34	2	73
J	33	3	74
K	73	2	75
L	61	2	76
M	95	2	77
N	83	2	78
O	79	2	79
P	60	2	80
Q	79	3	81
R	67	2	82
S	53	2	83
T	61	2	84
U	78	2	85
V	72	2	86
W	100	2	87
X	67	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
]	33	2	93
`	28	2	96
a	50	0	97
b	55	2	98
c	44	0	99
d	61	2	100
e	48	0	101
f	33	2	102
g	56	1	103
h	58	2	104
i	29	2	105
j	23	3	106
k	56	2	107
l	29	2	108
m	88	0	109
n	58	0	110
o	55	0	111
p	60	1	112
q	56	1	113
r	40	0	114
s	42	0	115
t	33	2	116
u	60	0	117
v	56	0	118
w	83	0	119
x	52	0	120
y	56	1	121
z	50	0	122
ct	50	0	162
fi	61	2	174
fl	61	2	175
dg	50	2	178
bu	61	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230362261006440057030057030000011044100522627502500002500000002037post.src/devopost/PB# Palatino-Bold
name PB
internalname 15
ligatures fi fl 0
charset
!	28	2	33
$	50	2	36
%	89	2	37
&	83	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	44	2	42
+	61	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	30	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
=	61	0	61
?	44	2	63
A	78	2	65
B	67	2	66
C	72	2	67
D	83	2	68
E	61	2	69
F	56	2	70
G	83	2	71
H	83	2	72
I	39	2	73
J	39	3	74
K	78	2	75
L	61	2	76
M	100	2	77
N	83	2	78
O	83	2	79
P	61	2	80
Q	83	3	81
R	72	2	82
S	61	2	83
T	67	2	84
U	78	2	85
V	78	2	86
W	100	2	87
X	67	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
]	33	2	93
`	28	2	96
a	50	0	97
b	61	2	98
c	44	0	99
d	61	2	100
e	50	0	101
f	39	2	102
g	56	1	103
h	61	2	104
i	33	2	105
j	33	3	106
k	61	2	107
l	33	2	108
m	89	0	109
n	61	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	39	0	114
s	44	0	115
t	33	2	116
u	61	0	117
v	56	0	118
w	83	0	119
x	50	0	120
y	56	1	121
z	50	0	122
ct	50	0	162
fi	61	2	174
fl	61	2	175
dg	50	2	178
bu	61	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230362271006440057030057030000011044120522627502500002500000002037post.src/devopost/PI# Palatino-Italic
name PI
internalname 14
ligatures fi fl 0
charset
!	33	2	33
$	50	2	36
%	89	2	37
&	78	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	39	2	42
+	61	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	30	3	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
=	61	0	61
?	50	2	63
A	72	2	65
B	61	2	66
C	67	2	67
D	78	2	68
E	61	2	69
F	56	2	70
G	72	2	71
H	78	2	72
I	33	2	73
J	33	3	74
K	67	2	75
L	56	2	76
M	94	2	77
N	78	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	78	2	85
V	72	2	86
W	94	2	87
X	72	2	88
Y	67	2	89
Z	67	2	90
[	33	2	91
]	33	2	93
`	28	2	96
a	44	0	97
b	46	2	98
c	41	0	99
d	50	2	100
e	39	0	101
f	28	3	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	44	0	111
p	50	1	112
q	46	1	113
r	39	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
ct	50	0	162
fi	53	3	174
fl	54	3	175
dg	50	2	178
bu	50	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230362301006440057030057030000011044140522627502500002500000002044post.src/devopost/PX# Palatino-BoldItalic
name PX
internalname 16
ligatures fi fl 0
charset
!	33	2	33
$	50	2	36
%	89	2	37
&	83	2	38
'	28	2	39
(	33	2	40
)	33	2	41
*	44	2	42
+	61	0	43
,	25	1	44
hy	39	0	45
-	"
.	25	0	46
/	32	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
=	61	0	61
?	44	2	63
A	72	2	65
B	67	2	66
C	69	2	67
D	78	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	78	2	72
I	39	2	73
J	39	3	74
K	72	2	75
L	61	2	76
M	94	2	77
N	78	2	78
O	83	2	79
P	67	2	80
Q	83	3	81
R	72	2	82
S	56	2	83
T	61	2	84
U	78	2	85
V	67	2	86
W	100	2	87
X	72	2	88
Y	61	2	89
Z	67	2	90
[	33	2	91
]	33	2	93
`	28	2	96
a	56	0	97
b	54	2	98
c	44	0	99
d	56	2	100
e	44	0	101
f	33	3	102
g	50	1	103
h	56	2	104
i	33	2	105
j	33	3	106
k	56	2	107
l	33	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	54	1	113
r	39	0	114
s	44	0	115
t	39	2	116
u	56	0	117
v	56	0	118
w	83	0	119
x	50	0	120
y	56	1	121
z	50	0	122
ct	50	0	162
fi	61	3	174
fl	61	3	175
dg	56	2	178
bu	61	0	183
de	56	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	50	2	170
''	50	2	186
0707070014230362311006440057030057030000011044160522627502500002400000002101post.src/devopost/R# Times-Roman
name R
internalname 1
ligatures fi fl 0
charset
!	33	2	33
$	50	2	36
%	83	2	37
&	78	2	38
'	33	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	56	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	28	0	58
;	28	1	59
=	56	0	61
?	44	2	63
A	72	2	65
B	67	2	66
C	67	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	72	2	71
H	72	2	72
I	33	2	73
J	39	2	74
K	72	2	75
L	61	2	76
M	89	2	77
N	72	2	78
O	72	2	79
P	56	2	80
Q	72	3	81
R	67	2	82
S	56	2	83
T	61	2	84
U	72	2	85
V	72	2	86
W	94	2	87
X	72	2	88
Y	72	2	89
Z	61	2	90
[	33	3	91
]	33	3	93
`	33	2	96
a	44	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	33	2	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	39	0	115
t	28	2	116
u	50	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	44	0	122
ct	50	3	162
fi	56	2	174
fl	56	2	175
ff	60	2	1
Fi	84	2	1
Fl	84	2	1
dg	50	3	178
bu	35	0	183
de	33	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
sq	50	2	1
``	44	2	170
''	44	2	186
0707070014230362321006440057030057030000011044300522627502500002400000004600post.src/devopost/S# Symbol
name S
internalname 33
special
charset
bx	50	2	1
ci	75	0	1
sq	50	2	1
~=	55	0	1
L1	110	1	2
LA	110	1	2
LV	110	3	2
LH	210	1	2
Lb	"
lh	100	0	2
rh	100	0	2
---	25	0	32
---	33	2	33
fa	71	2	34
---	50	2	35
te	55	2	36
---	83	2	37
---	78	2	38
---	44	0	39
---	33	3	40
---	33	3	41
**	50	0	42
pl	55	0	43
---	25	1	44
mi	55	0	45
---	25	0	46
---	28	2	47
---	50	2	48
---	50	2	49
---	50	2	50
---	50	2	51
---	50	2	52
---	50	2	53
---	50	2	54
---	50	2	55
---	50	2	56
---	50	2	57
---	28	0	58
---	28	1	59
<	55	0	60
eq	55	0	61
>	55	0	62
---	44	2	63
*A	72	2	65
*B	67	2	66
*X	72	2	67
*D	61	2	68
*E	61	2	69
*F	76	2	70
*G	60	2	71
*Y	72	2	72
*I	33	2	73
---	63	2	74
*K	72	2	75
*L	69	2	76
*M	89	2	77
*N	72	2	78
*O	72	2	79
*P	77	2	80
*H	74	2	81
*R	56	2	82
*S	59	2	83
*T	61	2	84
*U	69	2	85
---	44	1	86
ts	44	1	86
*W	77	2	87
*C	65	2	88
*Q	80	2	89
*Z	61	2	90
---	33	3	91
---	86	0	92
---	33	3	93
---	66	2	94
ul	50	1	95
_	"
rn	50	2	96
*a	63	0	97
*b	55	3	98
*x	55	1	99
*d	49	2	100
*e	44	0	101
*f	52	3	102
*g	41	1	103
*y	60	1	104
*i	33	0	105
---	60	1	106
*k	55	0	107
*l	55	2	108
*m	58	1	109
*n	52	0	110
*o	55	0	111
*p	55	0	112
*h	52	2	113
*r	55	1	114
*s	60	0	115
*t	44	0	116
*u	58	0	117
---	71	2	118
*w	69	0	119
*c	49	3	120
*q	69	1	121
*z	49	3	122
{	48	3	123
or	20	3	124
}	48	3	125
ap	55	0	126
---	62	2	161
fm	25	2	162
<=	55	2	163
sl	17	2	164
if	73	0	165
---	50	3	166
---	75	0	167
---	75	0	168
---	75	0	169
---	75	0	170
---	104	0	171
<-	99	0	172
ua	60	2	173
->	99	0	174
da	60	2	175
de	40	2	176
+-	55	2	177
---	41	2	178
>=	55	2	179
mu	55	0	180
pt	71	0	181
pd	49	2	182
bu	46	0	183
di	55	0	184
!=	55	0	185
==	55	0	186
~~	55	0	187
---	100	0	188
---	60	3	189
---	100	0	190
---	66	2	191
al	82	2	192
---	69	2	193
---	80	2	194
---	99	3	195
Ox	77	2	196
O+	77	2	197
es	82	2	198
ca	77	0	199
cu	77	0	200
sp	71	0	201
ip	71	1	202
---	71	0	203
sb	71	0	204
ib	71	1	205
mo	71	0	206
---	71	0	207
---	77	2	208
gr	71	2	209
rg	79	2	210
co	79	2	211
tm	89	2	212
---	82	2	213
sr	55	2	214
---	25	0	215
no	71	0	216
^	60	0	217
or	60	0	218
---	104	0	219
---	99	0	220
---	60	2	221
---	99	0	222
---	60	2	223
---	49	2	224
---	33	3	225
---	79	2	226
---	79	2	227
---	79	2	228
---	71	2	229
---	38	3	230
br	0	3	231
---	38	3	232
lc	50	2	233
vr	0	2	234
lf	50	2	235
lt	49	2	236
lk	49	2	237
lb	49	2	238
bv	49	2	239
---	25	0	240
---	33	3	241
is	50	3	242
---	69	2	243
---	69	2	244
---	69	2	245
---	38	3	246
---	38	2	247
---	38	3	248
rc	38	2	249
|	50	3	250
rf	38	2	251
rt	49	2	252
rk	49	2	253
rb	49	2	254
0707070014230362331006440057030057030000011042570522627502500002500000000530post.src/devopost/S1# Times-Roman special font
name S1
internalname 1
special
charset
"	41	2	34
#	50	2	35
<	56	0	60
>	56	0	62
@	92	3	64
\	28	2	92
or	20	2	124
^	33	2	195
~	33	2	196
\'	33	2	194
aa	"
\`	33	2	193
ga	"
ru	50	0	95
\-	65	0	177
en	"
sc	50	3	167
dg	50	3	178
dd	50	3	179
ct	50	3	162
14	75	2	1
34	75	2	1
12	75	2	1
Sl	50	2	1
ob	38	0	1
``	44	2	170
''	44	2	186
0707070014230362341006440057030057030000011044330522627502500002500000004145post.src/devopost/ZD# ZapfDingbats
name ZD
internalname 36
ligatures fi fl 0
charset
!	97	2	33
"	96	2	34
#	97	2	35
$	98	3	36
%	72	2	37
&	79	3	38
'	79	3	39
(	79	3	40
)	69	2	41
*	96	2	42
+	94	2	43
,	55	3	44
-	86	2	45
.	91	2	46
/	93	2	47
0	91	2	48
1	94	2	49
2	97	2	50
3	76	3	51
4	85	3	52
5	76	2	53
6	76	2	54
7	57	3	55
8	68	3	56
9	76	2	57
:	76	2	58
;	76	2	59
<	75	3	60
=	49	2	61
>	55	2	62
?	54	3	63
@	58	2	64
A	69	3	65
B	79	3	66
C	79	3	67
D	79	3	68
E	79	3	69
F	79	3	70
G	79	3	71
H	82	3	72
I	82	3	73
J	79	3	74
K	84	3	75
L	82	3	76
M	83	3	77
N	82	3	78
O	83	3	79
P	92	3	80
Q	74	2	81
R	72	2	82
S	75	2	83
T	79	3	84
U	79	3	85
V	69	3	86
W	78	3	87
X	77	3	88
Y	79	3	89
Z	76	2	90
[	71	3	91
\	71	3	92
]	68	3	93
^	70	3	94
_	83	3	95
`	81	3	96
a	79	3	97
b	79	3	98
c	71	3	99
d	69	2	100
e	70	2	101
f	69	2	102
g	79	3	103
h	79	3	104
i	71	3	105
j	79	3	106
k	78	3	107
l	79	3	108
m	87	3	109
n	76	2	110
o	76	2	111
p	76	2	112
q	76	3	113
r	76	3	114
s	89	2	115
t	89	3	116
u	79	3	117
v	78	3	118
w	44	3	119
x	14	2	120
y	28	2	121
z	41	2	122
{	39	2	123
|	39	2	124
}	67	2	125
~	67	2	126
hy	73	3	161
em	54	3	162
de	54	3	163
\-	91	2	164
en	67	3	165
ff	76	3	166
fi	76	2	167
fl	78	2	168
Fi	60	3	169
Fl	69	3	170
fm	63	3	171
ru	79	3	172
dg	79	3	173
bu	79	3	174
14	79	3	175
34	79	3	176
12	79	3	177
ct	79	3	178
rg	79	3	179
sq	79	3	180
sl	79	3	181
ul	79	3	182
or	79	3	183
no	79	3	184
->	79	3	185
<-	79	3	186
da	79	3	187
lh	79	3	188
ua	79	3	189
\e	79	3	190
\'	79	3	191
aa	79	3	192
\`	79	3	193
ga	79	3	194
pl	79	3	195
mi	79	3	196
mu	79	3	197
di	79	3	198
eq	79	3	199
==	79	3	200
>=	79	3	201
<=	79	3	202
!=	79	3	203
+-	79	3	204
-+	79	3	205
ap	79	3	206
~=	79	3	207
gr	79	3	208
is	79	3	209
pd	79	3	210
if	79	3	211
sr	89	2	212
rn	84	2	213
sb	102	2	214
sp	46	3	215
cu	75	2	216
ca	92	2	217
ib	75	2	218
ip	92	2	219
mo	93	2	220
es	93	2	221
sc	93	2	222
dd	83	2	223
lc	87	2	224
rc	83	2	225
lf	92	2	226
rf	92	2	227
bv	92	2	228
**	93	2	229
br	93	2	230
ci	46	3	231
ts	88	2	232
co	84	2	233
lt	84	2	234
rt	87	2	235
lb	87	2	236
rb	70	2	237
lk	70	2	238
rk	87	2	239
rh	87	2	241
tm	76	2	242
Sl	95	2	243
ps	77	2	244
cs	86	2	245
cy	77	2	246
as	89	3	247
os	97	2	248
=.	89	3	249
ld	83	2	250
rd	87	2	251
le	93	2	252
ge	97	2	253
pp	92	2	254
0707070014230362351006440057030057030000011044360522627502500002500000002051post.src/devopost/ZI# ZapfChancery-MediumItalic
name ZI
internalname 37
ligatures fi fl 0
charset
!	28	2	33
$	44	3	36
%	68	2	37
&	78	2	38
'	24	2	39
(	26	3	40
)	22	3	41
*	42	2	42
+	52	0	43
,	22	0	44
hy	28	0	45
-	"
.	22	0	46
/	34	3	47
0	44	2	48
1	44	2	49
2	44	2	50
3	44	2	51
4	44	2	52
5	44	2	53
6	44	2	54
7	44	2	55
8	44	2	56
9	44	2	57
:	26	0	58
;	24	0	59
=	52	0	61
?	38	2	63
A	62	2	65
B	60	2	66
C	52	2	67
D	70	2	68
E	62	2	69
F	58	2	70
G	62	3	71
H	68	2	72
I	38	2	73
J	40	2	74
K	66	3	75
L	58	2	76
M	84	2	77
N	70	3	78
O	60	2	79
P	54	2	80
Q	60	3	81
R	60	3	82
S	46	2	83
T	50	2	84
U	74	2	85
V	64	2	86
W	88	2	87
X	56	2	88
Y	56	3	89
Z	62	2	90
[	24	3	91
]	32	3	93
`	24	2	96
a	42	0	97
b	42	2	98
c	34	0	99
d	44	2	100
e	34	0	101
f	32	3	102
g	40	1	103
h	44	2	104
i	24	2	105
j	22	3	106
k	44	3	107
l	24	2	108
m	62	0	109
n	46	0	110
o	40	0	111
p	44	1	112
q	40	3	113
r	30	0	114
s	32	0	115
t	32	2	116
u	46	0	117
v	44	0	118
w	68	0	119
x	42	1	120
y	40	1	121
z	44	0	122
ct	44	2	162
fi	52	3	174
fl	52	3	175
dg	46	3	178
bu	60	2	183
de	30	2	202
em	100	0	208
14	75	2	1
34	75	2	1
12	75	2	1
``	34	2	170
''	36	2	186
0707070014230642310407550057030057030000021707770522627502700003200000000000post.src/devopost/charlib0707070014230642321006440057030057030000011704730522627502500003500000000421post.src/devopost/charlib/12/build_12 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (1) show
    rmoveto
    optsize R f
    (\244) show
    f
    (2) show

    optsize ofont f
} def
0707070014230642331006440057030057030000011704740522627502500003500000000421post.src/devopost/charlib/14/build_14 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (1) show
    rmoveto
    optsize R f
    (\244) show
    f
    (4) show

    optsize ofont f
} def
0707070014230642341006440057030057030000011704750522627502600003500000000421post.src/devopost/charlib/34/build_34 {
    pop
    /optsize ptsize def
    /osize size def
    /ofont font def

    optsize 2 div dup R exch R f
    0 size 2 mul 3 div dup neg exch 0 exch rmoveto

    (3) show
    rmoveto
    optsize R f
    (\244) show
    f
    (4) show

    optsize ofont f
} def
0707070014230642351006440057030057030000011710100522627502600005000000004542post.src/devopost/charlib/BRACKETS_NOTE
 lc, rc, lf, and rf contain PostScript code that can be used to build the top
 and bottom bracket pieces used by eqn. The files are only used if the character
 code field in the S font file for lc, rc, lf, and rf is set to 1. A code larger
 than 32 means a character from Adobe's Symbol font will be used. Think the real
 solution is to change eqn so large brackets and braces are built differently.

 There were some serious collisions with eqn's bracket building algorithm and
 Adobe's Symbol font. eqn extends all the pieces with the \(bv character, while
 the bracket and brace pieces available in Adobe's Symbol are all quite different
 and are designed to work with their own extenders. The reference points are
 different, but worse still the thickness of brackets and braces don't match.
 Anyway using a single extender (the way eqn does) can't ever work with the
 bracket and brace characters available in Adobe's Symbol font.

 The lc, rc, lf, and rf files are a very complicated attempt to get around the
 problem. Each builds the troff character by using the \(bv character from the
 Symbol font and then draws a small horizontal line at either the top or bottom
 of the \(bv. Using \(bv for the vertical part guarantees things will stack
 properly, but getting to the precise top or bottom of the \(bv (down to the
 pixel level on all devices and in all sizes) proved to be very difficult. In
 fact you would think that determining the bounding box of \(bv would be enough
 to let you draw a good bracket piece that matched up nicely with the extender.
 Not quite, at least I didn't find that it was possible to do a good job drawing
 the pieces from the \(bv bounding box. Think roundoff errors introduced by the
 CTM caused the trouble, although I expect there's more to it.
 
 Clipping a rectangular region 2 pixels smaller in height than the bounding box
 of the \(bv character, and using the corners of that box to locate the top and
 bottom of the bv for the horizontal extender solved the problems I originally
 had with the precise placement of the horizontal rule. Anyway that's what the
 clipping and idtransform are for. The initgraphics stuff is an attempt to fit
 a tight bounding box around the \(bv character independent of the rotation of
 our coordinate system. pathbbox only returns what we want if the coordinate
 system has been rotated by a multiple of 90 degrees.
 
0707070014230642361006440057030057030000011704760522627502600003500000000075post.src/devopost/charlib/Fi/build_Fi {
    pop
    size .05 mul neg 0 (ffi) ashow
} def
0707070014230642371006440057030057030000011704770522627502600003500000000075post.src/devopost/charlib/Fl/build_Fl {
    pop
    size .05 mul neg 0 (ffl) ashow
} def
0707070014230642401006440057030057030000011710130522627502600003500000000402post.src/devopost/charlib/L1/build_L1 {
    pop
    /picstr 40 string def
    gsave
    currentpoint translate
    .533 72 mul size mul 36 div
    .5 72 mul size mul 36 div
    scale
    160 150 1 [160 0 0 -150 0 150]
    {currentfile picstr readhexstring pop} image
    grestore
} def
0707070014230642411006440057030057030000011710300522627502600004100000014006post.src/devopost/charlib/L1.mapFFFFFFFFFFFFFFFFFF0007FFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFE0000000007FFFFFFFFFFFFFFF
FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFF
FFFFFFFFFFFFF8000000000001FFFFFFFFFFFFFF
FFFFFFFFFFFFE00000000000003FFFFFFFFFFFFF
FFFFFFFFFFFF000000000000000FFFFFFFFFFFFF
FFFFFFFFFFFC0000000000000003FFFFFFFFFFFF
FFFFFFFFFFF000000000000000007FFFFFFFFFFF
FFFFFFFFFFC000000000000000003FFFFFFFFFFF
FFFFFFFFFF8FFFFFFF00000000000FFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFF0000000007FFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF
FFFFFFFFFFFFFFFFFFFFC00000000003FFFFFFFF
FFFFFFF81FFFFFFFFFC0000000000001FFFFFFFF
FFFFFFF0000000000000000000000000FFFFFFFF
FFFFFFE00000000000000000000000007FFFFFFF
FFFFFFC00000000000000000000000003FFFFFFF
FFFFFF800000000000000000000000001FFFFFFF
FFFFFF000000000000000000000000000FFFFFFF
FFFFFE0007FFFFFFFF8000000000000007FFFFFF
FFFFFE7FFFFFFFFFFFFFFE000000000003FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFF0000000003FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFE000000001FFFFF
FFFFFFFFFFFFFFFFFFFFFFFF80000000001FFFFF
FFFF01FFFFFFFFFFFFFFFFC000000000000FFFFF
FFFE00000000000000000000000000000007FFFF
FFFE00000000000000000000000000000007FFFF
FFFC00000000000000000000000000000003FFFF
FFFC00000000000000000000000000000003FFFF
FFF800000000000000000000000000000001FFFF
FFF800000000000000000000000000000000FFFF
FFF80FFFFFFFFFFFFFFFFFE0000000000000FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFE0000000000FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FFF
FFFFFFFFFFFFFFFFFFFFFFFFFFC0000000001FFF
FF87FFFFFFFFFFFFFFFFFFFFC000000000000FFF
FF000000007FFFFFFFFFFC000000000000000FFF
FF000000000000000000000000000000000007FF
FF000000000000000000000000000000000007FF
FE000000000000000000000000000000000007FF
FE000000000000000000000000000000000003FF
FE000000000000000000000000000000000003FF
FE0007FFFFFFFFFFFFFFFFC000000000000003FF
FC0FFFFFFFFFFFFFFFFFFFFFFC000000000003FF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000003FF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FF
FFFFFFFFFFFFFFFFFFFFFFFFFF800000000001FF
F8FFFFFFFFFFFFFFFFFFFFFF80000000000000FF
F8000FFFFFFFFFFFFFFFFF0000000000000000FF
F8000000000000000000000000000000000000FF
F0000000000000000000000000000000000000FF
F0000000000000000000000000000000000000FF
F0000000000000000000000000000000000000FF
F00000000000000000000000000000000000007F
F00000007FFFFFFFFFFFE000000000000000007F
F000FFFFFFFFFFFFFFFFFFFF000000000000007F
F07FFFFFFFFFFFFFFFFFFFFFFFC000000000007F
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000007F
F007FFFFFFFFFFFFFFFFFFFC000000000000007F
F00003FFFFFFFFFFFFFFF000000000000000007F
F00000000000000000000000000000000000007F
F00000000000000000000000000000000000007F
F0000000000000000000000000000000000000FF
F0000000000000000000000000000000000000FF
F8000000000000000000000000000000000000FF
F8000000000000000000000000000000000000FF
F80003FFFFFFFFFFFFFFF80000000000000000FF
F80FFFFFFFFFFFFFFFFFFFFFC0000000000000FF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFE00000000000003FF
FC003FFFFFFFFFFFFFFE000000000000000003FF
FE000000FFFFFFFFC800000000000000000003FF
FE000000000000000000000000000000000003FF
FE000000000000000000000000000000000003FF
FE000000000000000000000000000000000003FF
FF000000000000000000000000000000000007FF
FF000000000000000000000000000000000007FF
FF000000000000000000000000000000000007FF
FF80000000000000000000000000000000000FFF
FF8000000007FF80000000000000000000000FFF
FFC00007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFC07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFF03FFFFFFFFFFFFFFFC0000000000000007FFF
FFF0000007FFFFFE000000000000000000007FFF
FFF800000000000000000000000000000000FFFF
FFF800000000000000000000000000000000FFFF
FFF800000000000000000000000000000000FFFF
FFFC00000000000000000000000000000001FFFF
FFFE00000000000000000000000000000003FFFF
FFFE00000000000000000000000000000003FFFF
FFFF00000000000000000000000000000007FFFF
FFFF0000000000000000000000000000000FFFFF
FFFF8000000000000000000000000000000FFFFF
FFFFC000003FFFE00000000000000000001FFFFF
FFFFE007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFC0000000000000000000000000001FFFFFF
FFFFFE0000000000000000000000000003FFFFFF
FFFFFF0000000000000000000000000003FFFFFF
FFFFFF0000000000000000000000000007FFFFFF
FFFFFF800000000000000000000000000FFFFFFF
FFFFFFC00000000000000000000000001FFFFFFF
FFFFFFE00000000000000000000000003FFFFFFF
FFFFFFF00000000000000000000000007FFFFFFF
FFFFFFFC000000000000000000000000FFFFFFFF
FFFFFFFE000000000000000000000003FFFFFFFF
FFFFFFFF000000000000000000000007FFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00000000000000000003FFFFFFFFFF
FFFFFFFFFF8000000000000000000FFFFFFFFFFF
FFFFFFFFFFE000000000000000001FFFFFFFFFFF
FFFFFFFFFFF000000000000000007FFFFFFFFFFF
FFFFFFFFFFFC0000000000000001FFFFFFFFFFFF
FFFFFFFFFFFF0000000000000007FFFFFFFFFFFF
FFFFFFFFFFFFE00000000000003FFFFFFFFFFFFF
FFFFFFFFFFFFF8000000000000FFFFFFFFFFFFFF
FFFFFFFFFFFFFF000000000007FFFFFFFFFFFFFF
FFFFFFFFFFFFFFF0000000007FFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFF
0707070014230642421006440057030057030000011710370522627502600003500000000024post.src/devopost/charlib/LH/build_LH {pop} def
0707070014230642431006440057030057030000011710500522627502600004100000017112post.src/devopost/charlib/LH.mapgsave
/M {moveto} def
/L {lineto} def

currentpoint translate
0 360 translate
2.4 2.4 scale
ptsize 36 div dup neg scale

68 1 M
68 1 L
60 2 L
55 3 L
52 4 L
49 5 L
47 6 L
44 7 L
42 8 L
40 9 L
38 10 L
37 11 L
39 11 L
53 10 L
68 11 L
76 12 L
112 12 L
111 11 L
109 10 L
108 9 L
105 8 L
103 7 L
101 6 L
98 5 L
95 4 L
92 3 L
88 2 L
80 1 L
closepath
84 17 M
84 17 L
78 18 L
70 19 L
50 20 L
30 19 L
25 19 L
24 20 L
23 21 L
22 22 L
21 23 L
20 24 L
19 25 L
19 26 L
20 26 L
32 25 L
50 24 L
69 25 L
83 26 L
92 27 L
129 27 L
129 26 L
128 25 L
127 24 L
126 23 L
125 22 L
124 21 L
123 20 L
122 19 L
121 18 L
119 17 L
closepath
99 32 M
99 32 L
93 33 L
86 34 L
52 35 L
18 34 L
12 34 L
11 35 L
11 36 L
10 37 L
10 38 L
9 39 L
9 40 L
9 41 L
15 41 L
51 40 L
87 41 L
99 42 L
139 42 L
139 41 L
139 40 L
138 39 L
137 38 L
137 37 L
136 36 L
136 35 L
135 34 L
134 33 L
134 32 L
closepath
110 47 M
110 47 L
102 48 L
94 49 L
82 50 L
59 51 L
36 50 L
8 49 L
5 49 L
4 50 L
4 51 L
4 52 L
3 53 L
3 54 L
3 55 L
3 56 L
2 57 L
7 57 L
16 56 L
51 55 L
86 56 L
98 57 L
110 58 L
145 58 L
145 57 L
145 56 L
145 55 L
145 54 L
144 53 L
144 52 L
144 51 L
143 50 L
143 49 L
142 48 L
142 47 L
closepath
178 49 M
178 49 L
178 50 L
177 51 L
177 52 L
177 53 L
176 54 L
176 55 L
176 56 L
175 57 L
175 58 L
175 59 L
174 60 L
174 61 L
174 62 L
173 63 L
173 64 L
173 65 L
172 66 L
172 67 L
172 68 L
171 69 L
171 70 L
171 71 L
170 72 L
170 73 L
170 74 L
169 75 L
169 76 L
169 77 L
168 78 L
168 79 L
168 80 L
167 81 L
167 82 L
167 83 L
166 84 L
166 85 L
166 86 L
165 87 L
165 88 L
165 89 L
164 90 L
164 91 L
164 92 L
163 93 L
163 94 L
163 95 L
162 96 L
162 97 L
162 98 L
161 99 L
161 100 L
161 101 L
160 102 L
174 102 L
174 101 L
175 100 L
175 99 L
175 98 L
176 97 L
176 96 L
176 95 L
177 94 L
185 93 L
194 94 L
194 95 L
195 96 L
195 97 L
195 98 L
195 99 L
196 100 L
196 101 L
196 102 L
210 102 L
209 101 L
209 100 L
209 99 L
208 98 L
208 97 L
208 96 L
208 95 L
207 94 L
207 93 L
207 92 L
206 91 L
206 90 L
206 89 L
205 88 L
205 87 L
205 86 L
204 85 L
204 84 L
204 83 L
203 82 L
203 81 L
203 80 L
202 79 L
202 78 L
202 77 L
202 76 L
201 75 L
201 74 L
201 73 L
200 72 L
200 71 L
200 70 L
199 69 L
199 68 L
199 67 L
198 66 L
198 65 L
198 64 L
197 63 L
197 62 L
197 61 L
197 60 L
196 59 L
196 58 L
196 57 L
195 56 L
195 55 L
195 54 L
194 53 L
194 52 L
194 51 L
193 50 L
193 49 L
closepath
200 49 M
200 49 L
200 50 L
200 51 L
200 52 L
200 53 L
200 54 L
200 55 L
200 56 L
200 57 L
200 58 L
200 59 L
200 60 L
214 61 L
214 62 L
214 63 L
214 64 L
214 65 L
214 66 L
214 67 L
214 68 L
214 69 L
214 70 L
214 71 L
214 72 L
214 73 L
214 74 L
214 75 L
214 76 L
214 77 L
214 78 L
214 79 L
214 80 L
214 81 L
214 82 L
214 83 L
214 84 L
214 85 L
214 86 L
214 87 L
214 88 L
214 89 L
214 90 L
214 91 L
214 92 L
214 93 L
214 94 L
214 95 L
214 96 L
214 97 L
214 98 L
214 99 L
214 100 L
214 101 L
214 102 L
228 102 L
228 101 L
228 100 L
228 99 L
228 98 L
228 97 L
228 96 L
228 95 L
228 94 L
228 93 L
228 92 L
228 91 L
228 90 L
228 89 L
228 88 L
228 87 L
228 86 L
228 85 L
228 84 L
228 83 L
228 82 L
228 81 L
228 80 L
228 79 L
228 78 L
228 77 L
228 76 L
228 75 L
228 74 L
228 73 L
228 72 L
228 71 L
228 70 L
228 69 L
228 68 L
228 67 L
228 66 L
228 65 L
228 64 L
228 63 L
228 62 L
228 61 L
241 60 L
241 59 L
241 58 L
241 57 L
241 56 L
241 55 L
241 54 L
241 53 L
241 52 L
241 51 L
241 50 L
241 49 L
closepath
266 49 M
266 49 L
266 50 L
266 51 L
266 52 L
266 53 L
266 54 L
266 55 L
266 56 L
266 57 L
266 58 L
266 59 L
266 60 L
280 61 L
280 62 L
280 63 L
280 64 L
280 65 L
280 66 L
280 67 L
280 68 L
280 69 L
280 70 L
280 71 L
280 72 L
280 73 L
280 74 L
280 75 L
280 76 L
280 77 L
280 78 L
280 79 L
280 80 L
280 81 L
280 82 L
280 83 L
280 84 L
280 85 L
280 86 L
280 87 L
280 88 L
280 89 L
280 90 L
280 91 L
280 92 L
280 93 L
280 94 L
280 95 L
280 96 L
280 97 L
280 98 L
280 99 L
280 100 L
280 101 L
280 102 L
294 102 L
294 101 L
294 100 L
294 99 L
294 98 L
294 97 L
294 96 L
294 95 L
294 94 L
294 93 L
294 92 L
294 91 L
294 90 L
294 89 L
294 88 L
294 87 L
294 86 L
294 85 L
294 84 L
294 83 L
294 82 L
294 81 L
294 80 L
294 79 L
294 78 L
294 77 L
294 76 L
294 75 L
294 74 L
294 73 L
294 72 L
294 71 L
294 70 L
294 69 L
294 68 L
294 67 L
294 66 L
294 65 L
294 64 L
294 63 L
294 62 L
294 61 L
308 60 L
308 59 L
308 58 L
308 57 L
308 56 L
308 55 L
308 54 L
308 53 L
308 52 L
308 51 L
308 50 L
308 49 L
closepath
251 59 M
251 59 L
245 60 L
243 61 L
241 62 L
240 63 L
239 64 L
239 65 L
238 66 L
238 67 L
237 68 L
237 69 L
237 70 L
237 71 L
237 72 L
238 73 L
238 74 L
238 75 L
239 76 L
239 77 L
240 78 L
239 79 L
238 80 L
237 81 L
237 82 L
237 83 L
236 84 L
236 85 L
235 86 L
235 87 L
235 88 L
235 89 L
235 90 L
235 91 L
235 92 L
236 93 L
236 94 L
237 95 L
237 96 L
238 97 L
239 98 L
240 99 L
241 100 L
243 101 L
245 102 L
249 103 L
259 103 L
262 102 L
265 101 L
267 100 L
270 101 L
272 102 L
276 102 L
276 101 L
276 100 L
276 99 L
276 98 L
276 97 L
276 96 L
276 95 L
276 94 L
276 93 L
273 92 L
273 91 L
274 90 L
274 89 L
274 88 L
274 87 L
274 86 L
274 85 L
274 84 L
274 83 L
274 82 L
274 81 L
274 80 L
274 79 L
274 78 L
274 77 L
274 76 L
264 75 L
264 74 L
264 73 L
264 72 L
264 71 L
264 70 L
264 69 L
264 68 L
264 67 L
263 66 L
263 65 L
263 64 L
262 63 L
261 62 L
260 61 L
258 60 L
253 59 L
closepath
114 62 M
114 62 L
101 63 L
93 64 L
84 65 L
49 66 L
15 65 L
3 64 L
1 64 L
1 65 L
1 66 L
0 67 L
0 68 L
0 69 L
0 70 L
0 71 L
0 72 L
0 73 L
4 73 L
11 72 L
28 71 L
53 70 L
79 71 L
92 72 L
102 73 L
148 73 L
148 72 L
148 71 L
148 70 L
147 69 L
147 68 L
147 67 L
147 66 L
147 65 L
147 64 L
146 63 L
146 62 L
closepath
185 68 M
185 68 L
186 67 L
187 68 L
187 69 L
187 70 L
188 71 L
188 72 L
188 73 L
188 74 L
189 75 L
189 76 L
189 77 L
189 78 L
190 79 L
190 80 L
190 81 L
185 82 L
181 81 L
181 80 L
181 79 L
182 78 L
182 77 L
182 76 L
183 75 L
183 74 L
183 73 L
184 72 L
184 71 L
184 70 L
184 69 L
closepath
250 68 M
250 68 L
251 67 L
253 68 L
254 69 L
254 70 L
254 71 L
254 72 L
254 73 L
254 74 L
254 75 L
252 76 L
251 75 L
250 74 L
249 73 L
249 72 L
249 71 L
249 70 L
249 69 L
closepath
254 77 M
254 77 L
259 76 L
264 77 L
264 78 L
264 79 L
264 80 L
264 81 L
264 82 L
264 83 L
264 84 L
263 85 L
262 84 L
261 83 L
260 82 L
258 81 L
257 80 L
256 79 L
255 78 L
closepath
100 78 M
100 78 L
90 79 L
80 80 L
48 81 L
17 80 L
8 79 L
0 79 L
0 80 L
0 81 L
0 82 L
0 83 L
0 84 L
1 85 L
1 86 L
1 87 L
1 88 L
7 88 L
17 87 L
49 86 L
81 87 L
94 88 L
147 88 L
147 87 L
147 86 L
147 85 L
147 84 L
147 83 L
148 82 L
148 81 L
148 80 L
148 79 L
148 78 L
closepath
246 86 M
246 86 L
247 85 L
249 86 L
250 87 L
252 88 L
253 89 L
254 90 L
255 91 L
255 92 L
252 93 L
250 92 L
248 91 L
247 90 L
247 89 L
246 88 L
246 87 L
closepath
91 93 M
91 93 L
75 94 L
65 95 L
64 96 L
63 95 L
62 95 L
44 96 L
27 95 L
13 94 L
2 94 L
3 95 L
3 96 L
3 97 L
3 98 L
4 99 L
4 100 L
4 101 L
5 102 L
5 103 L
6 104 L
6 105 L
12 105 L
24 104 L
40 103 L
46 102 L
53 103 L
143 103 L
143 102 L
144 101 L
144 100 L
144 99 L
145 98 L
145 97 L
145 96 L
145 95 L
145 94 L
145 93 L
closepath
8 108 M
8 108 L
8 109 L
9 110 L
9 111 L
9 112 L
10 113 L
11 114 L
11 115 L
12 116 L
12 117 L
13 118 L
14 119 L
15 120 L
24 120 L
37 119 L
46 118 L
55 119 L
134 119 L
135 118 L
135 117 L
136 116 L
137 115 L
137 114 L
138 113 L
139 112 L
139 111 L
139 110 L
140 109 L
140 108 L
78 108 L
59 109 L
45 110 L
32 109 L
13 108 L
closepath
18 124 M
18 124 L
19 125 L
20 126 L
20 127 L
21 128 L
22 129 L
23 130 L
24 131 L
26 132 L
27 133 L
28 134 L
120 134 L
121 133 L
123 132 L
124 131 L
125 130 L
126 129 L
127 128 L
128 127 L
129 126 L
129 125 L
130 124 L
closepath
36 139 M
36 139 L
37 140 L
39 141 L
40 142 L
42 143 L
44 144 L
47 145 L
49 146 L
52 147 L
56 148 L
60 149 L
67 150 L
80 150 L
88 149 L
92 148 L
96 147 L
99 146 L
101 145 L
104 144 L
106 143 L
108 142 L
110 141 L
111 140 L
113 139 L
closepath
fill
grestore
0707070014230642441006440057030057030000011710140522627502600003500000000402post.src/devopost/charlib/Lb/build_Lb {
    pop
    /picstr 78 string def
    gsave
    currentpoint translate
    1.03 72 mul size mul 36 div
    .5 72 mul size mul 36 div
    scale
    309 150 1 [309 0 0 -150 0 150]
    {currentfile picstr readhexstring pop} image
    grestore
} def
0707070014230642451006440057030057030000011710700522627502600004100000027112post.src/devopost/charlib/Lb.mapFFFFFFFFFFFFFFFFF0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFE0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF8000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFE00000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFC0000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFC000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFF8FFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFF0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFC00000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFF81FFFFFFFFFC0000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFF0000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFE00000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFC00000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFF800000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFF000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFE0007FFFFFFFF8000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFE7FFFFFFFFFFFFFFE000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFF0000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFE000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFF80000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFF01FFFFFFFFFFFFFFFFC000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFE00000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFE00000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFC00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFC00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF800000000000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF80FFFFFFFFFFFFFFFFFE0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFE0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFC0000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
F87FFFFFFFFFFFFFFFFFFFFC000000000000FFFFFFFFC0003F00000000003FFFFFC00000000007
F000000007FFFFFFFFFFC000000000000000FFFFFFFFC0003F00000000003FFFFFC00000000007
F000000000000000000000000000000000007FFFFFFF80001F00000000003FFFFFC00000000007
F000000000000000000000000000000000007FFFFFFF80001F00000000003FFFFFC00000000007
E000000000000000000000000000000000007FFFFFFF80001F00000000003FFFFFC00000000007
E000000000000000000000000000000000003FFFFFFF00000F00000000003FFFFFC00000000007
E000000000000000000000000000000000003FFFFFFF00000F00000000003FFFFFC00000000007
E0007FFFFFFFFFFFFFFFFC000000000000003FFFFFFF00000F00000000003FFFFFC00000000007
C0FFFFFFFFFFFFFFFFFFFFFFC000000000003FFFFFFE00000700000000003FFFFFC00000000007
FFFFFFFFFFFFFFFFFFFFFFFFFFFC000000003FFFFFFE00000700000000003FFFFFC00000000007
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000700000000003FE3FFC00000000007
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000003000000000038001FC00000000007
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000003FFFC0007FFE00007FFFF0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000001FFFFFFC000003FFFC0007FF800003FFFF0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFF800000000001FFFFFF8000003FFFC0007FF000001FFFF0001FFFF
8FFFFFFFFFFFFFFFFFFFFFF80000000000000FFFFFF8000001FFFC0007FE000000FFFF0001FFFF
8000FFFFFFFFFFFFFFFFF0000000000000000FFFFFF8000001FFFC0007FE000000FFFF0001FFFF
8000000000000000000000000000000000000FFFFFF0000001FFFC0007FC000000FFFF0001FFFF
0000000000000000000000000000000000000FFFFFF0000000FFFC0007FC0000007FFF0001FFFF
0000000000000000000000000000000000000FFFFFF0002000FFFC0007F80018007FFF0001FFFF
0000000000000000000000000000000000000FFFFFE0006000FFFC0007F8003C007FFF0001FFFF
00000000000000000000000000000000000007FFFFE00060007FFC0007F8003C007FFF0001FFFF
00000007FFFFFFFFFFFE000000000000000007FFFFE00070007FFC0007F8003C007FFF0001FFFF
000FFFFFFFFFFFFFFFFFFFF000000000000007FFFFC00070007FFC0007F8003C007FFF0001FFFF
07FFFFFFFFFFFFFFFFFFFFFFFC000000000007FFFFC000F0003FFC0007FC003C007FFF0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000F0003FFC0007FC001C007FFF0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000F8003FFC0007FC000C007FFF0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8001F8001FFC0007FE000000001F0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8001F8001FFC0007FE0001FF001F0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFF0000000000007FFFF0001F8001FFC0007FF0000FF001F0001FFFF
007FFFFFFFFFFFFFFFFFFFC000000000000007FFFF0003FC001FFC0007FE00007F001F0001FFFF
00003FFFFFFFFFFFFFFF000000000000000007FFFF0003FC000FFC0007FC00003F001F0001FFFF
00000000000000000000000000000000000007FFFE0003FC000FFC0007F800001F001F0001FFFF
00000000000000000000000000000000000007FFFE000000000FFC0007F8000007001F0001FFFF
0000000000000000000000000000000000000FFFFE0000000007FC0007F8000003001F0001FFFF
0000000000000000000000000000000000000FFFFC0000000007FC0007F0000001001F0001FFFF
8000000000000000000000000000000000000FFFFC0000000007FC0007F0000000001F0001FFFF
8000000000000000000000000000000000000FFFFC0000000003FC0007E0018000001F0001FFFF
80003FFFFFFFFFFFFFFF80000000000000000FFFF80000000003FC0007E001C000001F0001FFFF
80FFFFFFFFFFFFFFFFFFFFFC0000000000000FFFF80000000003FC0007E001F000001F0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000000001FC0007E000F800001F0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000001FC0007E000FC00001F0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000001FC0007E0007E00003F0001FFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FC0007E0001E00003F0001FFFF
FFFFFFFFFFFFFFFFFFFFFFE00000000000003FFFE00000000000FC0007F000000000070001FFFF
C003FFFFFFFFFFFFFFE000000000000000003FFFE0003FFFC000FC0007F000000000070001FFFF
E000000FFFFFFFFC800000000000000000003FFFE0007FFFC0007C0007F800000000070001FFFF
E000000000000000000000000000000000003FFFC0007FFFE0007C0007F800000000070001FFFF
E000000000000000000000000000000000003FFFC0007FFFE0007C0007FC00000000070001FFFF
E000000000000000000000000000000000003FFFC000FFFFE0007C0007FE00000000070001FFFF
F000000000000000000000000000000000007FFF8000FFFFE0003C0007FF00000000070001FFFF
F000000000000000000000000000000000007FFF8000FFFFF0003C0007FF80000000070001FFFF
F000000000000000000000000000000000007FFF8001FFFFF0003C0007FFE000003C070001FFFF
F80000000000000000000000000000000000FFFF0001FFFFF0001C0007FFF80001FF070001FFFF
F8000000007FF80000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF800FFFFFFFFFFFFF
FC00007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FC07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF03FFFFFFFFFFFFFFFC0000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF0000007FFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF800000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFC00000000000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFE00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFE00000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFF00000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFF0000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFF8000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFC000003FFFE00000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFE007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFC0000000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFE0000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFF0000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFF0000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFF800000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFC00000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFE00000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFF00000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFC000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFE000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFF000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFF00000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFF8000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFE000000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFC0000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFF0000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFE00000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF8000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFF000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFF0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFF00000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0707070014230642461006440057030057030000011710150522627502600004100000001173post.src/devopost/charlib/READMEPostscript definitions for special troff characters. File names are
the two character troff names. Each defines a PostScript procedure
that begins with build_ and ends with the character's name. The
build_?? procedure is called with the character width as it's only
argument. The .map files contain extra character data (e.g. image
data) that dpost downloads immediately after the build_?? call,
if the character's font table code field is 2 (rather than 1).

The following PostScript variables are available:

	font		current font
	ptsize		current point size
	size		actual font size - scaled up from ptsize

Don't overuse this stuff!

0707070014230642471006440057030057030000011710160522627502600003500000002631post.src/devopost/charlib/Sl/build_Sl {
pop
gsave
size .0022 mul dup scale
currentpoint translate
14 93 moveto
14 96 lineto
29 110 lineto
44 121 lineto
54 127 lineto
55 132 lineto
57 146 lineto
59 157 lineto
62 171 lineto
66 186 lineto
70 199 lineto
75 213 lineto
81 228 lineto
88 243 lineto
96 257 lineto
106 272 lineto
118 287 lineto
133 300 lineto
148 307 lineto
163 308 lineto
178 304 lineto
191 293 lineto
197 281 lineto
198 277 lineto
198 260 lineto
194 246 lineto
187 231 lineto
179 217 lineto
168 202 lineto
155 187 lineto
141 172 lineto
126 158 lineto
111 146 lineto
96 136 lineto
94 131 lineto
93 123 lineto
92 112 lineto
91 103 lineto
90 93 lineto
89 81 lineto
89 40 lineto
92 28 lineto
97 18 lineto
108 10 lineto
122 10 lineto
134 18 lineto
145 33 lineto
152 48 lineto
158 62 lineto
168 58 lineto
168 59 lineto
163 45 lineto
157 31 lineto
148 16 lineto
133 3 lineto
118 -1 lineto
103 0 lineto
88 5 lineto
73 18 lineto
64 31 lineto
58 46 lineto
55 59 lineto
53 73 lineto
52 111 lineto
37 101 lineto
22 86 lineto
14 93 lineto

97 152 moveto
97 153 lineto
99 166 lineto
101 178 lineto
103 190 lineto
106 205 lineto
109 218 lineto
113 232 lineto
118 246 lineto
124 261 lineto
132 275 lineto
144 290 lineto
157 298 lineto
171 298 lineto
181 291 lineto
186 283 lineto
187 279 lineto
187 264 lineto
186 260 lineto
181 246 lineto
174 233 lineto
165 218 lineto
155 204 lineto
142 190 lineto
127 175 lineto
112 162 lineto
97 152 lineto

eofill
grestore
} def
0707070014230642501006440057030057030000011711140522627502600003500000000264post.src/devopost/charlib/bx/build_bx {
    pop
    size 2 div /side exch def
    currentpoint
    newpath
    moveto
    0 side rlineto
    side 0 rlineto
    0 side neg rlineto
    closepath
    fill
} def
0707070014230642511006440057030057030000011711150522627502600003500000000221post.src/devopost/charlib/ci/build_ci {
    pop
    size 3 mul 8 div /rad exch def
    currentpoint
    newpath
    rad add exch rad add exch rad 0 360 arc
    stroke
} def
0707070014230642521006440057030057030000011711160522627502600003500000000074post.src/devopost/charlib/ff/build_ff {
    pop
    size .05 mul neg 0 (ff) ashow
} def
0707070014230642531006440057030057030000011711170522627502600003500000001716post.src/devopost/charlib/lc%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_lc {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 0 get bvbbox 1 get moveto
	bvbbox 0 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 3 get moveto
	bvbbox 4 get dup dup
	8 mul 0 rlineto
	0 exch neg rlineto
	8 mul neg 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230642541006440057030057030000011711300522627502600003500000001712post.src/devopost/charlib/lf%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_lf {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 0 get bvbbox 1 get moveto
	bvbbox 0 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 1 get moveto
	bvbbox 4 get dup dup
	8 mul 0 rlineto
	0 exch rlineto
	8 mul neg 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230642551006440057030057030000011711310522627502600003500000004412post.src/devopost/charlib/lh/build_lh {
pop
gsave
size .0022 mul dup scale
currentpoint translate

16 177 moveto
16 188 lineto
21 193 lineto
30 193 lineto
34 189 lineto
36 183 lineto
36 180 lineto
34 174 lineto
27 170 lineto
19 172 lineto
16 177 lineto
stroke

38 194 moveto
38 196 lineto
53 199 lineto
68 201 lineto
83 202 lineto
98 203 lineto
113 204 lineto
128 204 lineto
143 205 lineto
158 205 lineto
173 205 lineto
188 204 lineto
203 203 lineto
218 202 lineto
233 200 lineto
248 198 lineto
263 196 lineto
278 194 lineto
293 190 lineto
308 186 lineto
323 181 lineto
338 176 lineto
353 168 lineto
361 162 lineto
364 153 lineto
366 138 lineto
367 126 lineto
368 106 lineto
369 80 lineto
369 74 lineto
368 60 lineto
367 54 lineto
362 43 lineto
348 34 lineto
333 28 lineto
318 25 lineto
303 26 lineto
288 29 lineto
273 31 lineto
258 32 lineto
243 32 lineto
228 30 lineto
213 27 lineto
198 24 lineto
183 23 lineto
168 23 lineto
153 27 lineto
148 34 lineto
148 47 lineto
153 54 lineto
168 58 lineto
183 58 lineto
198 58 lineto
213 59 lineto
226 60 lineto
228 62 lineto
228 67 lineto
223 71 lineto
208 71 lineto
193 70 lineto
178 70 lineto
163 70 lineto
148 70 lineto
133 71 lineto
123 76 lineto
120 84 lineto
120 91 lineto
122 98 lineto
129 104 lineto
144 106 lineto
159 107 lineto
174 107 lineto
189 107 lineto
202 108 lineto
204 110 lineto
204 117 lineto
201 119 lineto
186 119 lineto
171 119 lineto
156 119 lineto
141 119 lineto
126 119 lineto
111 121 lineto
103 128 lineto
101 137 lineto
101 142 lineto
103 150 lineto
111 158 lineto
126 161 lineto
141 161 lineto
156 162 lineto
171 163 lineto
186 163 lineto
191 165 lineto
192 167 lineto
192 171 lineto
190 174 lineto
176 175 lineto
161 175 lineto
146 175 lineto
131 174 lineto
116 174 lineto
101 174 lineto
86 173 lineto
71 172 lineto
56 171 lineto
41 171 lineto
41 174 lineto
43 178 lineto
43 187 lineto
38 194 lineto
stroke

373 169 moveto
373 176 lineto
375 182 lineto
386 190 lineto
401 193 lineto
408 191 lineto
411 185 lineto
412 181 lineto
414 167 lineto
415 158 lineto
416 144 lineto
417 128 lineto
418 110 lineto
418 60 lineto
417 45 lineto
415 37 lineto
409 34 lineto
394 31 lineto
381 35 lineto
379 42 lineto
379 52 lineto
380 67 lineto
380 77 lineto
379 77 lineto
378 106 lineto
377 121 lineto
376 133 lineto
375 147 lineto
374 158 lineto
373 169 lineto

stroke
grestore
} def
0707070014230642561006440057030057030000011711340522627502600003500000000222post.src/devopost/charlib/ob/build_ob {
    pop
    size 3 mul 16 div /rad exch def
    currentpoint
    newpath
    rad add exch rad add exch rad 0 360 arc
    stroke
} def
0707070014230642571006440057030057030000011711350522627502700003500000001716post.src/devopost/charlib/rc%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_rc {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 2 get bvbbox 1 get moveto
	bvbbox 2 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 3 get moveto
	bvbbox 4 get dup dup
	8 mul neg 0 rlineto
	0 exch neg rlineto
	8 mul 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230642601006440057030057030000011711360522627502700003500000001712post.src/devopost/charlib/rf%
% This stuff has gotten terribly complicated - sorry.
%

currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if

/build_rf {
    pop
    gsave
	currentpoint translate newpath
	bvbbox 6 get size ne {
	    gsave
		initgraphics
		scaling scaling scale
		0 0 moveto
		(\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop
		0 1 idtransform dup mul exch dup mul add sqrt dup
		bvbbox 1 get add bvbbox 1 3 -1 roll put
		bvbbox 3 get exch sub bvbbox 3 3 -1 roll put
		bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put
		bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put
	    grestore
	} if
	bvbbox 2 get bvbbox 1 get moveto
	bvbbox 2 get bvbbox 3 get lineto
	bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto
	bvbbox 1 get lineto closepath clip newpath
	0 0 moveto (\357) show
	bvbbox 5 get bvbbox 1 get moveto
	bvbbox 4 get dup dup
	8 mul neg 0 rlineto
	0 exch rlineto
	8 mul 0 rlineto
	closepath clip eofill
    grestore
} def
0707070014230642611006440057030057030000011711500522627502700003500000004171post.src/devopost/charlib/rh/build_rh {
pop
gsave
size .0022 mul dup scale
currentpoint translate

15 66 moveto
15 86 lineto
16 131 lineto
17 146 lineto
18 158 lineto
19 167 lineto
21 181 lineto
24 190 lineto
34 193 lineto
49 189 lineto
58 182 lineto
60 177 lineto
60 166 lineto
59 156 lineto
58 143 lineto
57 130 lineto
56 117 lineto
55 102 lineto
54 42 lineto
53 39 lineto
49 35 lineto
34 34 lineto
19 39 lineto
16 47 lineto
15 66 lineto
stroke

65 60 moveto
65 111 lineto
66 127 lineto
67 139 lineto
69 153 lineto
72 163 lineto
83 171 lineto
98 177 lineto
113 182 lineto
128 187 lineto
143 190 lineto
158 194 lineto
173 196 lineto
188 199 lineto
203 201 lineto
218 203 lineto
233 205 lineto
248 205 lineto
263 206 lineto
278 206 lineto
293 206 lineto
308 206 lineto
323 206 lineto
338 205 lineto
353 203 lineto
368 202 lineto
383 200 lineto
394 197 lineto
389 190 lineto
389 180 lineto
391 176 lineto
391 173 lineto
380 173 lineto
365 173 lineto
350 174 lineto
335 175 lineto
320 176 lineto
305 176 lineto
290 176 lineto
275 177 lineto
260 177 lineto
245 177 lineto
240 173 lineto
240 170 lineto
245 165 lineto
260 164 lineto
275 164 lineto
290 164 lineto
305 163 lineto
320 160 lineto
327 155 lineto
330 149 lineto
330 134 lineto
328 129 lineto
323 124 lineto
309 121 lineto
294 121 lineto
279 121 lineto
264 121 lineto
249 121 lineto
234 121 lineto
228 118 lineto
228 112 lineto
234 109 lineto
249 109 lineto
264 109 lineto
279 108 lineto
294 108 lineto
306 104 lineto
311 97 lineto
312 91 lineto
312 88 lineto
311 82 lineto
305 74 lineto
290 72 lineto
275 72 lineto
260 72 lineto
245 73 lineto
230 73 lineto
215 73 lineto
205 70 lineto
205 63 lineto
217 60 lineto
232 60 lineto
247 60 lineto
262 60 lineto
277 57 lineto
283 52 lineto
285 44 lineto
285 41 lineto
284 35 lineto
280 30 lineto
268 26 lineto
253 25 lineto
238 26 lineto
223 28 lineto
208 31 lineto
193 33 lineto
178 34 lineto
163 33 lineto
148 31 lineto
133 28 lineto
118 27 lineto
103 28 lineto
88 34 lineto
73 43 lineto
67 52 lineto
65 60 lineto
stroke

396 180 moveto
396 188 lineto
399 194 lineto
410 196 lineto
416 190 lineto
416 180 lineto
415 177 lineto
411 173 lineto
400 173 lineto
396 180 lineto
stroke

grestore
} def
0707070014230642621006440057030057030000011711370522627502700003500000000320post.src/devopost/charlib/sq/build_sq {
    pop
    size 2 div /side exch def
    currentpoint
    newpath
    moveto
    0 side rlineto
    side 0 rlineto
    0 side neg rlineto
    closepath
    font B eq {fill} {stroke} ifelse
} def
0707070014230642631006440057030057030000011711530522627502700003500000000130post.src/devopost/charlib/~=/build_~= {
    pop
    (\176) stringwidth pop neg size -.15 mul (\176\055) ashow
} def
0707070014230362361006440057030057030000011044500522627502700003600000003013post.src/devopost/devopost.mkMAKE=/bin/make
MAKEFILE=devopost.mk

SYSTEM=SYSV
VERSION=3.3

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
FONTFILES=DESC ? ?? [A-Z]??*

all :

install : all
	@rm -fr $(FONTDIR)/devopost/*.out
	@if [ ! -d $(FONTDIR) ]; then \
	    mkdir $(FONTDIR); \
	    chmod 755 $(FONTDIR); \
	    chgrp $(GROUP) $(FONTDIR); \
	    chown $(OWNER) $(FONTDIR); \
	fi
	@if [ ! -d $(FONTDIR)/devopost ]; then \
	    mkdir $(FONTDIR)/devopost; \
	    chmod 755 $(FONTDIR)/devopost; \
	    chgrp $(GROUP) $(FONTDIR)/devopost; \
	    chown $(OWNER) $(FONTDIR)/devopost; \
	fi
	@if [ ! -d $(FONTDIR)/devopost/charlib ]; then \
	    mkdir $(FONTDIR)/devopost/charlib; \
	    chmod 755 $(FONTDIR)/devopost/charlib; \
	    chgrp $(GROUP) $(FONTDIR)/devopost/charlib; \
	    chown $(OWNER) $(FONTDIR)/devopost/charlib; \
	fi
	cp $(FONTFILES) $(FONTDIR)/devopost
	@for i in $(FONTFILES); do \
	    chmod 644 $(FONTDIR)/devopost/$$i; \
	    chgrp $(GROUP) $(FONTDIR)/devopost/$$i; \
	    chown $(OWNER) $(FONTDIR)/devopost/$$i; \
	done
	cp charlib/* $(FONTDIR)/devopost/charlib
	@for i in charlib/*; do \
	    chmod 644 $(FONTDIR)/devopost/$$i; \
	    chgrp $(GROUP) $(FONTDIR)/devopost/$$i; \
	    chown $(OWNER) $(FONTDIR)/devopost/$$i; \
	done

clean :

clobber : clean

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014231030720407550057030057030000020303470522627503100002500000000000post.src/devpost.add0707070014231030731006440057030057030000010304460522627502700003000000003356post.src/devpost.add/C1name C1
fontname CenturyOldStyle-Regular
ligatures fi fl 0
spacewidth 25
charset
!	26	2	33
"	40	2	34
dq	"
#	50	2	35
$	50	3	36
%	58	2	37
&	79	2	38
'	21	2	39
(	40	3	40
)	40	3	41
*	50	2	42
+	50	0	43
,	25	1	44
hy	24	0	45
-	"
.	25	0	46
/	53	3	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	40	2	63
@	85	2	64
A	66	2	65
B	69	2	66
C	69	2	67
D	76	2	68
E	66	2	69
F	61	2	70
G	74	2	71
H	76	2	72
I	34	2	73
J	40	3	74
K	71	2	75
L	58	2	76
M	95	2	77
N	76	2	78
O	76	2	79
P	61	2	80
Q	76	3	81
R	63	2	82
S	55	2	83
T	63	2	84
U	74	2	85
V	66	2	86
W	95	2	87
X	63	2	88
Y	63	2	89
Z	58	2	90
[	40	3	91
\	25	2	92
bs	"
]	40	3	93
---	50	2	94
---	50	1	95
`	21	2	96
a	47	0	97
b	55	2	98
c	47	0	99
d	55	2	100
e	50	0	101
f	29	2	102
g	55	1	103
h	58	2	104
i	26	2	105
j	24	3	106
k	55	2	107
l	26	2	108
m	84	0	109
n	55	0	110
o	53	0	111
p	53	1	112
q	55	1	113
r	40	0	114
s	45	0	115
t	31	2	116
u	55	0	117
v	47	0	118
w	71	0	119
x	53	0	120
y	50	1	121
z	45	0	122
{	40	3	123
---	25	2	124
}	40	3	125
---	50	0	126
---	26	1	161
ct	50	2	162
ps	50	2	163
fr	9	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	21	2	169
``	40	2	170
---	47	0	171
---	29	0	172
---	29	0	173
fi	58	2	174
fl	55	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	25	0	180
pg	66	3	182
---	66	0	183
---	21	1	184
---	40	1	185
''	40	2	186
---	47	0	187
---	100	0	188
---	92	2	189
---	40	1	191
ga	29	2	193
\`	"
aa	29	2	194
\'	"
^a	37	2	195
^	"
~a	50	2	196
~	"
-a	47	2	197
Ua	50	2	198
.a	26	2	199
:a	47	2	200
oa	34	2	202
,a	34	1	203
"a	40	2	205
Ca	37	1	206
va	37	2	207
em	100	0	208
---	103	2	225
---	34	2	227
---	58	2	232
---	76	2	233
---	108	2	234
---	34	2	235
---	76	0	241
---	26	0	245
---	26	2	248
---	53	0	249
---	84	0	250
---	58	2	251
0707070014231030741006440057030057030000010304600522627502700003000000003355post.src/devpost.add/C2name C2
fontname CenturyOldStyle-Italic
ligatures fi fl 0
spacewidth 27
charset
!	31	2	33
"	35	2	34
dq	"
#	54	0	35
$	54	3	36
%	70	2	37
&	75	2	38
'	21	2	39
(	46	3	40
)	46	3	41
*	59	2	42
+	54	0	43
,	27	1	44
hy	25	0	45
-	"
.	27	0	46
/	46	3	47
0	54	2	48
1	54	0	49
2	54	2	50
3	54	2	51
4	54	0	52
5	54	0	53
6	54	2	54
7	54	0	55
8	54	2	56
9	54	2	57
:	27	0	58
;	27	1	59
---	54	0	60
=	54	0	61
---	54	0	62
?	48	2	63
@	78	2	64
A	67	2	65
B	68	2	66
C	65	2	67
D	75	2	68
E	66	2	69
F	61	2	70
G	72	2	71
H	77	2	72
I	36	2	73
J	34	3	74
K	68	2	75
L	58	2	76
M	90	2	77
N	74	2	78
O	74	2	79
P	59	2	80
Q	75	3	81
R	65	2	82
S	57	2	83
T	63	2	84
U	72	2	85
V	62	2	86
W	88	2	87
X	64	2	88
Y	61	2	89
Z	57	2	90
[	46	3	91
\	27	2	92
bs	"
]	46	3	93
---	54	2	94
---	50	1	95
`	21	2	96
a	54	0	97
b	46	2	98
c	41	0	99
d	50	2	100
e	42	0	101
f	25	3	102
g	45	1	103
h	52	2	104
i	31	2	105
j	27	3	106
k	48	2	107
l	27	2	108
m	82	0	109
n	56	0	110
o	47	0	111
p	50	1	112
q	49	1	113
r	40	0	114
s	35	0	115
t	30	0	116
u	56	0	117
v	47	0	118
w	69	0	119
x	41	0	120
y	40	1	121
z	39	0	122
{	46	3	123
---	27	2	124
}	46	3	125
---	54	0	126
---	31	1	161
ct	54	0	162
ps	54	2	163
fr	5	2	164
yn	54	0	165
fn	54	3	166
sc	59	3	167
cr	54	0	168
---	19	2	169
``	37	2	170
---	45	0	171
---	29	0	172
---	29	0	173
fi	52	3	174
fl	52	3	175
en	50	0	177
\-	"
dg	59	3	178
dd	59	3	179
---	27	0	180
pg	61	3	182
---	61	0	183
---	21	1	184
---	37	1	185
''	37	2	186
---	45	0	187
---	100	0	188
---	103	2	189
---	48	1	191
ga	39	2	193
\`	"
aa	31	2	194
\'	"
^a	40	2	195
^	"
~a	51	2	196
~	"
-a	47	0	197
Ua	51	2	198
.a	26	2	199
:a	46	2	200
oa	32	2	202
,a	35	1	203
"a	39	2	205
Ca	34	1	206
va	40	2	207
em	100	0	208
---	94	2	225
---	32	2	227
---	58	2	232
---	74	2	233
---	107	2	234
---	32	2	235
---	69	0	241
---	31	0	245
---	27	2	248
---	47	0	249
---	71	0	250
---	53	2	251
0707070014231030751006440057030057030000010304620522627502700003000000003355post.src/devpost.add/C3name C3
fontname CenturyOldStyle-Bold
ligatures fi fl 0
spacewidth 33
charset
!	34	2	33
"	40	2	34
dq	"
#	56	2	35
$	66	3	36
%	79	2	37
&	84	2	38
'	28	2	39
(	39	3	40
)	39	3	41
*	56	2	42
+	56	0	43
,	33	1	44
hy	32	0	45
-	"
.	33	0	46
/	51	3	47
0	66	2	48
1	66	2	49
2	66	2	50
3	66	2	51
4	66	2	52
5	66	2	53
6	66	2	54
7	66	2	55
8	66	2	56
9	66	2	57
:	33	0	58
;	33	1	59
---	56	0	60
=	56	0	61
---	56	0	62
?	47	2	63
@	72	2	64
A	69	2	65
B	76	2	66
C	70	2	67
D	80	2	68
E	71	2	69
F	64	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	48	2	74
K	76	2	75
L	63	2	76
M	94	2	77
N	80	2	78
O	81	2	79
P	72	2	80
Q	81	3	81
R	72	2	82
S	61	2	83
T	60	2	84
U	78	2	85
V	64	2	86
W	97	2	87
X	68	2	88
Y	67	2	89
Z	59	2	90
[	39	3	91
\	28	2	92
bs	"
]	39	3	93
---	56	2	94
---	50	1	95
`	28	2	96
a	53	0	97
b	60	2	98
c	52	0	99
d	62	2	100
e	54	0	101
f	30	2	102
g	52	3	103
h	62	2	104
i	31	2	105
j	27	3	106
k	60	2	107
l	30	2	108
m	92	0	109
n	62	0	110
o	57	0	111
p	61	1	112
q	60	1	113
r	44	0	114
s	50	0	115
t	33	2	116
u	63	0	117
v	50	0	118
w	74	0	119
x	53	0	120
y	49	1	121
z	44	0	122
{	39	3	123
---	28	2	124
}	39	3	125
---	56	0	126
---	34	1	161
ct	66	2	162
ps	66	2	163
fr	10	2	164
yn	66	2	165
fn	66	3	166
sc	56	3	167
cr	66	2	168
---	22	2	169
``	52	2	170
---	58	0	171
---	37	0	172
---	37	0	173
fi	62	2	174
fl	61	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	33	0	180
pg	62	3	182
---	62	0	183
---	28	1	184
---	52	1	185
''	52	2	186
---	58	0	187
---	100	0	188
---	118	2	189
---	47	1	191
ga	34	2	193
\`	"
aa	34	2	194
\'	"
^a	45	2	195
^	"
~a	56	2	196
~	"
-a	53	2	197
Ua	56	2	198
.a	29	2	199
:a	51	2	200
oa	34	2	202
,a	37	1	203
"a	50	2	205
Ca	38	1	206
va	45	2	207
em	100	0	208
---	109	2	225
---	40	2	227
---	63	2	232
---	81	2	233
---	114	2	234
---	40	2	235
---	83	0	241
---	31	0	245
---	30	2	248
---	57	0	249
---	90	0	250
---	58	2	251
0707070014231030761006440057030057030000010304640522627502700003000000003353post.src/devpost.add/F1name F1
fontname FranklinGothic-Book
ligatures fi fl 0
spacewidth 30
charset
!	30	2	33
"	46	2	34
dq	"
#	60	2	35
$	60	2	36
%	70	2	37
&	68	2	38
'	30	2	39
(	30	3	40
)	30	3	41
*	60	2	42
+	60	0	43
,	30	1	44
hy	22	0	45
-	"
.	30	0	46
/	52	3	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	30	0	58
;	30	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	54	2	63
@	80	2	64
A	56	2	65
B	62	2	66
C	62	2	67
D	66	2	68
E	56	2	69
F	48	2	70
G	66	2	71
H	66	2	72
I	26	2	73
J	40	2	74
K	62	2	75
L	50	2	76
M	82	2	77
N	66	2	78
O	66	2	79
P	56	2	80
Q	66	3	81
R	62	2	82
S	62	2	83
T	50	2	84
U	64	2	85
V	56	2	86
W	82	2	87
X	54	2	88
Y	56	2	89
Z	54	2	90
[	30	3	91
\	52	2	92
bs	"
]	30	3	93
---	60	2	94
---	50	1	95
`	30	2	96
a	54	0	97
b	54	2	98
c	48	0	99
d	54	2	100
e	54	0	101
f	30	2	102
g	50	1	103
h	54	2	104
i	24	2	105
j	22	3	106
k	50	2	107
l	24	2	108
m	82	0	109
n	54	0	110
o	54	0	111
p	54	1	112
q	54	1	113
r	32	0	114
s	52	0	115
t	32	2	116
u	54	0	117
v	44	0	118
w	66	0	119
x	44	0	120
y	42	1	121
z	42	0	122
{	30	3	123
---	26	2	124
}	30	3	125
---	60	0	126
---	30	1	161
ct	60	2	162
ps	60	2	163
fr	16	2	164
yn	60	2	165
fn	60	3	166
sc	60	3	167
cr	60	0	168
---	30	2	169
``	46	2	170
---	40	0	171
---	26	0	172
---	26	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	60	3	178
dd	60	3	179
---	30	0	180
pg	54	3	182
---	60	0	183
---	30	1	184
---	46	1	185
''	46	2	186
---	40	0	187
---	100	0	188
---	104	2	189
---	54	1	191
ga	38	2	193
\`	"
aa	38	2	194
\'	"
^a	48	2	195
^	"
~a	50	2	196
~	"
-a	46	2	197
Ua	48	2	198
.a	24	2	199
:a	40	2	200
oa	32	2	202
,a	32	1	203
"a	50	2	205
Ca	32	1	206
va	48	2	207
em	100	0	208
---	96	2	225
---	36	2	227
---	50	2	232
---	66	2	233
---	100	2	234
---	36	2	235
---	90	0	241
---	24	0	245
---	20	2	248
---	54	0	249
---	88	0	250
---	58	2	251
0707070014231030771006440057030057030000010304660522627502700003000000003362post.src/devpost.add/F2name F2
fontname FranklinGothic-BookOblique
ligatures fi fl 0
spacewidth 30
charset
!	30	2	33
"	46	2	34
dq	"
#	60	2	35
$	60	2	36
%	70	2	37
&	68	2	38
'	30	2	39
(	30	3	40
)	30	3	41
*	60	2	42
+	60	0	43
,	30	1	44
hy	22	0	45
-	"
.	30	0	46
/	52	3	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	30	0	58
;	30	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	54	2	63
@	80	2	64
A	56	2	65
B	62	2	66
C	62	2	67
D	66	2	68
E	56	2	69
F	48	2	70
G	66	2	71
H	66	2	72
I	26	2	73
J	40	2	74
K	62	2	75
L	50	2	76
M	82	2	77
N	66	2	78
O	66	2	79
P	56	2	80
Q	66	3	81
R	62	2	82
S	62	2	83
T	50	2	84
U	64	2	85
V	56	2	86
W	82	2	87
X	54	2	88
Y	56	2	89
Z	54	2	90
[	30	3	91
\	52	2	92
bs	"
]	30	3	93
---	60	2	94
---	50	1	95
`	30	2	96
a	54	0	97
b	54	2	98
c	48	0	99
d	54	2	100
e	54	0	101
f	30	2	102
g	50	1	103
h	54	2	104
i	24	2	105
j	22	3	106
k	50	2	107
l	24	2	108
m	82	0	109
n	54	0	110
o	54	0	111
p	54	1	112
q	54	1	113
r	32	0	114
s	52	0	115
t	32	2	116
u	54	0	117
v	44	0	118
w	66	0	119
x	44	0	120
y	42	1	121
z	42	0	122
{	30	3	123
---	26	2	124
}	30	3	125
---	60	0	126
---	30	1	161
ct	60	2	162
ps	60	2	163
fr	16	2	164
yn	60	2	165
fn	60	3	166
sc	60	3	167
cr	60	0	168
---	30	2	169
``	46	2	170
---	40	0	171
---	26	0	172
---	26	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	60	3	178
dd	60	3	179
---	30	0	180
pg	54	3	182
---	60	0	183
---	30	1	184
---	46	1	185
''	46	2	186
---	40	0	187
---	100	0	188
---	104	2	189
---	54	1	191
ga	38	2	193
\`	"
aa	38	2	194
\'	"
^a	48	2	195
^	"
~a	50	2	196
~	"
-a	46	2	197
Ua	48	2	198
.a	24	2	199
:a	40	2	200
oa	32	2	202
,a	32	1	203
"a	50	2	205
Ca	32	1	206
va	48	2	207
em	100	0	208
---	96	2	225
---	36	2	227
---	50	2	232
---	66	2	233
---	100	2	234
---	36	2	235
---	90	0	241
---	24	0	245
---	20	2	248
---	54	0	249
---	88	0	250
---	58	2	251
0707070014231031001006440057030057030000010305000522627502700003000000003351post.src/devpost.add/F3name F3
fontname FranklinGothic-Demi
ligatures fi fl 0
spacewidth 30
charset
!	32	2	33
"	46	2	34
dq	"
#	60	2	35
$	60	2	36
%	70	2	37
&	72	2	38
'	30	2	39
(	38	3	40
)	38	3	41
*	60	2	42
+	60	0	43
,	30	1	44
hy	24	0	45
-	"
.	30	0	46
/	60	3	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	30	0	58
;	30	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	54	2	63
@	80	2	64
A	64	2	65
B	66	2	66
C	66	2	67
D	66	2	68
E	58	2	69
F	54	2	70
G	66	2	71
H	66	2	72
I	30	2	73
J	40	2	74
K	64	2	75
L	50	2	76
M	88	2	77
N	66	2	78
O	66	2	79
P	62	2	80
Q	66	3	81
R	66	2	82
S	60	2	83
T	54	2	84
U	66	2	85
V	60	2	86
W	90	2	87
X	64	2	88
Y	60	2	89
Z	66	2	90
[	38	3	91
\	60	2	92
bs	"
]	38	3	93
---	60	2	94
---	50	1	95
`	30	2	96
a	54	0	97
b	54	2	98
c	54	0	99
d	54	2	100
e	54	0	101
f	30	2	102
g	56	3	103
h	54	2	104
i	26	2	105
j	26	3	106
k	56	2	107
l	26	2	108
m	82	0	109
n	54	0	110
o	54	0	111
p	54	1	112
q	54	1	113
r	34	0	114
s	50	0	115
t	38	2	116
u	54	0	117
v	48	0	118
w	74	0	119
x	54	0	120
y	48	1	121
z	42	0	122
{	38	3	123
---	30	2	124
}	38	3	125
---	60	0	126
---	32	1	161
ct	60	2	162
ps	60	2	163
fr	8	2	164
yn	60	2	165
fn	60	3	166
sc	60	3	167
cr	60	0	168
---	30	2	169
``	48	2	170
---	40	0	171
---	26	0	172
---	26	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	60	3	178
dd	60	3	179
---	30	0	180
pg	54	3	182
---	60	0	183
---	30	1	184
---	48	1	185
''	48	2	186
---	40	0	187
---	100	0	188
---	104	2	189
---	54	1	191
ga	38	2	193
\`	"
aa	40	2	194
\'	"
^a	50	2	195
^	"
~a	50	2	196
~	"
-a	46	2	197
Ua	52	2	198
.a	26	2	199
:a	42	2	200
oa	32	2	202
,a	34	1	203
"a	52	2	205
Ca	34	1	206
va	52	2	207
em	100	0	208
---	90	2	225
---	36	2	227
---	52	2	232
---	66	2	233
---	96	2	234
---	36	2	235
---	82	0	241
---	26	0	245
---	26	2	248
---	54	0	249
---	86	0	250
---	66	2	251
0707070014231031011006440057030057030000010305020522627502700003000000003360post.src/devpost.add/F4name F4
fontname FranklinGothic-DemiOblique
ligatures fi fl 0
spacewidth 30
charset
!	32	2	33
"	46	2	34
dq	"
#	60	2	35
$	60	2	36
%	70	2	37
&	72	2	38
'	30	2	39
(	38	3	40
)	38	3	41
*	60	2	42
+	60	0	43
,	30	1	44
hy	24	0	45
-	"
.	30	0	46
/	60	3	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	30	0	58
;	30	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	54	2	63
@	80	2	64
A	64	2	65
B	66	2	66
C	66	2	67
D	66	2	68
E	58	2	69
F	54	2	70
G	66	2	71
H	66	2	72
I	30	2	73
J	40	2	74
K	64	2	75
L	50	2	76
M	88	2	77
N	66	2	78
O	66	2	79
P	62	2	80
Q	66	3	81
R	66	2	82
S	60	2	83
T	54	2	84
U	66	2	85
V	60	2	86
W	90	2	87
X	64	2	88
Y	60	2	89
Z	66	2	90
[	38	3	91
\	60	2	92
bs	"
]	38	3	93
---	60	2	94
---	50	1	95
`	30	2	96
a	54	0	97
b	54	2	98
c	54	0	99
d	54	2	100
e	54	0	101
f	30	2	102
g	56	3	103
h	54	2	104
i	26	2	105
j	26	3	106
k	56	2	107
l	26	2	108
m	82	0	109
n	54	0	110
o	54	0	111
p	54	1	112
q	54	1	113
r	34	0	114
s	50	0	115
t	38	2	116
u	54	0	117
v	48	0	118
w	74	0	119
x	54	0	120
y	48	1	121
z	42	0	122
{	38	3	123
---	30	2	124
}	38	3	125
---	60	0	126
---	32	1	161
ct	60	2	162
ps	60	2	163
fr	8	2	164
yn	60	2	165
fn	60	3	166
sc	60	3	167
cr	60	0	168
---	30	2	169
``	48	2	170
---	40	0	171
---	26	0	172
---	26	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	60	3	178
dd	60	3	179
---	30	0	180
pg	54	3	182
---	60	0	183
---	30	1	184
---	48	1	185
''	48	2	186
---	40	0	187
---	100	0	188
---	104	2	189
---	54	1	191
ga	38	2	193
\`	"
aa	40	2	194
\'	"
^a	50	2	195
^	"
~a	50	2	196
~	"
-a	46	2	197
Ua	52	2	198
.a	26	2	199
:a	42	2	200
oa	32	2	202
,a	34	1	203
"a	52	2	205
Ca	34	1	206
va	52	2	207
em	100	0	208
---	90	2	225
---	36	2	227
---	52	2	232
---	66	2	233
---	96	2	234
---	36	2	235
---	82	0	241
---	26	0	245
---	26	2	248
---	54	0	249
---	86	0	250
---	66	2	251
0707070014231031021006440057030057030000010305040522627502700003000000003353post.src/devpost.add/F5name F5
fontname FranklinGothic-Heavy
ligatures fi fl 0
spacewidth 30
charset
!	32	2	33
"	52	2	34
dq	"
#	60	2	35
$	60	2	36
%	74	2	37
&	78	2	38
'	30	2	39
(	38	3	40
)	38	3	41
*	60	2	42
+	60	0	43
,	30	1	44
hy	26	0	45
-	"
.	30	0	46
/	60	3	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	30	0	58
;	30	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	60	2	63
@	80	2	64
A	66	2	65
B	66	2	66
C	66	2	67
D	68	2	68
E	60	2	69
F	54	2	70
G	68	2	71
H	68	2	72
I	32	2	73
J	44	2	74
K	66	2	75
L	54	2	76
M	86	2	77
N	70	2	78
O	70	2	79
P	66	2	80
Q	70	3	81
R	68	2	82
S	66	2	83
T	50	2	84
U	66	2	85
V	66	2	86
W	92	2	87
X	70	2	88
Y	66	2	89
Z	60	2	90
[	38	3	91
\	60	2	92
bs	"
]	38	3	93
---	60	2	94
---	50	1	95
`	30	2	96
a	58	0	97
b	58	2	98
c	54	0	99
d	58	2	100
e	60	0	101
f	40	2	102
g	58	3	103
h	58	2	104
i	30	2	105
j	30	3	106
k	58	2	107
l	30	2	108
m	86	0	109
n	58	0	110
o	60	0	111
p	58	1	112
q	58	1	113
r	38	0	114
s	54	0	115
t	40	2	116
u	60	0	117
v	54	0	118
w	78	0	119
x	58	0	120
y	54	1	121
z	50	0	122
{	38	3	123
---	30	2	124
}	38	3	125
---	60	0	126
---	32	1	161
ct	60	2	162
ps	60	2	163
fr	12	2	164
yn	60	2	165
fn	60	3	166
sc	60	3	167
cr	60	0	168
---	30	2	169
``	52	2	170
---	42	0	171
---	26	0	172
---	26	0	173
fi	62	2	174
fl	60	2	175
en	50	0	177
\-	"
dg	60	3	178
dd	60	3	179
---	30	0	180
pg	54	3	182
---	60	0	183
---	30	1	184
---	52	1	185
''	52	2	186
---	42	0	187
---	100	0	188
---	108	2	189
---	60	1	191
ga	40	2	193
\`	"
aa	40	2	194
\'	"
^a	54	2	195
^	"
~a	50	2	196
~	"
-a	46	2	197
Ua	52	2	198
.a	28	2	199
:a	44	2	200
oa	34	2	202
,a	34	1	203
"a	60	2	205
Ca	34	1	206
va	54	2	207
em	100	0	208
---	96	2	225
---	38	2	227
---	56	2	232
---	70	2	233
---	98	2	234
---	38	2	235
---	82	0	241
---	30	0	245
---	30	2	248
---	60	0	249
---	86	0	250
---	66	2	251
0707070014231031031006440057030057030000010305060522627502700003000000003361post.src/devpost.add/F6name F6
fontname FranklinGothic-HeavyOblique
ligatures fi fl 0
spacewidth 30
charset
!	32	2	33
"	52	2	34
dq	"
#	60	2	35
$	60	2	36
%	74	2	37
&	78	2	38
'	30	2	39
(	38	3	40
)	38	3	41
*	60	2	42
+	60	0	43
,	30	1	44
hy	26	0	45
-	"
.	30	0	46
/	60	3	47
0	60	2	48
1	60	2	49
2	60	2	50
3	60	2	51
4	60	2	52
5	60	2	53
6	60	2	54
7	60	2	55
8	60	2	56
9	60	2	57
:	30	0	58
;	30	1	59
---	60	0	60
=	60	0	61
---	60	0	62
?	60	2	63
@	80	2	64
A	66	2	65
B	66	2	66
C	66	2	67
D	68	2	68
E	60	2	69
F	54	2	70
G	68	2	71
H	68	2	72
I	32	2	73
J	44	2	74
K	66	2	75
L	54	2	76
M	86	2	77
N	70	2	78
O	70	2	79
P	66	2	80
Q	70	3	81
R	68	2	82
S	66	2	83
T	50	2	84
U	66	2	85
V	66	2	86
W	92	2	87
X	70	2	88
Y	66	2	89
Z	60	2	90
[	38	3	91
\	60	2	92
bs	"
]	38	3	93
---	60	2	94
---	50	1	95
`	30	2	96
a	58	0	97
b	58	2	98
c	54	0	99
d	58	2	100
e	60	0	101
f	40	2	102
g	58	3	103
h	58	2	104
i	30	2	105
j	30	3	106
k	58	2	107
l	30	2	108
m	86	0	109
n	58	0	110
o	60	0	111
p	58	1	112
q	58	1	113
r	38	0	114
s	54	0	115
t	40	2	116
u	60	0	117
v	54	0	118
w	78	0	119
x	58	0	120
y	54	1	121
z	50	0	122
{	38	3	123
or	30	2	124
}	38	3	125
---	60	0	126
---	32	1	161
ct	60	2	162
ps	60	2	163
fr	12	2	164
yn	60	2	165
fn	60	3	166
sc	60	3	167
cr	60	0	168
---	30	2	169
``	52	2	170
---	42	0	171
---	26	0	172
---	26	0	173
fi	62	2	174
fl	60	2	175
en	50	0	177
\-	"
dg	60	3	178
dd	60	3	179
---	30	0	180
pg	54	3	182
---	60	0	183
---	30	1	184
---	52	1	185
''	52	2	186
---	42	0	187
---	100	0	188
---	108	2	189
---	60	1	191
ga	40	2	193
\`	"
aa	40	2	194
\'	"
^a	54	2	195
^	"
~a	50	2	196
~	"
-a	46	2	197
Ua	52	2	198
.a	28	2	199
:a	44	2	200
oa	34	2	202
,a	34	1	203
"a	60	2	205
Ca	34	1	206
va	54	2	207
em	100	0	208
---	96	2	225
---	38	2	227
---	56	2	232
---	70	2	233
---	98	2	234
---	38	2	235
---	82	0	241
---	30	0	245
---	30	2	248
---	60	0	249
---	86	0	250
---	66	2	251
0707070014231031041006440057030057030000010305200522627502700003000000003346post.src/devpost.add/G1name G1
fontname Garamond-Light
ligatures fi fl 0
spacewidth 32
charset
!	22	2	33
"	34	2	34
dq	"
#	60	2	35
$	50	2	36
%	76	2	37
&	70	2	38
'	22	2	39
(	36	3	40
)	36	3	41
*	34	2	42
+	56	0	43
,	26	1	44
hy	32	0	45
-	"
.	26	0	46
/	40	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	26	0	58
;	26	1	59
---	56	0	60
=	56	0	61
---	56	0	62
?	30	2	63
@	74	3	64
A	64	2	65
B	64	2	66
C	62	2	67
D	74	2	68
E	56	2	69
F	52	2	70
G	74	2	71
H	74	2	72
I	32	2	73
J	32	2	74
K	66	2	75
L	48	2	76
M	80	2	77
N	70	2	78
O	78	2	79
P	56	2	80
Q	78	3	81
R	58	2	82
S	48	2	83
T	58	2	84
U	70	2	85
V	64	2	86
W	92	2	87
X	64	2	88
Y	66	2	89
Z	60	2	90
[	24	3	91
\	52	2	92
bs	"
]	24	3	93
---	56	2	94
---	50	1	95
`	22	2	96
a	48	0	97
b	56	2	98
c	46	0	99
d	56	2	100
e	50	0	101
f	30	2	102
g	52	1	103
h	56	2	104
i	26	2	105
j	22	3	106
k	54	2	107
l	26	2	108
m	82	0	109
n	56	0	110
o	56	0	111
p	58	1	112
q	56	1	113
r	34	0	114
s	40	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	78	0	119
x	52	0	120
y	50	1	121
z	46	0	122
{	26	3	123
---	56	3	124
}	26	3	125
---	56	0	126
---	22	1	161
ct	50	2	162
ps	64	2	163
fr	16	2	164
yn	66	2	165
fn	50	3	166
sc	36	3	167
cr	50	2	168
---	20	2	169
``	38	2	170
---	26	0	171
---	16	0	172
---	16	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	40	3	178
dd	40	3	179
---	26	0	180
pg	62	3	182
---	62	0	183
---	22	1	184
---	36	1	185
''	38	2	186
---	26	0	187
---	100	0	188
---	108	2	189
---	30	1	191
ga	36	2	193
\`	"
aa	36	2	194
\'	"
^a	42	2	195
^	"
~a	42	2	196
~	"
-a	38	2	197
Ua	40	2	198
.a	22	2	199
:a	40	2	200
oa	28	2	202
,a	32	1	203
"a	38	2	205
Ca	30	1	206
va	42	2	207
em	100	0	208
---	94	2	225
---	34	2	227
---	48	2	232
---	78	2	233
---	100	2	234
---	34	2	235
---	74	0	241
---	26	0	245
---	26	2	248
---	56	0	249
---	88	0	250
---	56	2	251
0707070014231031051006440057030057030000010305220522627502700003000000003353post.src/devpost.add/G2name G2
fontname Garamond-LightItalic
ligatures fi fl 0
spacewidth 27
charset
!	26	2	33
"	35	2	34
dq	"
#	54	2	35
$	55	2	36
%	78	2	37
&	64	2	38
'	25	2	39
(	38	3	40
)	38	3	41
*	32	2	42
+	57	0	43
,	27	1	44
hy	33	0	45
-	"
.	27	0	46
/	30	2	47
0	55	2	48
1	55	2	49
2	55	2	50
3	55	2	51
4	55	2	52
5	55	2	53
6	55	2	54
7	55	2	55
8	55	2	56
9	55	2	57
:	27	0	58
;	27	1	59
---	57	0	60
=	57	0	61
---	57	0	62
?	35	2	63
@	69	3	64
A	64	2	65
B	63	2	66
C	63	2	67
D	72	2	68
E	55	2	69
F	52	2	70
G	71	2	71
H	73	2	72
I	31	2	73
J	30	2	74
K	63	2	75
L	46	2	76
M	80	2	77
N	66	2	78
O	72	2	79
P	58	2	80
Q	73	3	81
R	58	2	82
S	46	2	83
T	54	2	84
U	63	2	85
V	62	2	86
W	90	2	87
X	65	2	88
Y	58	2	89
Z	59	2	90
[	23	3	91
\	51	2	92
bs	"
]	23	3	93
---	57	2	94
---	50	1	95
`	25	2	96
a	57	0	97
b	52	2	98
c	46	0	99
d	57	2	100
e	44	0	101
f	30	2	102
g	48	1	103
h	56	2	104
i	30	2	105
j	27	3	106
k	49	2	107
l	26	2	108
m	84	0	109
n	62	0	110
o	50	0	111
p	51	1	112
q	52	1	113
r	39	0	114
s	36	0	115
t	28	2	116
u	61	0	117
v	46	0	118
w	73	0	119
x	53	0	120
y	47	1	121
z	51	0	122
{	26	3	123
---	57	3	124
}	26	3	125
---	57	0	126
---	26	1	161
ct	55	2	162
ps	65	2	163
fr	12	2	164
yn	55	2	165
fn	55	3	166
sc	36	3	167
cr	56	2	168
---	19	2	169
``	41	2	170
---	27	0	171
---	16	0	172
---	16	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	42	3	178
dd	42	3	179
---	27	0	180
pg	61	3	182
---	62	0	183
---	25	1	184
---	41	1	185
''	41	2	186
---	27	0	187
---	100	0	188
---	113	2	189
---	35	1	191
ga	39	2	193
\`	"
aa	34	2	194
\'	"
^a	43	2	195
^	"
~a	46	2	196
~	"
-a	38	2	197
Ua	43	2	198
.a	21	2	199
:a	36	2	200
oa	29	2	202
,a	33	1	203
"a	32	2	205
Ca	29	1	206
va	43	2	207
em	100	0	208
---	80	2	225
---	37	2	227
---	47	2	232
---	72	2	233
---	92	2	234
---	37	2	235
---	78	0	241
---	30	0	245
---	29	2	248
---	50	0	249
---	81	0	250
---	59	2	251
0707070014231031061006440057030057030000010305240522627503000003000000003345post.src/devpost.add/G3name G3
fontname Garamond-Bold
ligatures fi fl 0
spacewidth 28
charset
!	28	2	33
"	40	2	34
dq	"
#	60	2	35
$	56	2	36
%	88	2	37
&	76	2	38
'	26	2	39
(	40	3	40
)	40	3	41
*	34	2	42
+	56	0	43
,	28	1	44
hy	30	0	45
-	"
.	28	0	46
/	44	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	56	0	60
=	56	0	61
---	56	0	62
?	42	2	63
@	72	3	64
A	66	2	65
B	64	2	66
C	66	2	67
D	76	2	68
E	60	2	69
F	56	2	70
G	72	2	71
H	78	2	72
I	36	2	73
J	40	2	74
K	74	2	75
L	54	2	76
M	86	2	77
N	72	2	78
O	76	2	79
P	60	2	80
Q	76	3	81
R	66	2	82
S	52	2	83
T	60	2	84
U	70	2	85
V	64	2	86
W	94	2	87
X	70	2	88
Y	68	2	89
Z	62	2	90
[	28	3	91
\	54	2	92
bs	"
]	28	3	93
---	56	2	94
---	50	1	95
`	26	2	96
a	52	0	97
b	60	2	98
c	50	0	99
d	60	2	100
e	52	0	101
f	36	2	102
g	54	1	103
h	66	2	104
i	32	2	105
j	30	3	106
k	60	2	107
l	32	2	108
m	94	0	109
n	66	0	110
o	60	0	111
p	64	1	112
q	60	1	113
r	46	0	114
s	46	0	115
t	34	2	116
u	60	0	117
v	54	0	118
w	82	0	119
x	62	0	120
y	56	1	121
z	48	0	122
{	28	3	123
---	56	3	124
}	28	3	125
---	56	0	126
---	28	1	161
ct	56	2	162
ps	68	2	163
fr	56	2	164
yn	72	2	165
fn	66	3	166
sc	40	3	167
cr	56	2	168
---	22	2	169
``	44	2	170
---	34	0	171
---	20	0	172
---	20	0	173
fi	70	2	174
fl	70	2	175
en	50	0	177
\-	"
dg	54	3	178
dd	54	3	179
---	28	0	180
pg	66	3	182
---	62	0	183
---	26	1	184
---	44	1	185
''	44	2	186
---	34	0	187
---	100	0	188
---	126	2	189
---	42	1	191
ga	40	2	193
\`	"
aa	40	2	194
\'	"
^a	50	2	195
^	"
~a	52	2	196
~	"
-a	52	2	197
Ua	48	2	198
.a	30	2	199
:a	44	2	200
oa	32	2	202
,a	32	1	203
"a	42	2	205
Ca	34	1	206
va	50	2	207
em	100	0	208
---	96	2	225
---	36	2	227
---	54	2	232
---	76	2	233
---	100	2	234
---	36	2	235
---	80	0	241
---	32	0	245
---	34	2	248
---	60	0	249
---	92	0	250
---	64	2	251
0707070014231031071006440057030057030000010305260522627503000003000000003354post.src/devpost.add/G4name G4
fontname Garamond-BoldItalic
ligatures fi fl 0
spacewidth 28
charset
!	24	2	33
"	40	2	34
dq	"
#	56	2	35
$	56	2	36
%	76	2	37
&	74	2	38
'	22	2	39
(	48	3	40
)	48	3	41
*	54	2	42
+	56	0	43
,	24	1	44
hy	30	0	45
-	"
.	24	0	46
/	44	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	24	0	58
;	24	1	59
---	56	0	60
=	56	0	61
---	56	0	62
?	40	2	63
@	76	3	64
A	64	2	65
B	64	2	66
C	64	2	67
D	76	2	68
E	64	2	69
F	60	2	70
G	72	2	71
H	84	2	72
I	42	2	73
J	40	2	74
K	76	2	75
L	56	2	76
M	88	2	77
N	74	2	78
O	74	2	79
P	68	2	80
Q	74	3	81
R	72	2	82
S	52	2	83
T	58	2	84
U	72	2	85
V	64	2	86
W	90	2	87
X	72	2	88
Y	62	2	89
Z	62	2	90
[	34	3	91
\	54	2	92
bs	"
]	34	3	93
---	56	2	94
---	50	1	95
`	22	2	96
a	62	0	97
b	56	2	98
c	50	0	99
d	62	2	100
e	52	0	101
f	38	2	102
g	56	1	103
h	64	2	104
i	34	2	105
j	32	3	106
k	60	2	107
l	28	2	108
m	86	0	109
n	58	0	110
o	60	0	111
p	64	1	112
q	60	1	113
r	50	0	114
s	50	0	115
t	34	2	116
u	64	0	117
v	52	0	118
w	82	0	119
x	66	0	120
y	54	1	121
z	56	0	122
{	34	3	123
---	56	3	124
}	34	3	125
---	56	0	126
---	24	1	161
ct	56	2	162
ps	56	2	163
fr	18	2	164
yn	56	2	165
fn	56	3	166
sc	54	3	167
cr	56	2	168
---	22	2	169
``	42	2	170
---	42	0	171
---	24	0	172
---	24	0	173
fi	70	2	174
fl	66	2	175
en	50	0	177
\-	"
dg	54	3	178
dd	54	3	179
---	24	0	180
pg	70	3	182
---	62	0	183
---	22	1	184
---	42	1	185
''	42	2	186
---	42	0	187
---	100	0	188
---	114	2	189
---	40	1	191
ga	42	2	193
\`	"
aa	38	2	194
\'	"
^a	50	2	195
^	"
~a	56	2	196
~	"
-a	52	2	197
Ua	50	2	198
.a	26	2	199
:a	48	2	200
oa	32	2	202
,a	38	1	203
"a	38	2	205
Ca	34	1	206
va	50	2	207
em	100	0	208
---	100	2	225
---	40	2	227
---	56	2	232
---	76	2	233
---	104	2	234
---	38	2	235
---	88	0	241
---	34	0	245
---	28	2	248
---	60	0	249
---	90	0	250
---	64	2	251
0707070014231031101006440057030057030000010305400522627503000003000000003344post.src/devpost.add/Gbname Gb
fontname Goudy-Bold
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	50	2	34
dq	"
#	61	2	35
$	56	2	36
%	89	2	37
&	89	2	38
'	28	2	39
(	39	3	40
)	39	3	41
*	50	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	39	2	63
@	75	3	64
A	78	2	65
B	67	2	66
C	72	2	67
D	78	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	83	2	72
I	39	2	73
J	39	2	74
K	72	2	75
L	61	2	76
M	89	2	77
N	83	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	72	2	82
S	56	2	83
T	72	2	84
U	83	2	85
V	78	2	86
W	100	2	87
X	72	2	88
Y	67	2	89
Z	61	2	90
[	33	3	91
\	61	2	92
bs	"
]	33	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	44	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	33	2	102
g	44	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	56	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	39	0	122
{	33	3	123
---	61	3	124
}	33	3	125
---	61	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	50	3	167
cr	56	2	168
---	28	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	28	0	180
pg	63	3	182
---	61	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	39	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	28	2	227
---	61	2	232
---	78	2	233
---	100	2	234
---	30	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	0	249
---	78	0	250
---	56	2	251
0707070014231031111006440057030057030000010305420522627503000003000000003343post.src/devpost.add/Giname Gi
fontname Goudy-Italic
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	44	2	34
dq	"
#	61	2	35
$	50	2	36
%	83	2	37
&	83	2	38
'	28	2	39
(	39	3	40
)	39	3	41
*	50	2	42
+	61	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	33	0	58
;	33	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	39	2	63
@	75	3	64
A	72	2	65
B	61	2	66
C	72	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	78	2	72
I	33	2	73
J	33	2	74
K	67	2	75
L	56	2	76
M	89	2	77
N	78	2	78
O	78	2	79
P	56	2	80
Q	78	3	81
R	61	2	82
S	50	2	83
T	67	2	84
U	78	2	85
V	67	2	86
W	94	2	87
X	67	2	88
Y	56	2	89
Z	56	2	90
[	28	3	91
\	61	2	92
bs	"
]	28	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	44	0	97
b	44	2	98
c	39	0	99
d	44	2	100
e	39	0	101
f	28	2	102
g	39	1	103
h	44	2	104
i	22	2	105
j	22	3	106
k	44	2	107
l	22	2	108
m	72	0	109
n	50	0	110
o	44	0	111
p	44	1	112
q	44	1	113
r	33	0	114
s	33	0	115
t	28	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	28	3	123
---	61	3	124
}	28	3	125
---	61	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	61	2	168
---	28	2	169
``	44	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	33	0	180
pg	63	3	182
---	61	0	183
---	28	1	184
---	44	1	185
''	44	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	39	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	94	2	225
---	50	2	227
---	56	2	232
---	78	2	233
---	94	2	234
---	50	2	235
---	67	0	241
---	22	0	245
---	22	2	248
---	44	0	249
---	72	0	250
---	50	2	251
0707070014231031121006440057030057030000010305440522627503000003000000003347post.src/devpost.add/Grname Gr
fontname Goudy-Regular
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	37	2	34
dq	"
#	61	2	35
$	50	2	36
%	83	2	37
&	83	2	38
'	22	2	39
(	39	3	40
)	39	3	41
*	50	2	42
+	61	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	33	2	63
@	75	3	64
A	78	2	65
B	61	2	66
C	72	2	67
D	72	2	68
E	56	2	69
F	50	2	70
G	78	2	71
H	78	2	72
I	33	2	73
J	33	2	74
K	67	2	75
L	56	2	76
M	89	2	77
N	78	2	78
O	78	2	79
P	56	2	80
Q	78	3	81
R	67	2	82
S	56	2	83
T	67	2	84
U	78	2	85
V	72	2	86
W	100	2	87
X	67	2	88
Y	61	2	89
Z	56	2	90
[	28	3	91
\	61	2	92
bs	"
]	28	3	93
---	61	2	94
---	50	1	95
`	22	2	96
a	44	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	28	2	102
g	44	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	33	0	115
t	33	2	116
u	50	0	117
v	50	0	118
w	67	0	119
x	50	0	120
y	44	1	121
z	33	0	122
{	28	3	123
---	61	3	124
}	28	3	125
---	61	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	22	2	169
``	39	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	25	0	180
pg	63	3	182
---	61	0	183
---	22	1	184
---	39	1	185
''	39	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	33	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	39	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	43	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	0	249
---	78	0	250
---	50	2	251
0707070014231031131006440057030057030000010305460522627503000003000000003347post.src/devpost.add/Gxname Gx
fontname Goudy-BoldItalic
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	50	2	34
dq	"
#	61	2	35
$	56	2	36
%	83	2	37
&	83	2	38
'	28	2	39
(	39	3	40
)	39	3	41
*	50	2	42
+	61	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	33	0	58
;	33	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	39	2	63
@	75	3	64
A	72	2	65
B	67	2	66
C	67	2	67
D	78	2	68
E	67	2	69
F	61	2	70
G	72	2	71
H	78	2	72
I	39	2	73
J	44	2	74
K	72	2	75
L	61	2	76
M	94	2	77
N	78	2	78
O	78	2	79
P	67	2	80
Q	78	3	81
R	72	2	82
S	50	2	83
T	72	2	84
U	78	2	85
V	67	2	86
W	94	2	87
X	72	2	88
Y	61	2	89
Z	61	2	90
[	39	3	91
\	61	2	92
bs	"
]	39	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	28	2	102
g	44	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	78	0	109
n	56	0	110
o	44	0	111
p	50	1	112
q	50	1	113
r	39	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	44	0	118
w	72	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	39	3	123
---	61	3	124
}	39	3	125
---	61	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	50	3	167
cr	61	2	168
---	28	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	33	0	180
pg	63	3	182
---	61	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	39	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	89	2	225
---	30	2	227
---	61	2	232
---	78	2	233
---	94	2	234
---	30	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	44	0	249
---	72	0	250
---	50	2	251
0707070014231031141006440057030057030000010305600522627503000003000000003360post.src/devpost.add/H1name H1
fontname Helvetica-Condensed-Light
ligatures fi fl 0
spacewidth 22
charset
!	22	2	33
"	31	2	34
dq	"
#	44	2	35
$	44	2	36
%	78	2	37
&	61	2	38
'	16	2	39
(	28	3	40
)	28	3	41
*	39	2	42
+	44	0	43
,	22	1	44
hy	33	0	45
-	"
.	22	0	46
/	28	2	47
0	44	2	48
1	44	2	49
2	44	2	50
3	44	2	51
4	44	2	52
5	44	2	53
6	44	2	54
7	44	2	55
8	44	2	56
9	44	2	57
:	22	0	58
;	22	1	59
---	44	0	60
=	44	0	61
---	44	0	62
?	39	2	63
@	80	3	64
A	50	2	65
B	50	2	66
C	56	2	67
D	56	2	68
E	44	2	69
F	44	2	70
G	56	2	71
H	56	2	72
I	22	2	73
J	39	2	74
K	50	2	75
L	44	2	76
M	72	2	77
N	56	2	78
O	56	2	79
P	50	2	80
Q	56	3	81
R	50	2	82
S	50	2	83
T	44	2	84
U	56	2	85
V	50	2	86
W	72	2	87
X	50	2	88
Y	50	2	89
Z	44	2	90
[	28	3	91
\	22	2	92
bs	"
]	28	3	93
---	44	2	94
---	50	1	95
`	22	2	96
a	39	0	97
b	44	2	98
c	39	0	99
d	44	2	100
e	39	0	101
f	22	2	102
g	44	1	103
h	44	2	104
i	22	2	105
j	22	3	106
k	39	2	107
l	22	2	108
m	67	0	109
n	44	0	110
o	44	0	111
p	44	1	112
q	44	1	113
r	28	0	114
s	39	0	115
t	22	2	116
u	44	0	117
v	39	0	118
w	56	0	119
x	39	0	120
y	39	1	121
z	33	0	122
{	35	3	123
---	22	3	124
}	35	3	125
---	44	0	126
---	22	1	161
ct	44	2	162
ps	44	2	163
fr	17	2	164
yn	44	2	165
fn	44	3	166
sc	44	3	167
cr	44	2	168
---	20	2	169
``	33	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	44	2	174
fl	44	2	175
en	50	0	177
\-	"
dg	44	3	178
dd	44	3	179
---	22	0	180
pg	56	3	182
---	61	0	183
---	22	1	184
---	33	1	185
''	33	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	39	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	72	2	225
---	27	2	227
---	44	2	232
---	56	2	233
---	78	2	234
---	27	2	235
---	61	0	241
---	20	0	245
---	22	2	248
---	44	0	249
---	67	0	250
---	44	2	251
0707070014231031151006440057030057030000010305620522627503000003000000003367post.src/devpost.add/H2name H2
fontname Helvetica-Condensed-LightOblique
ligatures fi fl 0
spacewidth 22
charset
!	22	2	33
"	31	2	34
dq	"
#	44	2	35
$	44	2	36
%	78	2	37
&	61	2	38
'	16	2	39
(	28	3	40
)	28	3	41
*	39	2	42
+	44	0	43
,	22	1	44
hy	33	0	45
-	"
.	22	0	46
/	28	2	47
0	44	2	48
1	44	2	49
2	44	2	50
3	44	2	51
4	44	2	52
5	44	2	53
6	44	2	54
7	44	2	55
8	44	2	56
9	44	2	57
:	22	0	58
;	22	1	59
---	44	0	60
=	44	0	61
---	44	0	62
?	39	2	63
@	80	3	64
A	50	2	65
B	50	2	66
C	56	2	67
D	56	2	68
E	44	2	69
F	44	2	70
G	56	2	71
H	56	2	72
I	22	2	73
J	39	2	74
K	50	2	75
L	44	2	76
M	72	2	77
N	56	2	78
O	56	2	79
P	50	2	80
Q	56	3	81
R	50	2	82
S	50	2	83
T	44	2	84
U	56	2	85
V	50	2	86
W	72	2	87
X	50	2	88
Y	50	2	89
Z	44	2	90
[	28	3	91
\	22	2	92
bs	"
]	28	3	93
---	44	2	94
---	50	1	95
`	22	2	96
a	39	0	97
b	44	2	98
c	39	0	99
d	44	2	100
e	39	0	101
f	22	2	102
g	44	1	103
h	44	2	104
i	22	2	105
j	22	3	106
k	39	2	107
l	22	2	108
m	67	0	109
n	44	0	110
o	44	0	111
p	44	1	112
q	44	1	113
r	28	0	114
s	39	0	115
t	22	2	116
u	44	0	117
v	39	0	118
w	56	0	119
x	39	0	120
y	39	1	121
z	33	0	122
{	35	3	123
---	22	3	124
}	35	3	125
---	44	0	126
---	22	1	161
ct	44	2	162
ps	44	2	163
fr	17	2	164
yn	44	2	165
fn	44	3	166
sc	44	3	167
cr	44	2	168
---	20	2	169
``	33	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	44	2	174
fl	44	2	175
en	50	0	177
\-	"
dg	44	3	178
dd	44	3	179
---	22	0	180
pg	56	3	182
---	61	0	183
---	22	1	184
---	33	1	185
''	33	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	39	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	72	2	225
---	27	2	227
---	44	2	232
---	56	2	233
---	78	2	234
---	27	2	235
---	61	0	241
---	20	0	245
---	22	2	248
---	44	0	249
---	67	0	250
---	44	2	251
0707070014231031161006440057030057030000010305640522627503000003000000003352post.src/devpost.add/H3name H3
fontname Helvetica-Condensed
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	25	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	50	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	50	2	63
@	80	3	64
A	56	2	65
B	56	2	66
C	56	2	67
D	61	2	68
E	50	2	69
F	44	2	70
G	61	2	71
H	61	2	72
I	28	2	73
J	44	2	74
K	56	2	75
L	50	2	76
M	78	2	77
N	61	2	78
O	61	2	79
P	56	2	80
Q	61	3	81
R	61	2	82
S	56	2	83
T	50	2	84
U	61	2	85
V	56	2	86
W	83	2	87
X	56	2	88
Y	56	2	89
Z	50	2	90
[	33	3	91
\	25	2	92
bs	"
]	33	3	93
---	50	2	94
---	50	1	95
`	22	2	96
a	44	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	28	2	102
g	50	1	103
h	50	2	104
i	22	2	105
j	22	3	106
k	44	2	107
l	22	2	108
m	78	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	44	0	115
t	28	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	27	3	123
---	25	3	124
}	27	3	125
---	48	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	25	2	169
``	39	2	170
---	50	0	171
---	28	0	172
---	28	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	28	0	180
pg	44	3	182
---	33	0	183
---	22	1	184
---	39	1	185
''	39	2	186
---	50	0	187
---	100	0	188
---	111	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	83	2	225
---	30	2	227
---	50	2	232
---	61	2	233
---	83	2	234
---	30	2	235
---	67	0	241
---	22	0	245
---	22	2	248
---	50	0	249
---	72	0	250
---	50	2	251
0707070014231031171006440057030057030000010305660522627503000003000000003362post.src/devpost.add/H4name H4
fontname Helvetica-Condensed-Oblique
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	25	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	50	0	43
,	25	1	44
hy	33	0	45
-	"
.	25	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	50	2	63
@	80	3	64
A	56	2	65
B	56	2	66
C	56	2	67
D	61	2	68
E	50	2	69
F	44	2	70
G	61	2	71
H	61	2	72
I	28	2	73
J	44	2	74
K	56	2	75
L	50	2	76
M	78	2	77
N	61	2	78
O	61	2	79
P	56	2	80
Q	61	3	81
R	61	2	82
S	56	2	83
T	50	2	84
U	61	2	85
V	56	2	86
W	83	2	87
X	56	2	88
Y	56	2	89
Z	50	2	90
[	33	3	91
\	25	2	92
bs	"
]	33	3	93
---	50	2	94
---	50	1	95
`	22	2	96
a	44	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	44	0	101
f	28	2	102
g	50	1	103
h	50	2	104
i	22	2	105
j	22	3	106
k	44	2	107
l	22	2	108
m	78	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	44	0	115
t	28	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	27	3	123
---	25	3	124
}	27	3	125
---	48	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	25	2	169
``	39	2	170
---	50	0	171
---	28	0	172
---	28	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	28	0	180
pg	44	3	182
---	33	0	183
---	22	1	184
---	39	1	185
''	39	2	186
---	50	0	187
---	100	0	188
---	111	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	83	2	225
---	30	2	227
---	50	2	232
---	61	2	233
---	83	2	234
---	30	2	235
---	67	0	241
---	22	0	245
---	22	2	248
---	50	0	249
---	72	0	250
---	50	2	251
0707070014231031201006440057030057030000010306000522627503000003000000003357post.src/devpost.add/H5name H5
fontname Helvetica-Condensed-Bold
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	33	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	67	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	50	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	28	0	58
;	28	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	50	2	63
@	83	3	64
A	56	2	65
B	56	2	66
C	56	2	67
D	61	2	68
E	50	2	69
F	50	2	70
G	61	2	71
H	61	2	72
I	28	2	73
J	44	2	74
K	56	2	75
L	50	2	76
M	78	2	77
N	61	2	78
O	61	2	79
P	56	2	80
Q	61	3	81
R	61	2	82
S	56	2	83
T	50	2	84
U	61	2	85
V	56	2	86
W	83	2	87
X	56	2	88
Y	56	2	89
Z	50	2	90
[	33	3	91
\	25	2	92
bs	"
]	33	3	93
---	50	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	50	0	101
f	28	2	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	78	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	44	0	115
t	28	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	27	3	123
---	25	3	124
}	27	3	125
---	50	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	25	2	169
``	50	2	170
---	50	0	171
---	28	0	172
---	28	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	33	0	180
pg	55	3	182
---	42	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	111	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	78	2	225
---	30	2	227
---	50	2	232
---	61	2	233
---	83	2	234
---	30	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	0	249
---	72	0	250
---	50	2	251
0707070014231031211006440057030057030000010306020522627503000003000000003366post.src/devpost.add/H6name H6
fontname Helvetica-Condensed-BoldOblique
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	33	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	67	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	50	2	42
+	50	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	28	0	58
;	28	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	50	2	63
@	83	3	64
A	56	2	65
B	56	2	66
C	56	2	67
D	61	2	68
E	50	2	69
F	50	2	70
G	61	2	71
H	61	2	72
I	28	2	73
J	44	2	74
K	56	2	75
L	50	2	76
M	78	2	77
N	61	2	78
O	61	2	79
P	56	2	80
Q	61	3	81
R	61	2	82
S	56	2	83
T	50	2	84
U	61	2	85
V	56	2	86
W	83	2	87
X	56	2	88
Y	56	2	89
Z	50	2	90
[	33	3	91
\	25	2	92
bs	"
]	33	3	93
---	50	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	50	2	98
c	44	0	99
d	50	2	100
e	50	0	101
f	28	2	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	44	2	107
l	28	2	108
m	78	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	44	0	115
t	28	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	27	3	123
---	25	3	124
}	27	3	125
---	50	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	25	2	169
``	50	2	170
---	50	0	171
---	28	0	172
---	28	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	33	0	180
pg	55	3	182
---	42	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	111	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	78	2	225
---	30	2	227
---	50	2	232
---	61	2	233
---	83	2	234
---	30	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	0	249
---	72	0	250
---	50	2	251
0707070014231031221006440057030057030000010306040522627503000003000000003360post.src/devpost.add/H7name H7
fontname Helvetica-Condensed-Black
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	33	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	67	2	38
'	28	2	39
(	28	3	40
)	28	3	41
*	50	2	42
+	50	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	28	0	58
;	28	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	50	2	63
@	83	3	64
A	56	2	65
B	56	2	66
C	56	2	67
D	56	2	68
E	50	2	69
F	50	2	70
G	56	2	71
H	56	2	72
I	28	2	73
J	44	2	74
K	56	2	75
L	44	2	76
M	78	2	77
N	56	2	78
O	56	2	79
P	56	2	80
Q	56	3	81
R	56	2	82
S	50	2	83
T	50	2	84
U	56	2	85
V	56	2	86
W	78	2	87
X	56	2	88
Y	56	2	89
Z	44	2	90
[	28	3	91
\	25	2	92
bs	"
]	28	3	93
---	50	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	50	2	98
c	50	0	99
d	50	2	100
e	50	0	101
f	33	2	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	72	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	44	0	115
t	33	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	27	3	123
---	25	3	124
}	27	3	125
---	50	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	25	2	169
``	50	2	170
---	50	0	171
---	28	0	172
---	28	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	33	0	180
pg	55	3	182
---	42	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	111	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	78	2	225
---	30	2	227
---	44	2	232
---	56	2	233
---	78	2	234
---	30	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	0	249
---	72	0	250
---	50	2	251
0707070014231031231006440057030057030000010306060522627503000003000000003367post.src/devpost.add/H8name H8
fontname Helvetica-Condensed-BlackOblique
ligatures fi fl 0
spacewidth 25
charset
!	33	2	33
"	33	2	34
dq	"
#	50	2	35
$	50	2	36
%	83	2	37
&	67	2	38
'	28	2	39
(	28	3	40
)	28	3	41
*	50	2	42
+	50	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	28	0	58
;	28	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	50	2	63
@	83	3	64
A	56	2	65
B	56	2	66
C	56	2	67
D	56	2	68
E	50	2	69
F	50	2	70
G	56	2	71
H	56	2	72
I	28	2	73
J	44	2	74
K	56	2	75
L	44	2	76
M	78	2	77
N	56	2	78
O	56	2	79
P	56	2	80
Q	56	3	81
R	56	2	82
S	50	2	83
T	50	2	84
U	56	2	85
V	56	2	86
W	78	2	87
X	56	2	88
Y	56	2	89
Z	44	2	90
[	28	3	91
\	25	2	92
bs	"
]	28	3	93
---	50	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	50	2	98
c	50	0	99
d	50	2	100
e	50	0	101
f	33	2	102
g	50	1	103
h	50	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	72	0	109
n	50	0	110
o	50	0	111
p	50	1	112
q	50	1	113
r	33	0	114
s	44	0	115
t	33	2	116
u	50	0	117
v	44	0	118
w	67	0	119
x	44	0	120
y	44	1	121
z	39	0	122
{	27	3	123
---	25	3	124
}	27	3	125
---	50	0	126
---	33	1	161
ct	50	2	162
ps	50	2	163
fr	17	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	25	2	169
``	50	2	170
---	50	0	171
---	28	0	172
---	28	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	33	0	180
pg	55	3	182
---	42	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	111	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	78	2	225
---	30	2	227
---	44	2	232
---	56	2	233
---	78	2	234
---	30	2	235
---	72	0	241
---	28	0	245
---	28	2	248
---	50	0	249
---	72	0	250
---	50	2	251
0707070014231031241006440057030057030000010306200522627503000003000000003355post.src/devpost.add/HCname HC
fontname Helvetica-Black
ligatures fi fl 0
spacewidth 33
charset
!	33	2	33
"	50	2	34
dq	"
#	66	2	35
$	67	2	36
%	100	2	37
&	89	2	38
'	28	2	39
(	39	3	40
)	39	3	41
*	56	2	42
+	66	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	67	2	48
1	67	2	49
2	67	2	50
3	67	2	51
4	67	2	52
5	67	2	53
6	67	2	54
7	67	2	55
8	67	2	56
9	67	2	57
:	33	0	58
;	33	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	61	2	63
@	74	3	64
A	78	2	65
B	78	2	66
C	78	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	83	2	71
H	83	2	72
I	39	2	73
J	67	2	74
K	83	2	75
L	67	2	76
M	94	2	77
N	83	2	78
O	83	2	79
P	72	2	80
Q	83	3	81
R	78	2	82
S	72	2	83
T	72	2	84
U	83	2	85
V	78	2	86
W	100	2	87
X	78	2	88
Y	78	2	89
Z	72	2	90
[	39	3	91
\	28	2	92
bs	"
]	39	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	67	0	97
b	67	2	98
c	67	0	99
d	67	2	100
e	67	0	101
f	38	2	102
g	67	1	103
h	67	2	104
i	33	2	105
j	33	3	106
k	67	2	107
l	33	2	108
m	100	0	109
n	67	0	110
o	67	0	111
p	67	1	112
q	67	1	113
r	44	0	114
s	61	0	115
t	44	2	116
u	67	0	117
v	61	0	118
w	94	0	119
x	67	0	120
y	61	1	121
z	56	0	122
{	39	3	123
---	28	3	124
}	39	3	125
---	66	0	126
---	33	1	161
ct	67	2	162
ps	67	2	163
fr	17	2	164
yn	67	2	165
fn	67	3	166
sc	67	3	167
cr	66	2	168
---	28	2	169
``	50	2	170
---	67	0	171
---	33	0	172
---	33	0	173
fi	67	2	174
fl	67	2	175
en	50	0	177
\-	"
dg	67	3	178
dd	67	3	179
---	33	0	180
pg	85	3	182
---	50	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	67	0	187
---	100	0	188
---	100	2	189
---	61	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	40	2	227
---	67	2	232
---	83	2	233
---	100	2	234
---	40	2	235
---	100	0	241
---	33	0	245
---	33	2	248
---	67	0	249
---	100	0	250
---	67	2	251
0707070014231031251006440057030057030000010306220522627503000003000000003357post.src/devpost.add/HKname HK
fontname Helvetica-LightOblique
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	28	2	34
dq	"
#	66	2	35
$	56	2	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	66	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	50	2	63
@	80	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	67	2	82
S	61	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	89	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	66	2	94
---	50	1	95
`	22	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	28	2	102
g	61	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	22	3	124
}	33	3	125
---	66	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	2	168
---	22	2	169
``	39	2	170
---	56	0	171
---	39	0	172
---	39	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	65	3	182
---	50	0	183
---	22	1	184
---	39	1	185
''	39	2	186
---	56	0	187
---	100	0	188
---	100	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	33	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	33	2	235
---	89	0	241
---	22	0	245
---	22	2	248
---	56	0	249
---	94	0	250
---	50	2	251
0707070014231031261006440057030057030000010306240522627503000003000000003350post.src/devpost.add/HLname HL
fontname Helvetica-Light
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	28	2	34
dq	"
#	66	2	35
$	56	2	36
%	89	2	37
&	67	2	38
'	22	2	39
(	33	3	40
)	33	3	41
*	39	2	42
+	66	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	50	2	63
@	80	3	64
A	67	2	65
B	67	2	66
C	72	2	67
D	72	2	68
E	61	2	69
F	56	2	70
G	78	2	71
H	72	2	72
I	28	2	73
J	50	2	74
K	67	2	75
L	56	2	76
M	83	2	77
N	72	2	78
O	78	2	79
P	61	2	80
Q	78	3	81
R	67	2	82
S	61	2	83
T	56	2	84
U	72	2	85
V	61	2	86
W	89	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	28	2	92
bs	"
]	33	3	93
---	66	2	94
---	50	1	95
`	22	2	96
a	56	0	97
b	61	2	98
c	56	0	99
d	61	2	100
e	56	0	101
f	28	2	102
g	61	1	103
h	56	2	104
i	22	2	105
j	22	3	106
k	50	2	107
l	22	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	61	1	112
q	61	1	113
r	33	0	114
s	50	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	72	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	22	3	124
}	33	3	125
---	66	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	2	168
---	22	2	169
``	39	2	170
---	56	0	171
---	39	0	172
---	39	0	173
fi	50	2	174
fl	50	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	65	3	182
---	50	0	183
---	22	1	184
---	39	1	185
''	39	2	186
---	56	0	187
---	100	0	188
---	100	2	189
---	50	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	33	2	227
---	56	2	232
---	78	2	233
---	100	2	234
---	33	2	235
---	89	0	241
---	22	0	245
---	22	2	248
---	56	0	249
---	94	0	250
---	50	2	251
0707070014231031271006440057030057030000010306260522627503000003000000003364post.src/devpost.add/HYname HY
fontname Helvetica-BlackOblique
ligatures fi fl 0
spacewidth 33
charset
!	33	2	33
"	50	2	34
dq	"
#	66	2	35
$	67	2	36
%	100	2	37
&	89	2	38
'	28	2	39
(	39	3	40
)	39	3	41
*	56	2	42
+	66	0	43
,	33	1	44
hy	33	0	45
-	"
.	33	0	46
/	28	2	47
0	67	2	48
1	67	2	49
2	67	2	50
3	67	2	51
4	67	2	52
5	67	2	53
6	67	2	54
7	67	2	55
8	67	2	56
9	67	2	57
:	33	0	58
;	33	1	59
---	66	0	60
=	66	0	61
---	66	0	62
?	61	2	63
@	74	3	64
A	78	2	65
B	78	2	66
C	78	2	67
D	78	2	68
E	72	2	69
F	67	2	70
G	83	2	71
H	83	2	72
I	39	2	73
J	67	2	74
K	83	2	75
L	67	2	76
M	94	2	77
N	83	2	78
O	83	2	79
P	72	2	80
Q	83	3	81
R	78	2	82
S	72	2	83
T	72	2	84
U	83	2	85
V	78	2	86
W	100	2	87
X	78	2	88
Y	78	2	89
Z	72	2	90
[	39	3	91
\	28	2	92
bs	"
]	39	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	67	0	97
b	67	2	98
c	67	0	99
d	67	2	100
e	67	0	101
f	38	2	102
g	67	1	103
h	67	2	104
i	33	2	105
j	33	3	106
k	67	2	107
l	33	2	108
m	100	0	109
n	67	0	110
o	67	0	111
p	67	1	112
q	67	1	113
r	44	0	114
s	61	0	115
t	44	2	116
u	67	0	117
v	61	0	118
w	94	0	119
x	67	0	120
y	61	1	121
z	56	0	122
{	39	3	123
---	28	3	124
}	39	3	125
---	66	0	126
---	33	1	161
ct	67	2	162
ps	67	2	163
fr	17	2	164
yn	67	2	165
fn	67	3	166
sc	67	3	167
cr	66	2	168
---	28	2	169
``	50	2	170
---	67	0	171
---	33	0	172
---	33	0	173
fi	67	2	174
fl	67	2	175
en	50	0	177
\-	"
dg	67	3	178
dd	67	3	179
---	33	0	180
pg	85	3	182
---	50	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	67	0	187
---	100	0	188
---	100	2	189
---	61	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	100	2	225
---	40	2	227
---	67	2	232
---	83	2	233
---	100	2	234
---	40	2	235
---	100	0	241
---	33	0	245
---	33	2	248
---	67	0	249
---	100	0	250
---	67	2	251
0707070014231031301006440057030057030000010306400522627503000003000000004160post.src/devpost.add/MUfontname Sonata
name MU
charset
---	15	0	32
---	21	0	33
---	51	2	34
---	22	1	35
---	51	3	36
---	52	1	37
---	61	3	38
---	13	0	39
---	17	2	40
---	17	2	41
---	36	0	42
---	30	0	43
---	18	1	44
---	30	0	45
---	9	0	46
---	17	2	47
---	36	1	48
---	25	1	49
---	34	1	50
---	32	1	51
---	33	1	52
---	30	1	53
---	33	1	54
---	34	1	55
---	33	1	56
---	33	1	57
---	15	1	58
---	27	2	59
---	100	2	61
---	42	0	62
---	69	2	63
---	20	0	64
---	30	1	65
---	67	2	66
---	42	1	67
---	81	0	68
---	30	1	69
---	83	2	70
---	15	0	71
---	30	1	72
---	11	0	73
---	0	1	74
---	0	1	75
---	41	1	76
---	59	0	77
---	30	0	79
---	80	1	80
---	30	3	81
---	20	3	82
---	60	3	83
---	62	0	84
---	66	2	85
---	72	2	86
---	61	0	87
---	30	1	88
---	56	1	89
---	65	3	90
---	15	2	91
---	0	2	92
---	46	2	93
---	6	2	94
---	50	0	95
---	50	0	96
---	30	3	97
---	20	3	98
---	42	1	99
---	75	0	100
---	55	3	101
---	52	3	102
---	14	2	103
---	30	3	104
---	10	1	105
---	0	2	106
---	0	2	107
---	4	2	108
---	6	0	109
---	18	1	110
---	12	1	111
---	45	1	112
---	30	3	113
---	56	3	114
---	23	0	115
---	52	2	116
---	66	1	117
---	26	2	118
---	41	0	119
---	56	3	120
---	30	3	121
---	29	0	122
---	13	2	123
---	0	1	124
---	46	2	125
---	34	0	126
---	17	2	160
---	79	2	161
---	25	0	162
---	24	0	163
---	21	0	164
---	26	0	165
---	23	0	166
---	30	3	167
---	21	3	168
---	15	2	169
---	25	0	170
---	8	2	172
---	30	0	173
---	13	0	174
---	30	1	175
---	23	0	176
---	30	1	177
---	30	0	178
---	34	0	179
---	30	3	180
---	85	0	181
---	31	0	183
---	120	1	184
---	82	1	185
---	37	1	186
---	22	0	187
---	23	0	188
---	48	0	189
---	30	2	190
---	30	3	191
---	30	0	192
---	20	0	193
---	41	2	194
---	57	2	195
---	78	3	196
---	14	1	197
---	56	3	198
---	0	0	199
---	0	1	200
---	28	2	201
---	28	0	202
---	26	1	206
---	30	0	207
---	30	0	208
---	30	0	209
---	26	2	210
---	46	2	211
---	61	2	212
---	28	2	214
---	56	2	215
---	47	2	217
---	56	2	218
---	27	0	220
---	50	2	221
---	44	1	222
---	23	0	224
---	30	1	225
---	30	1	226
---	15	0	227
---	7	1	228
---	35	3	229
---	56	1	231
---	28	0	232
---	9	1	233
---	30	3	234
---	105	3	236
---	15	1	237
---	31	0	238
---	30	1	239
---	0	2	240
---	4	2	241
---	37	2	242
---	28	0	243
---	28	3	244
---	0	0	246
---	30	0	250
---	0	1	251
0707070014231031311006440057030057030000010306430522627503000003000000003347post.src/devpost.add/OAfontname Optima-Regular
name OA
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	33	2	34
dq	"
#	61	2	35
$	56	2	36
%	89	2	37
&	72	2	38
'	28	2	39
(	28	3	40
)	28	3	41
*	44	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	39	2	63
@	80	3	64
A	67	2	65
B	61	2	66
C	67	2	67
D	78	2	68
E	50	2	69
F	50	2	70
G	78	2	71
H	78	2	72
I	28	2	73
J	28	2	74
K	61	2	75
L	50	2	76
M	89	2	77
N	78	2	78
O	83	2	79
P	56	2	80
Q	83	3	81
R	61	2	82
S	50	2	83
T	56	2	84
U	78	2	85
V	67	2	86
W	100	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	50	2	92
bs	"
]	33	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	50	0	101
f	28	2	102
g	50	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	39	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	78	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	33	3	124
}	33	3	125
---	61	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	50	3	167
cr	56	2	168
---	28	2	169
``	44	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	28	0	180
pg	80	3	182
---	61	0	183
---	28	1	184
---	44	1	185
''	44	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	39	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	83	2	225
---	32	2	227
---	50	2	232
---	83	2	233
---	100	2	234
---	34	2	235
---	78	0	241
---	28	0	245
---	28	2	248
---	56	0	249
---	89	0	250
---	56	2	251
0707070014231031321006440057030057030000010306450522627503100003000000003345post.src/devpost.add/OBname OB
fontname Optima-Bold
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	33	2	34
dq	"
#	61	2	35
$	56	2	36
%	100	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	44	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	39	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	3	64
A	67	2	65
B	61	2	66
C	67	2	67
D	78	2	68
E	50	2	69
F	50	2	70
G	78	2	71
H	78	2	72
I	33	2	73
J	33	2	74
K	61	2	75
L	50	2	76
M	89	2	77
N	78	2	78
O	83	2	79
P	56	2	80
Q	83	3	81
R	61	2	82
S	50	2	83
T	56	2	84
U	78	2	85
V	67	2	86
W	100	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	52	2	92
bs	"
]	33	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	50	0	101
f	32	2	102
g	50	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	39	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	78	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	61	3	124
}	33	3	125
---	61	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	2	168
---	28	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	61	2	174
fl	61	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	70	3	182
---	61	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	44	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	89	2	225
---	33	2	227
---	50	2	232
---	83	2	233
---	100	2	234
---	34	2	235
---	78	0	241
---	28	0	245
---	28	2	248
---	56	0	249
---	89	0	250
---	56	2	251
0707070014231031331006440057030057030000010306600522627503100003000000003347post.src/devpost.add/OIname OI
fontname Optima-Oblique
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	33	2	34
dq	"
#	61	2	35
$	56	2	36
%	89	2	37
&	72	2	38
'	28	2	39
(	28	3	40
)	28	3	41
*	44	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	28	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	39	2	63
@	80	3	64
A	67	2	65
B	61	2	66
C	67	2	67
D	78	2	68
E	50	2	69
F	50	2	70
G	78	2	71
H	78	2	72
I	28	2	73
J	28	2	74
K	61	2	75
L	50	2	76
M	89	2	77
N	78	2	78
O	83	2	79
P	56	2	80
Q	83	3	81
R	61	2	82
S	50	2	83
T	56	2	84
U	78	2	85
V	67	2	86
W	100	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	50	2	92
bs	"
]	33	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	50	0	101
f	28	2	102
g	50	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	33	0	114
s	39	0	115
t	28	2	116
u	56	0	117
v	50	0	118
w	78	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	33	3	124
}	33	3	125
---	61	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	50	3	167
cr	56	2	168
---	28	2	169
``	44	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	56	2	174
fl	56	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	28	0	180
pg	80	3	182
---	61	0	183
---	28	1	184
---	44	1	185
''	44	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	39	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	83	2	225
---	32	2	227
---	50	2	232
---	83	2	233
---	100	2	234
---	34	2	235
---	78	0	241
---	28	0	245
---	28	2	248
---	56	0	249
---	89	0	250
---	56	2	251
0707070014231031341006440057030057030000010306620522627503100003000000003354post.src/devpost.add/OXname OX
fontname Optima-BoldOblique
ligatures fi fl 0
spacewidth 28
charset
!	33	2	33
"	33	2	34
dq	"
#	61	2	35
$	56	2	36
%	100	2	37
&	72	2	38
'	28	2	39
(	33	3	40
)	33	3	41
*	44	2	42
+	61	0	43
,	28	1	44
hy	33	0	45
-	"
.	28	0	46
/	39	2	47
0	56	2	48
1	56	2	49
2	56	2	50
3	56	2	51
4	56	2	52
5	56	2	53
6	56	2	54
7	56	2	55
8	56	2	56
9	56	2	57
:	28	0	58
;	28	1	59
---	61	0	60
=	61	0	61
---	61	0	62
?	44	2	63
@	75	3	64
A	67	2	65
B	61	2	66
C	67	2	67
D	78	2	68
E	50	2	69
F	50	2	70
G	78	2	71
H	78	2	72
I	33	2	73
J	33	2	74
K	61	2	75
L	50	2	76
M	89	2	77
N	78	2	78
O	83	2	79
P	56	2	80
Q	83	3	81
R	61	2	82
S	50	2	83
T	56	2	84
U	78	2	85
V	67	2	86
W	100	2	87
X	61	2	88
Y	61	2	89
Z	61	2	90
[	33	3	91
\	52	2	92
bs	"
]	33	3	93
---	61	2	94
---	50	1	95
`	28	2	96
a	50	0	97
b	56	2	98
c	50	0	99
d	56	2	100
e	50	0	101
f	32	2	102
g	50	1	103
h	56	2	104
i	28	2	105
j	28	3	106
k	50	2	107
l	28	2	108
m	83	0	109
n	56	0	110
o	56	0	111
p	56	1	112
q	56	1	113
r	39	0	114
s	39	0	115
t	33	2	116
u	56	0	117
v	50	0	118
w	78	0	119
x	50	0	120
y	50	1	121
z	50	0	122
{	33	3	123
---	61	3	124
}	33	3	125
---	61	0	126
---	33	1	161
ct	56	2	162
ps	56	2	163
fr	17	2	164
yn	56	2	165
fn	56	3	166
sc	56	3	167
cr	56	2	168
---	28	2	169
``	50	2	170
---	50	0	171
---	33	0	172
---	33	0	173
fi	61	2	174
fl	61	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	28	0	180
pg	70	3	182
---	61	0	183
---	28	1	184
---	50	1	185
''	50	2	186
---	50	0	187
---	100	0	188
---	100	2	189
---	44	1	191
ga	33	2	193
\`	"
aa	33	2	194
\'	"
^a	33	2	195
^	"
~a	33	2	196
~	"
-a	33	2	197
Ua	33	2	198
.a	33	2	199
:a	33	2	200
oa	33	2	202
,a	33	1	203
"a	33	2	205
Ca	33	1	206
va	33	2	207
em	100	0	208
---	89	2	225
---	33	2	227
---	50	2	232
---	83	2	233
---	100	2	234
---	34	2	235
---	78	0	241
---	28	0	245
---	28	2	248
---	56	0	249
---	89	0	250
---	56	2	251
0707070014231031351006440057030057030000010306640522627503100003000000003366post.src/devpost.add/a1name a1
fontname CenturyOldStyleAbstract-Regular
ligatures fi fl 0
spacewidth 25
charset
!	26	2	33
"	40	2	34
dq	"
#	50	2	35
$	50	3	36
%	58	2	37
&	79	2	38
'	21	2	39
(	40	3	40
)	40	3	41
*	50	2	42
+	50	0	43
,	25	1	44
hy	24	0	45
-	"
.	25	0	46
/	53	3	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	40	2	63
@	85	2	64
A	66	2	65
B	69	2	66
C	69	2	67
D	76	2	68
E	66	2	69
F	61	2	70
G	74	2	71
H	76	2	72
I	34	2	73
J	40	3	74
K	71	2	75
L	58	2	76
M	95	2	77
N	76	2	78
O	76	2	79
P	61	2	80
Q	76	3	81
R	63	2	82
S	55	2	83
T	63	2	84
U	74	2	85
V	66	2	86
W	95	2	87
X	63	2	88
Y	63	2	89
Z	58	2	90
[	40	3	91
\	25	2	92
bs	"
]	40	3	93
---	50	2	94
---	50	1	95
`	21	2	96
a	47	0	97
b	55	2	98
c	47	0	99
d	55	2	100
e	50	0	101
f	29	2	102
g	55	1	103
h	58	2	104
i	26	2	105
j	24	3	106
k	55	2	107
l	26	2	108
m	84	0	109
n	55	0	110
o	53	0	111
p	53	1	112
q	55	1	113
r	40	0	114
s	45	0	115
t	31	2	116
u	55	0	117
v	47	0	118
w	71	0	119
x	53	0	120
y	50	1	121
z	45	0	122
{	40	3	123
---	25	2	124
}	40	3	125
---	50	0	126
---	26	1	161
ct	50	2	162
ps	50	2	163
fr	9	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	21	2	169
``	40	2	170
---	47	0	171
---	29	0	172
---	29	0	173
fi	58	2	174
fl	55	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	25	0	180
pg	66	3	182
---	66	0	183
---	21	1	184
---	40	1	185
''	40	2	186
---	47	0	187
---	100	0	188
---	92	2	189
---	40	1	191
ga	29	2	193
\`	"
aa	29	2	194
\'	"
^a	37	2	195
^	"
~a	50	2	196
~	"
-a	47	2	197
Ua	50	2	198
.a	26	2	199
:a	47	2	200
oa	34	2	202
,a	34	1	203
"a	40	2	205
Ca	37	1	206
va	37	2	207
em	100	0	208
---	103	2	225
---	34	2	227
---	58	2	232
---	76	2	233
---	108	2	234
---	34	2	235
---	76	0	241
---	26	0	245
---	26	2	248
---	53	0	249
---	84	0	250
---	58	2	251
0707070014231031361006440057030057030000010306660522627503100003000000003365post.src/devpost.add/a2name a2
fontname CenturyOldStyleAbstract-Italic
ligatures fi fl 0
spacewidth 27
charset
!	31	2	33
"	35	2	34
dq	"
#	54	0	35
$	54	3	36
%	70	2	37
&	75	2	38
'	21	2	39
(	46	3	40
)	46	3	41
*	59	2	42
+	54	0	43
,	27	1	44
hy	25	0	45
-	"
.	27	0	46
/	46	3	47
0	54	2	48
1	54	0	49
2	54	2	50
3	54	2	51
4	54	0	52
5	54	0	53
6	54	2	54
7	54	0	55
8	54	2	56
9	54	2	57
:	27	0	58
;	27	1	59
---	54	0	60
=	54	0	61
---	54	0	62
?	48	2	63
@	78	2	64
A	67	2	65
B	68	2	66
C	65	2	67
D	75	2	68
E	66	2	69
F	61	2	70
G	72	2	71
H	77	2	72
I	36	2	73
J	34	3	74
K	68	2	75
L	58	2	76
M	90	2	77
N	74	2	78
O	74	2	79
P	59	2	80
Q	75	3	81
R	65	2	82
S	57	2	83
T	63	2	84
U	72	2	85
V	62	2	86
W	88	2	87
X	64	2	88
Y	61	2	89
Z	57	2	90
[	46	3	91
\	27	2	92
bs	"
]	46	3	93
---	54	2	94
---	50	1	95
`	21	2	96
a	54	0	97
b	46	2	98
c	41	0	99
d	50	2	100
e	42	0	101
f	25	3	102
g	45	1	103
h	52	2	104
i	31	2	105
j	27	3	106
k	48	2	107
l	27	2	108
m	82	0	109
n	56	0	110
o	47	0	111
p	50	1	112
q	49	1	113
r	40	0	114
s	35	0	115
t	30	0	116
u	56	0	117
v	47	0	118
w	69	0	119
x	41	0	120
y	40	1	121
z	39	0	122
{	46	3	123
---	27	2	124
}	46	3	125
---	54	0	126
---	31	1	161
ct	54	0	162
ps	54	2	163
fr	5	2	164
yn	54	0	165
fn	54	3	166
sc	59	3	167
cr	54	0	168
---	19	2	169
``	37	2	170
---	45	0	171
---	29	0	172
---	29	0	173
fi	52	3	174
fl	52	3	175
en	50	0	177
\-	"
dg	59	3	178
dd	59	3	179
---	27	0	180
pg	61	3	182
---	61	0	183
---	21	1	184
---	37	1	185
''	37	2	186
---	45	0	187
---	100	0	188
---	103	2	189
---	48	1	191
ga	39	2	193
\`	"
aa	31	2	194
\'	"
^a	40	2	195
^	"
~a	51	2	196
~	"
-a	47	0	197
Ua	51	2	198
.a	26	2	199
:a	46	2	200
oa	32	2	202
,a	35	1	203
"a	39	2	205
Ca	34	1	206
va	40	2	207
em	100	0	208
---	94	2	225
---	32	2	227
---	58	2	232
---	74	2	233
---	107	2	234
---	32	2	235
---	69	0	241
---	31	0	245
---	27	2	248
---	47	0	249
---	71	0	250
---	53	2	251
0707070014231031371006440057030057030000010307000522627503100003000000003367post.src/devpost.add/c1name c1
fontname CenturyOldStyleCondensed-Regular
ligatures fi fl 0
spacewidth 25
charset
!	26	2	33
"	40	2	34
dq	"
#	50	2	35
$	50	3	36
%	58	2	37
&	79	2	38
'	21	2	39
(	40	3	40
)	40	3	41
*	50	2	42
+	50	0	43
,	25	1	44
hy	24	0	45
-	"
.	25	0	46
/	53	3	47
0	50	2	48
1	50	2	49
2	50	2	50
3	50	2	51
4	50	2	52
5	50	2	53
6	50	2	54
7	50	2	55
8	50	2	56
9	50	2	57
:	25	0	58
;	25	1	59
---	50	0	60
=	50	0	61
---	50	0	62
?	40	2	63
@	85	2	64
A	66	2	65
B	69	2	66
C	69	2	67
D	76	2	68
E	66	2	69
F	61	2	70
G	74	2	71
H	76	2	72
I	34	2	73
J	40	3	74
K	71	2	75
L	58	2	76
M	95	2	77
N	76	2	78
O	76	2	79
P	61	2	80
Q	76	3	81
R	63	2	82
S	55	2	83
T	63	2	84
U	74	2	85
V	66	2	86
W	95	2	87
X	63	2	88
Y	63	2	89
Z	58	2	90
[	40	3	91
\	25	2	92
bs	"
]	40	3	93
---	50	2	94
---	50	1	95
`	21	2	96
a	47	0	97
b	55	2	98
c	47	0	99
d	55	2	100
e	50	0	101
f	29	2	102
g	55	1	103
h	58	2	104
i	26	2	105
j	24	3	106
k	55	2	107
l	26	2	108
m	84	0	109
n	55	0	110
o	53	0	111
p	53	1	112
q	55	1	113
r	40	0	114
s	45	0	115
t	31	2	116
u	55	0	117
v	47	0	118
w	71	0	119
x	53	0	120
y	50	1	121
z	45	0	122
{	40	3	123
---	25	2	124
}	40	3	125
---	50	0	126
---	26	1	161
ct	50	2	162
ps	50	2	163
fr	9	2	164
yn	50	2	165
fn	50	3	166
sc	50	3	167
cr	50	2	168
---	21	2	169
``	40	2	170
---	47	0	171
---	29	0	172
---	29	0	173
fi	58	2	174
fl	55	2	175
en	50	0	177
\-	"
dg	50	3	178
dd	50	3	179
---	25	0	180
pg	66	3	182
---	66	0	183
---	21	1	184
---	40	1	185
''	40	2	186
---	47	0	187
---	100	0	188
---	92	2	189
---	40	1	191
ga	29	2	193
\`	"
aa	29	2	194
\'	"
^a	37	2	195
^	"
~a	50	2	196
~	"
-a	47	2	197
Ua	50	2	198
.a	26	2	199
:a	47	2	200
oa	34	2	202
,a	34	1	203
"a	40	2	205
Ca	37	1	206
va	37	2	207
em	100	0	208
---	103	2	225
---	34	2	227
---	58	2	232
---	76	2	233
---	108	2	234
---	34	2	235
---	76	0	241
---	26	0	245
---	26	2	248
---	53	0	249
---	84	0	250
---	58	2	251
0707070014231031401006440057030057030000010307020522627503100003000000003366post.src/devpost.add/c2name c2
fontname CenturyOldStyleCondensed-Italic
ligatures fi fl 0
spacewidth 27
charset
!	31	2	33
"	35	2	34
dq	"
#	54	0	35
$	54	3	36
%	70	2	37
&	75	2	38
'	21	2	39
(	46	3	40
)	46	3	41
*	59	2	42
+	54	0	43
,	27	1	44
hy	25	0	45
-	"
.	27	0	46
/	46	3	47
0	54	2	48
1	54	0	49
2	54	2	50
3	54	2	51
4	54	0	52
5	54	0	53
6	54	2	54
7	54	0	55
8	54	2	56
9	54	2	57
:	27	0	58
;	27	1	59
---	54	0	60
=	54	0	61
---	54	0	62
?	48	2	63
@	78	2	64
A	67	2	65
B	68	2	66
C	65	2	67
D	75	2	68
E	66	2	69
F	61	2	70
G	72	2	71
H	77	2	72
I	36	2	73
J	34	3	74
K	68	2	75
L	58	2	76
M	90	2	77
N	74	2	78
O	74	2	79
P	59	2	80
Q	75	3	81
R	65	2	82
S	57	2	83
T	63	2	84
U	72	2	85
V	62	2	86
W	88	2	87
X	64	2	88
Y	61	2	89
Z	57	2	90
[	46	3	91
\	27	2	92
bs	"
]	46	3	93
---	54	2	94
---	50	1	95
`	21	2	96
a	54	0	97
b	46	2	98
c	41	0	99
d	50	2	100
e	42	0	101
f	25	3	102
g	45	1	103
h	52	2	104
i	31	2	105
j	27	3	106
k	48	2	107
l	27	2	108
m	82	0	109
n	56	0	110
o	47	0	111
p	50	1	112
q	49	1	113
r	40	0	114
s	35	0	115
t	30	0	116
u	56	0	117
v	47	0	118
w	69	0	119
x	41	0	120
y	40	1	121
z	39	0	122
{	46	3	123
---	27	2	124
}	46	3	125
---	54	0	126
---	31	1	161
ct	54	0	162
ps	54	2	163
fr	5	2	164
yn	54	0	165
fn	54	3	166
sc	59	3	167
cr	54	0	168
---	19	2	169
``	37	2	170
---	45	0	171
---	29	0	172
---	29	0	173
fi	52	3	174
fl	52	3	175
en	50	0	177
\-	"
dg	59	3	178
dd	59	3	179
---	27	0	180
pg	61	3	182
---	61	0	183
---	21	1	184
---	37	1	185
''	37	2	186
---	45	0	187
---	100	0	188
---	103	2	189
---	48	1	191
ga	39	2	193
\`	"
aa	31	2	194
\'	"
^a	40	2	195
^	"
~a	51	2	196
~	"
-a	47	0	197
Ua	51	2	198
.a	26	2	199
:a	46	2	200
oa	32	2	202
,a	35	1	203
"a	39	2	205
Ca	34	1	206
va	40	2	207
em	100	0	208
---	94	2	225
---	32	2	227
---	58	2	232
---	74	2	233
---	107	2	234
---	32	2	235
---	69	0	241
---	31	0	245
---	27	2	248
---	47	0	249
---	71	0	250
---	53	2	251
0707070014231031411006440057030057030000010307040522627503100003000000003366post.src/devpost.add/c3name c3
fontname CenturyOldStyleCondensed-Bold
ligatures fi fl 0
spacewidth 33
charset
!	34	2	33
"	40	2	34
dq	"
#	56	2	35
$	66	3	36
%	79	2	37
&	84	2	38
'	28	2	39
(	39	3	40
)	39	3	41
*	56	2	42
+	56	0	43
,	33	1	44
hy	32	0	45
-	"
.	33	0	46
/	51	3	47
0	66	2	48
1	66	2	49
2	66	2	50
3	66	2	51
4	66	2	52
5	66	2	53
6	66	2	54
7	66	2	55
8	66	2	56
9	66	2	57
:	33	0	58
;	33	1	59
---	56	0	60
=	56	0	61
---	56	0	62
?	47	2	63
@	72	2	64
A	69	2	65
B	76	2	66
C	70	2	67
D	80	2	68
E	71	2	69
F	64	2	70
G	78	2	71
H	83	2	72
I	41	2	73
J	48	2	74
K	76	2	75
L	63	2	76
M	94	2	77
N	80	2	78
O	81	2	79
P	72	2	80
Q	81	3	81
R	72	2	82
S	61	2	83
T	60	2	84
U	78	2	85
V	64	2	86
W	97	2	87
X	68	2	88
Y	67	2	89
Z	59	2	90
[	39	3	91
\	28	2	92
bs	"
]	39	3	93
---	56	2	94
---	50	1	95
`	28	2	96
a	53	0	97
b	60	2	98
c	52	0	99
d	62	2	100
e	54	0	101
f	30	2	102
g	52	3	103
h	62	2	104
i	31	2	105
j	27	3	106
k	60	2	107
l	30	2	108
m	92	0	109
n	62	0	110
o	57	0	111
p	61	1	112
q	60	1	113
r	44	0	114
s	50	0	115
t	33	2	116
u	63	0	117
v	50	0	118
w	74	0	119
x	53	0	120
y	49	1	121
z	44	0	122
{	39	3	123
---	28	2	124
}	39	3	125
---	56	0	126
---	34	1	161
ct	66	2	162
ps	66	2	163
fr	10	2	164
yn	66	2	165
fn	66	3	166
sc	56	3	167
cr	66	2	168
---	22	2	169
``	52	2	170
---	58	0	171
---	37	0	172
---	37	0	173
fi	62	2	174
fl	61	2	175
en	50	0	177
\-	"
dg	56	3	178
dd	56	3	179
---	33	0	180
pg	62	3	182
---	62	0	183
---	28	1	184
---	52	1	185
''	52	2	186
---	58	0	187
---	100	0	188
---	118	2	189
---	47	1	191
ga	34	2	193
\`	"
aa	34	2	194
\'	"
^a	45	2	195
^	"
~a	56	2	196
~	"
-a	53	2	197
Ua	56	2	198
.a	29	2	199
:a	51	2	200
oa	34	2	202
,a	37	1	203
"a	50	2	205
Ca	38	1	206
va	45	2	207
em	100	0	208
---	109	2	225
---	40	2	227
---	63	2	232
---	81	2	233
---	114	2	234
---	40	2	235
---	83	0	241
---	31	0	245
---	30	2	248
---	57	0	249
---	90	0	250
---	58	2	251
0707070014231031421006440057030057030000010307060522627503100004400000002013post.src/devpost.add/devpost.add.mkMAKE=/bin/make
MAKEFILE=devpost.add.mk

SYSTEM=SYSV
VERSION=3.2

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
FONTFILES=??

all :

install : all
	@if [ ! -d $(FONTDIR) ]; then \
	    mkdir $(FONTDIR); \
	    chmod 755 $(FONTDIR); \
	    chgrp $(GROUP) $(FONTDIR); \
	    chown $(OWNER) $(FONTDIR); \
	fi
	@if [ ! -d $(FONTDIR)/devpost ]; then \
	    mkdir $(FONTDIR)/devpost; \
	    chmod 755 $(FONTDIR)/devpost; \
	    chgrp $(GROUP) $(FONTDIR)/devpost; \
	    chown $(OWNER) $(FONTDIR)/devpost; \
	fi
	cp $(FONTFILES) $(FONTDIR)/devpost
	@for i in $(FONTFILES); do \
	    chmod 644 $(FONTDIR)/devpost/$$i; \
	    chgrp $(GROUP) $(FONTDIR)/devpost/$$i; \
	    chown $(OWNER) $(FONTDIR)/devpost/$$i; \
	done

clean :

clobber : clean

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014230547760407550057030057030000021527350522633074000002200000000000post.src/download0707070014230547771006440057030057030000011527360522627503100003100000000756post.src/download/README
A simple program that scans PostScript files for %%DocumentFonts:
comments and prepends requested host resident font files to the
input. Written for Unix 4.0 lp.

Downloaded fonts are the ones named in the %%DocumentFonts: comment
and listed in a special map file (which can be selected using the
-m option). See example.map and comments in download.c for examples
of map files. By default map files and font files are in *hostfontdir.
It's initialized using HOSTDIR (file ../common/path.h).

0707070014230550001006440057030057030000011527370522627503100003500000000443post.src/download/download.h/*
 *
 * The font data for a printer is saved in an array of the following type.
 *
 */

typedef struct map {
	char	*font;		/* a request for this PostScript font */
	char	*file;		/* means copy this unix file */
	int	downloaded;	/* TRUE after *file is downloaded */
} Map;

Map	*allocate();

0707070014230550061006400057030057030000011527660522633073700003600000003434post.src/download/download.mkMAKE=/bin/make
MAKEFILE=download.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

HOSTDIR=/usr/lib/font/postscript
MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=download.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=download.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/tempnam.o

all : download

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	cp download $(POSTBIN)/download
	@chmod 755 $(POSTBIN)/download
	@chgrp $(GROUP) $(POSTBIN)/download
	@chown $(OWNER) $(POSTBIN)/download
	cp download.1 $(MAN1DIR)/download.1
	@chmod 644 $(MAN1DIR)/download.1
	@chgrp $(GROUP) $(MAN1DIR)/download.1
	@chown $(OWNER) $(MAN1DIR)/download.1

clean :
	rm -f *.o

clobber : clean
	rm -f download

download : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o download $(OFILES)

download.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/tempnam.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^HOSTDIR=.*'HOSTDIR=$(HOSTDIR)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dH.*'.ds dH $(HOSTDIR)'" \
	download.1 >XXX.1; \
	mv XXX.1 download.1

0707070014230550021006440057030057030000011527420522627503100003600000001664post.src/download/example.map%
% An example font map table that extends the standard collection of 13
% fonts to the 35 made popular by the LaserWriter Plus.
%
% First string is full PostScript font name, exactly as it would appear
% in a %%DocumentFonts comment. Second string is the name of the Unix
% file relative to *hostfontdir, unless that string begins with a /, in
% which case it's taken as the full pathname.
%

	Palatino-Roman			PA
	Palatino-Italic			PI
	Palatino-Bold			PB
	Palatino-BoldItalic		PX
	Helvetica-Narrow		Hr
	Helvetica-Narrow-Oblique	Hi
	Helvetica-Narrow-Bold		Hb
	Helvetica-Narrow-BoldOblique	Hx
	Bookman-Light			KR
	Bookman-LightItalic		KI
	Bookman-Demi			KB
	Bookman-DemiItalic		KX
	AvantGarde-Book			AR
	AvantGarde-BookOblique		AI
	AvantGarde-Demi			AB
	AvantGarde-DemiOblique		AX
	NewCenturySchlbk-Roman		NR
	NewCenturySchlbk-Italic		NI
	NewCenturySchlbk-Bold		NB
	NewCenturySchlbk-BoldItalic	NX
	ZapfDingbats			ZD
	ZapfChancery-MediumItalic	ZI
	
0707070014230550031006440057030057030000011527500522627503100003500000034165post.src/download/download.c/*
 *
 * download - host resident font downloader
 *
 * Prepends host resident fonts to PostScript input files. The program assumes
 * the input files are part of a single PostScript job and that requested fonts
 * can be downloaded at the start of each input file. Downloaded fonts are the
 * ones named in a %%DocumentFonts: comment and listed in a special map table.
 * Map table pathnames (supplied using the -m option) that begin with a / are
 * taken as is. Otherwise the final pathname is built using *hostfontdir (-H
 * option), *mapname (-m option), and *suffix.
 *
 * The map table consists of fontname-filename pairs, separated by white space.
 * Comments are introduced by % (as in PostScript) and extend to the end of the
 * current line. The only fonts that can be downloaded are the ones listed in
 * the active map table that point the program to a readable Unix file. A request
 * for an unlisted font or inaccessible file is ignored. All font requests are
 * ignored if the map table can't be read. In that case the program simply copies
 * the input files to stdout.
 *
 * An example (but not one to follow) of what can be in a map table is,
 *
 *	%
 *	% Map requests for Bookman-Light to file *hostfontdir/KR
 *	%
 *
 *	  Bookman-Light		KR	% Keeping everything (including the map
 *					% table) in *hostfontdir seems like the
 *					% cleanest approach.
 *
 *	%
 *	% Map Palatino-Roman to file *hostfontdir/palatino/Roman
 *	%
 *	  Palatino-Roman	palatino/Roman
 *
 *	% Map ZapfDingbats to file /usr/lib/host/dingbats
 *
 *	  ZapfDingbats		/usr/lib/host/dingbats
 *
 * Once again, file names that begin with a / are taken as is. All others have
 * *hostfontdir/ prepended to the file string associated with a particular font.
 *
 * Map table can be associated with a printer model (e.g. a LaserWriter), a
 * printer destination, or whatever - the choice is up to an administrator.
 * By destination may be best if your spooler is running several private
 * printers. Host resident fonts are usually purchased under a license that
 * restricts their use to a limited number of printers. A font licensed for
 * a single printer should only be used on that printer.
 *
 * Was written quickly, so there's much room for improvement. Undoubtedly should
 * be a more general program (e.g. scan for other comments).
 *
 */

#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for temporary directory */
#include "ext.h"			/* external variable declarations */
#include "download.h"			/* a few special definitions */

char	*temp_dir = TEMPDIR;		/* temp directory - for copying stdin */
char	*hostfontdir = HOSTDIR;		/* host resident directory */
char	*mapname = "map";		/* map table - usually in *hostfontdir */
char	*suffix = "";			/* appended to the map table pathname */
Map	*map = NULL;			/* device font map table */
char	*stringspace = NULL;		/* for storing font and file strings */
int	next = 0;			/* next free slot in map[] */

char	*residentfonts = NULL;		/* list of printer resident fonts */
char	*printer = NULL;		/* printer name - only for Unix 4.0 lp */

char	buf[2048];			/* input file line buffer */
char	*comment = DOCUMENTFONTS;	/* look for this comment */
int	atend = FALSE;			/* TRUE only if a comment says so */

FILE	*fp_in = stdin;			/* next input file */
FILE	*fp_temp = NULL;		/* for copying stdin */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * Host resident font downloader. The input files are assumed to be part of a
 * single PostScript job.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* just for error messages */

    init_signals();			/* sets up interrupt handling */
    options();				/* first get command line options */
    readmap();				/* read the font map table */
    readresident();			/* and the optional resident font list */
    arguments();			/* then process non-option arguments */
    done();				/* and clean things up */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Makes sure we handle interrupts properly.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN ) {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */
    char	*optnames = "c:fm:p:r:H:T:DI";

    extern char	*optarg;		/* used by getopt() */
    extern int	optind;

/*
 *
 * Reads and processes the command line options.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF ) {
	switch ( ch ) {
	    case 'c':			/* look for this comment */
		    comment = optarg;
		    break;

	    case 'f':			/* force a complete input file scan */
		    atend = TRUE;
		    break;

	    case 'm':			/* printer map table name */
		    mapname = optarg;
		    break;

	    case 'p':			/* printer name - for Unix 4.0 lp */
		    printer = optarg;
		    break;

	    case 'r':			/* resident font list */
		    residentfonts = optarg;
		    break;

	    case 'H':			/* host resident font directory */
		    hostfontdir = optarg;
		    break;

	    case 'T':			/* temporary file directory */
		    temp_dir = optarg;
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

readmap()

{

    char	*path;
    char	*ptr;
    int		fd;
    struct stat	sbuf;

/*
 *
 * Initializes the map table by reading an ASCII mapping file. If mapname begins
 * with a / it's the map table. Otherwise hostfontdir, mapname, and suffix are
 * combined to build the final pathname. If we can open the file we read it all
 * into memory, erase comments, and separate the font and file name pairs. When
 * we leave next points to the next free slot in the map[] array. If it's zero
 * nothing was in the file or we couldn't open it.
 *
 */

    if ( hostfontdir == NULL || mapname == NULL )
	return;

    if ( *mapname != '/' ) {
	if ( (path = malloc(strlen(hostfontdir) + strlen(mapname) +
						strlen(suffix) + 2)) == NULL )
	    error(FATAL, "no memory");
	sprintf(path, "%s/%s%s", hostfontdir, mapname, suffix);
    } else path = mapname;

    if ( (fd = open(path, 0)) != -1 ) {
	if ( fstat(fd, &sbuf) == -1 )
	    error(FATAL, "can't fstat %s", path);
	if ( (stringspace = malloc(sbuf.st_size + 2)) == NULL )
	    error(FATAL, "no memory");
	if ( read(fd, stringspace, sbuf.st_size) == -1 )
	    error(FATAL, "can't read %s", path);
	close(fd);

	stringspace[sbuf.st_size] = '\n';	/* just to be safe */
	stringspace[sbuf.st_size+1] = '\0';
	for ( ptr = stringspace; *ptr != '\0'; ptr++ )	/* erase comments */
	    if ( *ptr == '%' )
		for ( ; *ptr != '\n' ; ptr++ )
		    *ptr = ' ';

	for ( ptr = stringspace; ; next++ ) {
	    if ( (next % 50) == 0 )
		map = allocate(map, next+50);
	    map[next].downloaded = FALSE;
	    map[next].font = strtok(ptr, " \t\n");
	    map[next].file = strtok(ptr = NULL, " \t\n");
	    if ( map[next].font == NULL )
		break;
	    if ( map[next].file == NULL )
		error(FATAL, "map table format error - check %s", path);
	}   /* End for */
    }	/* End if */

}   /* End of readmap */

/*****************************************************************************/

readresident()

{

    FILE	*fp;
    char	*path;
    int		ch;
    int		n;

/*
 *
 * Reads a file that lists the resident fonts for a particular printer and marks
 * each font as already downloaded. Nothing's done if the file can't be read or
 * there's no mapping file. Comments, as in the map file, begin with a % and
 * extend to the end of the line. Added for Unix 4.0 lp.
 *
 */

    if ( next == 0 || (printer == NULL && residentfonts == NULL) )
	return;

    if ( printer != NULL ) {		/* use Unix 4.0 lp pathnames */
	sprintf(buf, "/etc/lp/printers/%s/residentfonts", printer);
	path = buf;
    } else path = residentfonts;

    if ( (fp = fopen(path, "r")) != NULL ) {
	while ( fscanf(fp, "%s", buf) != EOF )
	    if ( buf[0] == '%' )
		while ( (ch = getc(fp)) != EOF && ch != '\n' ) ;
	    else if ( (n = lookup(buf)) < next )
		map[n].downloaded = TRUE;
	fclose(fp);
    }	/* End if */

}   /* End of readresident */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll translate stdin. Assumes input files are part of a single PostScript
 * job and fonts can be downloaded at the start of each file.
 *
 */

    if ( argc < 1 )
	download();
    else {
	while ( argc > 0 ) {
	    fp_temp = NULL;
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    download();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    if ( fp_temp != NULL )
		fclose(fp_temp);
	    argc--;
	    argv++;
	}   /* End while */
    }	/* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Clean things up before we quit.
 *
 */

    if ( temp_file != NULL )
	unlink(temp_file);

}   /* End of done */

/*****************************************************************************/

download()

{

    int		infontlist = FALSE;

/*
 *
 * If next is zero the map table is empty and all we do is copy the input file
 * to stdout. Otherwise we read the input file looking for %%DocumentFonts: or
 * continuation comments, add any accessible fonts to the output file, and then
 * append the input file. When reading stdin we append lines to fp_temp and
 * recover them when we're ready to copy the input file. fp_temp will often
 * only contain part of stdin - if there's no %%DocumentFonts: (atend) comment
 * we stop reading fp_in after the header.
 *
 */

    if ( next > 0 ) {
	if ( fp_in == stdin ) {
	    if ( (temp_file = tempnam(temp_dir, "post")) == NULL )
		error(FATAL, "can't generate temp file name");
	    if ( (fp_temp = fopen(temp_file, "w+r")) == NULL )
		error(FATAL, "can't open %s", temp_file);
	    unlink(temp_file);
	    temp_file = NULL;
	}   /* End if */

	while ( fgets(buf, sizeof(buf), fp_in) != NULL ) {
	    if ( fp_temp != NULL )
		fprintf(fp_temp, "%s", buf);
	    if ( buf[0] != '%' || buf[1] != '%' ) {
		if ( (buf[0] != '%' || buf[1] != '!') && atend == FALSE )
		    break;
		infontlist = FALSE;
	    } else if ( strncmp(buf, comment, strlen(comment)) == 0 ) {
		copyfonts(buf);
		infontlist = TRUE;
	    } else if ( buf[2] == '+' && infontlist == TRUE )
		copyfonts(buf);
	    else infontlist = FALSE;
	}   /* End while */
    }	/* End if */

    copyinput();

}   /* End of download */

/*****************************************************************************/

copyfonts(list)

    char	*list;

{

    char	*font;
    char	*path;
    int		n;

/*
 *
 * list points to a %%DocumentFonts: or continuation comment. What follows the
 * the keyword will be a list of fonts separated by white space (or (atend)).
 * Look for each font in the map table and if it's found copy the font file to
 * stdout (once only).
 *
 */

    strtok(list, " \n");		/* skip to the font list */

    while ( (font = strtok(NULL, " \t\n")) != NULL ) {
	if ( strcmp(font, ATEND) == 0 ) {
	    atend = TRUE;
	    break;
	}   /* End if */
	if ( (n = lookup(font)) < next ) {
	    if ( *map[n].file != '/' ) {
		if ( (path = malloc(strlen(hostfontdir)+strlen(map[n].file)+2)) == NULL )
		    error(FATAL, "no memory");
		sprintf(path, "%s/%s", hostfontdir, map[n].file);
		cat(path);
		free(path);
	    } else cat(map[n].file);
	    map[n].downloaded = TRUE;
	}   /* End if */
    }	/* End while */

}   /* End of copyfonts */

/*****************************************************************************/

copyinput()

{

/*
 *
 * Copies the input file to stdout. If fp_temp isn't NULL seek to the start and
 * add it to the output file - it's a partial (or complete) copy of stdin made
 * by download(). Then copy fp_in, but only seek to the start if it's not stdin.
 *
 */

    if ( fp_temp != NULL ) {
	fseek(fp_temp, 0L, 0);
	while ( fgets(buf, sizeof(buf), fp_temp) != NULL )
	    printf("%s", buf);
    }	/* End if */

    if ( fp_in != stdin )
	fseek(fp_in, 0L, 0);

    while ( fgets(buf, sizeof(buf), fp_in) != NULL )
	printf("%s", buf);

}   /* End of copyinput */

/*****************************************************************************/

lookup(font)

    char	*font;

{

    int		i;

/*
 *
 * Looks for *font in the map table. Return the map table index if found and
 * not yet downloaded - otherwise return next.
 *
 */

    for ( i = 0; i < next; i++ )
	if ( strcmp(font, map[i].font) == 0 ) {
	    if ( map[i].downloaded == TRUE )
		i = next;
	    break;
	}   /* End if */

    return(i);

}   /* End of lookup */

/*****************************************************************************/

Map *allocate(ptr, num)

    Map		*ptr;
    int		num;

{

/*
 *
 * Allocates space for num Map elements. Calls malloc() if ptr is NULL and
 * realloc() otherwise.
 *
 */

    if ( ptr == NULL )
	ptr = (Map *)malloc(num * sizeof(Map));
    else ptr = (Map *)realloc(ptr, num * sizeof(Map));

    if ( ptr == NULL )
	error(FATAL, "no map memory");

    return(ptr);

}   /* End of allocate */

/*****************************************************************************/

0707070014230550121006400057030057030000011530300522633074000003500000007101post.src/download/download.1.ds dH /usr/lib/font/postscript
.TH DOWNLOAD 1 "DWB 3.2"
.SH NAME
download \- host-resident PostScript font download
.SH SYNOPSIS
\*(mBdownload\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B download
prepends host-resident fonts to
.I files
and writes the results on the standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
.B download
assumes the input
.I files
are a single PostScript job and that requested fonts
can be included at the start of each input
.IR file .
The following
.I options
are understood:
.TP 1.0i
.OP \-f
Force a complete scan of each input
.I file.
In the absence of an explicit comment pointing
.I download
to the end of the file, the default scan stops
immediately after the PostScript header comments.
.TP 1.0i
.OP \-m name
Use
.I name
as the font map table.
A
.I name
that begins with
.MW /
is the full pathname of the
map table.
Otherwise
.I name
is relative to the host font directory.
.TP 1.0i
.OP \-p printer
Read the printer-resident font list from file
.br
.MI /etc/lp/printers/ printer /residentfonts \f1.
.br
Fonts named in this file will not be downloaded.
The
.OP \-p
option is for use with Unix 4.0 lp.
Other spoolers should use the
.OP \-r
option.
.TP 1.0i
.OP \-r file
Read the list of printer-resident fonts from
.I file.
Fonts named in this file will not be downloaded.
.TP 1.0i
.OP \-H dir
Use
.I dir
as the host font directory.
The default is
.MR \*(dH .
.TP 1.0i
.OP \-T dir
Use
.I dir
as the temporary file directory.
Only used to make a copy of standard input.
By default
.I dir
is set to
.MR /tmp .
.PP
Requested fonts are named in a
.MW %%DocumentFonts:
comment in the input
.IR files .
Available fonts are the ones listed in the map table
selected using the
.OP \-m
option.
.PP
The map table consists of fontname\-filename pairs.
The fontname is the full name of the PostScript font,
exactly as it would appear in a
.MW %%DocumentFonts:
comment.
The filename is the pathname of the host resident font.
A filename that begins with a
.MW /
is used as is,
otherwise the pathname is relative to the host font
directory.
Comments are introduced by
.MW %
(as in PostScript) and
extend to the end of the line.
.PP
The only candidates for downloading are fonts listed
in the map table that point
.B download
to readable files.
A font is downloaded at most once per job.
Requests for unlisted fonts or inaccessible files
are ignored.
All requests are ignored if the map table can't be read.
.SH EXAMPLES
A map table used to control the downloading
of the Bookman font family might be,
.EX -1
%
% The first string is the full PostScript font name. The second string
% is the file name - relative the host font directory unless it begins
% with a /.
%

  Bookman-Light            KR
  Bookman-LightItalic      KI
  Bookman-Demi             KB
  Bookman-DemiItalic       KX
.EE
Use file
.MW myprinter
(in the default host font directory) as the
map table:
.EX
download -m myprinter \f2file
.EE
Set the host font directory to
.MW /tmp/font
and use
.MW /tmp/font/xxx
as the map table:
.EX
download -H /tmp/font -mxxx \f2file
.EE
.SH DIAGNOSTICS
0 exit status is returned if
.I files
were successfully processed.
.SH BUGS
.B download
should be part of a more general program.
.PP
.B download
does not look for
.MW %%PageFonts:
comments
and there is no way to force multiple downloads of
a particular font.
.PP
Using full pathnames, either in map tables or for the map table
name, is not often recommended.
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy (1),
.BR postdmd (1),
.BR postio (1),
.BR postmd (1),
.BR postprint (1),
.BR posttek (1)
0707070014231031431006440057030057030000010231460522634431100001700000002663post.src/NOTES Directory dpost is DWB 3.3 version without UTF changes. dpost.utf is
 stuff for Plan 9. Both build and install dpost, so only pick one. The
 makefile I sent (postscript.mk) builds dpost.utf.

 Left READING set to ONEBYTE in common/gen.h. Expect dpost errors unless
 'x E UTF' is added to troff output or READING set to UTFENCODING. Easy
 to make 'x E UTF' anything else too.

 Left RUNELIB defined in common/rune.h so rune.c stuff is used when
 dpost.utf is built.

 UTF.enc is in directory psencoding. Install and link to Default.enc on
 Plan 9.

 Carmela requested two new characters: \(bs for backslash and \(dq for
 double quote. Both are in devLatin1 and devpost tables. Carmela also
 asked for a bunch of her devpost accent characters in devLatin1. Added
 them to the end of the devLatin1 tables.

 A word of warning about devLatin1. Carmela, Peter and others complained
 about - and hyphens being too long in the Latin1 fonts. I used Abode's
 choice but nobody liked it. New devLatin1 tables use a smaller character
 for hy. Looks better (I guess) but a width change affects line and page
 breaks!! Not sure what you want to do. Complaints on this one go to
 npn and carmela!!!

 Didn't take your suggested pathname change in download. Didn't want to
 risk breaking Unix 4.0 lp. What's there is bogus but was only for Unix
 4.0. The -r option accomplishes something similiar but needs a full path.

 postio.mk is very different and not tested on V9.

0707070014230735420407550057030057030000020011070522633074300002000000000000post.src/grabit0707070014230732661006400057030057030000010000700522633074200003200000002732post.src/grabit/grabit.mkMAKE=/bin/make
MAKEFILE=grabit.mk

OWNER=bin
GROUP=bin

MAN1DIR=/tmp
MAN5DIR=/usr/man/p_man/man5
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

all : grabit

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp grabit $(POSTBIN)/grabit
	@chmod 755 $(POSTBIN)/grabit
	@chgrp $(GROUP) $(POSTBIN)/grabit
	@chown $(OWNER) $(POSTBIN)/grabit
	cp grabit.ps $(POSTLIB)/grabit.ps
	@chmod 644 $(POSTLIB)/grabit.ps
	@chgrp $(GROUP) $(POSTLIB)/grabit.ps
	@chown $(OWNER) $(POSTLIB)/grabit.ps
	cp grabit.1 $(MAN1DIR)/grabit.1
	@chmod 644 $(MAN1DIR)/grabit.1
	@chgrp $(GROUP) $(MAN1DIR)/grabit.1
	@chown $(OWNER) $(MAN1DIR)/grabit.1

clean :

clobber : clean
	rm -f grabit

grabit : grabit.sh
	sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" grabit.sh >grabit
	@chmod 755 grabit

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	grabit.1 >XXX.1; \
	mv XXX.1 grabit.1

0707070014230735441006440057030057030000010014500522627503200003200000030161post.src/grabit/grabit.ps%
% Dump a PostScript object, occasionally in a form that can be sent back
% through the interpreter. Similiar to Adobe's == procedure, but output
% is usually easier to read. No binding so operators like rcheck and exec
% can be conviently redefined.
%

/GrabitDict 100 dict dup begin

/recursive true def
/scratchstring 200 string def
/slowdown 100 def

/column 0 def
/lastcolumn 80 def
/level 0 def
/multiline 100 array def
/nextname 0 def
/arraylength 0 def
/lengthonly false def

/GrabitSetup {
	counttomark {OmitNames exch true put} repeat pop
	0 0 moveto		% for hardcopy output
} def

/OmitNames 30 dict def		% ignore these names
/OtherDicts 200 dict def	% unrecognized dictionaries

%
% All strings returned to the host go through Print. First pass through an
% array has lengthonly set to true.
%

/Print {
	dup type /stringtype ne {scratchstring cvs} if
	lengthonly {
		length arraylength add /arraylength exch def
	}{
		dup length column add /column exch def
		print flush
		slowdown {1 pop} repeat
	} ifelse
} def

/Indent {level {(    ) Print} repeat} def
/Newline {(\n) Print lengthonly not {/column 0 def} if} def

/NextLevel {/level level 1 add def multiline level 0 put} def
/LastLevel {/level level 1 sub def} def

%
% Make a unique name for each unrecognized dictionary and remember the name
% and dictionary in OtherDicts.
%

/Register {
	dup type /dicttype eq {
		/nextname nextname 1 add def
		dup (UnknownDict   ) dup
        	(UnknownDict) length nextname (   ) cvs putinterval
		0 (UnknownDict) length nextname (   ) cvs length add getinterval cvn
		exch OtherDicts 3 1 roll put
	} if
} def

%
% Replace array or dictionary values by known names. Lookups are in the
% standard PostScript dictionaries and in OtherDicts. If found replace
% the value by the name and make it executable so nametype omits the
% leading /.
%

/Replace {
	false
	1 index type /dicttype eq {pop true} if
	1 index type /arraytype eq 2 index xcheck not and {pop true} if
	{
		false
		[userdict systemdict statusdict serverdict OtherDicts] {
			{
				3 index eq
					{exch pop exch pop cvx true exit}
					{pop}
				ifelse
			} forall
			dup {exit} if
		} forall
		pop
	} if
} def

%
% Simple type handlers. In some cases (e.g. savetype) what's returned can't
% be sent back through the interpreter.
%

/booleantype {{(true )}{(false )} ifelse Print} def
/marktype {pop (mark ) Print} def
/nulltype {pop (null ) Print} def
/integertype {Print ( ) Print} def
/realtype {Print ( ) Print} def
/filetype {pop (-file- ) Print} def
/fonttype {pop (-fontID- ) Print} def
/savetype {pop (-saveobj- ) Print} def

%
% Special formatting for operators is enabled if the flag in multiline
% (for the current level) is set to 1. In that case each operator, after
% being printed, is looked up in OperatorDict. If found the value is used
% as an index into the OperatorProcs array and the object at that index
% is retrieved and executed. Currently only used to choose the operators
% that end a line.
%

/operatortype {
	dup Print ( ) Print
	multiline level get 1 eq {
		scratchstring cvs cvn dup OperatorDict exch known {
			OperatorDict exch get
			OperatorProcs exch get exec
		}{
			pop
			column lastcolumn gt {Newline Indent} if
		} ifelse
	}{pop} ifelse
} def

%
% Executable names are passed to operatortype. Non-executable names get a
% leading /.
%

/nametype {
	dup xcheck {
		operatortype
	}{
		(/) Print Print ( ) Print
	} ifelse
} def

%
% Arrays are processed in two passes. The first computes the length of the
% string returned to the host without any special formatting. If it extends
% past the last column special formatting is enabled by setting a flag in
% array multiline. Arrays are processed in a for loop so the last element
% easily recognized. At that point special fortmatting is disabled.
%

/packedarraytype {arraytype} def

/arraytype {
	NextLevel
	lengthonly not {
		/lengthonly true def
		/arraylength 0 def
		dup dup type exec
		arraylength 20 gt arraylength column add lastcolumn gt and {
			multiline level 1 put
		} if
		/lengthonly false def
	} if

	dup rcheck not {
		(-array- ) Print pop
	}{
		dup xcheck {({)}{([)} ifelse Print
		multiline level get 0 ne {Newline Indent}{( ) Print} ifelse
		0 1 2 index length 1 sub {
			2 copy exch length 1 sub eq multiline level get 1 eq and {
				multiline level 2 put
			} if
			2 copy get exch pop
			dup type /dicttype eq {
				Replace
				dup type /dicttype eq {
					dup Register Replace
					recursive {
						2 copy cvlit
						/def load 3 1 roll
						count 3 roll
					} if
					exch pop
				} if
			} if
			dup type exec
			dup xcheck not multiline level get 1 eq and {
				0 index type /arraytype eq
				1 index type /packedarray eq or
				1 index type /stringtype eq or {Newline Indent} if
			} if
		} for
		multiline level get 0 ne {Newline LastLevel Indent NextLevel} if
		xcheck {(} )}{(] )} ifelse Print
	} ifelse
	LastLevel
} def

%
% Dictionary handler. Try to replace the value by a name before processing
% the dictionary.
%

/dicttype {
	dup
	rcheck not {
		(-dictionary- ) Print pop
	}{
		dup maxlength Print ( dict dup begin) Print Newline
		NextLevel
		{
			1 index OmitNames exch known {
				pop pop
			}{
				Indent
				Replace		% arrays and dicts by known names
				Register	% new dictionaries in OtherDicts
				exch
				cvlit dup type exec	% key first - force a /
				dup type exec		% then the value
				(def) Print Newline
			} ifelse
		} forall
		LastLevel
		Indent
		(end ) Print
	} ifelse
} def

%
% Strings containing characters not in AsciiDict are returned in hex. All
% others are ASCII strings and use AsciiDict for character mapping.
%

/onecharstring ( ) def
/twocharstring (  ) def

/stringtype {
	dup
	rcheck not {
		(-string- ) Print
	}{
		/hexit false def
		dup {
			onecharstring 0 3 -1 roll put
			AsciiDict onecharstring cvn known not {
				/hexit true def exit
			} if
		} forall

		hexit {(<)}{(\()} ifelse Print
		0 1 2 index length 1 sub {
			2 copy 1 getinterval exch pop
			hexit {
				0 get /n exch def
				n -4 bitshift 16#F and 16 twocharstring cvrs pop
				n 16#F and twocharstring 1 1 getinterval 16 exch cvrs pop
				twocharstring
			}{cvn AsciiDict exch get} ifelse
			Print
			column lastcolumn gt {
				hexit not {(\\) Print} if
				Newline
			} if
		} for
		hexit {(> )}{(\) )} ifelse Print
	} ifelse
	pop
} def

%
% ASCII characters and replacement strings. Ensures the returned string will
% reproduce the original when passed through the scanner. Strings containing
% characters not in this list should be returned as hex strings.
%

/AsciiDict 128 dict dup begin
	(\n) cvn (\\n) def
	(\r) cvn (\\r) def
	(\t) cvn (\\t) def
	(\b) cvn (\\b) def
	(\f) cvn (\\f) def
	( ) cvn ( ) def
	(!) cvn (!) def
	(") cvn (") def
	(#) cvn (#) def
	($) cvn ($) def
	(%) cvn (\\%) def
	(&) cvn (&) def
	(') cvn (') def
	(\() cvn (\\\() def
	(\)) cvn (\\\)) def
	(*) cvn (*) def
	(+) cvn (+) def
	(,) cvn (,) def
	(-) cvn (-) def
	(.) cvn (.) def
	(/) cvn (/) def
	(0) cvn (0) def
	(1) cvn (1) def
	(2) cvn (2) def
	(3) cvn (3) def
	(4) cvn (4) def
	(5) cvn (5) def
	(6) cvn (6) def
	(7) cvn (7) def
	(8) cvn (8) def
	(9) cvn (9) def
	(:) cvn (:) def
	(;) cvn (;) def
	(<) cvn (<) def
	(=) cvn (=) def
	(>) cvn (>) def
	(?) cvn (?) def
	(@) cvn (@) def
	(A) cvn (A) def
	(B) cvn (B) def
	(C) cvn (C) def
	(D) cvn (D) def
	(E) cvn (E) def
	(F) cvn (F) def
	(G) cvn (G) def
	(H) cvn (H) def
	(I) cvn (I) def
	(J) cvn (J) def
	(K) cvn (K) def
	(L) cvn (L) def
	(M) cvn (M) def
	(N) cvn (N) def
	(O) cvn (O) def
	(P) cvn (P) def
	(Q) cvn (Q) def
	(R) cvn (R) def
	(S) cvn (S) def
	(T) cvn (T) def
	(U) cvn (U) def
	(V) cvn (V) def
	(W) cvn (W) def
	(X) cvn (X) def
	(Y) cvn (Y) def
	(Z) cvn (Z) def
	([) cvn ([) def
	(\\) cvn (\\\\) def
	(]) cvn (]) def
	(^) cvn (^) def
	(_) cvn (_) def
	(`) cvn (`) def
	(a) cvn (a) def
	(b) cvn (b) def
	(c) cvn (c) def
	(d) cvn (d) def
	(e) cvn (e) def
	(f) cvn (f) def
	(g) cvn (g) def
	(h) cvn (h) def
	(i) cvn (i) def
	(j) cvn (j) def
	(k) cvn (k) def
	(l) cvn (l) def
	(m) cvn (m) def
	(n) cvn (n) def
	(o) cvn (o) def
	(p) cvn (p) def
	(q) cvn (q) def
	(r) cvn (r) def
	(s) cvn (s) def
	(t) cvn (t) def
	(u) cvn (u) def
	(v) cvn (v) def
	(w) cvn (w) def
	(x) cvn (x) def
	(y) cvn (y) def
	(z) cvn (z) def
	({) cvn ({) def
	(|) cvn (|) def
	(}) cvn (}) def
	(~) cvn (~) def
end def

%
% OperatorDict can help format procedure listings. The value assigned to each
% name is used as an index into the OperatorProcs array. The procedure at that
% index is fetched and executed after the named operator is printed. What's in
% OperatorDict is a matter of taste rather than correctness. The default list
% represents our choice of which of Adobe's operators should end a line.
%

/OperatorProcs [{} {Newline Indent}] def

/OperatorDict 250 dict def

OperatorDict	/arc			1 put
OperatorDict	/arcn			1 put
OperatorDict	/ashow			1 put
OperatorDict	/awidthshow		1 put
OperatorDict	/banddevice		1 put
OperatorDict	/begin			1 put
OperatorDict	/charpath		1 put
OperatorDict	/clear			1 put
OperatorDict	/cleardictstack		1 put
OperatorDict	/cleartomark		1 put
OperatorDict	/clip			1 put
OperatorDict	/clippath		1 put
OperatorDict	/closefile		1 put
OperatorDict	/closepath		1 put
OperatorDict	/concat			1 put
OperatorDict	/copypage		1 put
OperatorDict	/curveto		1 put
OperatorDict	/def			1 put
OperatorDict	/end			1 put
OperatorDict	/eoclip			1 put
OperatorDict	/eofill			1 put
OperatorDict	/erasepage		1 put
OperatorDict	/exec			1 put
OperatorDict	/exit			1 put
OperatorDict	/fill			1 put
OperatorDict	/flattenpath		1 put
OperatorDict	/flush			1 put
OperatorDict	/flushfile		1 put
OperatorDict	/for			1 put
OperatorDict	/forall			1 put
OperatorDict	/framedevice		1 put
OperatorDict	/grestore		1 put
OperatorDict	/grestoreall		1 put
OperatorDict	/gsave			1 put
OperatorDict	/handleerror		1 put
OperatorDict	/if			1 put
OperatorDict	/ifelse			1 put
OperatorDict	/image			1 put
OperatorDict	/imagemask		1 put
OperatorDict	/initclip		1 put
OperatorDict	/initgraphics		1 put
OperatorDict	/initmatrix		1 put
OperatorDict	/kshow			1 put
OperatorDict	/lineto			1 put
OperatorDict	/loop			1 put
OperatorDict	/moveto			1 put
OperatorDict	/newpath		1 put
OperatorDict	/nulldevice		1 put
OperatorDict	/pathforall		1 put
OperatorDict	/print			1 put
OperatorDict	/prompt			1 put
OperatorDict	/put			1 put
OperatorDict	/putinterval		1 put
OperatorDict	/quit			1 put
OperatorDict	/rcurveto		1 put
OperatorDict	/renderbands		1 put
OperatorDict	/repeat			1 put
OperatorDict	/resetfile		1 put
OperatorDict	/restore		1 put
OperatorDict	/reversepath		1 put
OperatorDict	/rlineto		1 put
OperatorDict	/rmoveto		1 put
OperatorDict	/rotate			1 put
OperatorDict	/run			1 put
OperatorDict	/scale			1 put
OperatorDict	/setcachedevice		1 put
OperatorDict	/setcachelimit		1 put
OperatorDict	/setcacheparams		1 put
OperatorDict	/setcharwidth		1 put
OperatorDict	/setdash		1 put
OperatorDict	/setdefaulttimeouts	1 put
OperatorDict	/setdostartpage		1 put
OperatorDict	/seteescratch		1 put
OperatorDict	/setflat		1 put
OperatorDict	/setfont		1 put
OperatorDict	/setgray		1 put
OperatorDict	/sethsbcolor		1 put
OperatorDict	/setidlefonts		1 put
OperatorDict	/setjobtimeout		1 put
OperatorDict	/setlinecap		1 put
OperatorDict	/setlinejoin		1 put
OperatorDict	/setlinewidth		1 put
OperatorDict	/setmargins		1 put
OperatorDict	/setmatrix		1 put
OperatorDict	/setmiterlimit		1 put
OperatorDict	/setpacking		1 put
OperatorDict	/setpagetype		1 put
OperatorDict	/setprintname		1 put
OperatorDict	/setrgbcolor		1 put
OperatorDict	/setsccbatch		1 put
OperatorDict	/setsccinteractive	1 put
OperatorDict	/setscreen		1 put
OperatorDict	/settransfer		1 put
OperatorDict	/show			1 put
OperatorDict	/showpage		1 put
OperatorDict	/start			1 put
OperatorDict	/stop			1 put
OperatorDict	/store			1 put
OperatorDict	/stroke			1 put
OperatorDict	/strokepath		1 put
OperatorDict	/translate		1 put
OperatorDict	/widthshow		1 put
OperatorDict	/write			1 put
OperatorDict	/writehexstring		1 put
OperatorDict	/writestring		1 put

end def

%
% Put an object on the stack and call Grabit. Output continues until stack
% is empty. For example,
%
%		/letter load Grabit
%
% prints a listing of the letter procedure.
%

/Grabit {
	/saveobj save def
	GrabitDict begin
		{
			count 0 eq {exit} if
			count {dup type exec} repeat
			(\n) print flush
		} loop
	end
	currentpoint			% for hardcopy output
	saveobj restore
	moveto
} def

0707070014230735451006440057030057030000010011550522627503200003200000002271post.src/grabit/grabit.sh#
# Print a listing of an object, often a dictionary or an array. Something
# like ==, but the output is often easier to read and closer to PostScript
# that can be sent back through the interpreter.
#

POSTLIB=/usr/lib/postscript
PROLOGUE=$POSTLIB/grabit.ps

COPYFILE=
RECURSIVE=true
OMITNAMES="/Grabit /GrabitDict"

NONCONFORMING="%!PS"
ENDPROLOG="%%EndProlog"
BEGINSETUP="%%BeginSetup"
ENDSETUP="%%EndSetup"
TRAILER="%%Trailer"

SETUP=GrabitSetup

while [ -n "$1" ]; do
    case $1 in
	-d)  RECURSIVE=false;;

	-o)  shift; OMITNAMES="$OMITNAMES $1";;
	-o*) OMITNAMES="$OMITNAMES `echo $1 | sed s/-o//`";;

	-C)  shift; COPYFILE="$COPYFILE $1";;
	-C*) COPYFILE="$COPYFILE `echo $1 | sed s/-C//`";;

	-L)  shift; PROLOGUE=$1;;
	-L*) PROLOGUE=`echo $1 | sed s/-L//`;;

	--)  shift; break;;

	-*)  echo "$0: illegal option $1" >&2; exit 1;;

	*)   break;;
    esac
    shift
done

echo $NONCONFORMING
cat $PROLOGUE
echo $ENDPROLOG
echo $BEGINSETUP
cat ${COPYFILE:-/dev/null}
echo "GrabitDict begin"
echo "/recursive $RECURSIVE def"

echo mark
for i in $OMITNAMES; do
    case $i in
	/*) echo "$i";;
	?*) echo "/$i";;
    esac
done
echo GrabitSetup

echo end
echo $ENDSETUP

for i do
    echo "$i Grabit"
done

0707070014230733311006400057030057030000011776300522633074300003100000003520post.src/grabit/grabit.1.ds dQ /usr/lib/postscript
.TH GRABIT 1 "DWB 3.2"
.SH NAME
.B grabit
\- recover the text representation of PostScript objects
.SH SYNOPSIS
\*(mBgrabit\f1
.OP "" options []
.OP "" object
\&...
.SH DESCRIPTION
.B Grabit
builds a PostScript program that generates a text representation
of one or more PostScript
.IR object s.
The program is written on the standard output.
The following
.I options
are understood:
.TP 1.0i
.OP \-d
Do not automatically dump the contents of unrecognized dictionary
objects found in PostScript arrays.
.TP 1.0i
.OP \-C file
Copy
.I file
into the PostScript program.
.I file
must contain legitimate PostScript.
.TP 1.0i
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/grabit.ps .
.PP
When the program built by
.B grabit
is sent to a PostScript printer the text representation of each
.I object
is normally returned to the host computer over the printer's serial port.
Use
.BR hardcopy (1)
if you do not have access to the port.
.PP
Each argument should be a PostScript
.I object
or commands that generate a PostScript
.IR object .
The program built by
.B grabit
produces results that are often close to legitimate PostScript that
can be successfully sent through an interpreter.
.SH EXAMPLES
.PP
If you can read and write 
.MW /dev/tty00
and there is a PostScript printer on
the other end, then
recover the readable portions of the
.MW userdict
and
.MW statusdict
dictionaries:
.EX
grabit userdict statusdict | postio -l/dev/tty00 -t
.EE
Otherwise get a printout of the dictionaries:
.EX
grabit userdict statusdict | hardcopy | lp ...
.EE
Arguments should be PostScript code that leaves an object on the stack.
Dump the contents of Adobe's
.MW internaldict
dictionary:
.EX
grabit "1183615869 internaldict" | postio -l/dev/tty00 -t
.EE
.SH FILES
.MW \*(dQ/grabit.ps
.SH SEE ALSO
.BR hardcopy (1),
.BR postio (1)
0707070014230642640407550057030057030000021711540522633074500002200000000000post.src/hardcopy0707070014230642651006440057030057030000011711550522627503200003600000003137post.src/hardcopy/hardcopy.sh#
# Generate paper output from the data that a PostScript program normally
# sends back to a host computer using file output operators.
#

POSTLIB=/usr/lib/postscript
PROLOGUE=$POSTLIB/hardcopy.ps

OPTIONS=
MODE=portrait

NONCONFORMING="%!PS"
ENDPROLOG="%%EndProlog"
BEGINSETUP="%%BeginSetup"
ENDSETUP="%%EndSetup"
TRAILER="%%Trailer"

SETUP=HardcopySetup
DONE="(%stdout)(w) file -1 write"

while [ -n "$1" ]; do
    case $1 in
	-c)  shift; OPTIONS="$OPTIONS /#copies $1 store";;
	-c*) OPTIONS="$OPTIONS /#copies `echo $1 | sed s/-c//` store";;

	-f)  shift; OPTIONS="$OPTIONS /font /$1 def";;
	-f*) OPTIONS="$OPTIONS /font /`echo $1 | sed s/-f//` def";;

	-p)  shift; MODE=$1;;
	-p*) MODE=`echo $1 | sed s/-p//`;;

	-m)  shift; OPTIONS="$OPTIONS /magnification $1 def";;
	-m*) OPTIONS="$OPTIONS /magnification `echo $1 | sed s/-m//` def";;

	-s)  shift; OPTIONS="$OPTIONS /pointsize $1 def";;
	-s*) OPTIONS="$OPTIONS /pointsize `echo $1 | sed s/-s//` def";;

	-x)  shift; OPTIONS="$OPTIONS /xoffset $1 def";;
	-x*) OPTIONS="$OPTIONS /xoffset `echo $1 | sed s/-x//` def";;

	-y)  shift; OPTIONS="$OPTIONS /yoffset $1 def";;
	-y*) OPTIONS="$OPTIONS /yoffset `echo $1 | sed s/-y//` def";;

	-L)  shift; PROLOGUE=$1;;
	-L*) PROLOGUE=`echo $1 | sed s/-L//`;;

	--)  shift; break;;

	-*)  echo "$0: illegal option $1" >&2; exit 1;;

	*)   break;;
    esac
    shift
done

case "$MODE" in
    l*) OPTIONS="$OPTIONS /landscape true def";;
    *)  OPTIONS="$OPTIONS /landscape false def";;
esac

echo $NONCONFORMING
cat $PROLOGUE
echo $ENDPROLOG
echo $BEGINSETUP
echo $OPTIONS
echo $SETUP
echo $ENDSETUP

cat $*

echo $TRAILER
echo $DONE

0707070014230642661006440057030057030000011711700522627503200003600000007544post.src/hardcopy/hardcopy.ps%
% Redefiniton of the PostScript file output operators so results go to paper.
% Complicated and slow, but the implementation doesn't place many demands on
% included PostScript. About all that's required is gentle treatment of the
% graphics state between write calls.
%

/#copies 1 store
/aspectratio 1 def
/font /Courier def
/formsperpage 1 def
/landscape false def
/magnification 1 def
/orientation 0 def
/pointsize 10 def
/rotation 1 def
/xoffset .1 def
/yoffset .1 def

/roundpage true def
/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} def
/min {2 copy gt {exch} if pop} def

/HardcopySetup {
	landscape {/orientation 90 orientation add def} if
	font findfont 1 1.1 div scalefont setfont

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	width 2 div neg height 2 div translate
	xoffset inch yoffset inch neg translate
	pointsize 1.1 mul dup scale
	magnification dup aspectratio mul scale
	height width div 1 min dup scale
	0 -1 translate
	0 0 moveto
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
} def

%
% Unbind the operators in an executable array or packedarray. Leaves the
% unbound array or the original object on the stack.
%

/Unbind {
	0 index xcheck
	1 index type /arraytype eq
	2 index type /packedarraytype eq or and {
		dup length array copy cvx
		dup 0 exch {
			dup type /operatortype eq {
				(                          ) cvs cvn cvx
			} if

			dup type /dicttype eq {
				dup maxlength dict exch {
					Unbind
					3 copy put pop pop
				} forall
			} if

			0 index xcheck
			1 index type /arraytype eq
			2 index type /packedarraytype eq or and {
				Unbind
			} if

			3 copy put pop
			1 add
		} forall
		pop
	} if
} def

%
% New write operator - don't bind the definition! Expands tabs and backspaces,
% wraps long lines, and starts a new page whenever necessary. The code that
% handles newlines assumes lines are separated by one vertical unit.
%

/write {
	true exch

      %%case '\b':
	dup 8#10 eq {
		( ) stringwidth pop neg 0 rmoveto
		currentpoint pop 0 lt {
			currentpoint exch pop 0 exch moveto
		} if
		exch pop false exch
	} if

      %%case '\t':
	dup 8#11 eq {
		currentpoint pop ( ) stringwidth pop div round cvi
		8 mod 8 exch sub {
			2 index 8#40 write
		} repeat
		exch pop false exch
	} if

      %%case '\n':
	dup 8#12 eq {
		currentpoint 0 exch 1 sub moveto pop

		gsave clippath pathbbox pop pop exch pop grestore
		currentpoint exch pop 1 sub ge {
			2 index 8#14 write
		} if
		exch pop false exch
	} if

      %%case '\f':
	dup 8#14 eq {
		gsave showpage grestore
		0 0 moveto
		exch pop false exch
	} if

      %%case '\r':
	dup 8#15 eq {
		currentpoint 0 exch moveto pop
		exch pop false exch
	} if

      %%case EOF:
	dup -1 eq {
		currentpoint 0 ne exch 0 ne or {
			2 index 8#14 write
		} if
		exch pop false exch
	} if

      %%default:
	exch {
		dup
		gsave clippath pathbbox pop 3 1 roll pop pop grestore 
		( ) stringwidth pop currentpoint pop add le {
			2 index 8#12 write
		} if
		( ) dup 0 4 -1 roll put show
	} if

	pop		% the character
	pop		% and file object
} def

%
% All the other file output operators call our redefined write operator.
%

/print {
	(%stdout) (w) file exch {1 index exch write} forall
	pop
} def

/writestring {
	{1 index exch write} forall
	pop
} def

/writehexstring {
	(0123456789ABCDEF) 3 1 roll {
		dup
		3 index exch -4 bitshift 16#F and get 2 index exch write
		2 index exch 16#F and get 1 index exch write
	} forall
	pop pop
} def

%
% Unbind and redefine the remaining file output procedures.
%

/= dup load Unbind def
/== dup load Unbind def
/stack dup load Unbind def
/pstack dup load Unbind def

0707070014230642671006440057030057030000011711570522627503200003100000000602post.src/hardcopy/READMERedirect output of the print operator to paper. Particularly useful if
you're trying to extract information from a printer, but you don't have
access to the data the printer returns to the host.

For example,

	FontDirectory {pop ==} forall

names all the fonts registered in the FontDirectory dictionary. Simple,
but only if you can read the data returned to the host by the printer.

0707070014230640011006400057030057030000011722500522633074500003500000005143post.src/hardcopy/hardcopy.1.ds dQ /usr/lib/postscript
.TH HARDCOPY 1 "DWB 3.2"
.SH NAME
.B hardcopy
\- redirects output from PostScript file operators to paper
.SH SYNOPSIS
\*(mBhardcopy\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B hardcopy
surrounds
.I files
with PostScript that redirects file output to paper,
and writes the results on the standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP 0.75i
.OP \-f name
Print
.I files
using font
.IR name ,
which should be the name of a constant width font.
The default font is Courier.
.TP 0.75i
.OP \-m num
Magnify each page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which is located near the upper left corner of
each page.
The default magnification is 1.0.
.TP 0.75i
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP 0.75i
.OP \-s num
Print
.I files
using point size
.IR num .
When printing in landscape mode
.I num
is scaled by a factor that depends on the
imaging area of the device.
The default size for portrait mode is 10.
.TP 0.75i
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed near the
upper left corner of the page, with positive
x to the right and positive y down the page.
Positive
.I num
moves everything right.
The default offset is 0.25 inches.
.TP 0.75i
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves text down the page.
The default offset is 0.25 inches.
.TP 0.75i
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/hardcopy.ps .
.PP
.B hardcopy
generates paper output from data that a PostScript program
normally sends back to a host computer.
It is particularly useful for recovering data from a printer
that does not allow access to its serial port.
.SH EXAMPLES
For a list of ROM based fonts type:
.EX
echo 'FontDirectory {pop ==} forall' | hardcopy | lp \(el
.EE
To recover the version number of the PostScript interpreter:
.EX
echo 'version ==' | hardcopy -pland | lp \(el
.EE
To build and print a width table for font
.MW R
type:
.EX
trofftable -TLatin1 R | hardcopy | lp \(el
.EE
.SH WARNINGS
Results are unpredictable if the input
.I files
make changes to the graphics state.
.SH FILES
.MW \*(dQ/hardcopy.ps
.SH SEE ALSO
.BR buildtables (1),
.BR postio (1),
.BR trofftable (1)
0707070014230640001006400057030057030000011713560522633074400003600000003016post.src/hardcopy/hardcopy.mkMAKE=/bin/make
MAKEFILE=hardcopy.mk

OWNER=bin
GROUP=bin

MAN1DIR=/tmp
MAN5DIR=/usr/man/p_man/man5
POSTLIB=/usr/lib/postscript
POSTBIN=/usr/bin/postscript

all : hardcopy

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp hardcopy $(POSTBIN)/hardcopy
	@chmod 755 $(POSTBIN)/hardcopy
	@chgrp $(GROUP) $(POSTBIN)/hardcopy
	@chown $(OWNER) $(POSTBIN)/hardcopy
	cp hardcopy.ps $(POSTLIB)/hardcopy.ps
	@chmod 644 $(POSTLIB)/hardcopy.ps
	@chgrp $(GROUP) $(POSTLIB)/hardcopy.ps
	@chown $(OWNER) $(POSTLIB)/hardcopy.ps
	cp hardcopy.1 $(MAN1DIR)/hardcopy.1
	@chmod 644 $(MAN1DIR)/hardcopy.1
	@chgrp $(GROUP) $(MAN1DIR)/hardcopy.1
	@chown $(OWNER) $(MAN1DIR)/hardcopy.1


clean :

clobber : clean
	rm -f hardcopy

hardcopy : hardcopy.sh
	sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" hardcopy.sh >hardcopy
	@chmod 755 hardcopy

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	hardcopy.1 >XXX.1; \
	mv XXX.1 hardcopy.1


0707070014230735470407550057030057030000020011170522633100500002000000000000post.src/mcolor0707070014230735501006440057030057030000010012140522627503200003100000004007post.src/mcolor/color.sr.ds Dc black
.ds Cc \*(Dc
.de CL	\" Color selection macro
.	\"
.	\"	$1=color (e.g. .CL red) or
.	\"	$1=textcolor on backgroundcolor (e.g. .CL "red on blue")
.	\"	$1=red green blue rgb (e.g. .CL ".2 .3 .4 rgb") or
.	\"	$1=hue saturation brightness hsb (e.g. .CL ".5 .6 .7 hsb")
.	\"	$2=text
.	\"
.	\" If no arguments are given the default color (usually black) will be
.	\" restored. If $2 is omitted the color selected by $1 remains in effect
.	\" until another color is selected. If two arguments are given $2 will be
.	\" printed in color $1 and then the default color will be restored.
.	\"
.	\" The color of the text and the background can be selected by setting $1
.	\" to "textcolor on backgroundcolor" where textcolor and backgroundcolor
.	\" can be any of the known colors. For example use .CL "white on black"
.	\" for reverse video printing. Changing color in a word can be accomplished
.	\" by preceeding the characters with a \X'SetColor:val' command, where val
.	\" is the color you wish to use. Named colors are case independent.
.	\"
.	\" Implementation details are device dependent and are handled in the
.	\" appropriate post-processor. Requesting a color that's not available
.	\" (eg. not defined in /usr/lib/postscript/color.ps) results in the use
.	\" of default colors - black or white on black for reverse video mode.
.	\"
.	\" All colors may not be supported on every output device, and the direct
.	\" specification of a color via an explicit rgb or hsb argument may also
.	\" be device dependent. In any case, to be safe on PostScript devices, all
.	\" numeric paramenters in the direct rgb or hsb specifications should lie
.	\" between 0 and 1 (inclusive). The names of the currently available colors
.	\" on PostScript printers are listed in file /usr/lib/postscript/color.ps.
.	\"
.mk Ov
.if \\n(.$=0 .ds Cc \\*(Dc
.if \\n(.$=1 .ds Cc \\$1
.if \\n(.$<2 \\X'SetColor:\\*(Cc'
.if \\n(.$=2 \\X'SetColor:\\$1'\\c
.if \\n(.$=2 'sp |\\n(Ovu
.if \\n(.$=2 \\$2
.if \\n(.$=2 .mk Ov
.if \\n(.$=2 \\X'SetColor:\\*(Cc'\\c
'sp |\\n(Ovu
..
0707070014230733361006400057030057030000010014750522633100500003100000002066post.src/mcolor/mcolor.5.ds dP /usr/lib/postscript
.ds dT /usr/lib/tmac
.TH MCOLOR 5
.SH NAME
.B mcolor
\- color and reverse video macro
.SH SYNOPSIS
\*(mBtroff \-mcolor\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B mcolor
is a macro package for color selection and reverse video printing
on PostScript printers.
The package is compatible with most existing macro packages
and includes the following macro:
.TP 1.25i
.MI .CL "\0color\0text"
Prints
.I text
in
.IR color .
No arguments restores the default color (black).
If
.I text
is omitted the selected
.I color
remains in effect until another
.I color
is selected.
If two arguments are given the
.I text
is printed in
.I color
and then the default color is restored.
.PP
Both the text and background color can be selected.
A
.I color
argument of
.RI `` color1
.MW on
.IR color2 ''
prints text in
.I color1
on a background in
.I color2 .
.PP
Named colors must be listed in the
``colordict''
dictionary in file
.MR \*(dP/color.ps .
.SH FILES
.MW \*(dT/tmac.color
.br
.MW \*(dP/color.ps
.SH SEE ALSO
.BR troff (1),
.BR dpost (1),
.BR mps (5)
0707070014230732631006400057030057030000010014600522633100500003200000002056post.src/mcolor/mcolor.mk#
# Not installing the man page.
#

MAKE=/bin/make
MAKEFILE=mcolor.mk

SYSTEM=V9
VERSION=3.3.2

OWNER=bin
GROUP=bin

POSTLIB=/usr/lib/postscript
TMACDIR=/usr/lib/tmac

all :
	@cp color.sr tmac.color

install : all
	@if [ ! -d $(TMACDIR) ]; then \
	    mkdir $(TMACDIR); \
	    chmod 755 $(TMACDIR); \
	    chgrp $(GROUP) $(TMACDIR); \
	    chown $(OWNER) $(TMACDIR); \
	fi
	cp tmac.color $(TMACDIR)/tmac.color
	@chmod 644 $(TMACDIR)/tmac.color
	@chgrp $(GROUP) $(TMACDIR)/tmac.color
	@chown $(OWNER) $(TMACDIR)/tmac.color

clean :
	rm -f tmac.color

clobber : clean

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	    -e "s'^TMACDIR=.*'TMACDIR=$(TMACDIR)'" \
	$(MAKEFILE) >X$(MAKEFILE); \
	mv X$(MAKEFILE) $(MAKEFILE); \
	sed \
	    -e "s'^.ds dP.*'.ds dP $(POSTLIB)'" \
	    -e "s'^.ds dT.*'.ds dT $(TMACDIR)'" \
	mcolor.5 >Xmcolor.5; \
	mv Xmcolor.5 mcolor.5

0707070014230642720407550057030057030000021711770522633074700002300000000000post.src/mpictures0707070014230642731006440057030057030000011712120522627503300003700000010340post.src/mpictures/pictures.sr.de PI	\" Picture Include
.	\" $1=file(page) $2=height,width,yoff,xoff $3=flags
.	\" Height, width, xoff, and yoff are for the frame, flags is for the
.	\" picture. Default dimensions are inches.
\\X'PI:\\n(.o:\\n(.i:\\n(.l:\\n(.t:\\$1:\\$2:\\$3:'\\c
..
.nr FT 0
.de BP	\" Begin a Picture
.	\"
.	\" $1=file(page) $2=height $3=width $4=position $5=offset $6=flags $7=label
.	\"
.	\" Height, width, position, and offset are for the frame, flags is for
.	\" the picture. The postion flag should be l, c, r, or "". Omitting the
.	\" position argument is also allowed for compatibility with the original
.	\" version of the macro. In that case offset is taken relative to your
.	\" left margin.
.if \\n(FT>1 .EP
.	\" Need these when we switch environments.
.nr Ov \\n(.v
.nr Oi \\n(.i
.nr Ol \\n(.l
.	\" Remember the arguments - sometimes as both a string and number register.
.nr $2 \\$2i
.nr $3 \\$3i
.nr $4 \\$4i
.ds $4 \\$4
.nr $5 \\$5i
.ds $5 \\$6
.ds $6 \\$7
.	\" Accept a few unadvertised position flags.
.if '\\*($4'L' .ds $4 l
.if '\\*($4'C' .ds $4 c
.if '\\*($4'R' .ds $4 r
.	\" A null with more than three arguments means l.
.if \\n(.$>3 .if '\\*($4'' .ds $4 l
.	\" Default frame dimensions if missing, zero, or null.
.if !\\n($2>0 .nr $2 3.0i
.if !\\n($3>0 .nr $3 \\n(.lu-\\n(.iu-\\n($4u
.if !\\n($3>0 .nr $3 \\n($2u
.	\" Figure out the offset that will be used the rest of the way.
.if '\\*($4'l' .nr $4 \\n($5u
.if '\\*($4'c' .nr $4 (\\n(.lu-\\n(.iu-\\n($3u)/2u+\\n($5u
.if '\\*($4'r' .nr $4 \\n(.lu-\\n(.iu-\\n($3u+\\n($5u
.	\" If we haven't recognized the position flag assume it wasn't given and
.	\" treat argument four as an offset from the left.
.if !'\\*($4'l' .if !'\\*($4'c' .if !'\\*($4'r' .ds $5 \\$5
.if !'\\*($4'l' .if !'\\*($4'c' .if !'\\*($4'r' .ds $6 \\$6
.	\" Set increments for line length and indent.
.nr Ii \\n($3u+\\n($4u+.1i
.nr Il \\n(.lu-\\n(.iu-\\n($4u+.1i
.	\" Set the frame type to one of:
.	\"	0 - frame is as wide as a line of text - skip over it.
.	\"	1 - fits in left or right margins
.	\"	2 - fill with text on the right
.	\"	3 - on the left
.	\"	4 - or on both sides of the frame
.	\"	5 - only set in EP if FT was 4 and now filling on the right.
.	\" Assume the frame is as wide as a line of text, then check dimensions
.	\" to see what's really true. The order of these tests is important!
.nr FT 0
.if \\n($4u>1.0i .nr FT 3
.if \\n($4u+\\n(.iu>=\\n(.lu .nr FT 1
.if \\n($3u+\\n($4u+\\n(.iu+1.0i<\\n(.lu .nr FT 2
.if \\n($3u+\\n($4u<=0 .nr FT 1
.if \\n(FT=2 .if \\n($4u>1.0i .nr FT 4
.	\" Ask for some vertical space - labeled pictures need a little extra,
.	\" margin pictures a little less.
.if \\n(FT=1 .if '\\*($6'' .ne \\n($2u
.if \\n(FT=1 .if !'\\*($6'' .ne \\n($2u+2v
.if !\\n(FT=1 .if '\\*($6'' .ne \\n($2u+3v
.if !\\n(FT=1 .if !'\\*($6'' .ne \\n($2u+5v
.	\" Save our place, draw the picture, label it, and return. Need precise
.	\" control of when \X'...' is put out - thus the new environment.
.mk Oh
.ev 1
.in \\n(Oiu
.ll \\n(Olu
.vs \\n(Ovu
.if \\n(FT=1 .sp -1v
.if \\n(FT=1 .PI \\$1 \\n($2u,\\n($3u,\\n(.vu,\\n($4u t\\*($5
.if !\\n(FT=1 .PI \\$1 \\n($2u,\\n($3u,\\n(.vu,\\n($4u \\*($5
.in
.ll
.vs
.ev
.lt \\n($3u
.tl \(ts\(ts\\h'\\n($4u+\\n(.iu'\\v'\\n($2u+1.5v'\\*($6\\v'-\\n($2u-1.5v'\\h'-\\n($4u-\\n(.iu'\(ts\(ts
.lt
'sp |\\n(Ohu
.	\" Figure out what to do with the text that follows.
.if !'\\*($6'' .nr $2 +2v
.if \\n(FT=0 .sp \\n($2u+2v
.if \\n(FT=1 .nr FT 0
.if \\n(FT=2 'in +\\n(Iiu
.if \\n(FT>2 .ll -\\n(Ilu
.if \\n(FT>1 .di BB
.if \\n(FT>1 .dt \\n($2u+2v+1u EP
.	\" Clean things up.
.rr $2
.rr $3
.rr $4
.rm $4
.rr $5
.rm $5
.rm $6
.rr Oh
.rr Oi
.rr Ol
.rr Ov
.if \\n(FT=0 .EP
..
.de EP	\" End the Picture - Normally called from a trap, although it can be used
.	\" on its own to mark the end of a picture.
.nr Ot 0
.if \\n(.tu<\\n(.pu .nr Ot \\n(.tu
.if \\n(Ot>0 .if \\n(FT=4 .nr FT 3
.if \\n(FT<2 .nr Ot 0
.if \\n(Ot>0 .br
.if \\n(FT=5 .nr Ot 0
.if \\n(FT>1 \{\
.	ev 1
.	eo
.	br
.	di
.	nf
.	in 0
.	BB
.	in
.	fi
.	ec
.	ev
.	rm BB\}
.if \\n(FT=5 \{\
.	nr FT 2
'	sp |\\n(Nhu+1v\}
.if \\n(FT=4 \{\
.	mk Nh
.	nr Nh -1v
.	nr FT 5
'	sp -\\n(dnu+1v
'	in +\\n(Iiu
.	ll +\\n(Ilu
.	di BB
.	dt \\n(dnu-2v+1u EP\}
.if \\n(FT=2 'in -\\n(Iiu
.if \\n(FT=3 .ll +\\n(Ilu
.if \\n(FT<4 .nr FT 0
.if \\n(Ot>0 .sp \\n(Otu
.rr Ot
.if \\n(FT=0 \{\
.	rr Nh
.	rr Ii
.	rr Il\}
..
0707070014230637741006400057030057030000011563000522633074700003700000010664post.src/mpictures/mpictures.5.ds dT /usr/lib/tmac
.TH MPICTURES 5
.SH NAME
.B mpictures
\- picture inclusion macros
.SH SYNOPSIS
\*(mBtroff \-mpictures\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B mpictures
is a macro package used to include PostScript pictures in
.B troff
documents.
The package is compatible with many existing
.B troff
macro packages and includes the following three macros:
.TP
.MI .BP "\0file\0height\0width\0position\0offset\0flags\0label"
.sp 0.3v
Places the picture
.I file
in the space set aside by
.IR height ,
.IR width ,
.IR position ,
and
.IR offset ,
which together define and position the picture frame.
The macro arguments are:
.in +0.75i
.de XX
.sp 3p
.ti -0.75i
\f2\\$1\fP
.sp -1v
..
.XX file
Pathname of a PostScript picture
.IR file .
Appending
.MI ( n )
to
.I file
selects page number
.I n
from a multiple-page picture
.IR file .
By default the first page in
.I file
is selected.
.XX height
Vertical extent of the frame.
The default is
.MR 3i .
.XX width
Horizontal extent of the frame.
The default is the current length of a line of text.
.XX position
One of
.MR l ,
.MR c ,
or
.MW r
used to align the left, center, or
right of the frame with the corresponding position
on the current line of text.
The default is
.MR l .
.XX offset
Moves the frame right (positive) or left (negative)
from the selected
.IR position .
The default is
.MR 0i .
.XX flags
A string built from one or more of the following:
.in +0.5i
.sp 3p
.de YY
.br
.ti -0.5i
\*(mW\\$1\f1
.sp -1v
..
.YY a[\f2d\*(mW]
Rotate the picture clockwise
.I d
degrees.
If
.I d
is omitted, 90 degrees is added to the
current angle, which starts at zero.
.YY o
Outline the picture with a box.
.YY s
Freely scale both picture dimensions.
.YY w
White out (erase) the area to be occupied by the picture.
.YY l
Attach the picture to the left side of the frame.
.YY r
Attach the picture to the right side of the frame.
.YY t
Attach the picture to the top of the frame.
.YY b
Attach the picture to the bottom of the frame.
.in -0.5i
.XX label
Place
.I label
1.5 vertical lines below the frame.
.in -0.75i
.sp 0.3v
If there is room
.MW .BP
fills text around the frame.
Everything destined for either side of the frame first
goes into a diversion and only reappears when the accumulated
text sweeps past the trap set by
.MW .BP
or when the diversion is explicitly closed
by the
.MW .EP
macro (see below).
.sp 0.5v
Null arguments, represented by
.MR \&"" ,
are replaced by the defaults as noted above.
.TP
.MI .PI "\0file\0height,\|width,\|yoffset,\|xoffset\0flags"
.sp 0.3v
A low level macro used by
.MR .BP .
It can help if you are trying to do things that
.MW .BP
will not allow or does not do well.
The two arguments not already described are:
.in +0.75i
.XX xoffset
Moves the frame right (positive) or left (negative) from the
left margin.
The default is
.MR 0i .
.XX yoffset
Moves the frame down (positive) or up (negative) from
the current baseline.
The default is
.MR 0i .
.in -0.75i
.sp 0.3v
The second argument is a comma separated list of four numbers,
and although defaults are available, supplying values for all
four numbers is recommended.
.br
.ne 2v
.TP
.MW .EP
Ends a picture started by
.MW .BP .
An explicit
.MW .EP
call is not often required.
Instead
.MW .EP
is usually called by
.MW .BP
at the bottom of each frame.
.PP
Much of what is done depends on file structuring comments
commonly found in PostScript files.
If the comments needed to isolate a particular page are missing
the entire
.I file
is included.
If a
.MW %%BoundingBox
comment is missing the picture is
assumed to fill an 8.5\(mu11-inch page.
A picture
.I file
that cannot be read when the
.B troff
postprocessor runs is replaced by white space.
Nothing done in
.MW .BP
or
.MW .PI
guarantees the picture has not been placed off the page.
All dimensions should be explicitly given in inches.
.SH BUGS
A picture and associated text can silently disappear if
the diversion trap set by
.MW .BP
is not reached.
Including a call to
.MW .EP
at the end of the paper
should recover whatever appears to be missing.
.PP
Macros in other packages occasionally break the adjustments
made to the line length and indent when text is being placed
around a picture.
.PP
A missing or improper
.MW %%BoundingBox
comment often
explains why a picture does not properly fill the space
that has been set aside.
.SH FILES
.MW \*(dT/tmac.pictures
.SH SEE ALSO
.BR troff (1),
.BR dpost (1),
.BR picpack (1),
.BR mps (5)
.SH REFERENCE
R. L. Drechsler and A. R. Wilks,
.ul
PostScript Pictures in Troff Documents
0707070014230637731006400057030057030000011577770522633074600004000000001740post.src/mpictures/mpictures.mk#
# Not installing the man page.
#

MAKE=/bin/make
MAKEFILE=mpictures.mk

SYSTEM=V9
VERSION=3.3.2

OWNER=bin
GROUP=bin

TMACDIR=/usr/lib/tmac

all :
	@cp pictures.sr tmac.pictures

install : all
	@if [ ! -d $(TMACDIR) ]; then \
	    mkdir $(TMACDIR); \
	    chmod 755 $(TMACDIR); \
	    chgrp $(GROUP) $(TMACDIR); \
	    chown $(OWNER) $(TMACDIR); \
	fi
	cp tmac.pictures $(TMACDIR)/tmac.pictures
	@chmod 644 $(TMACDIR)/tmac.pictures
	@chgrp $(GROUP) $(TMACDIR)/tmac.pictures
	@chown $(OWNER) $(TMACDIR)/tmac.pictures

clean :
	rm -f tmac.pictures

clobber : clean

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^TMACDIR=.*'TMACDIR=$(TMACDIR)'" \
	$(MAKEFILE) >X$(MAKEFILE); \
	mv X$(MAKEFILE) $(MAKEFILE); \
	sed \
	    -e "s'^.ds dT.*'.ds dT $(TMACDIR)'" \
	mpictures.5 >Xmpictures.5; \
	mv Xmpictures.5 mpictures.5

0707070014230735530407550057030057030000020011570522627503300001600000000000post.src/misc0707070014230735541004440057030057030000010014640522627503300002700000003144post.src/misc/lp.model
#       qmsps800        mac 10/22/86
#
LPDEST=`basename $0`
QMS_FILE="$1"
DATE="`date +%D`"
TIME="`date +%T`"
owner="$2"
site=`uname`
port="`/usr/bin/lpstat -v$LPDEST | sed -e 's/.*: //'`"
filter_cmd="/usr/lbin/postscript/postio"
filter="$filter_cmd -l $port"
landscape="" formsperpage=""
path=/usr/lbin/postscript
printer=postprint
bannerflag=ON
prev="| $path/postreverse"

for i in $5
do
        case "$i" in
                L2)
                        formsperpage="-n2"
                        ;;
                land)
                        landscape="-pland"
                        ;;
                dpost|postprint|posttek|postbgi|postdmd|postio)
                        printer="$i"
                        ;;

                postreverse)
                        prev=""
                        ;;
                nobanner)
                        bannerflag=OFF
                        ;;
                F*)
                        QMS_FILE="`expr $i : 'F\(.*\)'`"
                        ;;
        esac
done

if [ -n "$filter_cmd" -a ! -x "$filter_cmd" ]
then
        disable -r"can't execute filter: $filter_cmd" $LPDEST
        exit 1
fi

shift; shift; shift; shift; shift
files="$*"
cp /usr/spool/lp/model/banner.ps /tmp/ban.$$
echo "($QMS_FILE) ($LPDEST) ($TIME) ($DATE) ($owner) banner" >> /tmp/ban.$$
if [ "$printer" = "postio" ]
        then
        eval $filter $files 2> /dev/null
else
        eval $path/$printer $landscape $formsperpage $files $prev | $filter 2> /dev/null
        fi
if [ "$bannerflag" = "ON" ]
        then
        eval $filter /tmp/ban.$$ 2> /dev/null
        fi
rm -f /tmp/ban.$$
exit 0

0707070014230735551004440057030057030000010012170522627503300002500000000763post.src/misc/READMEMiscellaneous programs - all are unsupported.

  ibmfont.c	IBM PC to Unix font conversion program
  laserbar.[c1]	Barcode filter and man page - Jan Wolitzky
  lp.model	Sample lp interface (not for Unix 4.0) - Maryann Csaszar
  macfont.c	Macintosh to Unix font conversion program
  pscrypt.c	Quick implementation of Adobe's encryption/decryption algorithm
  setbaud.ps	Example of how to change the printer's baudrate

Use make to compile C programs. For example,

	make macfont

compiles macfont.c.

0707070014230735561004440057030057030000010015000522627503300003000000013025post.src/misc/macfont.c/*
 *
 * Program that converts Macintosh font files to a format that works on Unix
 * systems. Essentially all the information needed came from the Adobe paper
 * "Supporting Downloadable PostScript Fonts". To use the program type,
 *
 *	macfont font.mac >font.unix
 *
 * where font.mac is the font file, exactly as it came over from a Macintosh,
 * and font.unix is equivalent host resident font file usable on Unix systems.
 * 
 */

#include <stdio.h>
#include <signal.h>

#define OFF		0
#define ON		1

#define NON_FATAL	0
#define FATAL		1

#define FALSE		0
#define TRUE		1

char	**argv;
int	argc;

char	*prog_name;

int	x_stat;
int	debug = OFF;
int	ignore = OFF;

FILE	*fp_in = stdin;
FILE	*fp_out = stdout;

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * Macintosh to Unix font converter.
 *
 */

    argc = agc;
    argv = agv;
    prog_name = argv[0];

    options();
    arguments();
    exit(x_stat);

}   /* End of main */

/*****************************************************************************/

options()

{

    int		ch;
    char	*names = "DI";

    extern char	*optarg;
    extern int	optind;

/*
 *
 * Command line options.
 *
 */

    while ( (ch = getopt(argc, argv, names)) != EOF ) {
	switch ( ch ) {
	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;
    argv += optind;

}   /* End of options */

/*****************************************************************************/

arguments()

{


/*
 *
 * Everything else is an input file. No arguments or '-' means stdin.
 *
 */

    if ( argc < 1 )
	conv();
    else
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    conv();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */

}   /* End of arguments */

/*****************************************************************************/

conv()

{

    int		blocksize;
    int		blocktype;

/*
 *
 * The first four bytes (in a block) are the block size, the fifth is the block
 * type, and the sixth always appears to be NULL. Type 0 blocks are comments and
 * are always skipped. Type 1 blocks are ASCII text, type 2 is binary data that
 * should be converted to hex, while type 5 blocks represent the end of the font
 * file. Commment block lengths appear to be from the first byte, while other
 * lengths seem to be measured from block type byte (ie. the fifth byte). Type
 * four blocks aren't used, while type 3 blocks mean an end of file indication
 * should be sent to the printer. Haven't done anything with type 3 blocks.
 *
 */

    while ( 1 ) {
	blocksize = getint(fp_in);
	blocktype = getc(fp_in);
	getc(fp_in);
	if ( debug == ON )
	    fprintf(stderr, "blocktype = %d, blocksize = %d\n", blocktype, blocksize);
	switch ( blocktype ) {
	    case 0:			/* comment - skip blockcount bytes */
		fseek(fp_in, (long) blocksize - 6, 1);
		break;

	    case 1:
		asciitext(blocksize - 2);
		break;

	    case 2:
		hexdata(blocksize - 2);
		break;

	    case 3:
	    case 4:
		error(FATAL, "resource type %d not implemented", blocktype);
		break;

	    case 5:
		return;

	    default:
		error(FATAL, "unknown resource type %d", blocktype);
	}   /* End switch */
    }	/* End while */

}   /* End of conv */

/*****************************************************************************/

asciitext(count)

    int		count;			/* bytes left in the block */

{

    int		ch;
    int		i = 0;

/*
 *
 * Handles type 1 (ie. ASCII text) blocks. Changing carriage returns to newlines
 * is all I've done.
 *
 */

    for ( i = 0; i < count; i++ ) {
	if ( (ch = getc(fp_in)) == '\r' )
	    ch = '\n';
	putc(ch, fp_out);
    }	/* End for */
	
}   /* End of asciitext */

/*****************************************************************************/

hexdata(count)

    int		count;			/* bytes left in the block */

{

    int		i;
    int		n;

/*
 *
 * Reads the next count bytes and converts each byte to hex. Also starts a new
 * line every 80 hex characters.
 *
 */

    for ( i = 0, n = 0; i < count; i++ ) {
	fprintf(fp_out, "%.2X", getc(fp_in));
	if ( (++n % 40) == 0 )
	    putc('\n', fp_out);
    }	/* End for */
	
}   /* End of hexdata */

/*****************************************************************************/

getint()

{

    int		val;
    int		i;

/*
 *
 * Reads the next four bytes into an integer and returns the value to the caller.
 * First two bytes are probably always 0.
 *
 */

    for ( i = 0, val = (getc(fp_in) & 0377); i < 3; i++ )
	val = (val << 8) | (getc(fp_in) & 0377);

    return(val);

}   /* End of getint */ 

/*****************************************************************************/

error(kind, mesg, a1, a2, a3)


    int		kind;
    char	*mesg;
    unsigned	a1, a2, a3;

{

/*
 *
 * Print *mesg then quit if kind is FATAL.
 *
 */

    if ( mesg != NULL && *mesg != '\0' ) {
	fprintf(stderr, "%s: ", prog_name);
	fprintf(stderr, mesg, a1, a2, a3);
	putc('\n', stderr);
    }	/* End if */

    if ( kind == FATAL && ignore == OFF )
	exit(x_stat | 01);

}   /* End of error */

/*****************************************************************************/

0707070014230735571004440057030057030000010015100522627503300003100000010626post.src/misc/laserbar.c/* laserbar -- filter to print barcodes on postscript printer */

#define MAIN 1

#define	LABEL	01
#define	NFLAG	02
#define	SFLAG	04

#include <stdio.h>
#include <ctype.h>

static int code39[256] = {
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/*	sp    !     "     #     $     %     &     '	*/
	0304, 0,    0,    0,    0250, 0052, 0,    0,   
/*	(     )     *     +     ,     -     -     /	*/
	0,    0,    0224, 0212, 0,    0205, 0604, 0242,
/*	0     1     2     3     4     5     6     7	*/
	0064, 0441, 0141, 0540, 0061, 0460, 0160, 0045,
/*	8     9     :     ;     <     =     >     ?	*/
	0444, 0144, 0,    0,    0,    0,    0,    0,   
/*	@     A     B     C     D     E     F     G	*/
	0,    0411, 0111, 0510, 0031, 0430, 0130, 0015,
/*	H     I     J     K     L     M     N     O	*/
	0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422,
/*	P     Q     R     S     T     U     V     W	*/
	0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700,
/*	X     Y     Z     [     \     ]     ^     _	*/
	0221, 0620, 0320, 0,    0,    0,    0,    0,
/*	`     a     b     c     d     e     f     g	*/
	0,    0411, 0111, 0510, 0031, 0430, 0130, 0015,
/*	h     i     j     k     l     m     n     o	*/
	0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422,
/*	p     q     r     s     t     u     v     w	*/
	0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700,
/*	x     y     z     {     |     }     ~     del	*/
	0221, 0620, 0320, 0,    0,    0,    0,    0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};

static void barprt();
void laserbar();

#ifdef MAIN

main(argc, argv)
char **argv;
{
	int c, flags = 0, error = 0;
	double rotate = 0, xoffset = 0, yoffset = 0, xscale = 1, yscale = 1;
	extern char *optarg;
	extern int optind;
	extern double atof();
	extern void exit();

	while ((c = getopt(argc, argv, "r:x:y:X:Y:lns")) != EOF) {
		switch(c) {
		    case 'r':
			rotate = atof(optarg);
			break;
		    case 'x':
			xoffset = atof(optarg);
			break;
		    case 'y':
			yoffset = atof(optarg);
			break;
		    case 'X':
			xscale = atof(optarg);
			break;
		    case 'Y':
			yscale = atof(optarg);
			break;
		    case 'l':
			flags |= LABEL;
			break;
		    case 'n':
			flags |= NFLAG;
			break;
		    case 's':
			flags |= SFLAG;
			break;
		    case '?':
			++error;
		}
	}
	if ((argc - optind) != 1)
		++error;
	if (error) {
		(void) fprintf(stderr,
"Usage: %s [-r rotate] [-x xoffset] [-y yoffset] [-X xscale] [-Y yscale] [-lns] string\n",
		    *argv);
		exit(1);
	}
	laserbar(stdout, argv[optind], rotate, xoffset, yoffset, xscale, yscale, flags);
	return 0;
}

#endif MAIN

static int right = 0;

void
laserbar(fp, str, rotate, xoffset, yoffset, xscale, yscale, flags)
FILE *fp;
char *str;
double rotate, xoffset, yoffset, xscale, yscale;
int flags;
{
	xoffset *= 72.;
	yoffset *= 72.;
	(void) fprintf(fp, "gsave %s\n", (flags & NFLAG) ? "newpath" : "");
	if (xoffset || yoffset)
		(void) fprintf(fp, "%f %f moveto\n", xoffset, yoffset);
	if (xscale != 1 || yscale != 1)
		(void) fprintf(fp, "%f %f scale\n", xscale, yscale);
	if (rotate)
		(void) fprintf(fp, "%f rotate\n", rotate);
	(void) fputs("/Helvetica findfont 16 scalefont setfont\n", fp);
	(void) fputs("/w { 0 rmoveto gsave 3 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp);
	(void) fputs("/n { 0 rmoveto gsave 1 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp);
	(void) fputs("/l { gsave 2 -88 rmoveto show grestore } def\n", fp);
	barprt(fp, '*', 0);
	while (*str)
		barprt(fp, *(str++), (flags & LABEL));
	barprt(fp, '*', 0);
	(void) fprintf(fp, "%sgrestore\n", (flags & SFLAG) ? "showpage " : "");
	right = 0;
}

static void
barprt(fp, c, label)
FILE *fp;
int c, label;
{
	int i, mask, bar, wide;

	if (!(i = code39[c]))
		return;
	if (islower(c))
		c = toupper(c);
	if (label)
		(void) fprintf(fp, "(%c) l", c);
	else
		(void) fputs("     ", fp);
	for (bar = 1, mask = 0400; mask; bar = 1 - bar, mask >>= 1) {
		wide = mask & i;
		if (bar) {
			if (wide)
				++right;
			(void) fprintf(fp, " %d %s", right, wide ? "w" : "n");
			right = (wide ? 2 : 1);
		}
		else
			right += (wide ? 3 : 1);
	}
	(void) fputs("\n", fp);
	++right;
}
0707070014230735601004440057030057030000010014770522627503300003100000000226post.src/misc/setbaud.ps%
% Sets baud rate to 9600, options to 0 assuming the password is 0.
%

serverdict begin
	0 exitserver
	statusdict begin
		25 9600 0 setsccbatch
	end
0707070014230735611004440057030057030000010015200522627503300003000000012333post.src/misc/ibmfont.c/*
 *
 * Program that converts IBM font files to a format that works on Unix systems.
 * Essentially all the information needed came from the Adobe paper "Supporting
 * Downloadable PostScript Fonts". To use the program type,
 *
 *	ibmfont font.ibm >font.unix
 *
 * where font.ibm is the font file, exactly as it came over from an IBM PC,
 * and font.unix is equivalent host resident font file usable on Unix systems.
 * 
 */

#include <stdio.h>
#include <signal.h>

#define OFF		0
#define ON		1

#define NON_FATAL	0
#define FATAL		1

#define FALSE		0
#define TRUE		1

char	**argv;
int	argc;

char	*prog_name;

int	x_stat;
int	debug = OFF;
int	ignore = OFF;

FILE	*fp_in = stdin;
FILE	*fp_out = stdout;

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * IBM PC to Unix font converter.
 *
 */

    argc = agc;
    argv = agv;
    prog_name = argv[0];

    options();
    arguments();
    exit(x_stat);

}   /* End of main */

/*****************************************************************************/

options()

{

    int		ch;
    char	*names = "DI";

    extern char	*optarg;
    extern int	optind;

/*
 *
 * Command line options.
 *
 */

    while ( (ch = getopt(argc, argv, names)) != EOF ) {
	switch ( ch ) {
	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;
    argv += optind;

}   /* End of options */

/*****************************************************************************/

arguments()

{

/*
 *
 * Everything esle is an input file. No arguments or '-' means stdin.
 *
 */


    if ( argc < 1 )
	conv();
    else
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    conv();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */

}   /* End of arguments */

/*****************************************************************************/

conv()

{

    int		blocksize;
    int		blocktype;
    int		seg;
    long	ftell();

/*
 *
 * Font files on the IBM PC are stored in a compressed binary format. Individual
 * segments in the file are preceeded by a header that looks like,
 *
 *		Byte 1:		128
 *		Byte 2:		segment type (1=ASCII, 2=TOHEX, or 3=EOF)
 *		Bytes 3-6:	length of the segment
 *		Bytes 7 ...	data
 *
 */

    while ( 1 ) {
	seg = ftell(fp_in);
	if ( getc(fp_in) != 128 )
	    error(FATAL, "bad file format");
	blocktype = getc(fp_in);
	blocksize = getint(fp_in);
	if ( debug == ON ) {
	    fprintf(stderr, "blocktype = %d, blocksize = %d\n", blocktype, blocksize);
	    fprintf(stderr, "start=0%o, end=0%o\n", seg, seg+blocksize+6);
	    fprintf(stderr, "start=%d, end=%d\n", seg, seg+blocksize+6);
	}   /* End if */
	switch ( blocktype ) {
	    case 1:
		asciitext(blocksize);
		break;

	    case 2:
		hexdata(blocksize);
		break;

	    case 3:
		return;

	    default:
		error(FATAL, "unknown resource type %d", blocktype);
	}   /* End switch */
    }	/* End while */

}   /* End of conv */

/*****************************************************************************/

asciitext(count)

    int		count;			/* bytes left in the block */

{

    int		ch;
    int		i = 0;

/*
 *
 * Handles type 1 (ie. ASCII text) blocks. Changing carriage returns to newlines
 * is all I've done.
 *
 */

    for ( i = 0; i < count; i++ ) {
	if ( (ch = getc(fp_in)) == '\r' )
	    ch = '\n';
	putc(ch, fp_out);
    }	/* End for */
	
}   /* End of asciitext */

/*****************************************************************************/

hexdata(count)

    int		count;			/* bytes left in the block */

{

    int		i;
    int		n;

/*
 *
 * Reads the next count bytes and converts each byte to hex. Also starts a new
 * line every 80 hex characters.
 *
 */

    for ( i = 0, n = 0; i < count; i++ ) {
	fprintf(fp_out, "%.2X", getc(fp_in));
	if ( (++n % 40) == 0 )
	    putc('\n', fp_out);
    }	/* End for */
	
}   /* End of hexdata */

/*****************************************************************************/

getint()

{

    int		val;

/*
 *
 * Reads the next four bytes into an integer and returns the value to the caller.
 * First two bytes are probably always 0.
 *
 */

    val = getc(fp_in);
    val |= (getc(fp_in) << 8);
    val |= (getc(fp_in) << 16);
    val |= (getc(fp_in) << 24);

    return(val);

}   /* End of getint */ 

/*****************************************************************************/

error(kind, mesg, a1, a2, a3)

    int		kind;
    char	*mesg;
    unsigned	a1, a2, a3;

{

/*
 *
 * Print mesg and quit if kind is FATAL.
 *
 */

    if ( mesg != NULL && *mesg != '\0' ) {
	fprintf(stderr, "%s: ", prog_name);
	fprintf(stderr, mesg, a1, a2, a3);
	putc('\n', stderr);
    }	/* End if */

    if ( kind == FATAL && ignore == OFF )
	exit(x_stat | 01);

}   /* End of error */

/*****************************************************************************/

0707070014230735621004440057030057030000010015300522627503300003000000014610post.src/misc/pscrypt.c/*
 *
 * Adobe's encryption/decryption algorithm for eexec and show. Runs in
 * eexec mode unless told otherwise. Use,
 *
 *		pscrypt file.cypher > file.clear
 *
 * to decrypt eexec input. Assumes file.cypher is hex with the key as the
 * first four bytes, and writes file.clear as binary (omitting the key).
 * Use
 *
 *		pscrypt -e12ab34ef file.clear >file.cypher
 *
 * to encrypt file.clear (for eexec) using 12ab34ef as the key. Input is
 * binary and output is hex. The key must be given as a hex number. Use
 * -sshow to encrypt or decrypt a CharString or Subr,
 *
 *		pscrypt -sshow file.cypher > file.clear
 *
 * Use -b or -x to read binary or hex input, and -B or -X to output binary
 * or hex.
 *
 */

#include <stdio.h>
#include <ctype.h>

#define ENCRYPT		0
#define DECRYPT		1

#define NOTSET		-1
#define BINARY		0
#define HEX		1
#define LINELENGTH	40

#define CHARSTRING	4330
#define EEXEC		55665
#define MAGIC1		52845
#define MAGIC2		22719

int	argc;
char	**argv;

int	mode = DECRYPT;
int	input = NOTSET;
int	output = NOTSET;
int	outoffset = NOTSET;
int	inoffset = NOTSET;

int	cryptkey = 0;			/* encryption key set with -e */
int	linelength = LINELENGTH;	/* only for hex output */
int	lastchar = 0;

unsigned long	seed = EEXEC;
unsigned long	key;

FILE	*fp_in = stdin;

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * Implementation of the encryption/decryption used by eexec and show.
 *
 */

    argc = agc;
    argv = agv;

    options();
    initialize();
    arguments();

    exit(0);

}   /* End of main */

/*****************************************************************************/

options()

{

    int		ch;
    char	*names = "bde:l:os:xBSX";

    extern char	*optarg;
    extern int	optind;

/*
 *
 * Command line options.
 *
 */

    while ( (ch = getopt(argc, argv, names)) != EOF )
	switch ( ch ) {
	    case 'b':			/* binary input */
		    input = BINARY;
		    break;

	    case 'd':			/* decrypt */
		    mode = DECRYPT;
		    break;

	    case 'e':			/* encrypt */
		    mode = ENCRYPT;
		    if ( *optarg == '0' && *optarg == 'x' )
			optarg += 2;
		    sscanf(optarg, "%8x", &cryptkey);
		    break;

	    case 'l':			/* line length hex output */
		    linelength = atoi(optarg);
		    break;

	    case 'o':			/* output all bytes - debugging */
		    outoffset = 0;
		    break;

	    case 's':			/* seed */
		    if ( *optarg == 'e' )
			seed = EEXEC;
		    else if ( *optarg == 's' )
			seed = CHARSTRING;
		    else if ( *optarg == '0' && *(optarg+1) == 'x' )
			sscanf(optarg+2, "%x", &seed);
		    else if ( *optarg == '0' )
			sscanf(optarg, "%o", &seed);
		    else sscanf(optarg, "%d", &seed);
		    break;

	    case 'x':			/* hex input */
		    input = HEX;
		    break;

	    case 'B':			/* binary output */
		    output = BINARY;
		    break;

	    case 'X':			/* hex output */
		    output = HEX;
		    break;

	    case '?':			/* don't understand the option */
		    fprintf(stderr, "bad option -%c\n", ch);
		    exit(1);
		    break;

	    default:			/* don't know what to do for ch */
		    fprintf(stderr, "missing case for option -%c\n", ch);
		    exit(1);
		    break;
	}   /* End switch */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

initialize()

{

/*
 *
 * Initialization that has to be done after the options.
 *
 */

    key = seed;

    if ( mode == DECRYPT ) {
	input = (input == NOTSET) ? HEX : input;
	output = (output == NOTSET) ? BINARY : output;
	inoffset = (inoffset == NOTSET) ? 0 : inoffset;
	outoffset = (outoffset == NOTSET) ? -4 : outoffset;
    } else {
	input = (input == NOTSET) ? BINARY : input;
	output = (output == NOTSET) ? HEX : output;
	inoffset = (inoffset == NOTSET) ? 4 : inoffset;
	outoffset = (outoffset == NOTSET) ? 0 : outoffset;
    }	/* End else */

    if ( linelength <= 0 )
	linelength = LINELENGTH;

}   /* End of initialize */

/*****************************************************************************/

arguments()

{

/*
 *
 * Everything left is an input file. No arguments or '-' means stdin.
 *
 */

    if ( argc < 1 )
	crypt();
    else
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL ) {
		fprintf(stderr, "can't open %s\n", *argv);
		exit(1);
	    }	/* End if */
	    crypt();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */

}   /* End of arguments */

/*****************************************************************************/

crypt()

{

    unsigned int	cypher;
    unsigned int	clear;

/*
 *
 * Runs the encryption/decryption algorithm.
 *
 */

    while ( lastchar != EOF ) {
	cypher = nextbyte();
	clear = ((key >> 8) ^ cypher) & 0xFF;
	key = (key + (mode == DECRYPT ? cypher : clear)) * MAGIC1 + MAGIC2;
	if ( ++outoffset > 0 && lastchar != EOF ) {
	    if ( output == HEX ) {
		printf("%.2X", clear);
		if ( linelength > 0 && (outoffset % linelength) == 0 )
		    putchar('\n');
	    } else putchar(clear);
	}   /* End if */
    }	/* End while */

}   /* End of crypt */

/*****************************************************************************/

nextbyte()

{

    int		val = EOF;

/*
 *
 * Returns the next byte. Uses cryptkey (i.e. what followed -e) while inoffset is
 * positive, otherwise reads (hex or binary) from fp_in.
 *
 */

    if ( inoffset-- > 0 )
	val = (cryptkey >> (inoffset*8)) & 0xFF;
    else if ( input == HEX ) {
	if ( (val = nexthexchar()) != EOF )
	    val = (val << 4) | nexthexchar();
    } else if ( input == BINARY )
	val = Getc(fp_in);

    return(val);

}   /* End of nextbyte */

/*****************************************************************************/

nexthexchar()

{

    int		ch;

/*
 *
 * Reads the next hex character.
 *
 */

    while ( (ch = Getc(fp_in)) != EOF && ! isxdigit(ch) ) ;

    if ( isdigit(ch) )
	ch -= '0';
    else if ( isupper(ch) )
	ch -= 'A' - 10;
    else if ( islower(ch) )
	ch -= 'a' - 10;

    return(ch);

}   /* End of nexthexchar */

/*****************************************************************************/

Getc(fp)

    FILE	*fp;

{

/*
 *
 * Reads the next byte from *fp, sets lastchar, and returns the character.
 *
 */

    return(lastchar = getc(fp));

}   /* End of Getc */

/*****************************************************************************/

0707070014230735631004440057030057030000010014660522627503300003100000003244post.src/misc/laserbar.1.TH LASERBAR 1
.SH NAME
laserbar \- produce bar codes on a PostScript laser printer
.SH SYNOPSIS
.B laserbar
[\fB-r\fP rotate] [\fB-x\fP xoffset] [\fB-y\fP yoffset]
[\fB-X\fP xscale] [\fB-Y\fP yscale] [\fB-lns\fP] string
.SH DESCRIPTION
.I Laserbar
prints on the standard output the PostScript text that will produce
(on a suitable laser printer) the \s-2CODE-39\s+2 bar code
corresponding to
.I string.
The \fBr\fP option may be used to specify a rotation (in
degrees) of the bar code.
The \fBx\fP, \fBy\fP, \fBX\fP, and \fBY\fP options may be used to specify
an x- or y-axis offset (in inches) or scaling factor, respectively.
(The offset is measured from the lower left corner of the page
to the upper left corner of the bar
code.  By default, the bar code produced is one inch high, and is scaled
so that the narrowest elements are each 1/72-inch \- i.e., one point \- wide.)
If the \fBl\fP option is specified, the bar code produced is labeled.
If the \fBn\fP option is specified, the resulting PostScript text
includes a leading \f(CWnewpath\fP command, so that the text may stand
alone or precede any other PostScript commands.
If the \fBs\fP option is specified, the resulting PostScript text includes 
a trailing \f(CWshowpage\fP command, so that the text may stand alone
or follow any other PostScript commands.
.P
This manual page (if it appears with a bar code printed on it) was
produced by something like the following sequence:
.IP
.ft CW
laserbar -x 2.5 -y 3 -l -n ABC123xyz > tempfile
.br
troff -man -Tpost laserbar.1 | dpost >> tempfile
.br
prt -dprinter -lpostscript tempfile
.ft P
.SH SEE ALSO
laserbar(3), prt(1), dpost(1), postbgi(1), postprint(1), postdmd(1), posttek(1), etc.
0707070014231310670407550057030057030000021027270522633075100002100000000000post.src/picpack0707070014231307541006400057030057030000011033650522633075000003400000002737post.src/picpack/picpack.mkMAKE=/bin/make
MAKEFILE=picpack.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=$(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=picpack.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/tempnam.o

all : picpack

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	cp picpack $(POSTBIN)/picpack
	@chmod 755 $(POSTBIN)/picpack
	@chgrp $(GROUP) $(POSTBIN)/picpack
	@chown $(OWNER) $(POSTBIN)/picpack
	cp picpack.1 $(MAN1DIR)/picpack.1
	@chmod 644 $(MAN1DIR)/picpack.1
	@chgrp $(GROUP) $(MAN1DIR)/picpack.1
	@chown $(OWNER) $(MAN1DIR)/picpack.1

clean :
	rm -f *.o

clobber : clean
	rm -f picpack

picpack : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o picpack $(OFILES)

picpack.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/tempnam.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014231310711006440057030057030000011030000522627503400003300000030265post.src/picpack/picpack.c/*
 *
 * picpack - picture packing pre-processor
 *
 * A trivial troff pre-processor that copies files to stdout, expanding picture
 * requests into an in-line format that's passed transparently through troff and
 * handled by dpost. The program is an attempt to address requirements, expressed
 * by several organizations, of being able to store a document as a single file
 * (usually troff input) that can then be sent through dpost and ultimately to
 * a PostScript printer.
 *
 * The program looks for strings listed in the keys[] array at the start of each
 * line. When a picture request (as listed in keys[]) is found the second string
 * on the line is taken to be a picture file pathname that's added (in transparent
 * mode) to the output file. In addition each in-line picture file is preceeded by
 * device control command (again passed through in transparent mode) that looks
 * like,
 *
 *	x X InlinePicture filename bytes
 *
 * where bytes is the size of the picture file (which begins on the next line)
 * and filename is the pathname of the picture file. dpost uses both arguments to
 * manage in-line pictures (in a big temp file). To handle pictures in diversions
 * picpack reads each input file twice. The first pass looks for picture inclusion
 * requests and copies each picture file transparently to the output file, while
 * second pass just copies the input file to the output file. Things could still
 * break, but the two pass method should handle most jobs.
 *
 * The recognized in-line picture requests are saved in keys[] and by default only
 * expand .BP and .PI macro calls. The -k option changes the recognized strings,
 * and may be needed if you've built your own picture inclusion macros on top of
 * .BP or .PI or decided to list each picture file at the start of your input file
 * using a dummy macro. For example you could require every in-line picture be
 * named by a dummy macro (say .iP), then the command line,
 *
 *	picpack -k.iP file > file.pack
 *
 * hits on lines that begin with .iP (rather than .BP or .PI), and the only files
 * pulled in would be ones named as the second argument to the new .iP macro. The
 * -k option accepts a space or comma separated list of up to 10 different key
 * strings. picpack imposes no contraints on key strings, other than not allowing
 * spaces or commas. A key string can begin with \" and in that case it would be
 * troff comment.
 *
 * Although the program will help some users, there are obvious disadvantages.
 * Perhaps the most important is that troff output files (with in-line pictures
 * included) don't fit the device independent language accepted by important post
 * processors like proof, and that means you won't be able to reliably preview a
 * packed file on your 5620 or whatever. Another potential problem is that picture
 * files can be large. Packing everything together in a single file at an early
 * stage has a better chance of exceeding your system's ulimit.
 *
 */

#include	<stdio.h>
#include	<sys/types.h>
#include	<sys/stat.h>

#include	"gen.h"			/* general purpose definitions */
#include	"ext.h"			/* external variable definitions */
#include	"path.h"		/* just for TEMPDIR definition */

char		*keys[11] = {".BP", ".PI", NULL};
int		quiet = FALSE;

FILE		*fp_in = stdin;		/* input */
FILE		*fp_out = stdout;	/* and output files */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A picture packing pre-processor that copies input files to stdout, expanding
 * picture requests (as listed in keys[]) to an in-line format that can be passed
 * through troff (using transparent mode) and handled later by dpost.
 *
 */

    argc = agc;				/* global so everyone can use them */
    argv = agv;

    prog_name = argv[0];		/* just for error messages */

    options();				/* command line options */
    arguments();			/* translate all the input files */
    done();				/* clean things up */

    exit(x_stat);			/* everything probably went OK */

}   /* End of main */

/*****************************************************************************/

options()

{

    int		ch;			/* name returned by getopt() */

    extern char	*optarg;		/* option argument set by getopt() */
    extern int	optind;

/*
 *
 * Handles the command line options.
 *
 */

    while ( (ch = getopt(argc, argv, "k:qDI")) != EOF )  {
	switch ( ch )  {
	    case 'k':			/* new expansion key strings */
		    newkeys(optarg);
		    break;

	    case 'q':			/* disables "missing picture" messages */
		    quiet = TRUE;
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't know the option */
		    error(FATAL, "");
		    break;

	    default:
		    error(FATAL, "missing case for option %c", ch);
		    break;
	}   /* End switch */
    }	/* End while */

    argc -= optind;			/* get ready for non-options args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

newkeys(list)

    char	*list;			/* comma or space separated key strings */

{

    char	*p;			/* next key string from *list */
    int		i;			/* goes in keys[i] */
    int		n;			/* last key string slot in keys[] */

/*
 *
 * Separates *list into space or comma separated strings and adds each to the
 * keys[] array. The strings in keys[] are used to locate the picture inclusion
 * requests that are translated to the in-line format. The keys array must end
 * with a NULL pointer and by default only expands .BP and .PI macro calls.
 *
 */

    n = (sizeof(keys) / sizeof(char *)) - 1;

    for ( i = 0, p = strtok(list, " ,"); p != NULL; i++, p = strtok(NULL, " ,") )
	if ( i >= n )
	    error(FATAL, "too many key strings");
	else keys[i] = p;

    keys[i] = NULL;

}   /* End of newkeys */

/*****************************************************************************/

arguments()

{

    FILE	*copystdin();

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we process stdin, after copying it to a temporary file.
 *
 */

    if ( argc < 1 )  {
	fp_in = copystdin();
	picpack();
    } else
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = copystdin();
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    picpack();
	    fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */

}   /* End of arguments */

/*****************************************************************************/

FILE *copystdin()

{

    char	*tfile;			/* temporary file name */
    int		fd_out;			/* and its file descriptor */
    FILE	*fp;			/* return value - the new input file */

/*
 *
 * Copies stdin to a temp file, unlinks the file, and returns the file pointer
 * for the new temporary file to the caller. Needed because we read each input
 * file twice in an attempt to handle pictures in diversions.
 *
 */

    if ( (tfile = tempnam(TEMPDIR, "post")) == NULL )
	error(FATAL, "can't generate temp file name");

    if ( (fd_out = creat(tfile, 0660)) == -1 )
	error(FATAL, "can't create %s", tfile);

    copyfile(fileno(stdin), fd_out);
    close(fd_out);

    if ( (fp = fopen(tfile, "r")) == NULL )
	error(FATAL, "can't open %s", tfile);

    unlink(tfile);
    return(fp);

}   /* End of copystdin */

/*****************************************************************************/

copyfile(fd_in, fd_out)

    int		fd_in;			/* input */
    int		fd_out;			/* and output files */

{

    char	buf[512];		/* internal buffer for reads and writes */
    int		count;			/* number of bytes put in buf[] */

/*
 *
 * Copies file fd_in to fd_out. Handles the second pass for each input file and
 * also used to copy stdin to a temporary file.
 *
 */

    while ( (count = read(fd_in, buf, sizeof(buf))) > 0 )
	if ( write(fd_out, buf, count) != count )
	    error(FATAL, "write error");

}   /* End of copyfile */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files - unlink the temporary file that was used
 * to record the in-line picture file pathnames.
 *
 */

    if ( temp_file != NULL )
	unlink(temp_file);

}   /* End of done */

/*****************************************************************************/

picpack()

{

    char	line[512];		/* next input line */
    char	name[100];		/* picture file names - from BP or PI */
    int		i;			/* for looking through keys[] */

/*
 *
 * Handles the two passes over the next input file. First pass compares the start
 * of each line in *fp_in with the key strings saved in the keys[] array. If a
 * match is found inline() is called to copy the picture file (ie. the file named
 * as the second string in line[]) to stdout, provided the file hasn't previously
 * been copied. The second pass goes back to the start of fp_in and copies it all
 * to the output file.
 *
 */

    while ( fgets(line, sizeof(line), fp_in) != NULL )  {
	for ( i = 0; keys[i] != NULL; i++ )
	    if ( strncmp(line, keys[i], strlen(keys[i])) == 0 )  {
		if ( sscanf(line, "%*s %s", name) == 1 )  {
		    strtok(name, "(");
		    if ( gotpicfile(name) == FALSE )
			inline(name);
		}   /* End if */
	    }   /* End if */
    }	/* End while */

    fflush(fp_out);			/* second pass - copy fp_in to fp_out */
    fseek(fp_in, 0L, 0);
    copyfile(fileno(fp_in), fileno(fp_out));

}   /* End of picpack */

/*****************************************************************************/

inline(name)

    char	*name;			/* name of the in-line picture file */

{

    long	size;			/* size in bytes - from fstat */
    FILE	*fp;			/* for reading *name */
    int		ch;			/* next character from picture file */
    int		lastch = '\n';		/* so we know when to put out \! */

    struct stat	sbuf;			/* for the picture file size */

/*
 *
 * Copies the picture file *name to the output file in an in-line format that can
 * be passed through troff and recovered later by dpost. Transparent mode is used
 * so each line starts with \! and all \ characters must be escaped. The in-line
 * picture sequence begins with an "x X InlinePicture" device control command that
 * names the picture file and gives its size (in bytes).
 *
 */

    if ( (fp = fopen(name, "r")) != NULL )  {
	fstat(fileno(fp), &sbuf);
	if ( (size = sbuf.st_size) > 0 )  {
	    fprintf(fp_out, "\\!x X InlinePicture %s %ld\n", name, size);
	    while ( (ch = getc(fp)) != EOF )  {
		if ( lastch == '\n' )
		    fprintf(fp_out, "\\!");
		if ( ch == '\\' )
		    putc('\\', fp_out);
		putc(lastch = ch, fp_out);
	    }   /* End while */
	    if ( lastch != '\n' )
		putc('\n', fp_out);
	}    /* End if */
	fclose(fp);
	addpicfile(name);
    } else if ( quiet == FALSE )
	error(NON_FATAL, "can't read picture file %s", name);

}   /* End of inline */

/*****************************************************************************/

gotpicfile(name)

    char	*name;

{

    char	buf[100];
    FILE	*fp_pic;

/*
 *
 * Checks the list of previously added picture files in *temp_file and returns
 * FALSE if it's a new file and TRUE otherwise. Probably should open the temp
 * file once for update and leave it open, rather than opening and closing it
 * every time.
 *
 */

    if ( temp_file != NULL )
	if ( (fp_pic = fopen(temp_file, "r")) != NULL )  {
	    while ( fscanf(fp_pic, "%s", buf) != EOF )
		if ( strcmp(buf, name) == 0 )  {
		    fclose(fp_pic);
		    return(TRUE);
		}   /* End if */
	    fclose(fp_pic);
	}   /* End if */

    return(FALSE);

}   /* End of gotpicfile */

/*****************************************************************************/

addpicfile(name)

    char	*name;

{

    FILE	*fp_pic;

/*
 *
 * Adds string *name to the list of in-line picture files that's maintained in
 * *temp_file. Should undoubtedly open the file once for update and use fseek()
 * to move around in the file!
 *
 */

    if ( temp_file == NULL )
	if ( (temp_file = tempnam(TEMPDIR, "picpac")) == NULL )
	    return;

    if ( (fp_pic = fopen(temp_file, "a")) != NULL )  {
	fprintf(fp_pic, "%s\n", name);
	fclose(fp_pic);
    }	/* End if */

}   /* End of addpicfile */

/*****************************************************************************/

0707070014231310721006440057030057030000011030250522627503400003300000005252post.src/picpack/picpack.1.TH PICPACK 1
.SH NAME
.B picpack
\- PostScript picture packing preprocessor
.SH SYNOPSIS
\*(mBpicpack\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B picpack
copies
.I files
to stdout, expanding picture inclusion requests
(marked by the
.MW .BP
or
.MW .PI
macros) into an in-line
format that can be passed through
.B troff
and handled by
.BR dpost .
If no
.I files
are specified
or if
.OP \-
is one of the input
.I files
standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-k list
.I list
is a comma- or space-separated string of words used to locate
picture inclusion requests.
The start of every line in the input
.I files
is compared with each word in
.I list .
If there is a match, the second string on the line is
taken as the pathname of a picture file that is added
to the output file.
The default
.I list
is
.RM `` ".BP .PI ''.
.TP
.OP \-q
Suppress ``missing picture file'' error messages.
.PP
.B picpack
is a trivial preprocessor that, in a sense, duplicates some of the
picture inclusion capabilities already available in
.BR dpost .
.B picpack
should not be used if your formatting command line includes
a call to
.BR dpost .
Its only purpose is to combine picture files with text in a single
file that can be passed through
.B troff
and unpacked, at some later time, by
.BR dpost .
The original picture inclusion mechanism, with files are pulled in by
.BR dpost ,
is the preferred approach.
.SH EXAMPLES
A typical application might be in a distributed printing environment
where everything up to
.B troff
is run by the user and everything after
.B troff
is handled by a spooling daemon (perhaps
.BR lp ).
In that case the command line would be,
.EX
pic  \f2file\fP | tbl | eqn | picpack | troff -mm -Tpost | lp
.EE
A poor example, although one that should still work, would be,
.EX
pic  \f2file\fP | tbl | eqn | picpack | troff -mm -Tpost | dpost >\f2file\fP.ps
.EE
In this case picture inclusion requests could (and should) be handled by
.BR dpost .
Running
.B picpack
is not needed or even recommended.
It should be dropped from any pipeline that includes a call to
.BR dpost .
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.SH WARNINGS
.PP
Combining pictures and text using the capabilities available in
.B dpost
is the recommended approach and is always guaranteed to be more
efficient than
.BR picpack .
Running
.B picpack
and
.B dpost
in the same pipeline makes little sense.
.PP
Using
.B picpack
will likely result in files that can no longer be reliably passed
through other important
.B troff
postprocessors like
.BR proof .
At present
.B picpack
is only guaranteed to work with
.BR dpost .
.SH SEE ALSO
.BR dpost (1),
.BR troff (1)
0707070014230265620407550057030057030000020675370522633075200002100000000000post.src/postbgi0707070014230265771006400057030057030000010664560522633075200003400000003742post.src/postbgi/postbgi.mkMAKE=/bin/make
MAKEFILE=postbgi.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=postbgi.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=postbgi.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o

all : postbgi

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp postbgi $(POSTBIN)/postbgi
	@chmod 755 $(POSTBIN)/postbgi
	@chgrp $(GROUP) $(POSTBIN)/postbgi
	@chown $(OWNER) $(POSTBIN)/postbgi
	cp postbgi.ps $(POSTLIB)/postbgi.ps
	@chmod 644 $(POSTLIB)/postbgi.ps
	@chgrp $(GROUP) $(POSTLIB)/postbgi.ps
	@chown $(OWNER) $(POSTLIB)/postbgi.ps
	cp postbgi.1 $(MAN1DIR)/postbgi.1
	@chmod 644 $(MAN1DIR)/postbgi.1
	@chgrp $(GROUP) $(MAN1DIR)/postbgi.1
	@chown $(OWNER) $(MAN1DIR)/postbgi.1

clean :
	rm -f *.o

clobber : clean
	rm -f postbgi

postbgi : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postbgi $(OFILES) -lm

postbgi.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	postbgi.1 >XXX.1; \
	mv XXX.1 postbgi.1

0707070014230265641006440057030057030000010675700522627503400003300000117472post.src/postbgi/postbgi.c/*
 *
 * postbgi - BGI (Basic Graphical Instructions) to PostScript translator.
 *
 * A simple program that translates BGI files into PostScript. Probably only
 * useful in Computer Centers that support STARE or PRISM plotters. Most of the
 * code was borrowed from the corresponding program that was written for printers
 * that understand Impress.
 *
 * Extending the original program to handle PRISM jobs was not trivial. Graphics
 * packages that support PRISM occasionally use BGI commands that I ignored in the
 * STARE implementation. Subroutines, color requests, patterns (for filling), and
 * filled trapeziods were the most important omissions. All are now implemented,
 * and at present only repeats, filled slices, and raster rectangles are missing.
 *
 * Pattern filling results were not always predictable or even good, unless the
 * halftone screen definitions were changed and scaling was adjusted so one pixel
 * in user space mapped into an integral number of device space pixels. Doing that
 * makes the resulting PostScript output device dependent, but was often necessary.
 * I've added two booleans to the PostScript prologue (fixscreen and scaletodevice)
 * that control what's done. By default both are false (check postbgi.ps) but can
 * be set to true on the command line using the -P option or by hand by changing
 * the definitions in the prologue. A command line that would set fixscreen and
 * scaletodevice true would look like,
 *
 *	postbgi -P"/fixscreen true" -P"/scaletodevice true" file >file.ps
 *
 * Several other approaches are available if you want to have your spooler handle
 * STARE and PRISM jobs differently. A boolean called prism is defined in the
 * prologue (postbgi.ps) and if it's set to true PostScript procedure setup will
 * set fixscreen and scaletodevice to true before anything important is done. That
 * means the following command line,
 *
 *	postbgi -P"/prism true" file >file.ps
 *
 * accomplishes the same things as the last example. Two different prologue files,
 * one for STARE jobs and the other for PRISM, could be used and the spooler could
 * point postbgi to the appropriate one using the -L option. In that case the only
 * important difference in the two prologues would be the definition of prism. The
 * prologue used for PRISM jobs would have prism set to true, while the STARE
 * prologue would have it set to false.
 *
 * Also included is code that ties lines to device space coordinates. What you get
 * is a consistent line thickness, but placement of lines won't be exact. It's a
 * trade-off that should be right for most jobs. Everything is implemented in the
 * prologue (postbgi.ps) and nothing will be done if the linewidth is zero or if
 * the boolean fixlinewidth (again in postbgi.ps) is false. Once again the -P
 * option can be used to set fixlinewidth to whatever you choose.
 *
 * BGI supports color mixing but PostScript doesn't. BGI files that expect to mix
 * colors won't print properly. PostScript's fill operator overlays whatever has
 * already been put down. Implementing color mixing would have been a terribly
 * difficult job - not worth the effort!
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following PostScript procedures
 * are defined in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how the program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects
 *	    to find the current page number on the stack.
 *
 *	v
 *
 *	  dx1 dy1 ... dxn dyn x y v -
 *
 *	    Draws the vector described by the numbers on the stack. The top two
 *	    numbers are the coordinates of the starting point. The rest of the
 *	    numbers are relative displacements from the preceeding point.
 *
 *	pp
 *
 *	  x1 y1 ... xn yn string pp -
 *
 *	    Prints string, which is always a single character, at the points
 *	    represented by the rest of the numbers on the stack.
 *
 *	R
 *
 *	  n deltax deltay x y R -
 *
 *	    Creates a rectangular path with its lower left corner at (x, y) and
 *	    sides of length deltax and deltay. The resulting path is stroked if
 *	    n is 0 and filled otherwise.
 *
 *	T
 *
 *	  dx3 dy3 dx2 dy2 dx1 dy1 x y T -
 *
 *	    Fills a trapezoid starting at (x, y) and having relative displacements
 *	    given by the (dx, dy) pairs.
 *
 *	t
 *
 *	  angle x y string t -
 *
 *	    Prints string starting at (x, y) using an orientation of angle degrees.
 *	    The PostScript procedure can handle any angle, but BGI files will only
 *	    request 0 or 90 degrees. Text printed at any other orientation will be
 *	    vector generated.
 *
 *	p
 *
 *	  x y p -
 *
 *	    Called to mark the point (x, y). It fills a small circle, that right
 *	    now has a constant radius. This stuff could probably be much more
 *	    efficient?
 *
 *	l
 *
 *	  array l -
 *
 *	    Sets the line drawing mode according to the description given in
 *	    array. The arrays that describe the different line styles are declared
 *	    in STYLES (file posttek.h), although it would be better to have them
 *	    defined in the prologue.
 *
 *	c
 *
 *	  red green blue c -
 *
 *	    Sets the current PostScript RGB color using setrgbcolor. Also used for
 *	    selecting appropriate patterns as colors.
 *
 *	f
 *
 *	  bgisize f -
 *
 *	    Changes the size of the font that's used to print text. bgisize is a
 *	    grid separation in a 5 by 7 array in which characters are assumed to
 *	    be built.
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * The default line width is zero, which forces lines to be one pixel wide. That
 * works well for 'write to black' engines but won't be right for 'write to white'
 * engines. The line width can be changed using the -w option, or you can change
 * the initialization of linewidth in the prologue. Code in the prologue supports
 * the generation of uniform width lines when linewidth is non-zero and boolean
 * fixlinewidth is true.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <math.h>
#include <ctype.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable declarations */
#include "postbgi.h"			/* a few definitions just used here */

char	*optnames = "a:c:f:m:n:o:p:w:x:y:A:C:E:J:L:P:R:DI";

char	*prologue = POSTBGI;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */

char	*styles[] = STYLES;		/* descriptions of line styles */

int	hpos = 0;			/* current horizontal */
int	vpos = 0;			/* and vertical position */

int	bgisize = BGISIZE;		/* just the character grid spacing */
int	linespace;			/* distance between lines of text */

int	bgimode;			/* character or graph mode */

int	in_subr = FALSE;		/* currently defining a subroutine */
int	in_global = FALSE;		/* to save space with subroutine defs */
int	subr_id = 0;			/* defining this subroutine */
int	shpos = 0;			/* starting horizontal */
int	svpos = 0;			/* and vertical positions - subroutines */
Disp	displacement[64];		/* dx and dy after a subroutine call */

Fontmap	fontmap[] = FONTMAP;		/* for translating font names */
char	*fontname = "Courier";		/* use this PostScript font */

int	page = 0;			/* page we're working on */
int	printed = 0;			/* printed this many pages */

FILE	*fp_in = stdin;			/* read from this file */
FILE	*fp_out = NULL;			/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A program that converts BGI (Basic Graphical Instructions) files generated by
 * packages like GRAFPAC and DISSPLA into PostScript. It does an adequate job but
 * is far from perfect. A few things still haven't been implemented (eg. repeats
 * and raster rectangles), but what's here should be good enough for most of our
 * STARE and PRISM jobs. Color mixing (in PRISM jobs) won't work on PostScript
 * printers, and there's no chance I'll implement it!
 *
 */

    argc = agc;				/* global so everyone can use them */
    argv = agv;

    prog_name = argv[0];		/* just for error messages */

    init_signals();			/* set up interrupt handling */
    header();				/* PostScript header comments */
    options();				/* command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* everything probably went OK */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Make sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* option name - from getopt() */

/*
 *
 * Reads and processes the command line options.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s def\n", optarg);
		    break;

	    case 'f':			/* new font */
		    fontname = get_font(optarg);
		    fprintf(stdout, "/font /%s def\n", fontname);
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'w':			/* line width */
		    fprintf(stdout, "/linewidth %s def\n", optarg);
		    break;

	    case 'x':			/* shift horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
		    	error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* Postscript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't know the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c", ch);
		    break;
	}   /* End switch */
    }	/* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

char *get_font(name)

    char	*name;			/* name the user asked for */

{

    int		i;			/* for looking through fontmap[] */

/*
 *
 * Called from options() to map a user's font name into a legal PostScript name.
 * If the lookup fails *name is returned to the caller. That should let you choose
 * any PostScript font.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].val);

    return(name);

}   /* End of get_font */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

}   /* End of setup */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line options are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll process stdin.
 *
 */

    if ( argc < 1 )
	conv();
    else
	while ( argc > 0 )  {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    conv();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with the last input file, so mark the end of the pages, make sure the
 * last page is printed, and restore the initial environment.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname);
    fprintf(stdout, "%s %d\n", PAGES, printed);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct, provided it's not NULL.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

conv()

{

    int		ch;			/* next input character */

/*
 *
 * Controls the conversion of BGI files into PostScript. Not everything has been
 * implemented, but what's been done should be good enough for our purposes.
 *
 */

    redirect(-1);			/* get ready for the first page */
    bgimode = 0;
    formfeed();

    while ( (ch = get_char()) != EOF )  {
	switch ( ch )  {
		case BRCHAR:			/* rotated character mode */
			    bgimode = ch;
			    text(90);
			    break;

		case BCHAR:			/* graphical character mode */
			    bgimode = ch;
			    text(0);
			    break;

		case BGRAPH:			/* graphical master mode */
			    bgimode = ch;
			    break;

		case BSUB:			/* subroutine definition */
			    subr_def();
			    break;

		case BRET:			/* end of subroutine */
			    subr_end();
			    break;

		case BCALL:			/* subroutine call */
			    subr_call();
			    break;

		case BEND:			/* end display - page */
			    formfeed();
			    break;

		case BERASE:			/* erase - shouldn't be used */
			    error(FATAL, "BGI erase opcode obsolete");
			    break;

		case BREP:			/* repeat */
			    error(FATAL, "Repeat not implemented");
			    repeat();
			    break;

		case BSETX:			/* new x coordinate */
			    hgoto(get_int(0));
			    break;

		case BSETY:			/* new y coordinate */
			    vgoto(get_int(0));
			    break;

		case BSETXY:			/* new x and y coordinates */
			    hgoto(get_int(0));
			    vgoto(get_int(0));
			    break;

		case BINTEN:			/* mark the current point */
			    fprintf(fp_out, "%d %d p\n", hpos, vpos);
			    break;

		case BVISX:			/* visible x */
			    vector(X_COORD, VISIBLE);
			    break;

		case BINVISX:			/* invisible x */
			    vector(X_COORD, INVISIBLE);
			    break;

		case BVISY:			/* visible y */
			    vector(Y_COORD, VISIBLE);
			    break;

		case BINVISY:			/* invisible y */
			    vector(Y_COORD, INVISIBLE);
			    break;

		case BVEC:			/* arbitrary vector */
			    vector(LONGVECTOR, VISIBLE);
			    break;

		case BSVEC:			/* short vector */
			    vector(SHORTVECTOR, VISIBLE);
			    break;

		case BRECT:			/* draw rectangle */
			    rectangle(OUTLINE);
			    break;

		case BPOINT1:			/* point plot 1 */
		case BPOINT:			/* point plot 2 */
			    point_plot(ch, get_char());
			    break;

		case BLINE:			/* line plot */
			    line_plot();
			    break;

		case BLTY:			/* line type */
			    fprintf(fp_out, "%s l\n", styles[get_data()]);
			    break;

		case BARC:			/* circular arc */
			    arc(OUTLINE);
			    break;

		case BFARC:			/* filled circle */
			    arc(FILL);
			    break;

		case BFRECT:			/* filled rectangle */
			    rectangle(FILL);
			    break;

		case BRASRECT:			/* raster rectangle */
			    error(FATAL, "Raster Rectangle not implemented");
			    break;

		case BCOL:			/* select color */
			    set_color(get_data());
			    break;

		case BFTRAPH:			/* filled trapezoid */
			    trapezoid();
			    break;

		case BPAT:			/* pattern for area filling */
			    pattern();
			    break;

		case BCSZ:			/* change BGI character 'size' */
			    setsize(get_data());
			    break;

		case BNOISE:			/* from bad file format */
			    break;

		default:			/* don't recognize the code */
			    error(FATAL, "bad BGI command %d (0%o)", ch, ch);
			    break;
	}   /* End switch */

	if ( debug == ON )
	    fprintf(stderr, "\n");
    }	/* End while */

    formfeed();					/* in case BEND was missing */

}   /* End of conv */

/*****************************************************************************/

hgoto(n)

    int		n;			/* new horizontal position */

{

/*
 *
 * Sets the current BGI horizontal position to n.
 *
 */

    hpos = n;

}   /* End of hgoto */

/*****************************************************************************/

vgoto(n)

    int		n;			/* move to this vertical position */

{

/*
 *
 * Sets the absolute vertical position to n.
 * 
 */

    vpos = n;

}   /* End of vgoto */

/*****************************************************************************/

setsize(n)

    int		n;			/* BGI size - just a grid separation */

{

/*
 *
 * Called when we're supposed to change the BGI character size to n. The BGI
 * size is the grid separation in a 5 by 7 array in which characters are assumed
 * to be built.
 *
 */

    bgisize = n;
    linespace = LINESPACE(bgisize);

    fprintf(fp_out, "%d f\n", bgisize);

    if ( debug == ON )
	fprintf(stderr, "BGI size = %d\n", n);

}   /* End of setsize */

/*****************************************************************************/

repeat()

{

    int		count;			/* repeat this many times */
    int		ch;			/* next input character */

/*
 *
 * Haven't implemented repeats, although it wouldn't be difficult. Apparently it's
 * not used by any graphics packages that generate BGI.
 *
 */

    count = get_int();			/* get the repeat count */

    while ( (ch = get_char()) != EOF  &&  ch != BENDR ) ;

}   /* End of repeat */

/*****************************************************************************/

text(angle)

    int		angle;			/* either 0 or 90 degrees */

{

    int		ch;			/* next character from file *fp_in */

/*
 *
 * Called from conv() after we've entered one of the graphical character modes.
 * Characters are read from the input file and printed until the next mode change
 * opcode is found (or until EOF). angle will be 90 for rotated character mode
 * and 0 otherwise.
 *
 *
 */

    fprintf(fp_out, "%d %d %d(", angle, hpos, vpos);

    while ( (ch = get_char()) != EOF )  {
	if ( ch == BGRAPH || ch == BCHAR || ch == BRCHAR )  {
	    ungetc(ch, fp_in);
	    position--;
	    break;
	}   /* End if */

	switch ( ch )  {
	    case '\012':
		vgoto(vpos - linespace);

	    case '\015':
		hgoto(0);
		fprintf(fp_out, ")t\n%d %d %d(", angle, hpos, vpos);
		break;

	    case '(':
	    case ')':
	    case '\\':
		putc('\\', fp_out);

	    default:
		if ( isascii(ch) && isprint(ch) )
		    putc(ch, fp_out);
		else fprintf(fp_out, "\\%.3o", ch & 0377);
		break;
	}   /* End switch */
    }	/* End while */

    fprintf(fp_out, ") t\n");

}   /* End of text */

/*****************************************************************************/

formfeed()

{

    int		ch;			/* repeat count for this page */

/*
 *
 * Does whatever is needed to print the last page and get ready for the next one.
 * It's called, from conv(), after a BEND code is processed. I'm ignoring the
 * copy count that's expected to follow each page.
 *
 */

    if ( bgimode == BGRAPH && (ch = get_char()) != EOF  &&  ! (ch & MSB) )  {
	ungetc(ch, fp_in);
	position--;
    }	/* End if */

    if ( fp_out == stdout )		/* count the last page */
	printed++;

    fprintf(fp_out, "cleartomark\n");
    fprintf(fp_out, "showpage\n");
    fprintf(fp_out, "saveobj restore\n");
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);

    while ( (ch = get_char()) == 0 ) ;	/* skip any NULL characters */
    ungetc(ch, fp_in);
    position--;

    if ( ungetc(getc(fp_in), fp_in) == EOF )
	redirect(-1);
    else redirect(++page);

    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fprintf(fp_out, "/saveobj save def\n");
    fprintf(fp_out, "mark\n");
    writerequest(printed+1, fp_out);
    fprintf(fp_out, "%d pagesetup\n", printed+1);

    setsize(bgisize);
    hpos = vpos = 0;

}    /* End of formfeed */

/*****************************************************************************/

subr_def()

{

/*
 *
 * Starts a subroutine definition. All subroutines are defined as PostScript
 * procedures that begin with the character S and end with the subroutine's id
 * (a number between 0 and 63 - I guess). The primary, and perhaps only use of
 * subroutines is in special color plots produced by several graphics libraries,
 * and even there it's not all that common. I've also chosen not to worry about
 * nested subroutine definitions - that would certainly be overkill!
 *
 * All subroutines set up their own (translated) coordinate system, do their work
 * in that system, and restore things when they exit. To make everything work
 * properly we save the current point (in shpos and svpos), set our position to
 * (0, 0), and restore things at the end of the subroutine definition. That means
 * hpos and vpos measure the relative displacement after a subroutine returns, and
 * we save those values in the displacement[] array. The displacements are used
 * (in subr_call()) to properly adjust our position after each subroutine call,
 * and all subroutines are called with the current x and y coordinates on top of
 * the stack.
 *
 */

    if ( in_subr == TRUE )		/* a nested subroutine definition?? */
	error(FATAL, "can't handle nested subroutine definitions");

    if ( (subr_id = get_data()) == EOF )
	error(FATAL, "missing subroutine identifier");

    if ( in_global == FALSE )  {	/* just used to reduce file size some */
	fprintf(fp_out, "cleartomark\n");
	fprintf(fp_out, "saveobj restore\n");
	fprintf(fp_out, "%s", BEGINGLOBAL);
	in_global = TRUE;
    }	/* End if */

    fprintf(fp_out, "/S%d {\n", subr_id);
    fprintf(fp_out, "gsave translate\n");

    shpos = hpos;			/* save our current position */
    svpos = vpos;

    hgoto(0);				/* start at the origin */
    vgoto(0);

    in_subr = TRUE;			/* in a subroutine definition */

}   /* End of subr_def */

/*****************************************************************************/

subr_end()

{

    int		ch;			/* for looking at next opcode */

/*
 *
 * Handles stuff needed at the end of each subroutine. Want to remember the change
 * in horizontal and vertical positions for each subroutine so we can adjust our
 * position after each call - just in case. The current position was set to (0, 0)
 * before we started the subroutine definition, so when we get here hpos and vpos
 * are the relative displacements after the subroutine is called. They're saved in
 * the displacement[] array and used to adjust the current position when we return
 * from a subroutine.
 *
 */

    if ( in_subr == FALSE )		/* not in a subroutine definition?? */
	error(FATAL, "subroutine end without corresponding start");

    fprintf(fp_out, "grestore\n");
    fprintf(fp_out, "} def\n");

    if ( in_global == TRUE && (ch = get_char()) != BSUB )  {
	fprintf(fp_out, "%s", ENDGLOBAL);
	fprintf(fp_out, "/saveobj save def\n");
	fprintf(fp_out, "mark\n");
	in_global = FALSE;
    }	/* End if */

    ungetc(ch, fp_in);			/* put back the next opcode */

    displacement[subr_id].dx = hpos;
    displacement[subr_id].dy = vpos;

    hgoto(shpos);			/* back to where we started */
    vgoto(svpos);

    in_subr = FALSE;			/* done with the definition */

}   /* End of subr_end */

/*****************************************************************************/

subr_call()

{

    int		ch;			/* next byte from *fp_in */
    int		id;			/* subroutine id if ch wasn't an opcode */

/*
 *
 * Handles subroutine calls. Everything that follows the BCALL opcode (up to the
 * next opcode) is taken as a subroutine identifier - thus the loop that generates
 * the subroutine calls.
 *
 */

    while ( (ch = get_char()) != EOF && (ch & MSB) )  {
	id = ch & DMASK;
	fprintf(fp_out, "%d %d S%d\n", hpos, vpos, id);

	hgoto(hpos + displacement[id].dx);	/* adjust our position */
	vgoto(vpos + displacement[id].dy);
    }	/* End while */

    ungetc(ch, fp_in);

}   /* End of subr_call */

/*****************************************************************************/

vector(var, mode)

    int		var;			/* coordinate that varies next? */
    int		mode;			/* VISIBLE or INVISIBLE vectors */

{

    int		ch;			/* next character from *fp_in */
    int		x, y;			/* line drawn to this point */
    int		count = 0;		/* number of points so far */

/*
 *
 * Handles plotting of all types of BGI vectors. If it's a manhattan vector var
 * specifies which coordinate will be changed by the next number in the input
 * file.
 *
 */

    x = hpos;				/* set up the first point */
    y = vpos;

    while ( (ch = get_char()) != EOF  &&  ch & MSB )  {
	if ( var == X_COORD )		/* next length is change in x */
	    x += get_int(ch);
	else if ( var == Y_COORD )	/* it's the change in y */
	    y += get_int(ch);
	else if ( var == LONGVECTOR )  {	/* long vector */
	    x += get_int(ch);
	    y += get_int(0);
	} else {			/* must be a short vector */
	    x += ((ch & MSBMAG) * ((ch & SGNB) ? -1 : 1));
	    y += (((ch = get_data()) & MSBMAG) * ((ch & SGNB) ? -1 : 1));
	}   /* End else */

	if ( mode == VISIBLE )  {	/* draw the line segment */
	    fprintf(fp_out, "%d %d\n", hpos - x, vpos - y);
	    count++;
	}   /* End if */

	hgoto(x);			/* adjust the current BGI position */
	vgoto(y);

	if ( var == X_COORD )		/* vertical length comes next */
	    var = Y_COORD;
	else if ( var == Y_COORD )	/* change horizontal next */
	    var = X_COORD;
    }	/* End while */

    if ( count > 0 )
	fprintf(fp_out, "%d %d v\n", hpos, vpos);

    ungetc(ch, fp_in);			/* it wasn't part of the vector */
    position--;

}   /* End of vector */

/*****************************************************************************/

rectangle(mode)

    int		mode;			/* FILL or OUTLINE the rectangle */

{

    int		deltax;			/* displacement for horizontal side */
    int		deltay;			/* same but for vertical sides */

/*
 *
 * Draws a rectangle and either outlines or fills it, depending on the value of
 * mode. Would be clearer, and perhaps better, if {stroke} or {fill} were put on
 * the stack instead of 0 or 1. R could then define the path and just do an exec
 * to fill or stroke it.
 *
 */

    deltax = get_int(0);		/* get the height and width */
    deltay = get_int(0);

    if ( mode == OUTLINE )
	fprintf(fp_out, "0 %d %d %d %d R\n", deltax, deltay, hpos, vpos);
    else fprintf(fp_out, "1 %d %d %d %d R\n", deltax, deltay, hpos, vpos);

}   /* End of rectangle */

/*****************************************************************************/

trapezoid()

{

    int		kind;			/* which sides are parallel */
    int		d[6];			/* true displacements - depends on kind */

/*
 *
 * Handles filled trapeziods. A data byte of 0101 following the opcode means the
 * horizontal sides are parallel, 0102 means the vertical sides are parallel.
 * Filling is handled by eofill so we don't need to get things in the right order.
 *
 */

    kind = get_data();

    d[0] = get_int(0);
    d[1] = 0;
    d[2] = get_int(0);
    d[3] = get_int(0);
    d[4] = get_int(0);
    d[5] = 0;

    if ( kind == 2 )  {			/* parallel sides are vertical */
	d[1] = d[0];
	d[0] = 0;
	d[5] = d[4];
	d[4] = 0;
    }	/* End if */

    fprintf(fp_out, "%d %d %d %d %d %d %d %d T\n", d[4], d[5], d[2], d[3], d[0], d[1], hpos, vpos);

}   /* End of trapezoid */

/*****************************************************************************/

point_plot(mode, ch)

    int		mode;			/* plotting mode BPOINT or BPOINT1 */
    int		ch;			/* will be placed at the points */

{

    int		c;			/* next character from input file */
    int		x, y;			/* ch gets put here next */
    int		deltax;			/* x increment for BPOINT1 mode */

/*
 *
 * The two point plot modes are used to place a character at selected points. The
 * difference in the two modes, namely BPOINT and BPOINT1, is the way we get the
 * coordinates of the next point. In BPOINT1 the two bytes immediately following
 * ch select a constant horizontal change, while both coordinates are given for
 * all points in BPOINT mode.
 *
 */

    if ( mode == BPOINT1 )  {		/* first integer is change in x */
	deltax = get_int(0);
	x = hpos - deltax;
    }	/* End if */

    while ( (c = get_char()) != EOF  &&  (c & MSB) )  {
	if ( mode == BPOINT1 )  {	/* only read y coordinate */
	    y = get_int(c);
	    x += deltax;
	} else {			/* get new x and y from input file */
	    x = get_int(c);
	    y = get_int(0);
	}   /* End else */

	hgoto(x);			/* adjust BGI position */
	vgoto(y);

	fprintf(fp_out, "%d %d\n", hpos, vpos);
    }	/* End while */

    putc('(', fp_out);

    switch ( ch )  {
	case '(':
	case ')':
	case '\\':
		putc('\\', fp_out);

	default:
		putc(ch, fp_out);
    }	/* End switch */

    fprintf(fp_out, ")pp\n");

    ungetc(c, fp_in);			/* it wasn't part of the point plot */
    position--;

}   /* End of point_plot */

/*****************************************************************************/

line_plot()

{

    int		c;			/* next input character from fp_in */
    int		deltax;			/* change in x coordinate */
    int		x0, y0;			/* starting point for next segment */
    int		x1, y1;			/* endpoint of the line */
    int		count = 0;		/* number of points so far */

/*
 *
 * Essentially the same format as BPOINT1, except that in this case we connect
 * pairs of points by line segments.
 *
 */

    deltax = get_int(0);		/* again the change in x is first */

    x1 = hpos;				/* so it works first time through */
    y1 = get_int(0);

    while ( (c = get_char()) != EOF  &&  (c & MSB) )  {
	x0 = x1;			/* line starts here */
	y0 = y1;

	x1 += deltax;			/* and ends at this point */
    	y1 = get_int(c);

	fprintf(fp_out, "%d %d\n", -deltax, y0 - y1);
	count++;
    }	/* End while */

    hgoto(x1);				/* adjust current BGI position */
    vgoto(y1);

    if ( count > 0 )
	fprintf(fp_out, "%d %d v\n", hpos, vpos);

    ungetc(c, fp_in);			/* wasn't part of the line */
    position--;

}   /* End of line_plot */

/*****************************************************************************/

arc(mode)

    int		mode;			/* FILL or OUTLINE the path */

{

    int		dx1, dy1;		/* displacements for first point */
    int		dx2, dy2;		/* same for the second point */
    int		radius;			/* of the arc */
    int		angle1, angle2;		/* starting and ending angles */

/*
 *
 * Called whenever we need to draw an arc. I'm ignoring filled slices for now.
 *
 */

    dx1 = get_int(0);			/* displacements relative to center */
    dy1 = get_int(0);
    dx2 = get_int(0);
    dy2 = get_int(0);

    radius = get_int(0);		/* and the radius */

    if ( radius == 0 )			/* nothing to do */
	return;

    angle1 = (atan2((double) dy1, (double) dx1) * 360) / (2 * PI) + .5;
    angle2 = (atan2((double) dy2, (double) dx2) * 360) / (2 * PI) + .5;

    fprintf(fp_out, "%d %d %d %d %d arcn stroke\n", hpos, vpos, radius, angle1, angle2);

}   /* End of arc */

/*****************************************************************************/

pattern()

{

    double	red = 0;		/* color components */
    double	green = 0;
    double	blue = 0;
    int		kind;			/* corse or fine pattern */
    int		val;			/* next color data byte */
    int		i;			/* loop index */

/*
 *
 * Handles patterns by setting the current color based of the values assigned to
 * the next four data bytes. BGI supports two kinds of patterns (fine or coarse)
 * but I'm handling each in the same way - for now. In a fine pattern the four
 * data bytes assign a color to four individual pixels (upperleft first) while
 * in a coarse pattern the four colors are assigned to groups of four pixels,
 * for a total of 16. Again the first color goes to the group in the upper left
 * corner. The byte immediately following the BPAT opcode selects fine (040) or
 * coarse (041) patterns. The PostScript RGB color is assigned by averaging the
 * RED, GREEN, and BLUE components assigned to the four pixels (or groups of
 * pixels). Acceptable results, but there's no distinction between fine and
 * coarse patterns.
 *
 */

    if ( (kind = get_char()) == EOF )
	error(FATAL, "bad pattern command");

    for ( i = 0; i < 4; i++ )  {
	val = get_data();
	red += get_color(val, RED);
	green += get_color(val, GREEN);
	blue += get_color(val, BLUE);
    }	/* End for */

    fprintf(fp_out, "%g %g %g c\n", red/4, green/4, blue/4);

}   /* End of pattern */

/*****************************************************************************/

get_color(val, component)

    int		val;			/* color data byte */
    int		component;		/* RED, GREEN, or BLUE component */

{


    int		primary;		/* color mixing mode - bits 2 to 4 */
    int		plane;			/* primary color plane - bits 5 to 7 */
    unsigned	rgbcolor;		/* PostScript expects an RGB triple */

/*
 *
 * Picks the requested color component (RED, GREEN, or BLUE) from val and returns
 * the result to the caller. BGI works with Cyan, Yellow, and Magenta so the one's
 * complement stuff (following the exclusive or'ing) recovers the RED, BLUE, and
 * GREEN components that PostScript's setrgbcolor operator needs. The PostScript
 * interpreter in the ColorScript 100 has a setcmycolor operator, but it's not
 * generally available so I've decided to stick with setrgbcolor.
 *
 */

    primary = (val >> 3) & 07;
    plane = val & 07;
    rgbcolor = (~(primary ^ plane)) & 07;

    if ( debug == ON )
	fprintf(stderr, "val = %o, primary = %o, plane = %o, rgbcolor = %o\n",
		val, primary, plane, rgbcolor);

    switch ( component )  {
	case RED:
		return(rgbcolor>>2);

	case GREEN:
		return(rgbcolor&01);

	case BLUE:
		return((rgbcolor>>1)&01);

	default:
		error(FATAL, "unknown color component");
		return(0);
    }	/* End switch */

}   /* End of get_color */

/*****************************************************************************/

set_color(val)

    int		val;			/* color data byte */

{

/*
 *
 * Arranges to have the color set to the value requested in the BGI data byte val.
 *
 */

    fprintf(fp_out, "%d %d %d c\n", get_color(val, RED), get_color(val, GREEN), get_color(val, BLUE));

}   /* End of set_color */

/*****************************************************************************/

get_int(highbyte)

    int		highbyte;		/* already read this byte */

{

    int		lowbyte;		/* this and highbyte make the int */

/*
 *
 * Figures out the value on the integer (sign magnitude form) that's next in the
 * input file. If highbyte is nonzero we'll use it and the next byte to build the
 * integer, otherwise two bytes are read from fp_in.
 *
 */


    if ( highbyte == 0 )		/* need to read the first byte */
	highbyte = get_data();

    lowbyte = get_data();		/* always need the second byte */

    return(highbyte & SGNB ? -MAG(highbyte, lowbyte) : MAG(highbyte, lowbyte));

}   /* End of get_int */

/*****************************************************************************/

get_data()

{

    int		val;			/* data value returned to caller */

/*
 *
 * Called when we expect to find a single data character in the input file. The
 * data bit is turned off and the resulting value is returned to the caller.
 *
 */

    if ( (val = get_char()) == EOF  ||  ! (val & MSB) )
	error(FATAL, "missing data value");

    return(val & DMASK);

}   /* End of get_data */

/*****************************************************************************/

get_char()

{

    int		ch;			/* character we just read */

/*
 *
 * Reads the next character from file *fp_in and returns the value to the caller.
 * This routine isn't really needed, but we may want to deal directly with some
 * screwball file formats so I thought it would probably be a good idea to isolate
 * all the input in one routine that could be easily changed.
 *
 */

    if ( (ch = getc(fp_in)) != EOF )  {
	position++;
	ch &= CHMASK;
    }	/* End if */

    if ( debug == ON )
	fprintf(stderr, "%o ", ch);

    return(ch);

}   /* End of get_char */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014230265651006440057030057030000010675520522627503400003300000012631post.src/postbgi/postbgi.h/*
 *
 * BGI opcodes.
 *
 */

#define BRCHAR		033		/* rotated character mode */
#define BCHAR		034		/* graphical character mode */
#define BGRAPH		035		/* graphical master mode */

#define BSUB		042		/* subroutine definition */
#define BRET		043		/* end of subroutine */
#define BCALL		044		/* subroutine call */

#define BEND		045		/* end page */
#define BERASE		046		/* erase - obsolete */
#define BREP		047		/* repeat */
#define BENDR		050		/* end repeat */

#define BSETX		051		/* set horizontal position */
#define BSETY		052		/* set vertical position */
#define BSETXY		053		/* set horizontal and vertical positions */
#define BINTEN		054		/* intensify - mark current pixel */

#define BVISX		055		/* manhattan vector - change x first */
#define BINVISX		056		/* same as BVISX but nothing drawn */
#define BVISY		057		/* manhattan vector - change y first */
#define BINVISY		060		/* same as BVISY but nothing drawn */

#define BVEC		061		/* arbitrary long vector */
#define BSVEC		062		/* arbitrary short vector */
#define BRECT		063		/* outline rectangle */
#define BPOINT1		064		/* point plot - mode 1 */
#define BPOINT		065		/* point plot - mode 2 */
#define BLINE		066		/* line plot */

#define BCSZ		067		/* set character size */
#define BLTY		070		/* select line type */
#define BARC		071		/* draw circular arc */
#define BFARC		072		/* filled circular arc */
#define BFRECT		073		/* filled rectangle */
#define BRASRECT	074		/* raster rectangle */
#define BCOL		075		/* select color */
#define BFTRAPH		076		/* filled trapezoid */
#define BPAT		077		/* pattern are for filling - no info */

#define BNOISE		0		/* from bad file format */

/*
 *
 * Character size is controlled by the spacing of dots in a 5x7 dot matrix, which
 * by default is set to BGISIZE.
 *
 */

#define BGISIZE		2		/* default character grid spacing */

/*
 *
 * Definitions used to decode the bytes read from a BGI file.
 *
 */

#define CHMASK		0177		/* characters only use 7 bits */
#define DMASK		077		/* data values use lower 6 bits */
#define MSB		0100		/* used to check for data or opcode */
#define SGNB		040		/* sign bit for integers */
#define MSBMAG		037		/* mag of most sig byte in a BGI int */

/*
 *
 * Descriptions of BGI vectors and what's done when they're drawn.
 *
 */

#define X_COORD		0		/* change x next in manhattan vector */
#define Y_COORD		1		/* same but y change comes next */
#define LONGVECTOR	2		/* arbitrary long vector */
#define SHORTVECTOR	3		/* components given in 6 bits */

#define VISIBLE		0		/* really draw the vector */
#define INVISIBLE	1		/* just move the current position */

/*
 *
 * What's done with a closed path.
 *
 */

#define OUTLINE		0		/* outline the defined path */
#define FILL		1		/* fill it in */

/*
 *
 * BGI line style definitions. They're used as an index into the STYLES array,
 * which really belongs in the prologue.
 *
 */

#define SOLID		0
#define DOTTED		1
#define SHORTDASH	2
#define DASH		3
#define LONGDASH	4
#define DOTDASH		5
#define THREEDOT	6

#define STYLES								\
									\
	{								\
	    "[]",							\
	    "[.5 2]",							\
	    "[2 4]",							\
	    "[4 4]",							\
	    "[8 4]",							\
	    "[.5 2 4 2]",						\
	    "[.5 2 .5 2 .5 2 4 2]"					\
	}

/*
 *
 * Three constants used to choose which component (RED, GREEN, or BLUE) we're
 * interested in. BGI colors are specified as a single data byte and pulling a
 * particular  component out of the BGI color byte is handled by procedure
 * get_color().
 *
 */

#define RED		0
#define GREEN		1
#define BLUE		2

/*
 *
 * An array of type Disp is used to save the horizontal and vertical displacements
 * that result after a subroutine has been called. Needed so we can properly adjust
 * our horizontal and vertical positions after a subroutine call. Entries are made
 * immediately after a subroutine is defined and used after the call. Subroutine
 * names are integers that range from 0 to 63 (assigned in the BG file) and the
 * name is used as an index into the Disp array when we save or retrieve the
 * displacement.
 *
 */

typedef struct {
	int	dx;			/* horizontal and */
	int	dy;			/* vertical displacements */
} Disp;

/*
 *
 * An array of type Fontmap helps convert font names requested by users into
 * legitimate PostScript names. The array is initialized using FONTMAP, which must
 * end with and entry that has NULL defined as its name field.
 *
 */

typedef struct {
	char	*name;			/* user's font name */
	char	*val;			/* corresponding PostScript name */
} Fontmap;

#define FONTMAP								\
									\
	{								\
	    "R", "Courier",						\
	    "I", "Courier-Oblique",					\
	    "B", "Courier-Bold",					\
	    "CO", "Courier",						\
	    "CI", "Courier-Oblique",					\
	    "CB", "Courier-Bold",					\
	    "CW", "Courier",						\
	    "PO", "Courier",						\
	    "courier", "Courier",					\
	    "cour", "Courier",						\
	    "co", "Courier",						\
	    NULL, NULL							\
	}

/*
 *
 * Two macros that are useful in processing BGI files:
 *
 *       MAG(A, B)    - Takes bytes A and B which have been read from a BGI file
 *                      and returns the magnitude of the integer represented by
 *                      the two bytes.
 *
 *       LINESPACE(A) - Takes BGI size A and returns the number of address units
 *                      that can be used for a reasonable interline spacing.
 *
 */

#define MAG(A, B)	(((A & MSBMAG) << 6) | (B & DMASK))
#define LINESPACE(A)	(8 * A)

/*
 *
 * Some of the non-integer valued functions in postdmd.c.
 *
 */

char	*get_font();

0707070014230265661006440057030057030000010677100522627503400003000000001447post.src/postbgi/README
BGI (Basic Graphical Instructions) to PostScript translator. Probably
not useful outside the Computer Centers. Added code to tie lines to
device space coordinates. Helps eliminate variations in line widths
noticeable when users selected a non-zero linewidth with the -w option.

Much that was omitted from early versions of the program has been
implemented. What's in place will handle most STARE (black and white)
and PRISM (color) BGI jobs. PRISM jobs often fill regions with color,
and need require device specific tuning to get things just right. An
easy solution is add "-P/prism true def" option to the postbgi command
line when you translate PRISM jobs.

A typical command line for STARE jobs would be,

	postbgi file >file.ps

while for PRISM jobs use,

	postbgi -P"/prism true def" file >file.ps

0707070014230266641006400057030057030000010700100522633075200003300000010325post.src/postbgi/postbgi.1.ds dQ /usr/lib/postscript
.TH POSTBGI 1 "DWB 3.2"
.SH NAME
.B postbgi
\- PostScript translator for
.SM BGI
(Basic Graphical Instructions) files
.SH SYNOPSIS
\*(mBpostbgi\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B postbgi
translates
.SM BGI
(Basic Graphical Instructions)
.I files
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-f name
Print text using font
.IR name .
Any PostScript font can be used,
although the best results will only be
obtained with constant width fonts.
The default font is Courier.
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which by default is located at the center of
each page.
The default magnification is 1.0.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP
.OP \-w num
Set the line width used for graphics to
.I num
points, where a point is approximately 1/72
of an inch.
By default
.I num
is set to 0 points, which forces lines to be
one pixel wide.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed at the
center of the page, with positive
x to the right and positive y up the page.
Positive
.I num
moves everything right.
The default offset is 0 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves everything up the page.
The default offset is 0 inches.
.TP
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ name .enc \f1.
A nonexistent encoding file is silently ignored.
The default selects file
.MR \*(dQ/Default.enc .
.TP
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/postbgi.ps .
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include
.I string
in the output file;
.I string
must be legitimate PostScript.
.TP
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request ,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0, the request
applies to all pages.
If
.I file
is omitted, the request
lookup is done in
.MR \*(dQ/ps.requests .
.PP
.B postbgi
can handle
.SM STARE
(black and white) and
.SM PRISM
(color)
.SM BGI
jobs.
By default plots are rigidly scaled to fill the page, which produces
the good results for most
.SM STARE
jobs.
.SM PRISM
jobs typically fill regions with colors, and often require device
specific tuning to produce acceptable results.
Adding the
.MW \-P"/prism\ true\ def"
option is strongly recommended when
.B postbgi
is translating
.SM PRISM
jobs.
.br
.ne 7v
.SH EXAMPLES
For most
.SM STARE
jobs,
.EX
postbgi  \f2file
.EE
gives good results, while
.EX
postbgi \-P"/prism true def"  \f2file
.EE
is recommended when translating
.SM PRISM
jobs.
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.SH BUGS
The default line width is too small for write-white
print engines, like the one used by the PS-2400.
Several
.SM BGI
opcodes have not been implemented.
.SH FILES
.MW \*(dQ/postbgi.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy (1),
.BR postdmd (1),
.BR postio (1),
.BR postmd (1),
.BR postprint (1),
.BR postreverse (1),
.BR posttek (1),
.BR psencoding (1)
0707070014230265701006440057030057030000010677300522627503400003400000006016post.src/postbgi/postbgi.ps%
% Version 3.3.2 prologue for BGI files - STARE or PRISM.
%

/#copies 1 store
/aspectratio 1 def
/fixlinewidth true def
/fixscreen false def
/font /Courier def
/formsperpage 1 def
/landscape false def
/linewidth 0 def
/magnification 1 def
/margin 0 def
/orientation 0 def
/prism false def
/resolution 128 def
/rotation 1 def
/scaletodevice false def
/screenheight 1280 def
/screenwidth 1024 def
/xoffset 0 def
/yoffset 0 def

/devres 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def

/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/kshow {kshow} bind def		% so later references don't bind
/show {show} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if
	prism {/fixscreen true def /scaletodevice true def} if
	prism linewidth 0 eq and {/linewidth .3 def} if
	fixscreen {devres 4 div orientation currentscreen 3 1 roll pop pop setscreen} if

	pagedimensions
	/scaling
		scaletodevice
			{devres resolution div truncate 72 mul devres div dup}
			{height margin sub screenheight div width margin sub screenwidth div}
		ifelse
	min def
	xcenter ycenter translate
	orientation rotation mul rotate
	xoffset inch yoffset inch translate
	magnification dup aspectratio mul scale
	scaling scaling scale
	screenwidth 2 div neg screenheight 2 div neg translate

	tietodevicespace
	linewidth scaling div setlinewidth
	1 setlinecap
	newpath
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def} bind def

/tietodevicespace {
	fixlinewidth linewidth 0 gt and linewidth 1 lt and {
		/moveto {
			2 copy /Y exch def /X exch def
			transform round exch round exch itransform
			moveto
		} bind def
		/lineto {
			2 copy /Y exch def /X exch def
			transform round exch round exch itransform
			lineto
		} bind def
		/rlineto {Y add exch X add exch lineto} bind def
		/v V 0 get bind def
	} if
} def

/V [{moveto counttomark 2 idiv {rlineto} repeat stroke}] def
/v V 0 get bind def
/p {linewidth 2 div 0 360 arc fill} bind def
/pp {/ch exch def counttomark 2 idiv {moveto xc yc rmoveto ch show} repeat} bind def

/l {{scaling div} forall counttomark array astore 0 setdash} bind def
/c {setrgbcolor} bind def

/T {newpath moveto rlineto rlineto rlineto closepath eofill} bind def

/R {
	newpath moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath
	0 eq {stroke} {eofill} ifelse
} bind def

/f {
	dup dup
	/charwidth exch 6 mul def
	/xc exch -2.5 mul def
	/yc exch -3.5 mul def
	font findfont charwidth .6 div scalefont setfont
} bind def

/t {
	/str exch def
	gsave
	translate rotate
	xc yc moveto
	currentpoint
	{
		pop pop
		exch charwidth add exch
		moveto currentpoint
	} str kshow
	pop pop
	grestore
} bind def

/done {/lastpage where {pop lastpage} if} def
0707070014230642760407550057030057030000021712350522633075400002300000000000post.src/postdaisy0707070014230637751006400057030057030000011711740522633075300004000000004021post.src/postdaisy/postdaisy.mkMAKE=/bin/make
MAKEFILE=postdaisy.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=postdaisy.h \
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=postdaisy.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o

all : postdaisy

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp postdaisy $(POSTBIN)/postdaisy
	@chmod 755 $(POSTBIN)/postdaisy
	@chgrp $(GROUP) $(POSTBIN)/postdaisy
	@chown $(OWNER) $(POSTBIN)/postdaisy
	cp postdaisy.ps $(POSTLIB)/postdaisy.ps
	@chmod 644 $(POSTLIB)/postdaisy.ps
	@chgrp $(GROUP) $(POSTLIB)/postdaisy.ps
	@chown $(OWNER) $(POSTLIB)/postdaisy.ps
	cp postdaisy.1 $(MAN1DIR)/postdaisy.1
	@chmod 644 $(MAN1DIR)/postdaisy.1
	@chgrp $(GROUP) $(MAN1DIR)/postdaisy.1
	@chown $(OWNER) $(MAN1DIR)/postdaisy.1

clean :
	rm -f *.o

clobber : clean
	rm -f postdaisy

postdaisy : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postdaisy $(OFILES)

postdaisy.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	postdaisy.1 >XXX.1; \
	mv XXX.1 postdaisy.1

0707070014230643001006440057030057030000011712530522627503500003700000004056post.src/postdaisy/postdaisy.h/*
 *
 * Definitions used by the PostScript translator for Diablo 1640 files.
 *
 * Diablo printers have horizontal and vertical resolutions of 120 and 48 dpi.
 * We'll use a single resolution of 240 dpi and let the program scale horizontal
 * and vertical positions by HSCALE and VSCALE.
 *
 */

#define RES		240
#define HSCALE		2
#define VSCALE		5

/*
 *
 * HMI is the default character spacing and VMI is the line spacing. Both values
 * are in terms of the 240 dpi resolution.
 *
 */

#define HMI		(12 * HSCALE)
#define VMI		(8 * VSCALE)

/*
 *
 * Paper dimensions don't seem to be all that important. They're just used to
 * set the right and bottom margins. Both are given in terms of the 240 dpi
 * resolution.
 *
 */

#define LEFTMARGIN	0
#define RIGHTMARGIN	3168
#define TOPMARGIN	0
#define BOTTOMMARGIN	2640

/*
 *
 * ROWS and COLUMNS set the dimensions of the horizontal and vertical tab arrays.
 * The way I've implemented both kinds of tabs leaves something to be desired, but
 * it was simple and should be good enough for now. If arrays are going to be used
 * to mark tab stops I probably should use malloc() to get enough space once the
 * initial hmi and vmi are know.
 *
 */

#define ROWS		400
#define COLUMNS		200

/*
 *
 * An array of type Fontmap helps convert font names requested by users into
 * legitimate PostScript names. The array is initialized using FONTMAP, which must
 * end with an entry that has NULL defined as its name field.
 *
 */

typedef struct {
	char	*name;			/* user's font name */
	char	*val;			/* corresponding PostScript name */
} Fontmap;

#define FONTMAP								\
									\
	{								\
	    "R", "Courier",						\
	    "I", "Courier-Oblique",					\
	    "B", "Courier-Bold",					\
	    "CO", "Courier",						\
	    "CI", "Courier-Oblique",					\
	    "CB", "Courier-Bold",					\
	    "CW", "Courier",						\
	    "PO", "Courier",						\
	    "courier", "Courier",					\
	    "cour", "Courier",						\
	    "co", "Courier",						\
	    NULL, NULL							\
	}

/*
 *
 * Some of the non-integer functions in postdaisy.c.
 *
 */

char	*get_font();

0707070014230643011006440057030057030000011712700522627503500003700000067263post.src/postdaisy/postdaisy.c/*
 *
 * postdaisy - PostScript translator for Diablo 1640 files.
 *
 * A program that translates Diablo 1640 files into PostScript. Absolutely nothing
 * is guaranteed. Quite a few things haven't been implemented, and what's been
 * done isn't well tested. Most of the documentation used to write this program
 * was taken from the 'Diablo Emulator' section of a recent Imagen manual.
 *
 * Some of document comments that are generated may not be right. Most of the test
 * files I used produced a trailing blank page. I've put a check in formfeed() that
 * won't print the last page if it doesn't contain any text, but PAGES comments may
 * not be right. The DOCUMENTFONTS comment will also be wrong if auto underline or
 * bold printing have been turned on by escape commands.
 *
 * The brute force approach used to implement horizontal and vertical tabs leaves
 * much to be desired, and may not work for very small initial hmi and vmi values.
 * At the very least I should have used malloc() to get space for the two tabstop
 * arrays after hmi and vmi are known!
 *
 * Reverse printing mode hasn't been tested at all, but what's here should be
 * close even though it's not efficient.
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following PostScript procedures
 * are defined in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how this program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects to
 *	    find the current page number on the stack.
 *
 *	t
 *
 *	  mark str1 x1 str2 x2 ... strn xn y hmi t mark
 *
 *	    Handles all the text on the stack. Characters in the strings are
 *	    printed using hmi as the character advance, and all strings are at
 *	    vertical position y. Each string is begins at the horizontal position
 *	    that preceeds it.
 *
 *	f
 *
 *	  font f -
 *
 *	    Use font f, where f is the full PostScript font name. Only used when
 *	    we switch to auto underline (Courier-Italic) or bold (Courier-Bold)
 *	    printing.
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable declarations */
#include "postdaisy.h"			/* a few special definitions */

char	*optnames = "a:c:f:h:l:m:n:o:p:r:s:v:x:y:A:C:E:J:L:P:DI";

char	*prologue = POSTDAISY;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */

char	htabstops[COLUMNS];		/* horizontal */
char	vtabstops[ROWS];		/* and vertical tabs */

int	res = RES;			/* input file resolution - sort of */

int	hmi = HMI;			/* horizontal motion index - 1/120 inch */
int	vmi = VMI;			/* vertical motion index - 1/48 inch */
int	ohmi = HMI;			/* original hmi */
int	ovmi = VMI;			/* and vmi - for tabs and char size */

int	hpos = 0;			/* current horizontal */
int	vpos = 0;			/* and vertical position */

int	lastx = -1;			/* printer's last horizontal */
int	lasty = -1;			/* and vertical position */
int	lasthmi = -1;			/* hmi for current text strings */

int	lastc = -1;			/* last printed character */
int	prevx = -1;			/* at this position */

int	leftmargin = LEFTMARGIN;	/* page margins */
int	rightmargin = RIGHTMARGIN;
int	topmargin = TOPMARGIN;
int	bottommargin = BOTTOMMARGIN;

int	stringcount = 0;		/* number of strings on the stack */
int	stringstart = 1;		/* column where current one starts */
int	advance = 1;			/* -1 if in backward print mode */

int	lfiscr = OFF;			/* line feed implies carriage return */
int	crislf = OFF;			/* carriage return implies line feed */

int	linespp = 0;			/* lines per page if it's positive */
int	markedpage = FALSE;		/* helps prevent trailing blank page */
int	page = 0;			/* page we're working on */
int	printed = 0;			/* printed this many pages */

Fontmap	fontmap[] = FONTMAP;		/* for translating font names */
char	*fontname = "Courier";		/* use this PostScript font */
int	shadowprint = OFF;		/* automatic bold printing if ON */

FILE	*fp_in;				/* read from this file */
FILE	*fp_out = stdout;		/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that translates Diablo 1640 files into PostScript. Nothing
 * is guaranteed - the program not well tested and doesn't implement everything.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* really just for error messages */

    init_signals();			/* sets up interrupt handling */
    header();				/* PostScript header comments */
    options();				/* handle the command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Makes sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    if ( DOROUND )
	cat(ROUNDPAGE);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */
    int		n;			/* for CR and LF modes */

/*
 *
 * Reads and processes the command line options. Added the -P option so arbitrary
 * PostScript code can be passed through. Expect it could be useful for changing
 * definitions in the prologue for which options have not been defined.
 *
 * Although any PostScript font can be used, things will only work for constant
 * width fonts.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'f':			/* use this PostScript font */
		    fontname = get_font(optarg);
		    fprintf(stdout, "/font /%s def\n", fontname);
		    break;

	    case 'h':			/* default character spacing */
		    ohmi = hmi = atoi(optarg) * HSCALE;
		    fprintf(stdout, "/hmi %s def\n", optarg);
		    break;

	    case 'l':			/* lines per page */
		    linespp = atoi(optarg);
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'r':			/* set CR and LF modes */
		    n = atoi(optarg);
		    if ( n & 01 )
			lfiscr = ON;
		    else lfiscr = OFF;
		    if ( n & 02 )
			crislf = ON;
		    else crislf = OFF;
		    break;

	    case 's':			/* point size */
		    fprintf(stdout, "/pointsize %s def\n", optarg);
		    break;

	    case 'v':			/* default line spacing */
		    ovmi = vmi = atoi(optarg) * VSCALE;
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

char *get_font(name)

    char	*name;			/* name the user asked for */

{

    int		i;			/* for looking through fontmap[] */

/*
 *
 * Called from options() to map a user's font name into a legal PostScript name.
 * If the lookup fails *name is returned to the caller. That should let you choose
 * any PostScript font, although things will only work well for constant width
 * fonts.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].val);

    return(name);

}   /* End of get_font */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

}   /* End of setup */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll process stdin.
 *
 */

    fp_in = stdin;

    if ( argc < 1 )
	text();
    else {				/* at least one argument is left */
	while ( argc > 0 )  {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    text();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */
    }   /* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files, so mark the end of the pages, make sure the
 * last page is printed, and restore the initial environment.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname);
    fprintf(stdout, "%s %d\n", PAGES, printed);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct provided it's not NULL. Accounting
 * is requested using the -A or -J options.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

text()

{

    int		ch;			/* next input character */

/*
 *
 * Translates the next input file into PostScript. The redirect(-1) call forces
 * the initial output to go to /dev/null - so the stuff formfeed() does at the
 * end of each page doesn't go to stdout.
 *
 */

    redirect(-1);			/* get ready for the first page */
    formfeed();				/* force PAGE comment etc. */
    inittabs();

    while ( (ch = getc(fp_in)) != EOF )
	switch ( ch )  {
	    case '\010':		/* backspace */
		    backspace();
		    break;

	    case '\011':		/* horizontal tab */
		    htab();
		    break;

	    case '\012':		/* new line */
		    linefeed();
		    break;

	    case '\013':		/* vertical tab */
		    vtab();
		    break;

	    case '\014':		/* form feed */
		    formfeed();
		    break;

	    case '\015':		/* carriage return */
		    carriage();
		    break;

	    case '\016':		/* extended character set - SO */
		    break;

	    case '\017':		/* extended character set - SI */
		    break;

	    case '\031':		/* next char from supplementary set */
		    break;

	    case '\033':		/* 2 or 3 byte escape sequence */
		    escape();
		    break;

	    default:
		    oput(ch);
		    break;
	}   /* End switch */

    formfeed();				/* next file starts on a new page? */

}   /* End of text */

/*****************************************************************************/

inittabs()

{

    int		i;			/* loop index */

/*
 *
 * Initializes the horizontal and vertical tab arrays. The way tabs are handled is
 * quite inefficient and may not work for all initial hmi or vmi values.
 *
 */

    for ( i = 0; i < COLUMNS; i++ )
	htabstops[i] = ((i % 8) == 0) ? ON : OFF;

    for ( i = 0; i < ROWS; i++ )
	vtabstops[i] = ((i * ovmi) > BOTTOMMARGIN) ? ON : OFF;

}   /* End of inittabs */

/*****************************************************************************/

cleartabs()

{

    int		i;			/* loop index */

/*
 *
 * Clears all horizontal and vertical tab stops.
 *
 */

    for ( i = 0; i < ROWS; i++ )
	htabstops[i] = OFF;

    for ( i = 0; i < COLUMNS; i++ )
	vtabstops[i] = OFF;

}   /* End of cleartabs */

/*****************************************************************************/

formfeed()

{

/*
 *
 * Called whenever we've finished with the last page and want to get ready for the
 * next one. Also used at the beginning and end of each input file, so we have to
 * be careful about what's done. I've added a simple test before the showpage that
 * should eliminate the extra blank page that was put out at the end of many jobs,
 * but the PAGES comments may be wrong.
 *
 */

    if ( fp_out == stdout )		/* count the last page */
	printed++;

    endline();				/* print the last line */

    fprintf(fp_out, "cleartomark\n");
    if ( feof(fp_in) == 0 || markedpage == TRUE )
	fprintf(fp_out, "showpage\n");
    fprintf(fp_out, "saveobj restore\n");
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);

    if ( ungetc(getc(fp_in), fp_in) == EOF )
	redirect(-1);
    else redirect(++page);

    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fprintf(fp_out, "/saveobj save def\n");
    fprintf(fp_out, "mark\n");
    writerequest(printed+1, fp_out);
    fprintf(fp_out, "%d pagesetup\n", printed+1);

    vgoto(topmargin);
    hgoto(leftmargin);

    markedpage = FALSE;

}   /* End of formfeed */

/*****************************************************************************/

linefeed()

{

    int		line = 0;		/* current line - based on ovmi */

/*
 *
 * Adjust our current vertical position. If we've passed the bottom of the page
 * or exceeded the number of lines per page, print it and go to the upper left
 * corner of the next page. This routine is also called from carriage() if crislf
 * is ON.
 *
 */

    vmot(vmi);

    if ( lfiscr == ON )
	hgoto(leftmargin);

    if ( linespp > 0 )			/* means something so see where we are */
	line = vpos / ovmi + 1;

    if ( vpos > bottommargin || line > linespp )
	formfeed();

}   /* End of linefeed */

/*****************************************************************************/

carriage()

{

/*
 *
 * Handles carriage return character. If crislf is ON we'll generate a line feed
 * every time we get a carriage return character.
 *
 */

    if ( shadowprint == ON )		/* back to normal mode */
	changefont(fontname);

    advance = 1;
    shadowprint = OFF;

    hgoto(leftmargin);

    if ( crislf == ON )
	linefeed();

}   /* End of carriage */

/*****************************************************************************/

htab()

{

    int		col;			/* 'column' we'll be at next */
    int		i;			/* loop index */

/*
 *
 * Tries to figure out where the next tab stop is. Wasn't positive about this
 * one, since hmi can change. I'll assume columns are determined by the original
 * value of hmi. That fixes them on the page, which seems to make more sense than
 * letting them float all over the place.
 *
 */

    endline();

    col = hpos/ohmi + 1;
    for ( i = col; i < ROWS; i++ )
	if ( htabstops[i] == ON )  {
	    col = i;
	    break;
	}   /* End if */

    hgoto(col * ohmi);
    lastx = hpos;

}   /* End of htab */

/*****************************************************************************/

vtab()

{

    int		line;			/* line we'll be at next */
    int		i;			/* loop index */

/*
 *
 * Looks for the next vertical tab stop in the vtabstops[] array and moves to that
 * line. If we don't find a tab we'll just move down one line - shouldn't happen.
 *
 */

    endline();

    line = vpos/ovmi + 1;
    for ( i = line; i < COLUMNS; i++ )
	if ( vtabstops[i] == ON )  {
	    line = i;
	    break;
	}   /* End if */

    vgoto(line * ovmi);

}   /* End of vtab */

/*****************************************************************************/

backspace()

{

/*
 *
 * Moves backwards a distance equal to the current value of hmi, but don't go
 * past the left margin.
 *
 */

    endline();

    if ( hpos - leftmargin >= hmi )
	hmot(-hmi);
    else hgoto(leftmargin);		/* maybe just ignore the backspace?? */

    lastx = hpos;

}   /* End of backspace */

/*****************************************************************************/

escape()

{

    int		ch;			/* control character */

/*
 *
 * Handles special codes that are expected to follow an escape character. The
 * initial escape character is followed by one or two bytes.
 *
 */

    switch ( ch = getc(fp_in) ) {
	case 'T':			/* top margin */
		topmargin = vpos;
		break;

	case 'L':			/* bottom margin */
		bottommargin = vpos;
		break;

	case 'C':			/* clear top and bottom margins */
		bottommargin = BOTTOMMARGIN;
		topmargin = TOPMARGIN;
		break;

	case '9':			/* left margin */
		leftmargin = hpos;
		break;

	case '0':			/* right margin */
		rightmargin = hpos;
		break;

	case '1':			/* set horizontal tab */
		htabstops[hpos/ohmi] = ON;
		break;

	case '8':			/* clear horizontal tab at hpos */
		htabstops[hpos/ohmi] = OFF;
		break;

	case '-':			/* set vertical tab */
		vtabstops[vpos/ovmi] = ON;
		break;

	case '2':			/* clear all tabs */
		cleartabs();
		break;

	case '\014':			/* set lines per page */
		linespp = getc(fp_in);
		break;

	case '\037':			/* set hmi to next byte minus 1 */
		hmi = HSCALE * (getc(fp_in) - 1);
		break;

	case 'S':			/* reset hmi to default */
		hmi = ohmi;
		break;

	case '\011':			/* move to column given by next byte */
		hgoto((getc(fp_in)-1) * ohmi);
		break;

	case '?':			/* do carriage return after line feed */
		lfiscr = ON;
		break;

	case '!':			/* don't generate carriage return */
		lfiscr = OFF;
		break;

	case '5':			/* forward print mode */
		advance = 1;
		break;

	case '6':			/* backward print mode */
		advance = -1;
		break;

	case '\036':			/* set vmi to next byte minus 1 */
		vmi = VSCALE * (getc(fp_in) - 1);
		break;

	case '\013':			/* move to line given by next byte */
		vgoto((getc(fp_in)-1) * ovmi);
		break;

	case 'U':			/* positive half line feed */
		vmot(vmi/2);
		break;

	case 'D':			/* negative half line feed */
		vmot(-vmi/2);
		break;

	case '\012':			/* negative line feed */
		vmot(-vmi);
		break;

	case '\015':			/* clear all margins */
		bottommargin = BOTTOMMARGIN;
		topmargin = TOPMARGIN;
		leftmargin = BOTTOMMARGIN;
		rightmargin = RIGHTMARGIN;
		break;

	case 'E':			/* auto underscore - use italic font */
		changefont("/Courier-Oblique");
		break;

	case 'R':			/* disable auto underscore */
		changefont(fontname);
		break;

	case 'O':			/* bold/shadow printing */
	case 'W':
		changefont("/Courier-Bold");
		shadowprint = ON;
		break;

	case '&':			/* disable bold printing */
		changefont(fontname);
		shadowprint = OFF;
		break;

	case '/':			/* ignored 2 byte escapes */
	case '\\':
	case '<':
	case '>':
	case '%':
	case '=':
	case '.':
	case '4':
	case 'A':
	case 'B':
	case 'M':
	case 'N':
	case 'P':
	case 'Q':
	case 'X':
	case '\010':
		break;

	case ',':			/* ignored 3 byte escapes */
	case '\016':
	case '\021':
		getc(fp_in);
		break;

	case '3':			/* graphics mode - should quit! */
	case '7':
	case 'G':
	case 'V':
	case 'Y':
	case 'Z':
		error(FATAL, "graphics mode is not implemented");
		break;

	default:
		error(FATAL, "missing case for escape o%o\n", ch);
		break;
    }	/* End switch */

}   /* End of escape */

/*****************************************************************************/

vmot(n)

    int		n;			/* move this far vertically */

{

/*
 *
 * Move vertically n units from where we are.
 *
 */

    vpos += n;

}   /* End of vmot */

/*****************************************************************************/

vgoto(n)

    int		n;			/* new vertical position */

{

/*
 *
 * Moves to absolute vertical position n.
 *
 */

    vpos = n;

}   /* End of vgoto */

/*****************************************************************************/

hmot(n)

    int		n;			/* move this horizontally */

{

/*
 *
 * Moves horizontally n units from our current position.
 *
 */

    hpos += n * advance;

    if ( hpos < leftmargin )
	hpos = leftmargin;

}   /* End of hmot */

/*****************************************************************************/

hgoto(n)

    int		n;			/* go to this horizontal position */

{

/*
 *
 * Moves to absolute horizontal position n.
 *
 */

    hpos = n;

}   /* End of hgoto */

/*****************************************************************************/

changefont(name)

    char	*name;

{

/*
 *
 * Changes the current font. Used to get in and out of auto underscore and bold
 * printing.
 *
 */

    endline();
    fprintf(fp_out, "%s f\n", name);

}   /* End of changefont */

/*****************************************************************************/

startline()

{

/*
 *
 * Called whenever we want to be certain we're ready to start pushing characters
 * into an open string on the stack. If stringcount is positive we've already
 * started, so there's nothing to do. The first string starts in column 1.
 *
 */

    if ( stringcount < 1 )  {
	putc('(', fp_out);
	stringstart = lastx = hpos;
	lasty = vpos;
	lasthmi = hmi;
	lastc = -1;
	prevx = -1;
	stringcount = 1;
    }	/* End if */

}   /* End of startline */

/*****************************************************************************/

endline()

{

/*
 *
 * Generates a call to the PostScript procedure that processes the text on the
 * the stack - provided stringcount is positive.
 *
 */

    if ( stringcount > 0 )
	fprintf(fp_out, ")%d %d %d t\n", stringstart, lasty, lasthmi);

    stringcount = 0;

}   /* End of endline */

/*****************************************************************************/

endstring()

{

/*
 *
 * Takes the string we've been working on and adds it to the output file. Called
 * when we need to adjust our horizontal position before starting a new string.
 * Also called from endline() when we're done with the current line.
 *
 */

    if ( stringcount > 0 )  {
	fprintf(fp_out, ")%d(", stringstart);
	lastx = stringstart = hpos;
	stringcount++;
    }	/* End if */

}   /* End of endstring */

/*****************************************************************************/

oput(ch)

    int		ch;			/* next output character */

{

/*
 *
 * Responsible for adding all printing characters from the input file to the
 * open string on top of the stack. The only other characters that end up in
 * that string are the quotes required for special characters. Reverse printing
 * mode hasn't been tested but it should be close. hpos and lastx should disagree
 * each time (except after startline() does something), and that should force a
 * call to endstring() for every character.
 *
 */

    if ( stringcount > 100 )		/* don't put too much on the stack */
	endline();

    if ( vpos != lasty )
	endline();

    if ( advance == -1 )		/* for reverse printing - move first */
	hmot(hmi);

    startline();

    if ( lastc != ch || hpos != prevx )  {
	if ( lastx != hpos )
	    endstring();

	if ( isascii(ch) && isprint(ch) ) {
	    if ( ch == '\\' || ch == '(' || ch == ')' )
		putc('\\', fp_out);
	    putc(ch, fp_out);
	} else fprintf(fp_out, "\\%.3o", ch & 0377);

	lastc = ch;
	prevx = hpos;
	lastx += lasthmi;
    }	/* End if */

    if ( advance != -1 )
	hmot(hmi);

    markedpage = TRUE;

}   /* End of oput */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014230643021006440057030057030000011712360522627503500003200000000127post.src/postdaisy/README
Diablo 630 to PostScript translator. Not terribly useful, and much has
been omitted.

0707070014230637761006400057030057030000011712300522633075400003700000007451post.src/postdaisy/postdaisy.1.ds dQ /usr/lib/postscript
.TH POSTDAISY 1 "DWB 3.2"
.SH NAME
.B postdaisy
\- PostScript translator for Diablo 630 files
.SH SYNOPSIS
\*(mBpostdaisy\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B postdaisy
translates Diablo 630 daisy-wheel
.I files
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-f name
Print
.I files
using font
.IR name .
Any PostScript font can be used,
although the best results will only be
obtained with constant width fonts.
The default font is Courier.
.TP
.OP \-h num
Set the initial horizontal motion index to
.IR num .
Determines the character advance and the default
point size, unless the
.OP \-s
option is used.
The default is 12.
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which is located near the upper left corner of
each page.
The default magnification is 1.0.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP
.OP \-r num
Selects carriage return and line feed behavior.
If
.I num
is 1 a line feed generates a carriage return.
If
.I num
is 2 a carriage return generates a line feed.
Setting
.I num
to 3 enables both modes.
.TP
.OP \-s num
Use point size
.I num
instead of the default value set by the
initial horizontal motion index.
.TP
.OP \-v num
Set the initial vertical motion index to
.IR num .
The default is 8.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed near the
upper left corner of the page, with positive
x to the right and positive y down the page.
Positive
.I num
moves everything right.
The default offset is 0.25 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves text down the page.
The default offset is 0.25 inches.
.TP
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ/ name .enc \f1.
A nonexistent encoding file is silently ignored.
The default selects file
.MR \*(dQ/Default.enc .
.TP
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/postdaisy.ps .
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include
.I string
in output file;
.I string
must be legitimate PostScript.
.TP
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request ,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0, the request
applies to all pages.
If
.I file
is omitted, the request
lookup is done in
.MR \*(dQ/ps.requests .
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.SH FILES
.MW \*(dQ/postdaisy.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR dpost (1),
.BR postdmd (1),
.BR postio (1),
.BR postmd (1),
.BR postprint (1),
.BR postreverse (1),
.BR posttek (1),
.BR psencoding (1)
0707070014230643041006440057030057030000011712560522627503500004000000003367post.src/postdaisy/postdaisy.ps%
% Version 3.3.2 prologue for Diablo 1640 files.
%

/#copies 1 store
/aspectratio 1 def
/font /Courier def
/formsperpage 1 def
/hmi 12 def
/landscape false def
/magnification 1 def
/margin 10 def
/orientation 0 def
/resolution 240 def
/rotation 1 def
/xoffset .25 def
/yoffset .25 def

/roundpage true def
/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/ashow {ashow} bind def		% so later references don't bind
/stringwidth {stringwidth} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if
	/scaling 72 resolution div def
	currentdict /pointsize known not {/pointsize hmi def} if
	font findfont pointsize scaling div scalefont setfont
	/charwidth (M) stringwidth pop def

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	width 2 div neg height 2 div translate
	xoffset inch yoffset inch neg translate
	margin 2 div dup neg translate
	magnification dup aspectratio mul scale
	height width div 1 min dup scale
	scaling dup scale
} def

/pagedimensions {
	useclippath userdict /gotpagebbox known not and {
		/pagebbox [clippath pathbbox newpath] def
		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def 0 0 moveto} bind def

/t {
	charwidth sub /advance exch def
	neg /y exch def
	counttomark 2 idiv {y moveto advance 0 3 -1 roll ashow} repeat
} bind def

/f {findfont pointsize scaling div scalefont setfont} bind def

/done {/lastpage where {pop lastpage} if} def
0707070014230643051006440057030057030000011713700522627503500004000000067255post.src/postdaisy/Opostdaisy.c/*
 *
 * postdaisy - PostScript translator for Diablo 1640 files.
 *
 * A program that translates Diablo 1640 files into PostScript. Absolutely nothing
 * is guaranteed. Quite a few things haven't been implemented, and what's been
 * done isn't well tested. Most of the documentation used to write this program
 * was taken from the 'Diablo Emulator' section of a recent Imagen manual.
 *
 * Some of document comments that are generated may not be right. Most of the test
 * files I used produced a trailing blank page. I've put a check in formfeed() that
 * won't print the last page if it doesn't contain any text, but PAGES comments may
 * not be right. The DOCUMENTFONTS comment will also be wrong if auto underline or
 * bold printing have been turned on by escape commands.
 *
 * The brute force approach used to implement horizontal and vertical tabs leaves
 * much to be desired, and may not work for very small initial hmi and vmi values.
 * At the very least I should have used malloc() to get space for the two tabstop
 * arrays after hmi and vmi are known!
 *
 * Reverse printing mode hasn't been tested at all, but what's here should be
 * close even though it's not efficient.
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following PostScript procedures
 * are defined in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how this program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects to
 *	    find the current page number on the stack.
 *
 *	t
 *
 *	  mark str1 x1 str2 x2 ... strn xn y hmi t mark
 *
 *	    Handles all the text on the stack. Characters in the strings are
 *	    printed using hmi as the character advance, and all strings are at
 *	    vertical position y. Each string is begins at the horizontal position
 *	    that preceeds it.
 *
 *	f
 *
 *	  font f -
 *
 *	    Use font f, where f is the full PostScript font name. Only used when
 *	    we switch to auto underline (Courier-Italic) or bold (Courier-Bold)
 *	    printing.
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable declarations */
#include "postdaisy.h"			/* a few special definitions */

char	*optnames = "a:c:f:h:l:m:n:o:p:r:s:v:x:y:A:C:E:J:L:P:DI";

char	*prologue = POSTDAISY;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */

char	htabstops[COLUMNS];		/* horizontal */
char	vtabstops[ROWS];		/* and vertical tabs */

int	res = RES;			/* input file resolution - sort of */

int	hmi = HMI;			/* horizontal motion index - 1/120 inch */
int	vmi = VMI;			/* vertical motion index - 1/48 inch */
int	ohmi = HMI;			/* original hmi */
int	ovmi = VMI;			/* and vmi - for tabs and char size */

int	hpos = 0;			/* current horizontal */
int	vpos = 0;			/* and vertical position */

int	lastx = -1;			/* printer's last horizontal */
int	lasty = -1;			/* and vertical position */
int	lasthmi = -1;			/* hmi for current text strings */

int	lastc = -1;			/* last printed character */
int	prevx = -1;			/* at this position */

int	leftmargin = LEFTMARGIN;	/* page margins */
int	rightmargin = RIGHTMARGIN;
int	topmargin = TOPMARGIN;
int	bottommargin = BOTTOMMARGIN;

int	stringcount = 0;		/* number of strings on the stack */
int	stringstart = 1;		/* column where current one starts */
int	advance = 1;			/* -1 if in backward print mode */

int	lfiscr = OFF;			/* line feed implies carriage return */
int	crislf = OFF;			/* carriage return implies line feed */

int	linespp = 0;			/* lines per page if it's positive */
int	markedpage = FALSE;		/* helps prevent trailing blank page */
int	page = 0;			/* page we're working on */
int	printed = 0;			/* printed this many pages */

Fontmap	fontmap[] = FONTMAP;		/* for translating font names */
char	*fontname = "Courier";		/* use this PostScript font */
int	shadowprint = OFF;		/* automatic bold printing if ON */

FILE	*fp_in;				/* read from this file */
FILE	*fp_out = stdout;		/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that translates Diablo 1640 files into PostScript. Nothing
 * is guaranteed - the program not well tested and doesn't implement everything.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* really just for error messages */

    init_signals();			/* sets up interrupt handling */
    header();				/* PostScript header comments */
    options();				/* handle the command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

    int		interrupt();		/* signal handler */

/*
 *
 * Makes sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    if ( DOROUND )
	cat(ROUNDPAGE);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */
    int		n;			/* for CR and LF modes */

/*
 *
 * Reads and processes the command line options. Added the -P option so arbitrary
 * PostScript code can be passed through. Expect it could be useful for changing
 * definitions in the prologue for which options have not been defined.
 *
 * Although any PostScript font can be used, things will only work for constant
 * width fonts.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'f':			/* use this PostScript font */
		    fontname = get_font(optarg);
		    fprintf(stdout, "/font /%s def\n", fontname);
		    break;

	    case 'h':			/* default character spacing */
		    ohmi = hmi = atoi(optarg) * HSCALE;
		    fprintf(stdout, "/hmi %s def\n", optarg);
		    break;

	    case 'l':			/* lines per page */
		    linespp = atoi(optarg);
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'r':			/* set CR and LF modes */
		    n = atoi(optarg);
		    if ( n & 01 )
			lfiscr = ON;
		    else lfiscr = OFF;
		    if ( n & 02 )
			crislf = ON;
		    else crislf = OFF;
		    break;

	    case 's':			/* point size */
		    fprintf(stdout, "/pointsize %s def\n", optarg);
		    break;

	    case 'v':			/* default line spacing */
		    ovmi = vmi = atoi(optarg) * VSCALE;
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

char *get_font(name)

    char	*name;			/* name the user asked for */

{

    int		i;			/* for looking through fontmap[] */

/*
 *
 * Called from options() to map a user's font name into a legal PostScript name.
 * If the lookup fails *name is returned to the caller. That should let you choose
 * any PostScript font, although things will only work well for constant width
 * fonts.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].val);

    return(name);

}   /* End of get_font */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

}   /* End of setup */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll process stdin.
 *
 */

    fp_in = stdin;

    if ( argc < 1 )
	text();
    else {				/* at least one argument is left */
	while ( argc > 0 )  {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    text();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */
    }   /* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files, so mark the end of the pages, make sure the
 * last page is printed, and restore the initial environment.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname);
    fprintf(stdout, "%s %d\n", PAGES, printed);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct provided it's not NULL. Accounting
 * is requested using the -A or -J options.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

text()

{

    int		ch;			/* next input character */

/*
 *
 * Translates the next input file into PostScript. The redirect(-1) call forces
 * the initial output to go to /dev/null - so the stuff formfeed() does at the
 * end of each page doesn't go to stdout.
 *
 */

    redirect(-1);			/* get ready for the first page */
    formfeed();				/* force PAGE comment etc. */
    inittabs();

    while ( (ch = getc(fp_in)) != EOF )
	switch ( ch )  {
	    case '\010':		/* backspace */
		    backspace();
		    break;

	    case '\011':		/* horizontal tab */
		    htab();
		    break;

	    case '\012':		/* new line */
		    linefeed();
		    break;

	    case '\013':		/* vertical tab */
		    vtab();
		    break;

	    case '\014':		/* form feed */
		    formfeed();
		    break;

	    case '\015':		/* carriage return */
		    carriage();
		    break;

	    case '\016':		/* extended character set - SO */
		    break;

	    case '\017':		/* extended character set - SI */
		    break;

	    case '\031':		/* next char from supplementary set */
		    break;

	    case '\033':		/* 2 or 3 byte escape sequence */
		    escape();
		    break;

	    default:
		    if ( isascii(ch) && isprint(ch) )
			oput(ch);
		    break;
	}   /* End switch */

    formfeed();				/* next file starts on a new page? */

}   /* End of text */

/*****************************************************************************/

inittabs()

{

    int		i;			/* loop index */

/*
 *
 * Initializes the horizontal and vertical tab arrays. The way tabs are handled is
 * quite inefficient and may not work for all initial hmi or vmi values.
 *
 */

    for ( i = 0; i < COLUMNS; i++ )
	htabstops[i] = ((i % 8) == 0) ? ON : OFF;

    for ( i = 0; i < ROWS; i++ )
	vtabstops[i] = ((i * ovmi) > BOTTOMMARGIN) ? ON : OFF;

}   /* End of inittabs */

/*****************************************************************************/

cleartabs()

{

    int		i;			/* loop index */

/*
 *
 * Clears all horizontal and vertical tab stops.
 *
 */

    for ( i = 0; i < ROWS; i++ )
	htabstops[i] = OFF;

    for ( i = 0; i < COLUMNS; i++ )
	vtabstops[i] = OFF;

}   /* End of cleartabs */

/*****************************************************************************/

formfeed()

{

/*
 *
 * Called whenever we've finished with the last page and want to get ready for the
 * next one. Also used at the beginning and end of each input file, so we have to
 * be careful about what's done. I've added a simple test before the showpage that
 * should eliminate the extra blank page that was put out at the end of many jobs,
 * but the PAGES comments may be wrong.
 *
 */

    if ( fp_out == stdout )		/* count the last page */
	printed++;

    endline();				/* print the last line */

    fprintf(fp_out, "cleartomark\n");
    if ( feof(fp_in) == 0 || markedpage == TRUE )
	fprintf(fp_out, "showpage\n");
    fprintf(fp_out, "saveobj restore\n");
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);

    if ( ungetc(getc(fp_in), fp_in) == EOF )
	redirect(-1);
    else redirect(++page);

    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fprintf(fp_out, "/saveobj save def\n");
    fprintf(fp_out, "mark\n");
    writerequest(printed+1, fp_out);
    fprintf(fp_out, "%d pagesetup\n", printed+1);

    vgoto(topmargin);
    hgoto(leftmargin);

    markedpage = FALSE;

}   /* End of formfeed */

/*****************************************************************************/

linefeed()

{

    int		line = 0;		/* current line - based on ovmi */

/*
 *
 * Adjust our current vertical position. If we've passed the bottom of the page
 * or exceeded the number of lines per page, print it and go to the upper left
 * corner of the next page. This routine is also called from carriage() if crislf
 * is ON.
 *
 */

    vmot(vmi);

    if ( lfiscr == ON )
	hgoto(leftmargin);

    if ( linespp > 0 )			/* means something so see where we are */
	line = vpos / ovmi + 1;

    if ( vpos > bottommargin || line > linespp )
	formfeed();

}   /* End of linefeed */

/*****************************************************************************/

carriage()

{

/*
 *
 * Handles carriage return character. If crislf is ON we'll generate a line feed
 * every time we get a carriage return character.
 *
 */

    if ( shadowprint == ON )		/* back to normal mode */
	changefont(fontname);

    advance = 1;
    shadowprint = OFF;

    hgoto(leftmargin);

    if ( crislf == ON )
	linefeed();

}   /* End of carriage */

/*****************************************************************************/

htab()

{

    int		col;			/* 'column' we'll be at next */
    int		i;			/* loop index */

/*
 *
 * Tries to figure out where the next tab stop is. Wasn't positive about this
 * one, since hmi can change. I'll assume columns are determined by the original
 * value of hmi. That fixes them on the page, which seems to make more sense than
 * letting them float all over the place.
 *
 */

    endline();

    col = hpos/ohmi + 1;
    for ( i = col; i < ROWS; i++ )
	if ( htabstops[i] == ON )  {
	    col = i;
	    break;
	}   /* End if */

    hgoto(col * ohmi);
    lastx = hpos;

}   /* End of htab */

/*****************************************************************************/

vtab()

{

    int		line;			/* line we'll be at next */
    int		i;			/* loop index */

/*
 *
 * Looks for the next vertical tab stop in the vtabstops[] array and moves to that
 * line. If we don't find a tab we'll just move down one line - shouldn't happen.
 *
 */

    endline();

    line = vpos/ovmi + 1;
    for ( i = line; i < COLUMNS; i++ )
	if ( vtabstops[i] == ON )  {
	    line = i;
	    break;
	}   /* End if */

    vgoto(line * ovmi);

}   /* End of vtab */

/*****************************************************************************/

backspace()

{

/*
 *
 * Moves backwards a distance equal to the current value of hmi, but don't go
 * past the left margin.
 *
 */

    endline();

    if ( hpos - leftmargin >= hmi )
	hmot(-hmi);
    else hgoto(leftmargin);		/* maybe just ignore the backspace?? */

    lastx = hpos;

}   /* End of backspace */

/*****************************************************************************/

escape()

{

    int		ch;			/* control character */

/*
 *
 * Handles special codes that are expected to follow an escape character. The
 * initial escape character is followed by one or two bytes.
 *
 */

    switch ( ch = getc(fp_in) ) {
	case 'T':			/* top margin */
		topmargin = vpos;
		break;

	case 'L':			/* bottom margin */
		bottommargin = vpos;
		break;

	case 'C':			/* clear top and bottom margins */
		bottommargin = BOTTOMMARGIN;
		topmargin = TOPMARGIN;
		break;

	case '9':			/* left margin */
		leftmargin = hpos;
		break;

	case '0':			/* right margin */
		rightmargin = hpos;
		break;

	case '1':			/* set horizontal tab */
		htabstops[hpos/ohmi] = ON;
		break;

	case '8':			/* clear horizontal tab at hpos */
		htabstops[hpos/ohmi] = OFF;
		break;

	case '-':			/* set vertical tab */
		vtabstops[vpos/ovmi] = ON;
		break;

	case '2':			/* clear all tabs */
		cleartabs();
		break;

	case '\014':			/* set lines per page */
		linespp = getc(fp_in);
		break;

	case '\037':			/* set hmi to next byte minus 1 */
		hmi = HSCALE * (getc(fp_in) - 1);
		break;

	case 'S':			/* reset hmi to default */
		hmi = ohmi;
		break;

	case '\011':			/* move to column given by next byte */
		hgoto((getc(fp_in)-1) * ohmi);
		break;

	case '?':			/* do carriage return after line feed */
		lfiscr = ON;
		break;

	case '!':			/* don't generate carriage return */
		lfiscr = OFF;
		break;

	case '5':			/* forward print mode */
		advance = 1;
		break;

	case '6':			/* backward print mode */
		advance = -1;
		break;

	case '\036':			/* set vmi to next byte minus 1 */
		vmi = VSCALE * (getc(fp_in) - 1);
		break;

	case '\013':			/* move to line given by next byte */
		vgoto((getc(fp_in)-1) * ovmi);
		break;

	case 'U':			/* positive half line feed */
		vmot(vmi/2);
		break;

	case 'D':			/* negative half line feed */
		vmot(-vmi/2);
		break;

	case '\012':			/* negative line feed */
		vmot(-vmi);
		break;

	case '\015':			/* clear all margins */
		bottommargin = BOTTOMMARGIN;
		topmargin = TOPMARGIN;
		leftmargin = BOTTOMMARGIN;
		rightmargin = RIGHTMARGIN;
		break;

	case 'E':			/* auto underscore - use italic font */
		changefont("/Courier-Oblique");
		break;

	case 'R':			/* disable auto underscore */
		changefont(fontname);
		break;

	case 'O':			/* bold/shadow printing */
	case 'W':
		changefont("/Courier-Bold");
		shadowprint = ON;
		break;

	case '&':			/* disable bold printing */
		changefont(fontname);
		shadowprint = OFF;
		break;

	case '/':			/* ignored 2 byte escapes */
	case '\\':
	case '<':
	case '>':
	case '%':
	case '=':
	case '.':
	case '4':
	case 'A':
	case 'B':
	case 'M':
	case 'N':
	case 'P':
	case 'Q':
	case 'X':
	case '\010':
		break;

	case ',':			/* ignored 3 byte escapes */
	case '\016':
	case '\021':
		getc(fp_in);
		break;

	case '3':			/* graphics mode - should quit! */
	case '7':
	case 'G':
	case 'V':
	case 'Y':
	case 'Z':
		error(FATAL, "graphics mode is not implemented");
		break;

	default:
		error(FATAL, "missing case for escape o%o\n", ch);
		break;
    }	/* End switch */

}   /* End of escape */

/*****************************************************************************/

vmot(n)

    int		n;			/* move this far vertically */

{

/*
 *
 * Move vertically n units from where we are.
 *
 */

    vpos += n;

}   /* End of vmot */

/*****************************************************************************/

vgoto(n)

    int		n;			/* new vertical position */

{

/*
 *
 * Moves to absolute vertical position n.
 *
 */

    vpos = n;

}   /* End of vgoto */

/*****************************************************************************/

hmot(n)

    int		n;			/* move this horizontally */

{

/*
 *
 * Moves horizontally n units from our current position.
 *
 */

    hpos += n * advance;

    if ( hpos < leftmargin )
	hpos = leftmargin;

}   /* End of hmot */

/*****************************************************************************/

hgoto(n)

    int		n;			/* go to this horizontal position */

{

/*
 *
 * Moves to absolute horizontal position n.
 *
 */

    hpos = n;

}   /* End of hgoto */

/*****************************************************************************/

changefont(name)

    char	*name;

{

/*
 *
 * Changes the current font. Used to get in and out of auto underscore and bold
 * printing.
 *
 */

    endline();
    fprintf(fp_out, "%s f\n", name);

}   /* End of changefont */

/*****************************************************************************/

startline()

{

/*
 *
 * Called whenever we want to be certain we're ready to start pushing characters
 * into an open string on the stack. If stringcount is positive we've already
 * started, so there's nothing to do. The first string starts in column 1.
 *
 */

    if ( stringcount < 1 )  {
	putc('(', fp_out);
	stringstart = lastx = hpos;
	lasty = vpos;
	lasthmi = hmi;
	lastc = -1;
	prevx = -1;
	stringcount = 1;
    }	/* End if */

}   /* End of startline */

/*****************************************************************************/

endline()

{

/*
 *
 * Generates a call to the PostScript procedure that processes the text on the
 * the stack - provided stringcount is positive.
 *
 */

    if ( stringcount > 0 )
	fprintf(fp_out, ")%d %d %d t\n", stringstart, lasty, lasthmi);

    stringcount = 0;

}   /* End of endline */

/*****************************************************************************/

endstring()

{

/*
 *
 * Takes the string we've been working on and adds it to the output file. Called
 * when we need to adjust our horizontal position before starting a new string.
 * Also called from endline() when we're done with the current line.
 *
 */

    if ( stringcount > 0 )  {
	fprintf(fp_out, ")%d(", stringstart);
	lastx = stringstart = hpos;
	stringcount++;
    }	/* End if */

}   /* End of endstring */

/*****************************************************************************/

oput(ch)

    int		ch;			/* next output character */

{

/*
 *
 * Responsible for adding all printing characters from the input file to the
 * open string on top of the stack. The only other characters that end up in
 * that string are the quotes required for special characters. Reverse printing
 * mode hasn't been tested but it should be close. hpos and lastx should disagree
 * each time (except after startline() does something), and that should force a
 * call to endstring() for every character.
 *
 */

    if ( stringcount > 100 )		/* don't put too much on the stack */
	endline();

    if ( vpos != lasty )
	endline();

    if ( advance == -1 )		/* for reverse printing - move first */
	hmot(hmi);

    startline();

    if ( lastc != ch || hpos != prevx )  {
	if ( lastx != hpos )
	    endstring();

	if ( ch == '\\' || ch == '(' || ch == ')' )
	    putc('\\', fp_out);
	putc(ch, fp_out);

	lastc = ch;
	prevx = hpos;
	lastx += lasthmi;
    }	/* End if */

    if ( advance != -1 )
	hmot(hmi);

    markedpage = TRUE;

}   /* End of oput */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014230735640407550057030057030000020015370522633075500002100000000000post.src/postdmd0707070014230735651006440057030057030000010015060522627503500003000000001317post.src/postdmd/README
DMD bitmap to PostScript translator. Much of the code came from abm,
which was written by Guy Riddle.

By default 6 byte patterns are used to encode the output bitmap. Use
the -b option to change the pattern size. Bitmaps are unpacked one
scanline at a time and re-encoded in a format that looks like,

	bytes patterns count

where bytes and count are decimal integers and patterns is a series
of hex digits. Bytes is the number of bytes represented by the hex
pattern, and count is the number of additional times the pattern
should be repeated. For example,

	2 FFFF 4
	5 FFFFFFFFFF 1
       10 FFFFFFFFFFFFFFFFFFFF 0

all represent 10 consecutive bytes of ones. Scanlines are terminated
by a 0 on a line by itself.

0707070014230732611006400057030057030000010015760522633075500003400000003714post.src/postdmd/postdmd.mkMAKE=/bin/make
MAKEFILE=postdmd.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=$(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=postdmd.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o

all : postdmd

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp postdmd $(POSTBIN)/postdmd
	@chmod 755 $(POSTBIN)/postdmd
	@chgrp $(GROUP) $(POSTBIN)/postdmd
	@chown $(OWNER) $(POSTBIN)/postdmd
	cp postdmd.ps $(POSTLIB)/postdmd.ps
	@chmod 644 $(POSTLIB)/postdmd.ps
	@chgrp $(GROUP) $(POSTLIB)/postdmd.ps
	@chown $(OWNER) $(POSTLIB)/postdmd.ps
	cp postdmd.1 $(MAN1DIR)/postdmd.1
	@chmod 644 $(MAN1DIR)/postdmd.1
	@chgrp $(GROUP) $(MAN1DIR)/postdmd.1
	@chown $(OWNER) $(MAN1DIR)/postdmd.1

clean :
	rm -f *.o

clobber : clean
	rm -f postdmd

postdmd : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postdmd $(OFILES)

postdmd.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	postdmd.1 >XXX.1; \
	mv XXX.1 postdmd.1

0707070014230735671006440057030057030000010015400522627503500003300000050035post.src/postdmd/postdmd.c/*
 *
 * postdmd - PostScript translator for DMD bitmap files.
 *
 * A simple program that can be used to print DMD bitmaps on PostScript printers.
 * Much of the code was borrowed from abm, which was written by Guy Riddle.
 *
 * Although the program supports two different input bitmap formats, by far the
 * most important is the Eighth (and Ninth) Edition bitfile format. A bitmap in
 * the bitfile format begins with a 10 byte header with the first two bytes set to
 * zero. The next 8 bytes set the x and y coordinates of the bitmap's origin and
 * corner (ie. the upper left and lower right corners). The compressed raster data
 * follows the header and consists of control bytes followed an appropriate number
 * of data bytes. Control bytes (ie. n) less than 127 means read the next 2*n bytes 
 * of raster data directly from the input file, while if n is larger than 128 we
 * read two bytes from the input file and replicate the bytes n-128 times. After
 * each scan line is recovered it's exclusive-or'd with the preceeding line to
 * generate the real raster data.
 *
 * After each raster line is recovered postdmd encodes it in a slightly different
 * format that's designed to be unpacked by a PostScript procedure that's defined
 * in the prologue. By default no exclusive-or'ing is done and packing of pattern
 * data can be based on any number of bytes rather than just the next two bytes.
 * By default 6 byte patterns are used, but any number can be selected with the -b
 * option. A non-positive argument (eg. -b0) disables all pattern encoding. Larger
 * patterns increase the size of the output file, but reduce the work load that's
 * forced on the PostScript interpreter. The default choices I've made (ie. 6 byte
 * patterns and no exclusive-or'ing) do a decent balancing job across currently
 * available PostScript printers. Larger patterns (eg. -b16) increase the output
 * file size, but may be appropriate if you're running at a high baud rate (eg.
 * 19.2KB), while smaller patter size (eg. -b4) may help if you've got a printer
 * with a fast processor (eg. a PS-810).
 *
 * The encoding produced by the program (and decoded on the printer) looks like,
 * 
 * 	bytes patterns count
 * 
 * where bytes and count are decimal integers and patterns is a hex string. Bytes
 * is the number of bytes represented by the hex patterns and count is the number
 * of additional times the patterns should be repeated. For example,
 * 
 * 	2 FFFF 4
 * 	5 FFFFFFFFFF 1
 *     10 FFFFFFFFFFFFFFFFFFFF 0
 * 
 * all represent 10 consecutive bytes of ones. Scanlines are terminated by a 0 on
 * a line by itself.
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following PostScript procedures
 * are defined in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how this program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects
 *	    to find the current page number on the stack.
 *
 *	bitmap
 *
 *	  v8format flip scanlength scanlines bitmap -
 *
 *	    Prints the bitmap that's read from standard input. The bitmap consists
 *	    of scanlines lines, each of which includes scanlength pixels. If
 *	    v8format is true the picture is assumed to be an Eighth Edition bitmap,
 *	    and the exclusive-or'ing will be done on the printer.
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable declarations */

char	*optnames = "a:b:c:fm:n:o:p:ux:y:A:C:E:J:L:P:DI";

char	*prologue = POSTDMD;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */

int	bbox[2] = {0, 0};		/* upper right coordinates only */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */

int	bytespp = 6;			/* bytes per pattern - on output */
int	flip = FALSE;			/* ones complement the bitmap */
int	v8undo = TRUE;			/* xor'ing done on host if TRUE */
int	v8format = FALSE;		/* for Eighth Edition bitmaps */

int	page = 0;			/* last page we worked on */
int	printed = 0;			/* and the number of pages printed */

int	patterns;			/* 16 bit patterns per scan line */
int	scanlines;			/* lines in the bitmap */
int	patcount = 0;			/* should be patterns * scanlines */

char	*raster = NULL;			/* next raster line */
char	*prevrast = NULL;		/* and the previous one - v8format */
char	*rptr;				/* next free byte in raster */
char	*eptr;				/* one past the last byte in raster */

FILE	*fp_in = NULL;			/* read from this file */
FILE	*fp_out = stdout;		/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that translates DMD bitmap files into PostScript. There can
 * be more than one bitmap per file, but none can be split across input files.
 * Each bitmap goes on a page by itself.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* really just for error messages */

    init_signals();			/* sets up interrupt handling */
    header();				/* PostScript header comments */
    options();				/* handle the command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Make sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */

/*
 *
 * Reads and processes the command line options. Added the -P option so arbitrary
 * PostScript code can be passed through. Expect it could be useful for changing
 * definitions in the prologue for which options have not been defined.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'b':			/* bytes per pattern */
		    bytespp = atoi(optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'f':			/* ones complement - sort of */
		    flip = TRUE;
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'u':			/* don't undo Eighth Edition bitmaps */
		    v8undo = FALSE;
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding - unnecessary */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);		/* unnecessary */
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {		/* followed by stuff for multiple pages */
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

}   /* End of setup */

/*****************************************************************************/

arguments()

{

    FILE	*fp;			/* next input file */

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll process stdin.
 *
 */

    if ( argc < 1 )
	bitmap(stdin);
    else  {				/* at least one argument is left */
	while ( argc > 0 )  {
	    if ( strcmp(*argv, "-") == 0 )
		fp = stdin;
	    else if ( (fp = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    bitmap(fp);
	    if ( fp != stdin )
		fclose(fp);
	    argc--;
	    argv++;
	}   /* End while */
    }   /* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files, so mark the end of the pages with a TRAILER
 * comment, make sure the last page prints, and add things like the PAGES comment
 * that can only be determined after all the input files have been read.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, (bbox[0]*72+100)/100, (bbox[1]*72+100)/100);
    fprintf(stdout, "%s %d\n", PAGES, printed);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct provided it's not NULL. Accounting is
 * requested using the -A or -J options.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

bitmap(fp)

    FILE	*fp;			/* next input file */

{

    int		count;			/* pattern repeats this many times */
    long	total;			/* expect this many patterns */

/*
 *
 * Reads all the bitmaps from the next input file, translates each one into
 * PostScript, and arranges to have one bitmap printed on each page. Multiple
 * bitmaps per input file work.
 *
 */

    fp_in = fp;				/* everyone reads from this file */

    while ( dimensions() == TRUE )  {
	patcount = 0;
	total = scanlines * patterns;

	bbox[0] = MAX(bbox[0], patterns*16);	/* for BoundingBox comment */
	bbox[1] = MAX(bbox[1], scanlines);

	redirect(++page);
	fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
	fprintf(fp_out, "/saveobj save def\n");
	writerequest(printed+1, fp_out);

	fprintf(fp_out, "%s ", (v8format == TRUE && v8undo == FALSE) ? "true" : "false");
	fprintf(fp_out, "%s ", (flip == TRUE) ? "true" : "false");
	fprintf(fp_out, "%d %d bitmap\n", patterns * 16, scanlines);

	while ( patcount != total && (count = getc(fp)) != EOF )  {
	    addrast(count);
	    patcount += (count & 0177);
	    if ( patcount % patterns == 0 )
		putrast();
	}   /* End while */

	if ( debug == ON )
	    fprintf(stderr, "patterns = %d, scanlines = %d, patcount = %d\n", patterns, scanlines, patcount);

	if ( total != patcount )
	    error(FATAL, "bitmap format error");

	if ( fp_out == stdout ) printed++;

	fprintf(fp_out, "showpage\n");
	fprintf(fp_out, "saveobj restore\n");
	fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);
    }	/* End while */

}   /* End of bitmap */

/*****************************************************************************/

dimensions()

{

    int		ox, oy;			/* coordinates of the origin */
    int		cx, cy;			/* and right corner of the bitmap */
    int		i;			/* loop index */

/*
 *
 * Determines the dimensions and type of the next bitmap. Eighth edition bitmaps
 * have a zero in the first 16 bits. If valid dimensions are read TRUE is returned
 * to the caller. Changed so the check of whether we're done (by testing scanlines
 * or patterns) comes before the malloc().
 *
 */

    if ( (scanlines = getint()) == 0 )  {
	ox = getint();
	oy = getint();
	cx = getint();
	cy = getint();
	scanlines = cy - oy;
	patterns = (cx - ox + 15) / 16;
	v8format = TRUE;
    } else patterns = getint();

    if ( scanlines <= 0 || patterns <= 0 )	/* done - don't do the malloc() */
	return(FALSE);

    if ( raster != NULL ) free(raster);
    if ( prevrast != NULL ) free(prevrast);

    if ( (rptr = raster = (char *) malloc(patterns * 2)) == NULL )
	error(FATAL, "no memory");

    if ( (prevrast = (char *) malloc(patterns * 2)) == NULL )
	error(FATAL, "no memory");

    for ( i = 0; i < patterns * 2; i++ )
	*(prevrast+i) = 0377;

    eptr = rptr + patterns * 2;

    return(TRUE);

}   /* End of dimensions */

/*****************************************************************************/

addrast(count)

    int		count;			/* repeat count for next pattern */

{

    int		size;			/* number of bytes in next pattern */
    int		l, h;			/* high and low bytes */
    int		i, j;			/* loop indices */

/*
 *
 * Reads the input file and adds the appropriate number of bytes to the output
 * raster line. If count has bit 7 on, one 16 bit pattern is read and repeated
 * count & 0177 times. If bit 7 is off, count is the number of patterns read from
 * fp_in - each one repeated once.
 *
 */

    if ( count & 0200 )  {
	size = 1;
	count &= 0177;
    } else {
	size = count;
	count = 1;
    }	/* End else */

    for ( i = size; i > 0; i-- )  {
	if ( (l = getc(fp_in)) == EOF || (h = getc(fp_in)) == EOF )
	    return;
	for ( j = count; j > 0; j-- )  {
	    *rptr++ = l;
	    *rptr++ = h;
	}   /* End for */
    }	/* End for */

}   /* End of addrast */

/*****************************************************************************/

putrast()

{

    char	*p1, *p2;		/* starting and ending patterns */
    int		n;			/* set to bytes per pattern */
    int		i;			/* loop index */

/*
 *
 * Takes the scanline that's been saved in *raster, encodes it according to the
 * value that's been assigned to bytespp, and writes the result to *fp_out. Each
 * line in the output bitmap is terminated by a 0 on a line by itself.
 *
 */

    n = (bytespp <= 0) ? 2 * patterns : bytespp;

    if ( v8format == TRUE && v8undo == TRUE )
	for ( i = 0; i < patterns * 2; i++ )
	    *(raster+i) = (*(prevrast+i) ^= *(raster+i));

    for ( p1 = raster, p2 = raster + n; p1 < eptr; p1 = p2 )
	if ( patncmp(p1, n) == TRUE )  {
	    while ( patncmp(p2, n) == TRUE ) p2 += n;
	    p2 += n;
	    fprintf(fp_out, "%d ", n);
	    for ( i = 0; i < n; i++, p1++ )
		fprintf(fp_out, "%.2X", ((int) *p1) & 0377);
	    fprintf(fp_out, " %d\n", (p2 - p1) / n);
	} else {
	    while ( p2 < eptr && patncmp(p2, n) == FALSE ) p2 += n;
	    if ( p2 > eptr ) p2 = eptr;
	    fprintf(fp_out, "%d ", p2 - p1);
	    while ( p1 < p2 )
		fprintf(fp_out, "%.2X", ((int) *p1++) & 0377);
	    fprintf(fp_out, " 0\n");
	}   /* End else */

    fprintf(fp_out, "0\n");

    rptr = raster;

}   /* End of putrast */

/*****************************************************************************/

patncmp(p1, n)

    char	*p1;			/* first patterns starts here */
    int		n;			/* and extends this many bytes */

{

    char	*p2;			/* address of the second pattern */

/*
 *
 * Compares the two n byte patterns *p1 and *(p1+n). FALSE is returned if they're
 * different or extend past the end of the current raster line.
 *
 */

    p2 = p1 + n;

    for ( ; n > 0; n--, p1++, p2++ )
	if ( p2 >= eptr || *p1 != *p2 )
	    return(FALSE);

    return(TRUE);

}   /* End of patncmp */

/*****************************************************************************/

getint()

{

    int		h, l;			/* high and low bytes */

/*
 *
 * Reads the next two bytes from *fp_in and returns the resulting integer.
 *
 */

    if ( (l = getc(fp_in)) == EOF || (h = getc(fp_in)) == EOF )
	return(-1);

    return((h & 0377) << 8 | (l & 0377));

}   /* End of getint */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014230732621006400057030057030000010016100522633075500003300000007146post.src/postdmd/postdmd.1.ds dQ /usr/lib/postscript
.TH POSTDMD 1
.SH NAME
.B postdmd
\- PostScript translator for
.SM DMD
bitmap files
.SH SYNOPSIS
\*(mBpostdmd\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B postdmd
translates
.SM DMD
bitmap
.IR files ,
as produced by
.BR dmdps ,
or
.I files
written in the Ninth Edition
.BR bitfile (9.5)
format
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-b num
Pack the bitmap in the output file using
.I num
byte patterns.
A value of 0 turns off all packing of the output file.
By default
.I num
is 6.
.TP
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-f
Flip the sense of the bits in
.I files
before printing the bitmaps.
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which by default is located at the center of
each page.
The default magnification is 1.0.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP
.OP \-u
Disables much of the unpacking for Eighth
Edition bitmap files.
Usually results in smaller output files that take longer to print.
Not a recommended option.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed at the
center of the page, with positive
x to the right and positive y up the page.
Positive
.I num
moves everything right.
The default offset is 0 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves everything up the page.
The default offset is 0.
.TP
.TP
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/postdmd.ps .
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include
.I string
in the output file;
.I string
must be legitimate PostScript.
.TP
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0, the request applies to all pages.
If
.I file
is omitted, the request lookup is done in
.MR \*(dQ/ps.requests .
.PP
Only one bitmap is printed on each logical page, and each of the input
.I files
must contain complete descriptions of at least one bitmap.
Decreasing the pattern size using the
.OP \-b
option may help throughput on printers with fast processors
(e.g., \s-1PS\s+1-810),
while increasing the pattern size will often be the right move
on older models
(.e.g, \s-1PS\s+1-800).
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.br
.ne 4v
.SH FILES
.MW \*(dQ/postdmd.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy (1),
.BR postio (1),
.BR postmd (1),
.BR postprint (1),
.BR postreverse (1),
.BR posttek (1)
0707070014230735711006440057030057030000010015150522627503500003400000005002post.src/postdmd/postdmd.ps%
% Version 3.3.2 prologue for DMD bitmap files.
%

/#copies 1 store
/aspectratio 1 def
/formsperpage 1 def
/landscape false def
/magnification 1 def
/margin 0 def
/orientation 0 def
/rotation 1 def
/screenres 100 def
/xoffset 0 def
/yoffset 0 def

/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	xoffset inch yoffset inch translate
	magnification dup aspectratio mul scale

	/height height margin sub def
	/width width margin sub def
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def} bind def

/bitmap {
	/scanlines exch def
	/scanlength exch def
	/flip exch def
	/v8format exch def

	/bytelength scanlength 8 idiv def
	/picstr bytelength string def
	/lpicstr bytelength string def
	/bytelength bytelength 1 sub def

	gsave

% First the overall scaling.

	height scanlines div width scanlength div min
	72 screenres div min
	dup scale

% Followed by the one for the unit square.

	scanlength neg 2 div scanlines neg 2 div translate
	scanlength scanlines scale
	v8format {getv8bitmap} {getbitmap} ifelse
	grestore
} bind def

/getbitmap {
	scanlength scanlines flip [scanlength 0 0 scanlines neg 0 scanlines] {
		0 {
			currentfile token pop dup
			0 eq {pop pop exit} if
			/charcount exch def
			picstr 1 index charcount getinterval
			/repl exch def
			currentfile repl readhexstring pop pop
			charcount add
			currentfile token pop {
				picstr 1 index repl putinterval
				charcount add
			} repeat
		} loop
		picstr
	} imagemask
} bind def

/getv8bitmap {
	scanlength scanlines flip not [scanlength 0 0 scanlines neg 0 scanlines] {
		0 {
			currentfile token pop dup
			0 eq {pop pop exit} if
			/charcount exch def
			picstr 1 index charcount getinterval
			/repl exch def
			currentfile repl readhexstring pop pop
			charcount add
			currentfile token pop {
				picstr 1 index repl putinterval
				charcount add
			} repeat
		} loop
		0 0 picstr {
			exch lpicstr exch get xor
			lpicstr exch 2 index exch put
			1 add dup
		} forall
		pop pop lpicstr
	} imagemask
} bind def

/done {/lastpage where {pop lastpage} if} def
0707070014230101030407550057030057030000020322170522633075700002100000000000post.src/postgif0707070014230102111006400057030057030000010225450522633075700003300000005276post.src/postgif/postgif.1.ds dQ /usr/lib/postscript
.TH POSTGIF 1
.SH NAME
.B postgif
\- PostScript translator for
.SM GIF
files
.SH SYNOPSIS
\*(mBpostgif\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B postgif
translates Graphics Interchange Format (\s-1GIF\s+1)
.I files
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-f
Flip the sense of the bits in
.I files
before printing the pixmaps.
.TP
.OP \-g
Generate picture in gray instead of color
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which by default is located at the center of
each page.
The default magnification is 1.0.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed at the
center of the page, with positive
x to the right and positive y up the page.
Positive
.I num
moves everything right.
The default offset is 0 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves everything up the page.
The default offset is 0.
.TP
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/postgif.ps .
.PP
Two options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include
.I string
in the output file;
.I string
must be legitimate PostScript.
.PP
Only one pixmap is printed on each logical page,
and each of the input
.I files
must contain complete descriptions of at least one pixmap.
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.br
.ne 1i
.SH FILES
.MW \*(dQ/postgif.ps
.br
.MW \*(dQ/forms.ps
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy (1),
.BR postdmd (1),
.BR postio (1),
.BR postmd (1),
.BR postprint (1),
.BR postreverse (1),
.BR posttek (1),
.BR psencoding (1)
0707070014230077041006400057030057030000010311160522633075700003400000003720post.src/postgif/postgif.mkMAKE=/bin/make
MAKEFILE=postgif.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=$(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=postgif.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o

all : postgif

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp postgif $(POSTBIN)/postgif
	@chmod 755 $(POSTBIN)/postgif
	@chgrp $(GROUP) $(POSTBIN)/postgif
	@chown $(OWNER) $(POSTBIN)/postgif
	cp postgif.ps $(POSTLIB)/postgif.ps
	@chmod 644 $(POSTLIB)/postgif.ps
	@chgrp $(GROUP) $(POSTLIB)/postgif.ps
	@chown $(OWNER) $(POSTLIB)/postgif.ps
	cp postgif.1 $(MAN1DIR)/postgif.1
	@chmod 644 $(MAN1DIR)/postgif.1
	@chgrp $(GROUP) $(MAN1DIR)/postgif.1
	@chown $(OWNER) $(MAN1DIR)/postgif.1

clean :
	rm -f *.o

clobber : clean
	rm -f postgif

postgif : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postgif $(OFILES) -lm

postgif.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	postgif.1 >XXX.1; \
	mv XXX.1 postgif.1

0707070014230101061006440057030057030000010322000522627503600003300000044005post.src/postgif/postgif.c
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"
#include "gen.h"
#include "path.h"
#include "ext.h"

#define dbprt	if (debug) fprintf

char	*optnames = "a:c:fglm:n:o:p:x:y:C:E:DG:IL:P:";
char    *prologue = POSTGIF;		/* default PostScript prologue */
char    *formfile = FORMFILE;           /* stuff for multiple pages per sheet */
int     formsperpage = 1;               /* page images on each piece of paper */
int	copies = 1;                     /* and this many copies of each sheet */
int     page = 0;                       /* last page we worked on */
int     printed = 0;                    /* and the number of pages printed */

extern char *malloc();
extern void free();
extern double atof(), pow();

unsigned char ibuf[BUFSIZ];
unsigned char *cmap, *gcmap, *lcmap;
unsigned char *gmap, *ggmap, *lgmap;
unsigned char *pmap;
double gamma;
float cr = 0.3, cg = 0.59, cb = 0.11;
int maplength, gmaplength, lmaplength;
int scrwidth, scrheight;
int gcolormap, lcolormap;
int bitperpixel, background;
int imageleft, imagetop;
int imagewidth, imageheight;
int interlaced, lbitperpixel;
int gray = 0;
int gammaflag = 0;
int negative = 0;
int terminate = 0;
int codesize, clearcode, endcode, curstblsize, pmindex, byteinibuf, bitsleft;
int prefix[4096], suffix[4096], cstbl[4096];
int bburx = -32767, bbury = -32767;
FILE *fp_in = NULL;
FILE *fp_out = stdout;

char *
allocate(size)
    int size;
{
    char *p;

    if ((p = malloc(size)) == NULL) error(FATAL, "not enough memory");
    return(p);
}

void
puthex(c, fp)
    unsigned char c;
    FILE *fp;
{
    static char hextbl[16] = {
	'0', '1', '2', '3', '4', '5', '6', '7',
	'8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
    };

    putc(hextbl[(c >> 4) & 017], fp);
    putc(hextbl[c & 017], fp);
}

void
setcolormap(bp)
    int bp;
{
    int i, entries = 1, scale = 1;
    unsigned char *p, *q;

    for (i = 0; i < bp; i++) entries *= 2;
    for (i = 0; i < 8 - bp; i++) scale *= 2;
    gcmap = (unsigned char *) allocate(entries*3);
    ggmap = (unsigned char *) allocate(entries);
    gmaplength = entries;
    for (i = 0, p = gcmap, q = ggmap; i < 256; i += scale, p += 3, q++) {
	if (negative) {
	    *p = 255 - i; p[1] = *p; p[2] = *p;
	    *q = *p;
	}
	else {
	    *p = i; p[1] = i; p[2] = i;
	    *q = i;
	}
    }
    if (gammaflag)
    	for (i = 0, p = gcmap; i < 256; i += scale, p += 3) {
	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
	    p[1] = *p; p[2] = *p;
	}
dbprt(stderr,"default color map:\n");
for (i = 0; i < entries*3; i += 3)
dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
}

void
readgcolormap(bp)
    int bp;
{
    int i, entries = 1;
    unsigned char *p, *q;

    for (i = 0; i < bp; i++) entries *= 2;
    gcmap = (unsigned char *) allocate(entries*3);
    ggmap = (unsigned char *) allocate(entries);
    gmaplength = entries;
    fread(gcmap, sizeof(*gcmap), entries*3, fp_in);
    if (negative)
	for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = 255 - *p;
    for (i = 0, p = gcmap, q = ggmap; i < entries; i++, p += 3, q++)
	*q = cr*(int)p[0] + cg*(int)p[1] + cb*(int)p[2] + 0.5;
    if (gammaflag)
    	for (i = 0, p = gcmap; i < entries*3; i++, p++)
	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
dbprt(stderr,"global color map:\n");
for (i = 0; i < entries*3; i += 3)
dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
}

void
readlcolormap(bp)
    int bp;
{
    int i, entries = 1;
    unsigned char *p, *q;

    for (i = 0; i < bp; i++) entries *= 2;
    lcmap = (unsigned char *) allocate(entries*3);
    lgmap = (unsigned char *) allocate(entries);
    lmaplength = entries;
    fread(lcmap, sizeof(*lcmap), entries*3, fp_in);
    if (negative)
	for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = 255 - *p;
    for (i = 0, p = lcmap, q = lgmap; i < entries; i++, p += 3, q++)
	*q = cr*(int)p[0] + cg*(int)p[1] + cb*(int)p[2] + 0.5;
    if (gammaflag)
    	for (i = 0, p = lcmap; i < entries*3; i++, p++)
	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
dbprt(stderr,"local color map:\n");
for (i = 0; i < entries*3; i += 3)
dbprt(stderr, "%d, %d, %d\n", lcmap[i], lcmap[i+1], lcmap[i+2]);
}

void
initstbl()
{
    int i, entries = 1, *p, *s;

    for (i = 0; i < codesize; i++) entries *= 2;
    clearcode = entries;
    endcode = clearcode + 1;
    for (i = 0, p = prefix, s = suffix; i <= endcode; i++, p++, s++) {
	*p = endcode;
	*s = i;
    }
    curstblsize = endcode + 1;
    pmindex = 0;
    byteinibuf = 0;
    bitsleft = 0;
}

int
nextbyte()
{
    static ibufindex;

    if (byteinibuf) {
	byteinibuf--;
	ibufindex++;
    }
    else {
    	fread(ibuf, sizeof(*ibuf), 1, fp_in);
    	byteinibuf = ibuf[0];
dbprt(stderr, "byte count: %d\n", byteinibuf);
	if (byteinibuf) fread(ibuf, sizeof(*ibuf), byteinibuf, fp_in);
	else error(FATAL, "encounter zero byte count block before end code");
	ibufindex = 0;
	byteinibuf--;
	ibufindex++;
    }
    return(ibuf[ibufindex-1]);
}

int masktbl[25] = {
    0, 01, 03, 07, 017, 037, 077, 0177, 0377, 0777, 01777, 03777, 07777,
    017777, 037777, 077777, 0177777, 0377777, 0777777, 01777777, 03777777,
    07777777, 017777777, 037777777, 077777777
};

int
getcode()
{
    int cs, c;
    static int oldc;

    if (curstblsize < 4096) cs = cstbl[curstblsize];
    else cs = 12;
    while (bitsleft < cs) {
	oldc = (oldc & masktbl[bitsleft]) | ((nextbyte() & 0377) << bitsleft);
	bitsleft += 8;
    }
    c = oldc & masktbl[cs];
    oldc = oldc >> cs;
    bitsleft -= cs;
/* dbprt(stderr, "code: %d %d %d\n", curstblsize, cs, c); */
    return(c);
}

void
putcode(c)
    int c;
{
    if (prefix[c] != endcode) {
	putcode(prefix[c]);
	pmap[pmindex] = suffix[c];
	pmindex++;
    }
    else {
   	pmap[pmindex] = suffix[c];
	pmindex++;
    }
}

int
firstof(c)
    int c;
{
    while (prefix[c] != endcode) c = prefix[c];
    return(suffix[c]);
}

void
writeimage()
{
    int i, j, k;

dbprt(stderr, "pmindex: %d\n", pmindex);
    fputs("save\n", fp_out);
    fprintf(fp_out, "/codestr %d string def\n", imagewidth);
    if (!gray) {
    	fprintf(fp_out, "/colortbl currentfile %d string readhexstring\n",
	    maplength*3);
        for (i = 0; i < maplength; i++) puthex(cmap[i], fp_out);
        fputs("\n", fp_out);
        for (i = maplength ; i < maplength*2; i++) puthex(cmap[i], fp_out);
        fputs("\n", fp_out);
        for (i = maplength*2 ; i < maplength*3; i++) puthex(cmap[i], fp_out);
        fputs("\npop def\n", fp_out);
    	fprintf(fp_out, "/graytbl currentfile %d string readhexstring\n",
	    maplength);
        for (i = 0; i < maplength; i++) puthex(gmap[i], fp_out);
        fputs("\npop def\n", fp_out);
    }
    fprintf(fp_out, "%s %d %d %d %d gifimage\n",
	gray ? "true" : "false", imagewidth, imageheight,
	scrwidth - imageleft - imagewidth, scrheight - imagetop - imageheight);
    if (gray) {
	if (interlaced) {
	    int *iltbl;

	    iltbl = (int *) allocate(imageheight*sizeof(int));
	    j = 0;
	    for (i = 0; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass1: %d\n", j);
	    for (i = 4; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass2: %d\n", j);
	    for (i = 2; i < imageheight; i += 4) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass3: %d\n", j);
	    for (i = 1; i < imageheight; i += 2) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass4: %d\n", j);

    	    for (i = 0; i < imageheight; i++) {
		k = iltbl[i];
	        for (j = 0; j < imagewidth; j++, k++)
		    puthex(gmap[pmap[k]], fp_out);
	        fputs("\n", fp_out);
	    }
	}
	else {
    	    for (i = 0, k = 0; i < imageheight; i++) {
	        for (j = 0; j < imagewidth; j++, k++)
		    puthex(gmap[pmap[k]], fp_out);
	        fputs("\n", fp_out);
	    }
    	}
    }
    else {
	if (interlaced) {
	    int *iltbl;

	    iltbl = (int *) allocate(imageheight*sizeof(int));
	    j = 0;
	    for (i = 0; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass1: %d\n", j);
	    for (i = 4; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass2: %d\n", j);
	    for (i = 2; i < imageheight; i += 4) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass3: %d\n", j);
	    for (i = 1; i < imageheight; i += 2) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass4: %d\n", j);

    	    for (i = 0; i < imageheight; i++) {
		k = iltbl[i];
	        for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
	        fputs("\n", fp_out);
    	    }
	}
	else {
    	    for (i = 0, k = 0; i < imageheight; i++) {
	        for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
	        fputs("\n", fp_out);
    	    }
	}
    }
    fputs("restore\n", fp_out);
}

void
readimage()
{
    int bytecount, zerobytecount = 0;
    int code, oldcode;

    fread(ibuf, sizeof(*ibuf), 9, fp_in);
    imageleft = ibuf[0] + 256*ibuf[1];
    imagetop = ibuf[2] + 256*ibuf[3];
    imagewidth = ibuf[4] + 256*ibuf[5];
    imageheight = ibuf[6] + 256*ibuf[7];
    lcolormap = ibuf[8] & 0200;
    interlaced = ibuf[8] & 0100;
    lbitperpixel = (ibuf[8] & 07) + 1;
dbprt(stderr, "imageleft: %d\n", imageleft);
dbprt(stderr, "imagetop: %d\n", imagetop);
dbprt(stderr, "imagewidth: %d\n", imagewidth);
dbprt(stderr, "imgaeheight: %d\n", imageheight);
dbprt(stderr, "lcolormap: %d\n", lcolormap ? 1 : 0);
dbprt(stderr, "interlaced: %d\n", interlaced ? 1 : 0);
dbprt(stderr, "lbitperpixel: %d\n", lbitperpixel);
    if (lcolormap) {
	readlcolormap(lbitperpixel);
	cmap = lcmap;
	gmap = lgmap;
	maplength = lmaplength;
    }

dbprt(stderr, "start reading raster data\n");
    fread(ibuf, sizeof(*ibuf), 1, fp_in);
    codesize = ibuf[0];
dbprt(stderr, "codesize: %d\n", codesize);
    pmap = (unsigned char *) allocate(imagewidth*imageheight);
    initstbl();
    while ((code = getcode()) != endcode) {
	if (code == clearcode) {
	    curstblsize = endcode + 1;
    	    code = getcode();
    	    putcode(code);
    	    oldcode = code;
	}
	else if (code < curstblsize) {
	    putcode(code);
	    prefix[curstblsize] = oldcode;
	    suffix[curstblsize] = firstof(code);
	    curstblsize++;
	    oldcode = code;
	}
	else {
	   if (code != curstblsize) error(FATAL, "code out of order");
	   prefix[curstblsize] = oldcode;
	   suffix[curstblsize] = firstof(oldcode);
	   curstblsize++;
	   putcode(curstblsize-1);
	   oldcode = code;
	}
    }
dbprt(stderr, "finish reading raster data\n");

    /* read the rest of the raster data */
    do {
    	fread(ibuf, sizeof(*ibuf), 1, fp_in);
    	bytecount = ibuf[0];
dbprt(stderr, "byte count: %d\n", bytecount);
	if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
	else zerobytecount = 1;
    } while (!zerobytecount);

    writeimage();

    if (lcolormap) {
	cmap = gcmap;
	gmap = ggmap;
	maplength = gmaplength;
	free(lcmap);
	free(lgmap);
    }
}

void
readextensionblock()
{
    int functioncode, bytecount, zerobytecount = 0;

    fread(ibuf, sizeof(*ibuf), 1, fp_in);
    functioncode = ibuf[0];
dbprt(stderr, "function code: %d\n", functioncode);
    do {
    	fread(ibuf, sizeof(*ibuf), 1, fp_in);
    	bytecount = ibuf[0];
dbprt(stderr, "byte count: %d\n", bytecount);
	if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
	else zerobytecount = 1;
    } while (!zerobytecount);
}

void
writebgscr()
{
    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fputs("/saveobj save def\n", fp_out);
    fprintf(fp_out, "%s: %d %d %d %d\n",
	"%%PageBoundingBox", 0, 0, scrwidth, scrheight);
    if (scrwidth > bburx) bburx = scrwidth;
    if (scrheight > bbury) bbury = scrheight;
    fprintf(fp_out, "%d %d gifscreen\n", scrwidth, scrheight);
}

void
writeendscr()
{
    if ( fp_out == stdout ) printed++;
    fputs("showpage\n", fp_out);
    fputs("saveobj restore\n", fp_out);
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);
}

void
redirect(pg)
    int		pg;			/* next page we're printing */
{
    static FILE	*fp_null = NULL;	/* if output is turned off */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}

void
readgif()
{
    int i, j, k;

    for (i = 0, j = 1, k = 0; i < 13; i++) {
	for (; k < j; k++) cstbl[k] = i;
	j *= 2;
    }

    fread(ibuf, sizeof(*ibuf), 6, fp_in);
dbprt(stderr, "%.6s\n", ibuf);
    if (strncmp((char *)ibuf, "GIF87a", 6) != 0) {
    	fread(ibuf, sizeof(*ibuf), 122, fp_in);
    	fread(ibuf, sizeof(*ibuf), 6, fp_in);
dbprt(stderr, "%.6s\n", ibuf);
    	if (strncmp((char *)ibuf, "GIF87a", 6) != 0)
		 error(FATAL, "wrong GIF signature");
    }
    fread(ibuf, sizeof(*ibuf), 7, fp_in);
    scrwidth = ibuf[0] + 256*ibuf[1];
    scrheight = ibuf[2] + 256*ibuf[3];
    gcolormap = ibuf[4] & 0200;
    bitperpixel = (ibuf[4] & 07) + 1;
    background = ibuf[5];
dbprt(stderr, "scrwidth: %d\n", scrwidth);
dbprt(stderr, "scrheight: %d\n", scrheight);
dbprt(stderr, "gcolormap: %d\n", gcolormap ? 1 : 0);
dbprt(stderr, "bitperpixel: %d\n", bitperpixel);
dbprt(stderr, "background: %d\n", background);
    if (ibuf[6] != 0) error(FATAL, "wrong screen descriptor");
    if (gcolormap) readgcolormap(bitperpixel);
    else setcolormap(bitperpixel);

    redirect(++page);
    writebgscr();

    cmap = gcmap;
    gmap = ggmap;
    maplength = gmaplength;

    do {
	fread(ibuf, sizeof(*ibuf), 1, fp_in);
	if (ibuf[0] == ',') readimage();
	else if (ibuf[0] == ';') terminate = 1;
	else if (ibuf[0] == '!') readextensionblock();
	else
	error(FATAL, "wrong image separator character or wrong GIF terminator");
    } while (!terminate);

    writeendscr();

    free(gcmap);
    free(ggmap);
}

void
init_signals()
{

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
        signal(SIGINT, SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
        signal(SIGHUP, SIG_IGN);
    }
    else {
        signal(SIGHUP, interrupt);
        signal(SIGQUIT, interrupt);
    }

    signal(SIGTERM, interrupt);
}

void
header()
{
    int         ch;                     /* return value from getopt() */
    int         old_optind = optind;    /* for restoring optind - should be 1 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
        if ( ch == 'L' )
            prologue = optarg;
        else if ( ch == '?' )
            error(FATAL, "");

    optind = old_optind;                /* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
        error(FATAL, "can't read %s", prologue);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}

void
options()
{
    int		ch;			/* return value from getopt() */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {

	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'f':
		    negative = TRUE;
		    break;

	    case 'g':
		    gray = TRUE;
		    break;

	    case 'l':
		    fprintf(stdout, "/alignment true def\n");
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding - unnecessary */
		    fontencoding = optarg;
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'G':
		    gammaflag = ON;
		    gamma = atof(optarg);
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;

	}
    }

    argc -= optind;			/* get ready for non-option args */
    argv += optind;
}

void
setup()
{
    /*setencoding(fontencoding);*/
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {          /* followed by stuff for multiple pages
*/
        if ( cat(formfile) == FALSE )
            error(FATAL, "can't read %s", formfile);
        fprintf(stdout, "%d setupforms\n", formsperpage);
    }   /* End if */

    fprintf(stdout, "%s", ENDSETUP);

}

void
arguments()
{
    if ( argc < 1 ) {
	fp_in = stdin;
	readgif();
    }
    else  {				/* at least one argument is left */
	while ( argc > 0 )  {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    readgif();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}
    }
}

void
done()
{
    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, bburx, bbury);
    fprintf(stdout, "%s %d\n", PAGES, printed); 
}

main(agc, agv)
    int agc;
    char *agv[];
{
    argc = agc;
    argv = agv;
    prog_name = argv[0];

    init_signals();
    header();
    options();
    setup();
    arguments();
    done();

    exit(0);
}

0707070014230101071006440057030057030000010322300522627503600003400000043614post.src/postgif/Opostgif.c
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"
#include "gen.h"
#include "path.h"
#include "ext.h"

#define dbprt	if (debug) fprintf

char	*optnames = "a:c:fglm:n:o:p:x:y:C:DG:IL:P:";
char    *prologue = POSTGIF;		/* default PostScript prologue */
char    *formfile = FORMFILE;           /* stuff for multiple pages per sheet */
int     formsperpage = 1;               /* page images on each piece of paper */
int	copies = 1;                     /* and this many copies of each sheet */
int     page = 0;                       /* last page we worked on */
int     printed = 0;                    /* and the number of pages printed */

extern char *malloc();
extern void free();
extern double atof(), pow();

unsigned char ibuf[BUFSIZ];
unsigned char *cmap, *gcmap, *lcmap;
unsigned char *gmap, *ggmap, *lgmap;
unsigned char *pmap;
double gamma;
float cr = 0.3, cg = 0.59, cb = 0.11;
int maplength, gmaplength, lmaplength;
int scrwidth, scrheight;
int gcolormap, lcolormap;
int bitperpixel, background;
int imageleft, imagetop;
int imagewidth, imageheight;
int interlaced, lbitperpixel;
int gray = 0;
int gammaflag = 0;
int negative = 0;
int terminate = 0;
int codesize, clearcode, endcode, curstblsize, pmindex, byteinibuf, bitsleft;
int prefix[4096], suffix[4096], cstbl[4096];
int bburx = -32767, bbury = -32767;
FILE *fp_in = NULL;
FILE *fp_out = stdout;

char *
allocate(size)
    int size;
{
    char *p;

    if ((p = malloc(size)) == NULL) error(FATAL, "not enough memory");
    return(p);
}

void
puthex(c, fp)
    unsigned char c;
    FILE *fp;
{
    static char hextbl[16] = {
	'0', '1', '2', '3', '4', '5', '6', '7',
	'8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
    };

    putc(hextbl[(c >> 4) & 017], fp);
    putc(hextbl[c & 017], fp);
}

void
setcolormap(bp)
    int bp;
{
    int i, entries = 1, scale = 1;
    unsigned char *p, *q;

    for (i = 0; i < bp; i++) entries *= 2;
    for (i = 0; i < 8 - bp; i++) scale *= 2;
    gcmap = (unsigned char *) allocate(entries*3);
    ggmap = (unsigned char *) allocate(entries);
    gmaplength = entries;
    for (i = 0, p = gcmap, q = ggmap; i < 256; i += scale, p += 3, q++) {
	if (negative) {
	    *p = 255 - i; p[1] = *p; p[2] = *p;
	    *q = *p;
	}
	else {
	    *p = i; p[1] = i; p[2] = i;
	    *q = i;
	}
    }
    if (gammaflag)
    	for (i = 0, p = gcmap; i < 256; i += scale, p += 3) {
	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
	    p[1] = *p; p[2] = *p;
	}
dbprt(stderr,"default color map:\n");
for (i = 0; i < entries*3; i += 3)
dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
}

void
readgcolormap(bp)
    int bp;
{
    int i, entries = 1;
    unsigned char *p, *q;

    for (i = 0; i < bp; i++) entries *= 2;
    gcmap = (unsigned char *) allocate(entries*3);
    ggmap = (unsigned char *) allocate(entries);
    gmaplength = entries;
    fread(gcmap, sizeof(*gcmap), entries*3, fp_in);
    if (negative)
	for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = 255 - *p;
    for (i = 0, p = gcmap, q = ggmap; i < entries; i++, p += 3, q++)
	*q = cr*p[0] + cg*p[1] + cb*p[2] + 0.5;
    if (gammaflag)
    	for (i = 0, p = gcmap; i < entries*3; i++, p++)
	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
dbprt(stderr,"global color map:\n");
for (i = 0; i < entries*3; i += 3)
dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
}

void
readlcolormap(bp)
    int bp;
{
    int i, entries = 1;
    unsigned char *p, *q;

    for (i = 0; i < bp; i++) entries *= 2;
    lcmap = (unsigned char *) allocate(entries*3);
    lgmap = (unsigned char *) allocate(entries);
    lmaplength = entries;
    fread(lcmap, sizeof(*lcmap), entries*3, fp_in);
    if (negative)
	for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = 255 - *p;
    for (i = 0, p = lcmap, q = lgmap; i < entries; i++, p += 3, q++)
	*q = cr*p[0] + cg*p[1] + cb*p[2] + 0.5;
    if (gammaflag)
    	for (i = 0, p = lcmap; i < entries*3; i++, p++)
	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
dbprt(stderr,"local color map:\n");
for (i = 0; i < entries*3; i += 3)
dbprt(stderr, "%d, %d, %d\n", lcmap[i], lcmap[i+1], lcmap[i+2]);
}

void
initstbl()
{
    int i, entries = 1, *p, *s;

    for (i = 0; i < codesize; i++) entries *= 2;
    clearcode = entries;
    endcode = clearcode + 1;
    for (i = 0, p = prefix, s = suffix; i <= endcode; i++, p++, s++) {
	*p = endcode;
	*s = i;
    }
    curstblsize = endcode + 1;
    pmindex = 0;
    byteinibuf = 0;
    bitsleft = 0;
}

int
nextbyte()
{
    static ibufindex;

    if (byteinibuf) {
	byteinibuf--;
	ibufindex++;
    }
    else {
    	fread(ibuf, sizeof(*ibuf), 1, fp_in);
    	byteinibuf = ibuf[0];
dbprt(stderr, "byte count: %d\n", byteinibuf);
	if (byteinibuf) fread(ibuf, sizeof(*ibuf), byteinibuf, fp_in);
	else error(FATAL, "encounter zero byte count block before end code");
	ibufindex = 0;
	byteinibuf--;
	ibufindex++;
    }
    return(ibuf[ibufindex-1]);
}

int masktbl[25] = {
    0, 01, 03, 07, 017, 037, 077, 0177, 0377, 0777, 01777, 03777, 07777,
    017777, 037777, 077777, 0177777, 0377777, 0777777, 01777777, 03777777,
    07777777, 017777777, 037777777, 077777777
};

int
getcode()
{
    int cs, c;
    static int oldc;

    if (curstblsize < 4096) cs = cstbl[curstblsize];
    else cs = 12;
    while (bitsleft < cs) {
	oldc = (oldc & masktbl[bitsleft]) | ((nextbyte() & 0377) << bitsleft);
	bitsleft += 8;
    }
    c = oldc & masktbl[cs];
    oldc = oldc >> cs;
    bitsleft -= cs;
/* dbprt(stderr, "code: %d %d %d\n", curstblsize, cs, c); */
    return(c);
}

void
putcode(c)
    int c;
{
    if (prefix[c] != endcode) {
	putcode(prefix[c]);
	pmap[pmindex] = suffix[c];
	pmindex++;
    }
    else {
   	pmap[pmindex] = suffix[c];
	pmindex++;
    }
}

int
firstof(c)
    int c;
{
    while (prefix[c] != endcode) c = prefix[c];
    return(suffix[c]);
}

void
writeimage()
{
    int i, j, k;

dbprt(stderr, "pmindex: %d\n", pmindex);
    fputs("save\n", fp_out);
    fprintf(fp_out, "/codestr %d string def\n", imagewidth);
    if (!gray) {
    	fprintf(fp_out, "/colortbl currentfile %d string readhexstring\n",
	    maplength*3);
        for (i = 0; i < maplength; i++) puthex(cmap[i], fp_out);
        fputs("\n", fp_out);
        for (i = maplength ; i < maplength*2; i++) puthex(cmap[i], fp_out);
        fputs("\n", fp_out);
        for (i = maplength*2 ; i < maplength*3; i++) puthex(cmap[i], fp_out);
        fputs("\npop def\n", fp_out);
    	fprintf(fp_out, "/graytbl currentfile %d string readhexstring\n",
	    maplength);
        for (i = 0; i < maplength; i++) puthex(gmap[i], fp_out);
        fputs("\npop def\n", fp_out);
    }
    fprintf(fp_out, "%s %d %d %d %d gifimage\n",
	gray ? "true" : "false", imagewidth, imageheight,
	scrwidth - imageleft - imagewidth, scrheight - imagetop - imageheight);
    if (gray) {
	if (interlaced) {
	    int *iltbl;

	    iltbl = (int *) allocate(imageheight*sizeof(int));
	    j = 0;
	    for (i = 0; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass1: %d\n", j);
	    for (i = 4; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass2: %d\n", j);
	    for (i = 2; i < imageheight; i += 4) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass3: %d\n", j);
	    for (i = 1; i < imageheight; i += 2) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass4: %d\n", j);

    	    for (i = 0; i < imageheight; i++) {
		k = iltbl[i];
	        for (j = 0; j < imagewidth; j++, k++)
		    puthex(gmap[pmap[k]], fp_out);
	        fputs("\n", fp_out);
	    }
	}
	else {
    	    for (i = 0, k = 0; i < imageheight; i++) {
	        for (j = 0; j < imagewidth; j++, k++)
		    puthex(gmap[pmap[k]], fp_out);
	        fputs("\n", fp_out);
	    }
    	}
    }
    else {
	if (interlaced) {
	    int *iltbl;

	    iltbl = (int *) allocate(imageheight*sizeof(int));
	    j = 0;
	    for (i = 0; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass1: %d\n", j);
	    for (i = 4; i < imageheight; i += 8) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass2: %d\n", j);
	    for (i = 2; i < imageheight; i += 4) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass3: %d\n", j);
	    for (i = 1; i < imageheight; i += 2) {
		iltbl[i] = j;
		j += imagewidth;
	    }
dbprt(stderr, "pass4: %d\n", j);

    	    for (i = 0; i < imageheight; i++) {
		k = iltbl[i];
	        for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
	        fputs("\n", fp_out);
    	    }
	}
	else {
    	    for (i = 0, k = 0; i < imageheight; i++) {
	        for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
	        fputs("\n", fp_out);
    	    }
	}
    }
    fputs("restore\n", fp_out);
}

void
readimage()
{
    int bytecount, zerobytecount = 0;
    int code, oldcode;

    fread(ibuf, sizeof(*ibuf), 9, fp_in);
    imageleft = ibuf[0] + 256*ibuf[1];
    imagetop = ibuf[2] + 256*ibuf[3];
    imagewidth = ibuf[4] + 256*ibuf[5];
    imageheight = ibuf[6] + 256*ibuf[7];
    lcolormap = ibuf[8] & 0200;
    interlaced = ibuf[8] & 0100;
    lbitperpixel = (ibuf[8] & 07) + 1;
dbprt(stderr, "imageleft: %d\n", imageleft);
dbprt(stderr, "imagetop: %d\n", imagetop);
dbprt(stderr, "imagewidth: %d\n", imagewidth);
dbprt(stderr, "imgaeheight: %d\n", imageheight);
dbprt(stderr, "lcolormap: %d\n", lcolormap ? 1 : 0);
dbprt(stderr, "interlaced: %d\n", interlaced ? 1 : 0);
dbprt(stderr, "lbitperpixel: %d\n", lbitperpixel);
    if (lcolormap) {
	readlcolormap(lbitperpixel);
	cmap = lcmap;
	gmap = lgmap;
	maplength = lmaplength;
    }

dbprt(stderr, "start reading raster data\n");
    fread(ibuf, sizeof(*ibuf), 1, fp_in);
    codesize = ibuf[0];
dbprt(stderr, "codesize: %d\n", codesize);
    pmap = (unsigned char *) allocate(imagewidth*imageheight);
    initstbl();
    while ((code = getcode()) != endcode) {
	if (code == clearcode) {
	    curstblsize = endcode + 1;
    	    code = getcode();
    	    putcode(code);
    	    oldcode = code;
	}
	else if (code < curstblsize) {
	    putcode(code);
	    prefix[curstblsize] = oldcode;
	    suffix[curstblsize] = firstof(code);
	    curstblsize++;
	    oldcode = code;
	}
	else {
	   if (code != curstblsize) error(FATAL, "code out of order");
	   prefix[curstblsize] = oldcode;
	   suffix[curstblsize] = firstof(oldcode);
	   curstblsize++;
	   putcode(curstblsize-1);
	   oldcode = code;
	}
    }
dbprt(stderr, "finish reading raster data\n");

    /* read the rest of the raster data */
    do {
    	fread(ibuf, sizeof(*ibuf), 1, fp_in);
    	bytecount = ibuf[0];
dbprt(stderr, "byte count: %d\n", bytecount);
	if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
	else zerobytecount = 1;
    } while (!zerobytecount);

    writeimage();

    if (lcolormap) {
	cmap = gcmap;
	gmap = ggmap;
	maplength = gmaplength;
	free(lcmap);
	free(lgmap);
    }
}

void
readextensionblock()
{
    int functioncode, bytecount, zerobytecount = 0;

    fread(ibuf, sizeof(*ibuf), 1, fp_in);
    functioncode = ibuf[0];
dbprt(stderr, "function code: %d\n", functioncode);
    do {
    	fread(ibuf, sizeof(*ibuf), 1, fp_in);
    	bytecount = ibuf[0];
dbprt(stderr, "byte count: %d\n", bytecount);
	if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
	else zerobytecount = 1;
    } while (!zerobytecount);
}

void
writebgscr()
{
    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fputs("/saveobj save def\n", fp_out);
    fprintf(fp_out, "%s: %d %d %d %d\n",
	"%%PageBoundingBox", 0, 0, scrwidth, scrheight);
    if (scrwidth > bburx) bburx = scrwidth;
    if (scrheight > bbury) bbury = scrheight;
    fprintf(fp_out, "%d %d gifscreen\n", scrwidth, scrheight);
}

void
writeendscr()
{
    if ( fp_out == stdout ) printed++;
    fputs("showpage\n", fp_out);
    fputs("saveobj restore\n", fp_out);
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);
}

void
redirect(pg)
    int		pg;			/* next page we're printing */
{
    static FILE	*fp_null = NULL;	/* if output is turned off */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}

void
readgif()
{
    int i, j, k;

    for (i = 0, j = 1, k = 0; i < 13; i++) {
	for (; k < j; k++) cstbl[k] = i;
	j *= 2;
    }

    fread(ibuf, sizeof(*ibuf), 6, fp_in);
dbprt(stderr, "%.6s\n", ibuf);
    if (strncmp(ibuf, "GIF87a", 6) != 0) {
    	fread(ibuf, sizeof(*ibuf), 122, fp_in);
    	fread(ibuf, sizeof(*ibuf), 6, fp_in);
dbprt(stderr, "%.6s\n", ibuf);
    	if (strncmp(ibuf, "GIF87a", 6) != 0)
		 error(FATAL, "wrong GIF signature");
    }
    fread(ibuf, sizeof(*ibuf), 7, fp_in);
    scrwidth = ibuf[0] + 256*ibuf[1];
    scrheight = ibuf[2] + 256*ibuf[3];
    gcolormap = ibuf[4] & 0200;
    bitperpixel = (ibuf[4] & 07) + 1;
    background = ibuf[5];
dbprt(stderr, "scrwidth: %d\n", scrwidth);
dbprt(stderr, "scrheight: %d\n", scrheight);
dbprt(stderr, "gcolormap: %d\n", gcolormap ? 1 : 0);
dbprt(stderr, "bitperpixel: %d\n", bitperpixel);
dbprt(stderr, "background: %d\n", background);
    if (ibuf[6] != 0) error(FATAL, "wrong screen descriptor");
    if (gcolormap) readgcolormap(bitperpixel);
    else setcolormap(bitperpixel);

    redirect(++page);
    writebgscr();

    cmap = gcmap;
    gmap = ggmap;
    maplength = gmaplength;

    do {
	fread(ibuf, sizeof(*ibuf), 1, fp_in);
	if (ibuf[0] == ',') readimage();
	else if (ibuf[0] == ';') terminate = 1;
	else if (ibuf[0] == '!') readextensionblock();
	else
	error(FATAL, "wrong image separator character or wrong GIF terminator");
    } while (!terminate);

    writeendscr();

    free(gcmap);
    free(ggmap);
}

void
init_signals()
{
    int         interrupt();            /* signal handler */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
        signal(SIGINT, SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
        signal(SIGHUP, SIG_IGN);
    }
    else {
        signal(SIGHUP, interrupt);
        signal(SIGQUIT, interrupt);
    }

    signal(SIGTERM, interrupt);
}

void
header()
{
    int         ch;                     /* return value from getopt() */
    int         old_optind = optind;    /* for restoring optind - should be 1 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
        if ( ch == 'L' )
            prologue = optarg;
        else if ( ch == '?' )
            error(FATAL, "");

    optind = old_optind;                /* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
        error(FATAL, "can't read %s", prologue);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}

void
options()
{
    int		ch;			/* return value from getopt() */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {

	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'f':
		    negative = TRUE;
		    break;

	    case 'g':
		    gray = TRUE;
		    break;

	    case 'l':
		    fprintf(stdout, "/alignment true def\n");
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'G':
		    gammaflag = ON;
		    gamma = atof(optarg);
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;

	}
    }

    argc -= optind;			/* get ready for non-option args */
    argv += optind;
}

void
setup()
{
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {          /* followed by stuff for multiple pages
*/
        if ( cat(formfile) == FALSE )
            error(FATAL, "can't read %s", formfile);
        fprintf(stdout, "%d setupforms\n", formsperpage);
    }   /* End if */

    fprintf(stdout, "%s", ENDSETUP);

}

void
arguments()
{
    if ( argc < 1 ) {
	fp_in = stdin;
	readgif();
    }
    else  {				/* at least one argument is left */
	while ( argc > 0 )  {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    readgif();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}
    }
}

void
done()
{
    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, bburx, bbury);
    fprintf(stdout, "%s %d\n", PAGES, printed); 
}

main(agc, agv)
    int agc;
    char *agv[];
{
    argc = agc;
    argv = agv;
    prog_name = argv[0];

    init_signals();
    header();
    options();
    setup();
    arguments();
    done();

    exit(0);
}

0707070014230101101006440057030057030000010322450522627503600003400000004347post.src/postgif/postgif.ps%
% Version 3.3.2 prologue for GIF pixmap files.
%

/#copies 1 store
/aspectratio 1 def
/formsperpage 1 def
/landscape false def
/magnification 1 def
/margin 0 def
/orientation 0 def
/rotation 1 def
/xoffset 0 def
/yoffset 0 def

/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	xoffset inch yoffset inch translate
	magnification dup aspectratio mul scale

	/height height margin sub def
	/width width margin sub def
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def} bind def

/done {/lastpage where {pop lastpage} if} def

/alignment false def

/gifscreen { % scrwidth scrheight $
    2 copy

    alignment {
    	100 dup dtransform exch 100 exch div abs exch 100 exch div abs
	2 copy scale
	/height exch height exch div def
	/width exch width exch div def
    } if

    height exch div exch width exch div
    2 copy lt { pop } { exch pop } ifelse

    alignment { cvi } if

    dup scale

    neg 2 div exch neg 2 div exch translate
} def

/gifimage { % gray imagewidth imageheight xorigin yorigin $
    translate
    2 copy scale
    /imageheight exch def
    /imagewidth exch def
    /gray exch def
    imagewidth imageheight 8 [imagewidth 0 0 imageheight neg 0 imageheight]
    gray {
	{ currentfile codestr readhexstring pop } image
    } {
	/colorimage where {
	    pop
	    /picstr imagewidth 3 mul string def
	    { currentfile codestr readhexstring pop pop
	    	0 1 imagewidth 1 sub {
		    picstr exch dup 3 mul exch colortbl exch codestr exch get
		    3 mul 3 getinterval putinterval
	    	} for picstr
	    } false 3 colorimage
	} {
	    { currentfile codestr readhexstring pop pop
	    	0 1 imagewidth 1 sub {
		    codestr exch dup graytbl exch codestr exch get get put
	    	} for codestr
	    } image
	} ifelse
    } ifelse
} def
0707070014231405030407550057030057030000021222660522633076100002000000000000post.src/postio0707070014231405041006440057030057030000011222670522627503600002700000001622post.src/postio/READMESerial communications program for PostScript printers.

Runs as a single read/write process (by default). Use the -R2 option
or set splitme to TRUE (file postio.c) to get separate read and write
processes. Although not the default, we recommend using separate read
and write processes.

Sends occasional status queries (control Ts) while transmitting files.
Use the -q option or set quiet (file postio.c) to TRUE to disable status
queries.

Datakit connections are supported on System V and Ninth Edition systems.
The syntax (for connecting to a Datakit destination) varies. Check the
SYSV and V9 versions of setupline() in file ifdef.c.

Set DKHOST and DKSTREAMS to TRUE in postio.mk for streams based DKHOST
support. When DKSTREAMS is TRUE postio.mk uses "dknetty" as the stream
module. Settings like DKSTREAMS=dkty select a different stream module
and may be required for full Datakit support on some systems.

0707070014231405051006440057030057030000011223000522627503600003000000056437post.src/postio/ifdef.c/*
 *
 * Conditionally compiled routines for setting up and reading the line. Things
 * were getting out of hand with all the ifdefs, and even though this defeats
 * part of the purpose of conditional complilation directives, I think it's easier
 * to follow this way. Thanks to Alan Buckwalter for the System V DKHOST code.
 *
 * postio now can be run as separate read and write processes, but requires that
 * you write a procedure called resetline() and perhaps modify readline() some.
 * I've already tested the code on System V and it seems to work. Ninth Edition
 * and BSD code may be missing.
 *
 * By request I've changed the way some of the setupline() procedures (eg. in the
 * System V implementation) handle things when no line has been given. If line is
 * NULL the new setupline() procedures try to continue, assuming whoever called
 * postio connected stdout to the printer. Things will only work if we can read
 * and write stdout!
 *
 */

#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>

#include "ifdef.h"			/* conditional header file inclusion */
#include "gen.h"			/* general purpose definitions */

FILE	*fp_ttyi, *fp_ttyo;
char	*ptr = mesg;

extern int	window_size;

/*****************************************************************************/

#ifdef SYSV
setupline()

{

    struct termio	termio;

/*
 *
 * Line initialization for SYSV. For now if no line is given (ie. line == NULL )
 * we continue on as before using stdout as ttyi and ttyo. Doesn't work when we're
 * running in interactive mode or forcing stuff that comes back from the printer
 * to stdout. Both cases are now caught by a test that's been added to routine
 * initialize(). The change is primarily for the version of lp that's available
 * with SVR3.2.
 *
 */

#ifdef DKHOST
    if ( line != NULL && *line != '/' )  {
	if ( strncmp(line, "DK:", 3) == 0 )
	    line += 3;
	dkhost_connect();
#ifdef DKSTREAMS
	if ( ioctl(ttyi, I_PUSH, DKSTREAMS) == -1 )
	    error(FATAL, "ioctl error - %s", DKSTREAMS);
	if ( ioctl(ttyi, I_PUSH, "ldterm") == -1 )
	    error(FATAL, "ioctl error - ldterm");
#endif
    } else
#endif

    if ( line == NULL )
	ttyi = fileno(stdout);
    else if ( (ttyi = open(line, O_RDWR)) == -1 )
	error(FATAL, "can't open %s", line);

    if ( (ttyo = dup(ttyi)) == -1 )
	error(FATAL, "can't dup file descriptor for %s", line);

    if ( stopbits == 1 )
	stopbits = 0;
    else stopbits = CSTOPB;

    if ( fcntl(ttyi, F_SETFL, O_NDELAY) == -1 )
	error(FATAL, "fcntl error - F_SETFL");

    if ( ioctl(ttyi, TCGETA, &termio) == -1 )
	error(FATAL, "ioctl error - TCGETA");

    termio.c_iflag = IXON | IGNCR;
    termio.c_oflag = 0;
    termio.c_cflag = HUPCL | CREAD | CS8 | stopbits | baudrate;
    termio.c_lflag = 0;
    termio.c_cc[VMIN] = termio.c_cc[VTIME] = 0;

    if ( ioctl(ttyi, TCSETA, &termio) == -1 )
	error(FATAL, "ioctl error - TCSETA");

    if ( ioctl(ttyi, TCFLSH, 2) == -1 )
	error(FATAL, "ioctl error - TCFLSH");

    fp_ttyi = fdopen(ttyi, "r");

}   /* End of setupline */

/*****************************************************************************/

resetline()

{

    int			flags;		/* for turning O_NDELAY off */
    struct termio	termio;		/* so we can reset flow control */

/*
 *
 * Only used if we're running the program as separate read and write processes.
 * Called from split() after the initial connection has been made and returns
 * TRUE if two processes should work. Don't know if the O_NDELAY stuff is really
 * needed, but setting c_cc[VMIN] to 1 definitely is. If we leave it be (as a 0)
 * the read in readline() won't block!
 *
 */

    if ( (flags = fcntl(ttyi, F_GETFL, 0)) == -1 )
	error(FATAL, "fcntl error - F_GETFL");

    flags &= ~O_NDELAY;

    if ( fcntl(ttyi, F_SETFL, flags) == -1 )
	error(FATAL, "fcntl error - F_SETFL");

    if ( ioctl(ttyi, TCGETA, &termio) == -1 )
	error(FATAL, "ioctl error - TCGETA");

    termio.c_iflag &= ~IXANY;
    termio.c_iflag |= IXON | IXOFF;
    termio.c_cc[VMIN] = 1;
    termio.c_cc[VTIME] = 0;

    if ( ioctl(ttyi, TCSETA, &termio) == -1 )
	error(FATAL, "ioctl error - TCSETA");

    return(TRUE);

}   /* End of resetline */

/*****************************************************************************/

setupstdin(mode)

    int		mode;			/* what to do with stdin settings */

{

    struct termio		termio;

    static int			saved = FALSE;
    static struct termio	oldtermio;

/*
 *
 * Save (mode = 0), reset (mode = 1), or restore (mode = 2) the tty settings for
 * stdin. Expect something like raw mode with no echo will be set up. Explicit
 * code to ensure blocking reads probably isn't needed because blocksize is set
 * to 1 when we're in interactive mode, but I've included it anyway.
 *
 */

    if ( interactive == TRUE )
	switch ( mode )  {
	    case 0:
		if ( isatty(0) != 1 )
		    error(FATAL, "stdin not a terminal - can't run interactive mode");
		if ( ioctl(0, TCGETA, &oldtermio) == -1 )
		    error(FATAL, "can't save terminal settings");
		saved = TRUE;
		break;

	    case 1:
		termio = oldtermio;
		termio.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL);
		termio.c_cc[VMIN] = 1;
		termio.c_cc[VTIME] = 0;
		ioctl(0, TCSETA, &termio);
		break;

	    case 2:
		if ( saved == TRUE )
		    ioctl(0, TCSETA, &oldtermio);
		break;
	}   /* End switch */

}   /* End of setupstdin */

/*****************************************************************************/

readline()

{

    int		n;			/* read() return value */
    int		ch;			/* for interactive mode */

    static int	tries = 0;		/* consecutive times read returned 0 */

/*
 *
 * Reads characters coming back from the printer on ttyi up to a newline (or EOF)
 * or until no more characters are available. Characters are put in mesg[], the
 * string is terminated with '\0' when we're done with a line and TRUE is returned
 * to the caller. If complete line wasn't available FALSE is returned. Interactive
 * mode should loop here forever, except during start(), echoing characters to
 * stdout. If it happens to leave FALSE should be returned. The non-blocking read
 * gets us out until split() is called.
 *
 * Some users (apparently just on 3B2 DKHOST systems) have had problems with the
 * two process implementation that's forced me to kludge things up some. When a
 * printer (on those systems) is turned off while postio is transmitting files
 * the write process hangs in writeblock() (postio.c) - it's typically in the
 * middle of a write() call, while the read() call (below) continually returns 0.
 * In the original code readline() returned FALSE when read() returned 0 and we
 * get into a loop that never ends - because the write process is hung. In the
 * one process implementation having read return 0 is legitimate because the line
 * is opened for no delay, but with two processes the read() blocks and a return
 * value of 0 should never occur. From my point of view the real problem is that
 * the write() call hangs on 3B2 DKHOST systems and apparently doesn't anywhere
 * else. If the write returned anything less than or equal to 0 writeblock() would
 * shut things down. The kludge I've implemented counts the number of consecutive
 * times read() returns a 0 and if it exceeds a limit (100) the read process will
 * shut things down. In fact one return of 0 from read() when we're in the two
 * process mode is undoubtedly sufficient and no counting should be necessary!!!
 * Moving the check to getstatus() should also work and is probably where things
 * belong.
 *
 */

    if ( interactive == FALSE )  {
	while ( (n = read(ttyi, ptr, 1)) != 0 )  {
	    if ( n < 0 )
		if ( errno == EINTR )
		    continue;
		else error(FATAL, "error reading %s", line);
	    tries = 0;
	    if ( *ptr == '\n' || *ptr == '\004' || ptr >= endmesg )  {
		*(ptr+1) = '\0';
		if ( *ptr == '\004' )
		    strcpy(ptr, "%%[ status: endofjob ]%%\n");
		ptr = mesg;
		return(TRUE);
	    }   /* End if */
	    ptr++;
	}   /* End while */
	if ( canread == TRUE && canwrite == FALSE )	/* read process kludge */
	    if ( ++tries > 100 )
		error(FATAL, "printer appears to be offline - shutting down");
	return(FALSE);
    }	/* End if */

    if ( canwrite == TRUE )		/* don't block during start() */
	return(FALSE);

    while ( (ch = getc(fp_ttyi)) != EOF )
	putc(ch, stdout);
    return(FALSE);

}   /* End of readline */
#endif

/*****************************************************************************/

#ifdef V9
#include <ipc.h>

char	tbuf[256];			/* temporary input buffer */
char	*nptr = tbuf;			/* next character comes from here */
char	*eptr = tbuf;			/* one past the last character in tbuf */

setupline()

{

    struct sgttyb	sgtty;
    struct ttydevb	ttydev;		/* for setting up the line */
    static struct tchars	tchar = { '\377',	/* interrupt */
					  '\377',	/* quit */
					  '\021',	/* start output */
					  '\023',	/* stop output */
					  '\377',	/* end-of-file */
					  '\377'	/* input delimiter */
					};

/*
 *
 * Line initialization for V9.
 *
 */

    if ( line == NULL )  {
	ttyi = ttyo = 1;
	return;
    }	/* End if */
    alarm(120);			/* watch for hanging opens */
    if ( line[0] == '/' ) {
	if ( (ttyi = open(line, O_RDWR)) == -1 )
	error(FATAL, "can't open %s", line);
    } else if ((ttyi = ipcopen(ipcpath(line, "dk", 0), "")) < 0) {
		sleep(5);	/* wait for Datakit to hangup */
		if ((ttyi = ipcopen(ipcpath(line, "dk", 0), "")) < 0) {
			fprintf(stderr, "%s", errstr);
			error(FATAL, "can't ipcopen %s", line);
		}
    }
    alarm(0);

    if ( (ttyo = dup(ttyi)) == -1 )
	error(FATAL, "can't dup file descriptor for %s", line);

    if ( ioctl(ttyi, FIOPUSHLD, &tty_ld) == -1 )
	error(FATAL, "ioctl error - FIOPUSHLD");

    if ( ioctl(ttyi, TIOCGDEV, &ttydev) == -1 )
	error(FATAL, "ioctl error - TIOCGDEV");

    if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCGETP");

    sgtty.sg_flags &= ~ECHO;
    sgtty.sg_flags &= ~CRMOD;
    sgtty.sg_flags |= CBREAK;
    ttydev.ispeed = baudrate;
    ttydev.ospeed = baudrate;

    if ( ioctl(ttyi, TIOCSDEV, &ttydev) == -1 )
	error(FATAL, "ioctl error - TIOCSDEV");

    if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCSETP");

    if ( ioctl(ttyi, TIOCSETC, &tchar) == -1 )
	error(FATAL, "ioctl error - TIOCSETC");

    fp_ttyi = fdopen(ttyi, "r");

}   /* End of setupline */

/*****************************************************************************/

resetline()

{

    struct sgttyb	sgtty;

/*
 *
 * Only used if we're running the program as separate read and write processes.
 * Called from split() after the initial connection has been made and returns
 * TRUE if two processes should work. Haven't tested or even compiled the stuff
 * for separate read and write processes on Ninth Edition systems - no guarantees
 * even though we return TRUE!
 *
 */

    if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCGETP");

    sgtty.sg_flags |= TANDEM;

    if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCSETP");

    return(TRUE);

}   /* End of resetline */

/*****************************************************************************/

setupstdin(mode)

    int		mode;			/* what to do with stdin settings */

{

    struct sgttyb		sgtty;

    static int			saved = FALSE;
    static struct sgttyb	oldsgtty;

/*
 *
 * Save (mode = 0), reset (mode = 1), or restore (mode = 2) the tty settings for
 * stdin. Expect something like raw mode with no echo will be set up. Need to make
 * sure interrupt and quit still work - they're the only good way to exit when
 * we're running interactive mode. I haven't tested or even compiled this code
 * so there are no guarantees.
 *
 */

    if ( interactive == TRUE )
	switch ( mode )  {
	    case 0:
		if ( ioctl(0, TIOCGETP, &oldsgtty) == -1 )
		    error(FATAL, "can't save terminal settings");
		saved = TRUE;
		break;

	    case 1:
		sgtty = oldsgtty;
		sgtty.sg_flags &= ~ECHO;
		sgtty.sg_flags |= CBREAK;
		ioctl(0, TIOCSETP, &sgtty);
		break;

	    case 2:
		if ( saved == TRUE )
		    ioctl(0, TIOCSETP, &oldsgtty);
		break;
	}   /* End switch */

}   /* End of setupstdin */

/*****************************************************************************/

readline()

{

    int		n;			/* read() return value */
    int		ch;			/* for interactive mode */

/*
 *
 * Reads characters coming back from the printer on ttyi up to a newline (or EOF)
 * and transfers each line to the mesg[] array. Everything available on ttyi is
 * initially stored in tbuf[] and a line at a time is transferred from there to
 * mesg[]. The string in mesg[] is terminated with a '\0' and TRUE is returned to
 * the caller when we find a newline, EOF, or reach the end of the mesg[] array.
 * If nothing is available on ttyi we return FALSE if a single process is being
 * used for reads and writes, while in the two process implementation we force a
 * one character read. Interactive mode loops here forever, except during start(),
 * echoing everything that comes back on ttyi to stdout. The performance of a
 * simple getc/putc loop for interactive mode was unacceptable when run under mux
 * and has been replaced by more complicated code. When layers wasn't involved
 * the getc/putc loop worked well.
 *
 */

    if ( interactive == FALSE )  {
	while ( 1 )  {
	    while ( nptr < eptr )  {	/* grab characters from tbuf */
		*ptr = *nptr++;
		if ( *ptr == '\r' ) continue;
		if ( *ptr == '\n' || *ptr == '\004' || ptr >= endmesg )  {
		    *(ptr+1) = '\0';
		    if ( *ptr == '\004' )
			strcpy(ptr, "%%[ status: endofjob ]%%\n");
		    ptr = mesg;
		    return(TRUE);
		}   /* End if */
		++ptr;
	    }	/* End for */

	    nptr = eptr = tbuf;
	    if ( ioctl(ttyi, FIONREAD, &n) < 0 )
		if ( errno == EINTR )
		    continue;
		else error(FATAL, "ioctl error - FIONREAD");
	    if ( n <= 0 )
		if ( canwrite == TRUE )
		    return(FALSE);
	    n = ((n < 1) ? 1 : ((n < sizeof(tbuf)) ? n : sizeof(tbuf)));
	    if ( (n = read(ttyi, tbuf, n)) < 0 )
		if ( errno == EINTR )
		    continue;
		else error(FATAL, "error reading line %s", line);
	    else eptr = nptr + n;
	}   /* End while */
    }	/* End if */

    if ( canwrite == TRUE )		/* don't block during start() */
	return(FALSE);

    while ( 1 )  {			/* only interactive mode gets here */
	if ( ioctl(ttyi, FIONREAD, &n) < 0 )
	    error(FATAL, "ioctl error - FIONREAD");
	n = ((n < 1) ? 1 : ((n < sizeof(tbuf)) ? n : sizeof(tbuf)));
	if ( (n = read(ttyi, tbuf, n)) < 0 )
	    error(FATAL, "error reading line %s", line);
	else if ( n == 0 )		/* should not happen */
	    error(FATAL, "end of file in interactive mode");
	if ( write(1, tbuf, n) != n )
	    error(FATAL, "error writing to stdout");
    }	/* End while */

    return(FALSE);

}   /* End of readline */
#endif

/*****************************************************************************/

#ifdef BSD4_2
setupline()

{

    struct sgttyb	sgtty;
    static struct tchars	tchar = { '\377',	/* interrupt */
					  '\377',	/* quit */
					  '\021',	/* start output */
					  '\023',	/* stop output */
					  '\377',	/* end-of-file */
					  '\377'	/* input delimiter */
					};
    long	lmodes;
    int		disc = NTTYDISC;

/*
 *
 * Line initialization for BSD4_2. As in the System V code, if no line is given
 * (ie. line == NULL) we continue on as before using stdout as ttyi and ttyo.
 *
 */

    if ( line == NULL )
	ttyi = fileno(stdout);
    else if ( (ttyi = open(line, O_RDWR)) == -1 )
	error(FATAL, "can't open %s", line);

    if ( (ttyo = dup(ttyi)) == -1 )
	error(FATAL, "can't dup file descriptor for %s", line);

    if (ioctl(ttyi, TIOCSETD, &disc) == -1 )
	error(FATAL, "ioctl error - TIOCSETD");

    if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCGETP");

    if ( ioctl(ttyi, TIOCLGET, &lmodes) == -1 )
	error(FATAL, "ioctl error - TIOCLGET");

    sgtty.sg_flags &= ~ECHO;
    sgtty.sg_flags &= ~CRMOD;
    sgtty.sg_flags |= CBREAK;
    sgtty.sg_ispeed = baudrate;
    sgtty.sg_ospeed = baudrate;
    lmodes |= LDECCTQ;

    if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCSETP");

    if ( ioctl(ttyi, TIOCSETC, &tchar) == -1 )
	error(FATAL, "ioctl error - TIOCSETC");

    if ( ioctl(ttyi, TIOCLSET, &lmodes) == -1 )
	error(FATAL, "ioctl error - TIOCLSET");

    fp_ttyi = fdopen(ttyi, "r");

}   /* End of setupline */

/*****************************************************************************/

resetline()

{

    struct sgttyb	sgtty;

/*
 *
 * Only used if we're running the program as separate read and write processes.
 * Called from split() after the initial connection has been made and returns
 * TRUE if two processes should work. Haven't tested or even compiled the stuff
 * for separate read and write processes on Berkeley systems - no guarantees
 * even though we return TRUE!
 *
 */

    if ( ioctl(ttyi, TIOCGETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCGETP");

    sgtty.sg_flags |= TANDEM;

    if ( ioctl(ttyi, TIOCSETP, &sgtty) == -1 )
	error(FATAL, "ioctl error - TIOCSETP");

    return(TRUE);

}   /* End of resetline */

/*****************************************************************************/

setupstdin(mode)

    int		mode;			/* what to do with stdin settings */

{

    struct sgttyb		sgtty;

    static int			saved = FALSE;
    static struct sgttyb	oldsgtty;

/*
 *
 * Save (mode = 0), reset (mode = 1), or restore (mode = 2) the tty settings for
 * stdin. Expect something like raw mode with no echo will be set up. Need to make
 * sure interrupt and quit still work - they're the only good way to exit when
 * we're running interactive mode. I haven't tested or even compiled this code
 * so there are no guarantees.
 *
 */

    if ( interactive == TRUE )
	switch ( mode )  {
	    case 0:
		if ( isatty(0) != 1 )
		    error(FATAL, "stdin not a terminal - can't run interactive mode");
		if ( ioctl(0, TIOCGETP, &oldsgtty) == -1 )
		    error(FATAL, "can't save terminal settings");
		saved = TRUE;
		break;

	    case 1:
		sgtty = oldsgtty;
		sgtty.sg_flags &= ~ECHO;
		sgtty.sg_flags |= CBREAK;
		ioctl(0, TIOCSETP, &sgtty);
		break;

	    case 2:
		if ( saved == TRUE )
		    ioctl(0, TIOCSETP, &oldsgtty);
		break;
	}   /* End switch */

}   /* End of setupstdin */

/*****************************************************************************/

readline()

{

    int		n;			/* read() return value */
    int		ch;			/* for interactive mode */

/*
 *
 * Reads characters coming back from the printer on ttyo up to a newline (or EOF)
 * or until no more characters are available. Characters are put in mesg[], the
 * string is terminated with '\0' when we're done with a line and TRUE is returned
 * to the caller. If complete line wasn't available FALSE is returned. Interactive
 * mode should loop here forever, except during start(), echoing characters to
 * stdout. If it happens to leave FALSE should be returned. Probably should read
 * everything available on ttyi into a temporary buffer and work from there rather
 * than reading one character at a time.
 *
 */

    if ( interactive == FALSE )  {
	while ( 1 )  {
	    if ( ioctl(ttyi, FIONREAD, &n) < 0 )
		if ( errno == EINTR )
		    continue;
		else error(FATAL, "ioctl error - FIONREAD");
	    if ( n <= 0 )
		if ( canwrite == TRUE )
		    return(FALSE);
		else n = 1;
	    for ( ; n > 0; n-- )  {
		/*if ( read(ttyi, ptr, 1) < 0 )*/
		if ( (*ptr = getc(fp_ttyi)) == EOF )
		    if ( errno == EINTR )
			continue;
		    else error(FATAL, "error reading %s", line);
		if ( *ptr == '\r' ) continue;
		if ( *ptr == '\n' || *ptr == '\004' || ptr >= endmesg )  {
		    *(ptr+1) = '\0';
		    if ( *ptr == '\004' )
			strcpy(ptr, "%%[ status: endofjob ]%%\n");
		    ptr = mesg;
		    return(TRUE);
		}   /* End if */
		++ptr;
	    }	/* End for */
	}   /* End while */
    }	/* End if */

    if ( canwrite == TRUE )		/* don't block during start() */
	return(FALSE);

    while ( (ch = getc(fp_ttyi)) != EOF )
	putc(ch, stdout);
    return(FALSE);

}   /* End of readline */

/*****************************************************************************/

/*	@(#)strspn.c	1.2	*/
/*LINTLIBRARY*/
/*
 * Return the number of characters in the maximum leading segment
 * of string which consists solely of characters from charset.
 */
int
strspn(string, charset)
char	*string;
register char	*charset;
{
	register char *p, *q;

	for(q=string; *q != '\0'; ++q) {
		for(p=charset; *p != '\0' && *p != *q; ++p)
			;
		if(*p == '\0')
			break;
	}
	return(q-string);
}

/*	@(#)strpbrk.c	1.2	*/
/*LINTLIBRARY*/
/*
 * Return ptr to first occurance of any character from `brkset'
 * in the character string `string'; NULL if none exists.
 */

char *
strpbrk(string, brkset)
register char *string, *brkset;
{
	register char *p;

	do {
		for(p=brkset; *p != '\0' && *p != *string; ++p)
			;
		if(*p != '\0')
			return(string);
	}
	while(*string++);
	return((char*)0);
}

/*	@(#)strtok.c	1.2	*/
/*	3.0 SID #	1.2	*/
/*LINTLIBRARY*/
/*
 * uses strpbrk and strspn to break string into tokens on
 * sequentially subsequent calls.  returns NULL when no
 * non-separator characters remain.
 * `subsequent' calls are calls with first argument NULL.
 */


extern int strspn();
extern char *strpbrk();

char *
strtok(string, sepset)
char	*string, *sepset;
{
	register char	*p, *q, *r;
	static char	*savept;

	/*first or subsequent call*/
	p = (string == (char*)0)? savept: string;

	if(p == 0)		/* return if no tokens remaining */
		return((char*)0);

	q = p + strspn(p, sepset);	/* skip leading separators */

	if(*q == '\0')		/* return if no tokens remaining */
		return((char*)0);

	if((r = strpbrk(q, sepset)) == (char*)0)	/* move past token */
		savept = 0;	/* indicate this is last token */
	else {
		*r = '\0';
		savept = ++r;
	}
	return(q);
}
#endif

/*****************************************************************************/

#ifdef DKHOST

#ifndef DKSTREAMS
short	dkrmode[3] = {DKR_TIME, 0, 0};
#endif

dkhost_connect()

{

    int		ofd;			/* for saving and restoring stderr */
    int		dfd;
    int		retrytime = 5;

/*
 *
 * Tries to connect to a Datakit destination. The extra stuff I've added to save
 * and later restore stderr is primarily for our spooling setup at Murray Hill.
 * postio is usually called with stderr directed to a file that will be returned
 * to the user when the job finishes printing. Problems encountered by dkdial(),
 * like busy messages, go to stderr but don't belong in the user's mail. They'll
 * be temporarily directed to the log file. After we've connected stderr will be
 * restored.
 *
 */

    if ( *line == '\0' )
	error(FATAL, "incomplete Datakit line");

    if ( fp_log != NULL && fp_log != stderr )  {	/* redirect dkdial errors */
	ofd = dup(2);
	close(2);
	dup(fileno(fp_log));
    }	/* End if */

    while ( (dfd = ttyi = dkdial(line)) < 0 )  {
	if ( retrytime < 0 )
	    error(FATAL, "can't connect to %s", line);
	sleep(retrytime++);
	if ( retrytime > 60 )
	    retrytime = 60;
    }	/* End while */

    if ( fp_log != NULL && fp_log != stderr )  {	/* restore stderr */
	close(2);
	dup(ofd);
	close(ofd);
    }	/* End if */

#ifndef DKSTREAMS
    if ( ioctl(ttyi, DIOCRMODE, dkrmode) == -1 )
	error(FATAL, "ioctl error - DIOCRMODE");

#ifdef DIOURPWD
    if ( window_size > 0 ) {
	short	dkparm[3];

	dkparm[0] = dkminor(ttyi);
	dkparm[1] = 1;
	dkparm[2] = window_size;
	if ( ioctl(ttyi, DIOURPWD, dkparm) < 0 || ioctl(ttyi, DIOCFLUSH, 0) < 0 )
	    error(NON_FATAL, "WSA failed");
    }	/* End if */
#endif

    line = dtnamer(dkminor(ttyi));

    if ( (ttyi = open(line, O_RDWR)) == -1 )
	error(FATAL, "can't open %s", line);

    close(dfd);
#endif

}   /* End of dkhost_connect */
#endif

/*****************************************************************************/

0707070014231405061006440057030057030000011222050522627503600003000000002561post.src/postio/ifdef.h/*
 *
 * Conditional compilation definitions needed in ifdef.c and postio.c.
 *
 */

#ifdef SYSV
#include <termio.h>

#ifdef DKSTREAMS
#include <sys/stream.h>
#include <sys/stropts.h>
#endif

#endif

#ifdef V9
#include <sys/filio.h>
#include <sys/ttyio.h>

extern int	tty_ld;
#endif

#ifdef BSD4_2
#include <sgtty.h>
#include <sys/time.h>
#include <errno.h>

#define FD_ZERO(s) (s) = 0
#define FD_SET(n,s) (s) |= 1 << (n)

extern int	errno;
#endif

#ifdef DKHOST
#include <dk.h>
#include <sysexits.h>

extern char	*dtnamer();
extern int	dkminor();
#endif

/*
 *
 * External variable declarations - most (if not all) are defined in postio.c and
 * needed by the routines in ifdef.c.
 *
 */

extern char	*line;			/* printer is on this line */
extern int	ttyi;			/* input */
extern int	ttyo;			/* and output file descriptors */
extern FILE	*fp_log;		/* just for DKHOST stuff */

extern char	mesg[];			/* exactly what came back on ttyi */
extern char	*endmesg;		/* one in front of last free slot in mesg */
extern int	next;			/* next character goes in mesg[next] */

extern short	baudrate;		/* printer is running at this speed */
extern int	stopbits;		/* and expects this many stop bits */
extern int	interactive;		/* TRUE for interactive mode */

extern int	whatami;		/* a READ or WRITE process - or both */
extern int	canread;		/* allows reads */
extern int	canwrite;		/* and writes if TRUE */

0707070014231405071006440057030057030000011223600522627503600003100000015777post.src/postio/postio.1.TH POSTIO 1 "DWB 3.2"
.SH NAME
.B postio
\- serial interface for PostScript printers
.SH SYNOPSIS
\*(mBpostio\f1
.OP \-l line
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B postio
sends
.I files
to the PostScript printer attached to
.IR line .
If no
.I files
are specified the standard input is sent.
The first group of
.I options
should be sufficient for most applications:
.TP 0.75i
.OP \-b speed
Transmit data over
.I line
at baud rate
.I speed.
Recognized baud rates are 1200, 2400, 4800, 9600, and 19200.
The default
.I speed
is 9600 baud.
.TP
.OP \-c
Do not send
.MR ^C s
(interrupts) to the printer,
which means
.B postio
does not force a busy printer into the idle state.
.TP
.OP \-l line
Connect to printer attached to
.IR line .
In most cases there is no default and
.B postio
must be able to read and write
.IR line .
If
.I line
does not begin with
.MW /
it is treated as a Datakit destination.
.TP
.OP \-q
Prevents status queries while
.I files
are being sent to the printer.
When status queries are disabled a dummy message is appended
to the log file before each block is transmitted.
.TP
.OP \-B num
Set internal buffer size for reading and writing
.I files
to
.I num
bytes
(default is 2048 bytes).
.TP
.OP \-D
Enable debug mode.
Guarantees that everything read on
.I line
will be added to the log file (standard error by default).
.TP
.OP \-L file
Data received on
.I line
gets put in
.IR file .
The default log
.I file
is standard error.
Printer or status messages that do not indicate a change in state
are not normally written to
.I file
but can be forced out using the
.OP \-D
option.
.TP
.OP \-P string
Send
.I string
to the printer before any of the input files.
The default
.I string
is simple PostScript code that disables timeouts.
.TP
.OP \-R num
Run
.B postio
as a single process if
.I num
is 1 or as separate read and write processes if
.I num
is 2.
By default
.B postio
runs as a single process.
.PP
The next two
.I options
are provided for users who expect to run
.B postio
on their own.
Neither is suitable for use in spooler interface
programs:
.TP 0.35i
.OP \-i
Run the program in interactive mode.
Any
.I files
are sent first and followed by the standard input.
Forces separate read and write processes
and overrides many other options.
To exit interactive mode use your interrupt or quit character.
To get a friendly interactive connection with the printer type
.MW executive
on a line by itself.
.TP
.OP \-t
Data received on
.I line
and not recognized as printer or status information is written to
the standard output.
Forces separate read and write processes.
Convenient if you have a PostScript program that
will be returning useful data to the host.
.PP
The last option is not generally recommended and should only
be used if all else fails to provide a reliable connection:
.TP 0.35i
.OP \-S
Slow the transmission of data to the printer.
Severely limits throughput, runs as a single process,
disables the
.OP \-q
option, limits the internal buffer size to 1024 bytes,
can use an excessive amount of
.SM CPU
time, and does nothing in interactive mode.
.PP
Best performance is usually obtained by using
a large internal buffer
.OP -B "" ) (
and by running the program as separate read and write processes
.OP \-R2 "" ). (
Inability to fork the additional process causes
.B postio
to continue as a single read/write process.
When one process is used, only data sent to the printer is flow-controlled.
.PP
The options are not all mutually exclusive.
The
.OP \-i
option always wins, selecting its own settings for whatever is
needed to run interactive mode, independent of anything else
found on the command line.
Interactive mode runs as separate read and write processes
and few of the other
.I options
accomplish anything in the presence of the
.OP \-i
option.
The
.OP \-t
option needs a reliable two way connection to the printer and
therefore tries to force separate read and write processes.
The
.OP \-S
option relies on the status query mechanism, so
.OP \-q
is disabled and the program runs as a single process.
.PP
In most cases
.B postio
starts by making a connection to
.I line
and then attempts to force the printer into the
.SM IDLE
state by sending an appropriate sequence of
.MW ^T
(status query), 
.MW ^C
(interrupt), and
.MW ^D
(end of job) characters.
When the printer goes
.SM IDLE
.I files
are transmitted along with an occasional
.MW ^T
(unless the
.OP \-q
option was used).
After all the
.I files
are sent the program waits until it is reasonably sure the
job is complete.
Printer generated error messages received at any time
except while establishing the initial connection
(or when running interactive mode) cause
.B postio
to exit with a non-zero status.
In addition to being added to the log file, printer error messages
are also echoed to standard error.
.SH EXAMPLES
Run as a single process at 9600 baud and send
.I file1
and
.I file2
to the printer attached to
.MR /dev/tty01 :
.EX
postio -l /dev/tty01  \f2file1  file2
.EE
Same as above except two processes are used,
the internal buffer is set to 4096 bytes,
and data returned by the printer gets put in file
.MR log :
.EX
postio -R2 -B4096 -l/dev/tty01 -Llog  \f2file1  file2
.EE
Establish an interactive connection with the printer at Datakit
destination
.MR my/printer :
.EX
postio -i -l my/printer
.EE
Send file
.MW program
to the printer connected to
.MR /dev/tty22 ,
recover any data in file
.MR results ,
and put log messages in file
.MR log :
.EX
postio -t -l /dev/tty22 -L log program >results
.EE
.SH DIAGNOSTICS
A 0 exit status is returned if the files ran successfully.
System errors (e.g., ``can't open the line'') set the low order
bit in the exit status, while PostScript errors set bit 1.
An exit status of 2 usually means the printer
detected a PostScript error in the input
.IR files .
.SH WARNINGS
.PP
The input
.I files
are handled as a single PostScript job.
Sending several different jobs, each with their own internal
end of job mark
.RM ( ^D )
is not guaranteed to work properly.
.B postio
may quit before all the jobs have completed and could be restarted
before the last one finishes.
.PP
All the capabilities described above may not be available on every
machine or even across the different versions of
.SM UNIX
that are currently supported by the program.
For example, the code needed to connect to a Datakit destination may only
work on System\ V and may require that the
.SM DKHOST
software package be available at compile time.
.PP
There may be no default
.I line
so using
.OP \-l
option is strongly recommended.
If omitted
.B postio
may attempt to connect to the printer using the standard output.
If Datakit is involved the
.OP \-b
may be ineffective and attempts by
.B postio
to flow control data in both directions may not work.
The
.OP \-q
option can help if the printer is connected to \s-1RADIAN\s+1.
The
.OP \-S
option is not generally recommended and should only be used if
all else fails to establish a reliable connection.
.SH SEE ALSO
.BR buildtables (1),
.BR dpost (1),
.BR postdaisy (1),
.BR postdmd (1),
.BR postmd (1),
.BR postprint (1),
.BR postreverse (1),
.BR posttek (1),
.BR printfont (1)
0707070014231405101006440057030057030000011224000522627503600003100000107251post.src/postio/postio.c/*
 *
 * postio - RS-232 serial interface for PostScript printers
 *
 * A simple program that manages input and output for PostScript printers. Much
 * has been added and changed from early versions of the program, but the basic
 * philosophy is still the same. Don't send real data until we're certain we've
 * connected to a PostScript printer that's in the idle state and try to hold the
 * connection until the job is completely done. It's more work than you might
 * expect is necessary, but should provide a reasonably reliable spooler interface
 * that can return error indications to the caller via the program's exit status.
 *
 * I've added code that will let you split the program into separate read/write
 * processes. Although it's not the default it should be useful if you have a file
 * that will be returning useful data from the printer. The two process stuff was
 * laid down on top of the single process code and both methods still work. The
 * implementation isn't as good as it could be, but didn't require many changes
 * to the original program (despite the fact that there are now many differences).
 *
 * By default the program still runs as a single process. The -R2 option forces
 * separate read and write processes after the intial connection is made. If you
 * want that as the default initialize splitme (below) to TRUE. In addition the
 * -t option that's used to force stuff not recognized as status reports to stdout
 * also tries to run as two processes (by setting splitme to TRUE). It will only
 * work if the required code (ie. resetline() in ifdef.c) has been implemented
 * for your Unix system. I've only tested the System V code.
 *
 * Code needed to support interactive mode has also been added, although again it's
 * not as efficient as it could be. It depends on the system dependent procedures
 * resetline() and setupstdin() (file ifdef.c) and for now is only guaranteed to
 * work on System V. Can be requested using the -i option.
 *
 * Quiet mode (-q option) is also new, but was needed for some printers connected
 * to RADIAN. If you're running in quiet mode no status requests will be sent to
 * the printer while files are being transmitted (ie. in send()).
 *
 * The program expects to receive printer status lines that look like,
 *
 *	%%[ status: idle; source: serial 25 ]%%
 *	%%[ status: waiting; source: serial 25 ]%%
 *	%%[ status: initializing; source: serial 25 ]%%
 *	%%[ status: busy; source: serial 25 ]%%
 *	%%[ status: printing; source: serial 25 ]%%
 *	%%[ status: PrinterError: out of paper; source: serial 25 ]%%
 *	%%[ status: PrinterError: no paper tray; source: serial 25 ]%%
 *
 * although this list isn't complete. Sending a '\024' (control T) character forces
 * the return of a status report. PostScript errors detected on the printer result
 * in the immediate transmission of special error messages that look like,
 *
 *	%%[ Error: undefined; OffendingCommand: xxx ]%%
 *	%%[ Flushing: rest of job (to end-of-file) will be ignored ]%%
 *
 * although we only use the Error and Flushing keywords. Finally conditions, like
 * being out of paper, result in other messages being sent back from the printer
 * over the communications line. Typical PrinterError messages look like,
 *
 *	%%[ PrinterError: out of paper; source: serial 25 ]%%
 *	%%[ PrinterError: paper jam; source: serial 25 ]%%
 *
 * although we only use the PrinterError keyword rather than trying to recognize
 * all possible printer errors.
 *
 * The implications of using one process and only flow controlling data going to
 * the printer are obvious. Job transmission should be reliable, but there can be
 * data loss in stuff sent back from the printer. Usually that only caused problems
 * with jobs designed to run on the printer and return useful data back over the
 * communications line. If that's the kind of job you're sending call postio with
 * the -t option. That should force the program to split into separate read and
 * write processes and everything not bracketed by "%%[ " and " ]%%" strings goes
 * to stdout. In otherwords the data you're expecting should be separated from the
 * status stuff that goes to the log file (or stderr). The -R2 option does almost
 * the same thing (ie. separate read and write processes), but everything that
 * comes back from the printer goes to the log file (stderr by default) and you'll
 * have to separate your data from any printer messages.
 *
 * A typical command line might be,
 *
 *	postio -l /dev/tty01 -b 9600 -L log file1 file2
 *
 * where -l selects the line, -b sets the baud rate, and -L selects the printer
 * log file. Since there's no default line, at least not right now, you'll always
 * need to use the -l option, and if you don't choose a log file stderr will be
 * used. If you have a program that will be returning data the command line might
 * look like,
 *
 *	postio -t -l/dev/tty01 -b9600 -Llog file >results
 *
 * Status stuff goes to file log while the data you're expecting back from the
 * printer gets put in file results.
 *
 */

#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>

#include "ifdef.h"			/* conditional compilation stuff */
#include "gen.h"			/* general purpose definitions */
#include "postio.h"			/* some special definitions */

char	**argv;				/* global so everyone can use them */
int	argc;

char	*prog_name = "";		/* really just for error messages */
int	x_stat = 0;			/* program exit status */
int	debug = OFF;			/* debug flag */
int	ignore = OFF;			/* what's done for FATAL errors */

char	*line = NULL;			/* printer is on this tty line */
short	baudrate = BAUDRATE;		/* and running at this baud rate */
Baud	baudtable[] = BAUDTABLE;	/* converts strings to termio values */

int	stopbits = 1;			/* number of stop bits */
int	tostdout = FALSE;		/* non-status stuff goes to stdout? */
int	quiet = FALSE;			/* no status queries in send() if TRUE */
int	interactive = FALSE;		/* interactive mode */
char	*postbegin = POSTBEGIN;		/* preceeds all the input files */
int	useslowsend = FALSE;		/* not recommended! */
int	sendctrlC = TRUE;		/* interrupt with ctrl-C when BUSY */
int	window_size = -1;		/* for Datakit - use -w */

char	*block = NULL;			/* input file buffer */
int	blocksize = BLOCKSIZE;		/* and its size in bytes */
int	head = 0;			/* block[head] is the next character */
int	tail = 0;			/* one past the last byte in block[] */

int	splitme = FALSE;		/* into READ and WRITE processes if TRUE */
int	whatami = READWRITE;		/* a READ or WRITE process - or both */
int	canread = TRUE;			/* allow reads */
int	canwrite = TRUE;		/* and writes if TRUE */
int	otherpid = -1;			/* who gets signals if greater than 1 */
int	joinsig = SIGTRAP;		/* reader gets this when writing is done */
int	writedone = FALSE;		/* and then sets this to TRUE */

char	mesg[MESGSIZE];			/* exactly what came back on ttyi */
char	sbuf[MESGSIZE];			/* for parsing the message */
int	next = 0;			/* next character goes in mesg[next] */
char	*mesgptr = NULL;		/* printer message starts here in mesg[] */
char	*endmesg = NULL;		/* as far as readline() can go in mesg[] */

Status	status[] = STATUS;		/* for converting status strings */
int	nostatus = NOSTATUS;		/* default getstatus() return value */

int	currentstate = NOTCONNECTED;	/* what's happening START, SEND, or DONE */

int	ttyi = 0;			/* input */
int	ttyo = 2;			/* and output file descriptors */

FILE	*fp_log = stderr;		/* log file for stuff from the printer */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that manages input and output for PostScript printers. Can run
 * as a single process or as separate read/write processes. What's done depends on
 * the value assigned to splitme when split() is called.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* really just for error messages */

    init_signals();			/* sets up interrupt handling */
    options();				/* get command line options */
    initialize();			/* must be done after options() */
    start();				/* make sure the printer is ready */
    split();				/* into read/write processes - maybe */
    arguments();			/* then send each input file */
    done();				/* wait until the printer is finished */
    cleanup();				/* make sure the write process stops */

    exit(x_stat);			/* everything probably went OK */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

    void	interrupt();		/* handles them if we catch signals */

/*
 *
 * Makes sure we handle interrupts. The proper way to kill the program, if
 * necessary, is to do a kill -15. That forces a call to interrupt(), which in
 * turn tries to reset the printer and then exits with a non-zero status. If the
 * program is running as two processes, sending SIGTERM to either the parent or
 * child should clean things up.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }	/* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_sig */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */
    char	*optnames = "b:cil:qs:tw:B:L:P:R:SDI";

    extern char	*optarg;		/* used by getopt() */
    extern int	optind;

/*
 *
 * Reads and processes the command line options. The -R2, -t, and -i options all
 * force separate read and write processes by eventually setting splitme to TRUE
 * (check initialize()). The -S option is not recommended and should only be used
 * as a last resort!
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'b':			/* baud rate string */
		    baudrate = getbaud(optarg);
		    break;

	    case 'c':			/* no ctrl-C's */
		    sendctrlC = FALSE;
		    break;

	    case 'i':			/* interactive mode */
		    interactive = TRUE;
		    break;

	    case 'l':			/* printer line */
		    line = optarg;
		    break;

	    case 'q':			/* no status queries - for RADIAN? */
		    quiet = TRUE;
		    break;

	    case 's':			/* use 2 stop bits - for UNISON? */
		    if ( (stopbits = atoi(optarg)) < 1 || stopbits > 2 )
			stopbits = 1;
		    break;

	    case 't':			/* non-status stuff goes to stdout */
		    tostdout = TRUE;
		    break;

	    case 'w':			/* Datakit window size */
		    window_size = atoi(optarg);
		    break;

	    case 'B':			/* set the job buffer size */
		    if ( (blocksize = atoi(optarg)) <= 0 )
			blocksize = BLOCKSIZE;
		    break;

	    case 'L':			/* printer log file */
		    if ( (fp_log = fopen(optarg, "w")) == NULL )  {
			fp_log = stderr;
			error(NON_FATAL, "can't open log file %s", optarg);
		    }	/* End if */
		    break;

	    case 'P':			/* initial PostScript code */
		    postbegin = optarg;
		    break;

	    case 'R':			/* run as one or two processes */
		    if ( atoi(optarg) == 2 )
			splitme = TRUE;
		    else splitme = FALSE;
		    break;

	    case 'S':			/* slow and kludged up version of send */
		    useslowsend = TRUE;
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

getbaud(rate)

    char	*rate;			/* string representing the baud rate */

{

    int		i;			/* for looking through baudtable[] */

/*
 *
 * Called from options() to convert a baud rate string into an appropriate termio
 * value. *rate is looked up in baudtable[] and if it's found, the corresponding
 * value is returned to the caller.
 *
 */

    for ( i = 0; baudtable[i].rate != NULL; i++ )
	if ( strcmp(rate, baudtable[i].rate) == 0 )
	    return(baudtable[i].val);

    error(FATAL, "don't recognize baud rate %s", rate);

}   /* End of getbaud */

/*****************************************************************************/

initialize()

{

/*
 *
 * Initialization, a few checks, and a call to setupline() (file ifdef.c) to open
 * and configure the communications line. Settings for interactive mode always
 * take precedence. The setupstdin() call with an argument of 0 saves the current
 * terminal settings if interactive mode has been requested - otherwise nothing's
 * done. Unbuffering stdout (via the setbuf() call) isn't really needed on System V
 * since it's flushed whenever terminal input is requested. It's more efficient if
 * we buffer the stdout (on System V) but safer (for other versions of Unix) if we
 * include the setbuf() call.
 *
 */

    whatami = READWRITE;		/* always run start() as one process */
    canread = canwrite = TRUE;

    if ( tostdout == TRUE )		/* force separate read/write processes */
	splitme = TRUE;

    if ( interactive == TRUE )  {	/* interactive mode settings always win */
	quiet = FALSE;
	tostdout = FALSE;
	splitme = TRUE;
	blocksize = 1;
	postbegin = NULL;
	useslowsend = FALSE;
	nostatus = INTERACTIVE;
	setbuf(stdout, NULL);
    }	/* End if */

    if ( useslowsend == TRUE )  {	/* last resort only - not recommended */
	quiet = FALSE;
	splitme = FALSE;
	if ( blocksize > 1024 )		/* don't send too much all at once */
	    blocksize = 1024;
    }	/* End if */

    if ( tostdout == TRUE && fp_log == stderr )
	fp_log = NULL;

    if ( line == NULL && (interactive == TRUE || tostdout == TRUE) )
	error(FATAL, "a printer line must be supplied - use the -l option");

    if ( (block = malloc(blocksize)) == NULL )
	error(FATAL, "no memory");

    endmesg = mesg + sizeof mesg - 2;	/* one byte from last position in mesg */

    setupline();			/* configure the communications line */
    setupstdin(0);			/* save current stdin terminal settings */

}   /* End of initialize */

/*****************************************************************************/

start()

{

/*
 *
 * Tries to put the printer in the IDLE state before anything important is sent.
 * Run as a single process no matter what has been assigned to splitme. Separate
 * read and write processes, if requested, will be created after we're done here.
 *
 */

    logit("printer startup\n");

    currentstate = START;
    clearline();

    while ( 1 )
	switch ( getstatus(1) )  {
	    case IDLE:
	    case INTERACTIVE:
		    if ( postbegin != NULL && *postbegin != '\0' )
			Write(ttyo, postbegin, strlen(postbegin));
		    clearline();
		    return;

	    case BUSY:
		    if ( sendctrlC == TRUE ) {
			Write(ttyo, "\003", 1);
			Rest(1);
		    }	/* End if */
		    break;

	    case WAITING:
	    case ERROR:
	    case FLUSHING:
		    Write(ttyo, "\004", 1);
		    Rest(1);
		    break;

	    case PRINTERERROR:
		    Rest(15);
		    break;

	    case DISCONNECT:
		    error(FATAL, "Disconnected - printer may be offline");
		    break;

	    case ENDOFJOB:
	    case UNKNOWN:
		    clearline();
		    break;

	    default:
		    Rest(1);
		    break;
	}   /* End switch */

}   /* End of start */

/*****************************************************************************/

split()

{

    int		pid;
    void	interrupt();

/*
 *
 * If splitme is TRUE we fork a process, make the parent handle reading, and let
 * the child take care of writing. resetline() (file ifdef.c) contains all the
 * system dependent code needed to reset the communications line for separate
 * read and write processes. For now it's expected to return TRUE or FALSE and
 * that value controls whether we try the fork. I've only tested the two process
 * stuff for System V. Other versions of resetline() may just be dummy procedures
 * that always return FALSE. If the fork() failed previous versions continued as
 * a single process, although the implementation wasn't quite right, but I've now
 * decided to quit. The main reason is a Datakit channel may be configured to
 * flow control data in both directions, and if we run postio over that channel
 * as a single process we likely will end up in deadlock.
 *
 */

    if ( splitme == TRUE )
	if ( resetline() == TRUE )  {
	    pid = getpid();
	    signal(joinsig, interrupt);
	    if ( (otherpid = fork()) == -1 )
		error(FATAL, "can't fork");
	    else if ( otherpid == 0 )  {
		whatami = WRITE;
		nostatus = WRITEPROCESS;
		otherpid = pid;
		setupstdin(1);
	    } else whatami = READ;
	} else if ( interactive == TRUE || tostdout == TRUE )
	    error(FATAL, "can't create two process - check resetline()");
 	else error(NON_FATAL, "running as a single process - check resetline()");

    canread = (whatami & READ) ? TRUE : FALSE;
    canwrite = (whatami & WRITE) ? TRUE : FALSE;

}   /* End of split */

/*****************************************************************************/

arguments()

{

    int		fd_in;			/* next input file */

/*
 *
 * Makes sure all the non-option command line arguments are processed. If there
 * aren't any arguments left when we get here we'll send stdin. Input files are
 * only read and sent to the printer if canwrite is TRUE. Checking it here means
 * we won't have to do it in send(). If interactive mode is TRUE we'll stay here
 * forever sending stdin when we run out of files - exit with a break. Actually
 * the loop is bogus and used at most once when we're in interactive mode because
 * stdin is in a pseudo raw mode and the read() in readblock() should never see
 * the end of file.
 *
 */

    if ( canwrite == TRUE )
	do				/* loop is for interactive mode */
	    if ( argc < 1 )
		send(fileno(stdin), "pipe.end");
	    else  {
		while ( argc > 0 )  {
		    if ( (fd_in = open(*argv, O_RDONLY)) == -1 )
			error(FATAL, "can't open %s", *argv);
		    send(fd_in, *argv);
		    close(fd_in);
		    argc--;
		    argv++;
		}   /* End while */
	    }	/* End else */
	while ( interactive == TRUE );

}   /* End of arguments */

/*****************************************************************************/

send(fd_in, name)

    int		fd_in;			/* next input file */
    char	*name;			/* and it's pathname */

{

/*
 *
 * Sends file *name to the printer. There's nothing left here that depends on
 * sending and receiving status reports, although it can be reassuring to know
 * the printer is responding and processing our job. Only the writer gets here
 * in the two process implementation, and in that case split() has reset nostatus
 * to WRITEPROCESS and that's what getstatus() always returns. For now we accept
 * the IDLE state and ENDOFJOB as legitimate and ignore the INITIALIZING state.
 *
 */

    if ( interactive == FALSE )
	logit("sending file %s\n", name);

    currentstate = SEND;

    if ( useslowsend == TRUE )  {
	slowsend(fd_in);
	return;
    }	/* End if */

    while ( readblock(fd_in) )
	switch ( getstatus(0) )  {
	    case IDLE:
	    case BUSY:
	    case WAITING:
	    case PRINTING:
	    case ENDOFJOB:
	    case PRINTERERROR:
	    case UNKNOWN:
	    case NOSTATUS:
	    case WRITEPROCESS:
	    case INTERACTIVE:
		    writeblock();
		    break;

	    case ERROR:
		    fprintf(stderr, "%s", mesg);	/* for csw */
		    error(USER_FATAL, "PostScript Error");
		    break;

	    case FLUSHING:
		    error(USER_FATAL, "Flushing Job");
		    break;

	    case DISCONNECT:
		    error(FATAL, "Disconnected - printer may be offline");
		    break;
	}   /* End switch */

}   /* End of send */

/*****************************************************************************/

done()

{

    int		sleeptime = 15;		/* for 'out of paper' etc. */

/*
 *
 * Tries to stay connected to the printer until we're reasonably sure the job is
 * complete. It's the only way we can recover error messages or data generated by
 * the PostScript program and returned over the communication line. Actually doing
 * it correctly for all possible PostScript jobs is more difficult that it might
 * seem. For example if we've sent several jobs, each with their own EOF mark, then
 * waiting for ENDOFJOB won't guarantee all the jobs have completed. Even waiting
 * for IDLE isn't good enough. Checking for the WAITING state after all the files
 * have been sent and then sending an EOF may be the best approach, but even that
 * won't work all the time - we could miss it or might not get there. Even sending
 * our own special PostScript job after all the input files has it's own different
 * set of problems, but probably could work (perhaps by printing a fake status
 * message or just not timing out). Anyway it's probably not worth the trouble so
 * for now we'll quit if writedone is TRUE and we get ENDOFJOB or IDLE.
 *
 * If we're running separate read and write processes the reader gets here after
 * after split() while the writer goes to send() and only gets here after all the
 * input files have been transmitted. When they're both here the writer sends the
 * reader signal joinsig and that forces writedone to TRUE in the reader. At that
 * point the reader can begin looking for an indication of the end of the job.
 * The writer hangs around until the reader kills it (usually in cleanup()) sending
 * occasional status requests.
 *
 */

    if ( canwrite == TRUE )
	logit("waiting for end of job\n");

    currentstate = DONE;
    writedone = (whatami == READWRITE) ? TRUE : FALSE;

    while ( 1 )  {
	switch ( getstatus(1) )  {

	    case WRITEPROCESS:
		    if ( writedone == FALSE )  {
			sendsignal(joinsig);
			Write(ttyo, "\004", 1);
			writedone = TRUE;
			sleeptime = 1;
		    }	/* End if */
		    Rest(sleeptime++);
		    break;

	    case WAITING:
		    Write(ttyo, "\004", 1);
		    Rest(1);
		    sleeptime = 15;
		    break;

	    case IDLE:
	    case ENDOFJOB:
		    if ( writedone == TRUE )  {
			logit("job complete\n");
			return;
		    }	/* End if */
		    break;

	    case BUSY:
	    case PRINTING:
	    case INTERACTIVE:
		    sleeptime = 15;
		    break;

	    case PRINTERERROR:
		    Rest(sleeptime++);
		    break;

	    case ERROR:
		    fprintf(stderr, "%s", mesg);	/* for csw */
		    error(USER_FATAL, "PostScript Error");
		    return;

	    case FLUSHING:
		    error(USER_FATAL, "Flushing Job");
		    return;

	    case DISCONNECT:
		    error(FATAL, "Disconnected - printer may be offline");
		    return;

	    default:
		    Rest(1);
		    break;
	}   /* End switch */

	if ( sleeptime > 60 )
	    sleeptime = 60;
    }	/* End while */

}   /* End of done */

/*****************************************************************************/

cleanup()

{

    int		w;

/*
 *
 * Only needed if we're running separate read and write processes. Makes sure the
 * write process is killed after the read process has successfully finished with
 * all the jobs. sendsignal() returns a -1 if there's nobody to signal so things
 * work when we're running a single process.
 *
 */

    while ( sendsignal(SIGKILL) != -1 && (w = wait((int *)0)) != otherpid && w != -1 ) ;

}   /* End of cleanup */

/*****************************************************************************/

readblock(fd_in)

    int		fd_in;			/* current input file */

{

    static long	blocknum = 1;

/*
 *
 * Fills the input buffer with the next block, provided we're all done with the
 * last one. Blocks from fd_in are stored in array block[]. head is the index
 * of the next byte in block[] that's supposed to go to the printer. tail points
 * one past the last byte in the current block. head is adjusted in writeblock()
 * after each successful write, while head and tail are reset here each time
 * a new block is read. Returns the number of bytes left in the current block.
 * Read errors cause the program to abort. The fake status message that's put out
 * in quiet mode is only so you can look at the log file and know something's
 * happening - take it out if you want.
 *
 */

    if ( head >= tail )  {		/* done with the last block */
	if ( (tail = read(fd_in, block, blocksize)) == -1 )
	    error(FATAL, "error reading input file");
	if ( quiet == TRUE && tail > 0 )	/* put out a fake message? */
	    logit("%%%%[ status: busy; block: %d ]%%%%\n", blocknum++);
	head = 0;
    }	/* End if */

    return(tail - head);

}   /* End of readblock */

/*****************************************************************************/

writeblock()

{

    int		count;			/* bytes successfully written */

/*
 *
 * Called from send() when it's OK to send the next block to the printer. head
 * is adjusted after the write, and the number of bytes that were successfully
 * written is returned to the caller.
 *
 */

    if ( (count = write(ttyo, &block[head], tail - head)) == -1 )
	error(FATAL, "error writing to %s", line);
    else if ( count == 0 )
	error(FATAL, "printer appears to be offline");

    head += count;
    return(count);

}   /* End of writeblock */

/*****************************************************************************/

getstatus(t)

    int		t;			/* sleep time after sending '\024' */

{

    int		gotline = FALSE;	/* value returned by readline() */
    int		state = nostatus;	/* representation of the current state */
    int		mesgch;			/* to restore mesg[] when tostdout == TRUE */

    static int	laststate = NOSTATUS;	/* last state recognized */

/*
 *
 * Looks for things coming back from the printer on the communications line, parses
 * complete lines retrieved by readline(), and returns an integer representation
 * of the current printer status to the caller. If nothing was available a status
 * request (control T) is sent to the printer and nostatus is returned to the
 * caller (provided quiet isn't TRUE). Interactive mode either never returns from
 * readline() or returns FALSE.
 * 
 */

    if ( canread == TRUE && (gotline = readline()) == TRUE )  {
	state = parsemesg();
	if ( state != laststate || state == UNKNOWN || mesgptr != mesg || debug == ON )
	    logit("%s", mesg);

	if ( tostdout == TRUE && currentstate != START )  {
	    mesgch = *mesgptr;
	    *mesgptr = '\0';
	    fprintf(stdout, "%s", mesg);
	    fflush(stdout);
	    *mesgptr = mesgch;		/* for ERROR in send() and done() */
	}   /* End if */
	return(laststate = state);
    }	/* End if */

    if ( (quiet == FALSE || currentstate != SEND) &&
	 (tostdout == FALSE || currentstate == START) && interactive == FALSE )  {
	if ( Write(ttyo, "\024", 1) != 1 )
	    error(FATAL, "printer appears to be offline");
	if ( t > 0 ) Rest(t);
    }	/* End if */

    return(nostatus);

}   /* End of getstatus */

/*****************************************************************************/

parsemesg()

{

    char	*e;			/* end of printer message in mesg[] */
    char	*key, *val;		/* keyword/value strings in sbuf[] */
    char	*p;			/* for converting to lower case etc. */
    int		i;			/* where *key was found in status[] */

/*
 *
 * Parsing the lines that readline() stores in mesg[] is messy, and what's done
 * here isn't completely correct nor as fast as it could be. The general format
 * of lines that come back from the printer (assuming no data loss) is:
 *
 *		str%%[ key: val; key: val; key: val ]%%\n
 *
 * where str can be most anything not containing a newline and printer reports
 * (eg. status or error messages) are bracketed by "%%[ " and " ]%%" strings and
 * end with a newline. Usually we'll have the string or printer report but not
 * both. For most jobs the leading string will be empty, but could be anything
 * generated on a printer and returned over the communications line using the
 * PostScript print operator. I'll assume PostScript jobs are well behaved and
 * never bracket their messages with "%%[ " and " ]%%" strings that delimit status
 * or error messages.
 *
 * Printer reports consist of one or more key/val pairs, and what we're interested
 * in (status or error indications) may not be the first pair in the list. In
 * addition we'll sometimes want the value associated with a keyword (eg. when
 * key = status) and other times we'll want the keyword (eg. when key = Error or
 * Flushing). The last pair isn't terminated by a semicolon and a value string
 * often contains many space separated words and it can even include colons in
 * meaningful places. I've also decided to continue converting things to lower
 * case before doing the lookup in status[]. The isupper() test is for Berkeley
 * systems.
 *
 */

    if ( *(mesgptr = find("%%[ ", mesg)) != '\0' && *(e = find(" ]%%", mesgptr+4)) != '\0' )  {
	strcpy(sbuf, mesgptr+4);		/* don't change mesg[] */
	sbuf[e-mesgptr-4] = '\0';		/* ignore the trailing " ]%%" */

	for ( key = strtok(sbuf, " :"); key != NULL; key = strtok(NULL, " :") )  {
	    if ( (val = strtok(NULL, ";")) != NULL && strcmp(key, "status") == 0 )
		key = val;

	    for ( ; *key == ' '; key++ ) ;	/* skip any leading spaces */
	    for ( p = key; *p; p++ )		/* convert to lower case */
		if ( *p == ':' )  {
		    *p = '\0';
		    break;
		} else if ( isupper(*p) ) *p = tolower(*p);

	    for ( i = 0; status[i].state != NULL; i++ )
		if ( strcmp(status[i].state, key) == 0 )
		    return(status[i].val);
	}   /* End for */
    } else if ( strcmp(mesg, "CONVERSATION ENDED.\n") == 0 )
	return(DISCONNECT);

    return(mesgptr == '\0' ? nostatus : UNKNOWN);

}   /* End of parsemesg */

/*****************************************************************************/

char *find(str1, str2)

    char	*str1;			/* look for this string */
    char	*str2;			/* in this one */

{

    char	*s1, *s2;		/* can't change str1 or str2 too fast */

/*
 *
 * Looks for *str1 in string *str2. Returns a pointer to the start of the substring
 * if it's found or to the end of string str2 otherwise.
 *
 */ 

    for ( ; *str2 != '\0'; str2++ )  {
	for ( s1 = str1, s2 = str2; *s1 != '\0' && *s1 == *s2; s1++, s2++ ) ;
	if ( *s1 == '\0' )
	    break;
    }	/* End for */

    return(str2);

}   /* End of find */

/*****************************************************************************/

clearline()

{

/*
 *
 * Reads characters from the input line until nothing's left. Don't do anything if
 * we're currently running separate read and write processes.
 * 
 */

    if ( whatami == READWRITE )
	while ( readline() != FALSE ) ;

}   /* End of clearline */

/*****************************************************************************/

sendsignal(sig)

    int		sig;			/* this goes to the other process */

{

/*
 *
 * Sends signal sig to the other process if we're running as separate read and
 * write processes. Returns the result of the kill if there's someone else to
 * signal or -1 if we're running alone.
 *
 */

    if ( whatami != READWRITE && otherpid > 1 )
	return(kill(otherpid, sig));

    return(-1);

}   /* End of sendsignal */

/*****************************************************************************/

void interrupt(sig)

    int		sig;			/* signal that we caught */

{

/*
 *
 * Caught a signal - all except joinsig cause the program to quit. joinsig is the
 * signal sent by the writer to the reader after all the jobs have been transmitted.
 * Used to tell the read process when it can start looking for the end of the job.
 *
 */

    signal(sig, SIG_IGN);

    if ( sig != joinsig )  {
	x_stat |= FATAL;
	if ( canread == TRUE )
	    if ( interactive == FALSE )
		error(NON_FATAL, "signal %d abort", sig);
	    else error(NON_FATAL, "quitting");
	quit(sig);
    }	/* End if */

    writedone = TRUE;
    signal(joinsig, interrupt);

}   /* End of interrupt */

/*****************************************************************************/

logit(mesg, a1, a2, a3)

    char	*mesg;			/* control string */
    unsigned	a1, a2, a3;		/* and possible arguments */

{

/*
 *
 * Simple routine that's used to write a message to the log file.
 *
 */

    if ( mesg != NULL && fp_log != NULL )  {
	fprintf(fp_log, mesg, a1, a2, a3);
	fflush(fp_log);
    }	/* End if */

}   /* End of logit */

/*****************************************************************************/

error(kind, mesg, a1, a2, a3)

    int		kind;			/* FATAL or NON_FATAL error */
    char	*mesg;			/* error message control string */
    unsigned	a1, a2, a3;		/* control string arguments */

{

    FILE	*fp_err;

/*
 *
 * Called when we've run into some kind of program error. First *mesg is printed
 * using the control string arguments a?. If kind is FATAL and we're not ignoring
 * errors the program will be terminated. If mesg is NULL or *mesg is the NULL
 * string nothing will be printed.
 *
 */

    fp_err = (fp_log != NULL) ? fp_log : stderr;

    if ( mesg != NULL && *mesg != '\0' )  {
	fprintf(fp_err, "%s: ", prog_name);
	fprintf(fp_err, mesg, a1, a2, a3);
	putc('\n', fp_err);
    }	/* End if */

    x_stat |= kind;

    if ( kind != NON_FATAL && ignore == OFF )
	quit(SIGTERM);

}   /* End of error */

/*****************************************************************************/

quit(sig)

    int		sig;

{

    int		w;

/*
 *
 * Makes sure everything is properly cleaned up if there's a signal or FATAL error
 * that should cause the program to terminate. The sleep by the write process is
 * to help give the reset sequence a chance to reach the printer before we break
 * the connection - primarily for printers connected to Datakit. There's a very
 * slight chance the reset sequence that's sent to the printer could get us stuck
 * here. Simplest solution is don't bother to send it - everything works without it.
 * Flushing ttyo would be better, but means yet another system dependent procedure
 * in ifdef.c! I'll leave things be for now.
 *
 * Obscure problem on PS-810 turbos says wait a bit after sending an interrupt.
 * Seem to remember the printer getting into a bad state immediately after the
 * top was opened when the toner light was on. A sleep after sending the ctrl-C
 * seemed to fix things.
 *
 */

    signal(sig, SIG_IGN);
    ignore = ON;

    while ( sendsignal(sig) != -1 && (w = wait((int *)0)) != otherpid && w != -1 ) ;

    setupstdin(2);

    if ( currentstate != NOTCONNECTED ) {
	if ( sendctrlC == TRUE ) {
	    Write(ttyo, "\003", 1);
	    Rest(1);			/* PS-810 turbo problem?? */
	}   /* End if */
	Write(ttyo, "\004", 1);
    }	/* End if */

    alarm(0);				/* prevents sleep() loop on V9 systems */
    Rest(2);

    exit(x_stat);

}   /* End of quit */

/*****************************************************************************/

Rest(t)

    int		t;

{

/*
 *
 * Used to replace sleep() calls. Only needed if we're running the program as
 * a read and write process and don't want to have the read process sleep. Most
 * sleeps are in the code because of the non-blocking read used by the single
 * process implementation. Probably should be a macro.
 *
 */

    if ( t > 0 && canwrite == TRUE )
	sleep(t);

}   /* End of Rest */

/*****************************************************************************/

Read(fd, buf, n)

    int		fd;
    char	*buf;
    int		n;

{

    int		count;

/*
 *
 * Used to replace some of the read() calls. Only needed if we're running separate
 * read and write processes. Should only be used to replace read calls on ttyi.
 * Always returns 0 to the caller if the process doesn't have its READ flag set.
 * Probably should be a macro.
 *
 */

    if ( canread == TRUE )  {
	if ( (count = read(fd, buf, n)) == -1 && errno == EINTR )
	    count = 0;
    } else count = 0;

    return(count);

}   /* End of Read */

/*****************************************************************************/

Write(fd, buf, n)

    int		fd;
    char	*buf;
    int		n;

{

    int		count;

/*
 *
 * Used to replace some of the write() calls. Again only needed if we're running
 * separate read and write processes. Should only be used to replace write calls
 * on ttyo. Always returns n to the caller if the process doesn't have its WRITE
 * flag set. Should also probably be a macro.
 *
 */

    if ( canwrite == TRUE )  {
	if ( (count = write(fd, buf, n)) == -1 && errno == EINTR )
	    count = n;
    } else count = n;

    return(count);

}   /* End of Write */
 
/*****************************************************************************/

0707070014231405111006440057030057030000011225200522627503600003100000015154post.src/postio/postio.h/*
 *
 * POSTBEGIN, if it's not NULL, is some PostScript code that's sent to the printer
 * before any of the input files. It's not terribly important since the same thing
 * can be accomplished in other ways, but this approach is convenient. POSTBEGIN
 * is initialized so as to disable job timeouts. The string can also be set on the
 * command line using the -P option.
 *
 */

#define POSTBEGIN	"statusdict /waittimeout 0 put\n"

/*
 *
 * The following help determine where postio is when it's running - either in the
 * START, SEND, or DONE states. Primarily controls what's done in getstatus().
 * RADIAN occasionally had problems with two way conversations. Anyway this stuff
 * can be used to prevent status queries while we're transmitting a job. Enabled
 * by the -q option.
 *
 */

#define NOTCONNECTED	0
#define START		1
#define SEND		2
#define DONE		3

/*
 *
 * Previous versions of postio only ran as a single process. That was (and still
 * is) convenient, but meant we could only flow control one direction. Data coming
 * back from the printer occasionally got lost, but that didn't often hurt (except
 * for lost error messages). Anyway I've added code that lets you split the program
 * into separate read and write processes, thereby helping to prevent data loss in
 * both directions. It should be particularly useful when you're sending a job that
 * you expect will be returning useful data over the communications line.
 *
 * The next three definitions control what's done with data on communications line.
 * The READ flag means the line can be read, while the WRITE flag means it can be
 * written. When we're running as a single process both flags are set. I tried to
 * overlay the separate read/write process code on what was there and working for
 * one process. The implementation isn't as good as it could be, but should be
 * safe. The single process version still works, and remains the default.
 *
 */

#define READ		1
#define WRITE		2
#define READWRITE	3

/*
 *
 * Messages generated on the printer and returned over the communications line
 * look like,
 *
 *	%%[ status: idle; source: serial 25 ]%%
 *	%%[ status: waiting; source: serial 25 ]%%
 *	%%[ status: initializing; source: serial 25 ]%%
 *	%%[ status: busy; source: serial 25 ]%%
 *	%%[ status: printing; source: serial 25 ]%%
 *	%%[ status: PrinterError: out of paper; source: serial 25 ]%%
 *	%%[ status: PrinterError: no paper tray; source: serial 25 ]%%
 *
 *	%%[ PrinterError: out of paper; source: serial 25 ]%%
 *	%%[ PrinterError: no paper tray; source: serial 25 ]%%
 *
 *	%%[ Error: undefined; OffendingCommand: xxx ]%%
 *	%%[ Flushing: rest of job (to end-of-file) will be ignored ]%%
 *
 * although the list isn't meant to be complete.
 *
 * The following constants are used to classify the recognized printer states.
 * readline() reads complete lines from ttyi and stores them in array mesg[].
 * getstatus() looks for the "%%[ " and " ]%%" delimiters that bracket printer
 * messages and if found it tries to parse the enclosed message. After the lookup
 * one of the following numbers is returned as an indication of the existence or
 * content of the printer message. The return value is used in start(), send(),
 * and done() to figure out what's happening and what can be done next.
 *
 */

#define BUSY		0		/* processing data already sent */
#define WAITING		1		/* printer wants more data */
#define PRINTING	2		/* printing a page */
#define IDLE		3		/* ready to start the next job */
#define ENDOFJOB	4		/* readline() builds this up on EOF */
#define PRINTERERROR	5		/* PrinterError - eg. out of paper */
#define ERROR		6		/* some kind of PostScript error */
#define FLUSHING	7		/* throwing out the rest of the job */
#define INITIALIZING	8		/* printer is booting */
#define DISCONNECT	9		/* from Datakit! */
#define UNKNOWN		10		/* in case we missed anything */
#define NOSTATUS	11		/* no response from the printer */

#define WRITEPROCESS	12		/* dummy states for write process */
#define INTERACTIVE	13		/* and interactive mode */

/*
 *
 * An array of type Status is used, in getstatus(), to figure out the printer's
 * current state. Just helps convert strings representing the current state into
 * integer codes that other routines use.
 *
 */

typedef struct {
	char	*state;			/* printer's current status */
	int	val;			/* value returned by getstatus() */
} Status;

/*
 *
 * STATUS is used to initialize an array of type Status that translates the ASCII
 * strings returned by the printer into appropriate codes that can be used later
 * on in the program. getstatus() converts characters to lower case, so if you
 * add any entries make them lower case and put them in before the UNKNOWN entry.
 * The lookup terminates when we get a match or when an entry with a NULL state
 * is found.
 *
 */

#define STATUS								\
									\
	{								\
	    "busy", BUSY,						\
	    "waiting", WAITING,						\
	    "printing", PRINTING,					\
	    "idle", IDLE,						\
	    "endofjob", ENDOFJOB,					\
	    "printererror", PRINTERERROR,				\
	    "error", ERROR,						\
	    "flushing", FLUSHING,					\
	    "initializing", INITIALIZING,				\
	    NULL, UNKNOWN						\
	}

/*
 *
 * The baud rate can be set on the command line using the -b option. If you omit
 * it BAUDRATE will be used.
 *
 */

#define BAUDRATE	B9600

/*
 *
 * An array of type Baud is used, in routine getbaud(), to translate ASCII strings
 * into termio values that represent the requested baud rate.
 *
 */

typedef struct {
	char	*rate;			/* string identifying the baud rate */
	short	val;			/* and its termio.h value */
} Baud;

/*
 *
 * BAUDTABLE initializes the array that's used to translate baud rate requests
 * into termio values. It needs to end with an entry that has NULL assigned to
 * the rate field.
 *
 */

#define BAUDTABLE							\
									\
	{								\
	    "9600", B9600,						\
	    "B9600", B9600,						\
	    "19200", EXTA,						\
	    "19.2", EXTA,						\
	    "B19200", EXTA,						\
	    "EXTA", EXTA,						\
	    "1200", B1200,						\
	    "B1200", B1200,						\
	    "2400", B2400,						\
	    "B2400", B2400,						\
	    "B4800", B4800,						\
	    "4800", B4800,						\
	    "38400", EXTB,						\
	    "38.4", EXTB,						\
	    "B38400", EXTB,						\
	    "EXTB", EXTB,						\
	    NULL, B9600							\
	}

/*
 *
 * A few miscellaneous definitions. BLOCKSIZE is the default size of the buffer
 * used for reading the input files (changed with the -B option). MESGSIZE is the
 * size of the character array used to store printer status lines - don't make it
 * too small!
 *
 */

#define BLOCKSIZE	2048
#define MESGSIZE	512

/*
 *
 * Some of the non-integer valued functions used in postio.c.
 *
 */

char	*find();

char	*malloc();
char	*strtok();
0707070014231402051006400057030057030000011227430522633076100003200000004703post.src/postio/postio.mkMAKE=/bin/make
MAKEFILE=postio.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

DKLIB=-ldk
DKHOST=FALSE
DKSTREAMS=FALSE

#
# Need dk.h and libdk.a for Datakit support on System V. We recommend you put
# them in standard places. If it's not possible define DKHOSTDIR (below) and
# try uncommenting the following lines:
#
#	DKHOSTDIR=/usr
#	CFLAGS=$(CFLGS) -D$(SYSTEM) -I$(COMMONDIR) -I$(DKHOSTDIR)/include
#	EXTRA=-Wl,-L$(DKHOSTDIR)/lib
#

HFILES=postio.h\
       ifdef.h\
       $(COMMONDIR)/gen.h

OFILES=postio.o\
       ifdef.o\
       slowsend.o

all : postio

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	cp postio $(POSTBIN)/postio
	@chmod 755 $(POSTBIN)/postio
	@chgrp $(GROUP) $(POSTBIN)/postio
	@chown $(OWNER) $(POSTBIN)/postio
	cp postio.1 $(MAN1DIR)/postio.1
	@chmod 644 $(MAN1DIR)/postio.1
	@chgrp $(GROUP) $(MAN1DIR)/postio.1
	@chown $(OWNER) $(MAN1DIR)/postio.1

clean :
	rm -f *.o

clobber : clean
	rm -f postio

postio ::
	@CFLAGS="$(CFLAGS)"; export CFLAGS; \
	DKLIB=" "; export DKLIB; \
	if [ "$(SYSTEM)" != V9 ]; \
	    then \
		if [ "$(DKHOST)" = TRUE ]; then \
		    if [ "$(DKSTREAMS)" != FALSE ]; then \
			if [ "$(DKSTREAMS)" = TRUE ]; \
			    then CFLAGS="$$CFLAGS -DDKSTREAMS=\\\"dknetty\\\""; \
			    else CFLAGS="$$CFLAGS -DDKSTREAMS=\\\"$(DKSTREAMS)\\\""; \
			fi; \
		    fi; \
		    CFLAGS="$$CFLAGS -DDKHOST"; export CFLAGS; \
		    DKLIB=-ldk; export DKLIB; \
		    SYSTEM=SYSV; export SYSTEM; \
		fi; \
	    else DKLIB=-lipc; export DKLIB; \
	fi; \
	CFLAGS="$$CFLAGS -D$$SYSTEM"; export CFLAGS; \
	$(MAKE) -e -f $@.mk compile

compile : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postio $(OFILES) $(EXTRA) $(DKLIB)

postio.o : $(HFILES)
slowsend.o : postio.h $(COMMONDIR)/gen.h
ifdef.o : ifdef.h $(COMMONDIR)/gen.h

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^DKLIB=.*'DKLIB=$(DKLIB)'" \
	    -e "s'^DKHOST=.*'DKHOST=$(DKHOST)'" \
	    -e "s'^DKSTREAMS=.*'DKSTREAMS=$(DKSTREAMS)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014231405131006440057030057030000011225400522627503700003300000006206post.src/postio/slowsend.c/*
 *
 * Stuff that slows the transmission of jobs to PostScript printers. ONLY use it
 * if you appear to be having trouble with flow control. The idea is simple - only
 * send a significant amount of data when we're certain the printer is in the
 * WAITING state. Depends on receiving status messages and only works when the
 * program is run as a single process. What's done should stop printer generated
 * XOFFs - provided our input buffer (ie. blocksize) is sufficiently small. Was
 * originally included in the postio.tmp directory, but can now be requested with
 * the -S option. Considered eliminating this code, but some printers still depend
 * on it. In particular Datakit connections made using Datakit PVCs and DACUs seem
 * to have the most problems. Much of the new stuff that was added can't work when
 * you use this code and will be automatically disabled.
 *
 */

#include <stdio.h>

#include "gen.h"
#include "postio.h"

extern char	*block;
extern int	blocksize;
extern int	head;
extern int	tail;
extern char	*line;
extern char	mesg[];
extern int	ttyo;

/*****************************************************************************/

slowsend(fd_in)

    int		fd_in;			/* next input file */

{

/*
 *
 * A slow version of send() that's very careful about when data is sent to the
 * printer. Should help prevent overflowing the printer's input buffer, provided
 * blocksize is sufficiently small (1024 should be safe). It's a totally kludged
 * up routine that should ONLY be used if you have constant transmission problems.
 * There's really no way it will be able to drive a printer much faster that about
 * six pages a minute, even for the simplest jobs. Get it by using the -S option.
 *
 */

    while ( readblock(fd_in) )
	switch ( getstatus(0) )  {
	    case WAITING:
		    writeblock(blocksize);
		    break;

	    case BUSY:
	    case IDLE:
	    case PRINTING:
		    writeblock(30);
		    break;

	    case NOSTATUS:
	    case UNKNOWN:
		    break;

	    case PRINTERERROR:
		    sleep(30);
		    break;

	    case ERROR:
		    fprintf(stderr, "%s", mesg);	/* for csw */
		    error(FATAL, "PostScript Error");
		    break;

	    case FLUSHING:
		    error(FATAL, "Flushing Job");
		    break;

	    case DISCONNECT:
		    error(FATAL, "Disconnected - printer may be offline");
		    break;

	    default:
		    sleep(2);
		    break;
	}   /* End switch */

}   /* End of send */

/*****************************************************************************/

static writeblock(num)

    int		num;			/* most bytes we'll write */

{

    int		count;			/* bytes successfully written */

/*
 *
 * Called from send() when it's OK to send the next block to the printer. head
 * is adjusted after the write, and the number of bytes that were successfully
 * written is returned to the caller.
 *
 */

    if ( num > tail - head )
	num = tail - head;

    if ( (count = write(ttyo, &block[head], num)) == -1 )
	error(FATAL, "error writing to %s", line);
    else if ( count == 0 )
	error(FATAL, "printer appears to be offline");

    head += count;
    return(count);

}   /* End of writeblock */

/*****************************************************************************/

0707070014231405141006440057030057030000011225440522627503700003600000003377post.src/postio/postio.mk.oldMAKE=/bin/make
MAKEFILE=postio.mk

SYSTEM=V9
VERSION=3.3.1

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript

COMMONDIR=../common

DKLIB=-lipc
CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -D$(SYSTEM) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

#
# Need dk.h and libdk.a for Datakit support on System V. We recommend you put
# them in standard places. If it's not possible define DKHOSTDIR (below) and
# try uncommenting the following lines:
#
#	DKHOSTDIR=/usr
#	CFLAGS=$(CFLGS) -D$(SYSTEM) -I$(COMMONDIR) -I$(DKHOSTDIR)/include
#	EXTRA=-Wl,-L$(DKHOSTDIR)/lib
#

HFILES=postio.h\
       ifdef.h\
       $(COMMONDIR)/gen.h

OFILES=postio.o\
       ifdef.o\
       slowsend.o

all : postio

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	cp postio $(POSTBIN)/postio
	@chmod 755 $(POSTBIN)/postio
	@chgrp $(GROUP) $(POSTBIN)/postio
	@chown $(OWNER) $(POSTBIN)/postio
	cp postio.1 $(MAN1DIR)/postio.1
	@chmod 644 $(MAN1DIR)/postio.1
	@chgrp $(GROUP) $(MAN1DIR)/postio.1
	@chown $(OWNER) $(MAN1DIR)/postio.1

clean :
	rm -f *.o

clobber : clean
	rm -f postio

postio : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postio $(OFILES) $(EXTRA) $(DKLIB)

postio.o : $(HFILES)
slowsend.o : postio.h $(COMMONDIR)/gen.h
ifdef.o : ifdef.h $(COMMONDIR)/gen.h

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^CFLGS=.*'CFLGS=$(CFLGS)'" \
	    -e "s'^DKLIB=.*'DKLIB=$(DKLIB)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014230006040407550057030057030000020074410522633076300002000000000000post.src/postmd0707070014230006051006440057030057030000010074420522627503700002700000002320post.src/postmd/README
A program that displays a matrix as a gray scale image on PostScript
printers. May be useful if you have a large matrix and want a simple
way to look for patterns. Expect a 600x600 matrix is an optimistic
upper limit on a 300 dpi printers using 5 shades of gray and 8.5x11
inch paper.

Matrix elements are a series of floating point numbers arranged in
the input file in row major order. By default each matrix is assumed
to be square and the number of rows (and columns) is set to the square
root of the number of elements in the input file. White space, including
newlines, is not used to determine the matrix dimensions. Each matrix
element is mapped into an integer in the range 0 to 255 (254 by default)
and PostScript's image operator maps that integer into a gray scale
appropriate for the printer.

The mapping from floating point matrix elements to integers is controlled
by an interval list and grayscale map. The default interval list is
"-1,0,1" which partitions the real line into 7 regions. The default
grayscale map gets darker as the regions move from left to right along
the real line. The -i option changes the interval list and the -g option
modifies the grayscale mapping. Check the man page for more details.

0707070014230004201006400057030057030000010063100522633076300003100000016617post.src/postmd/postmd.1.ds dQ /usr/lib/postscript
.TH POSTMD 1 "DWB 3.2"
.SH NAME
.B postmd
\- matrix display program for PostScript printers
.SH SYNOPSIS
\*(mBpostmd\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B postmd
reads a series of floating point numbers from
.IR files ,
translates them into a PostScript gray scale image,
and writes the results on the standard output.
In a typical application the numbers might be
the elements of a large matrix,
written in row major order,
while the printed image could help locate
patterns in the matrix.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-b num
Pack the bitmap in the output file using
.I num
byte patterns.
A value of 0 turns off all packing of the output file.
By default
.I num
is 6.
.TP
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-d dimen
Sets the default matrix dimensions for all input
.I files
to
.IR dimen .
The
.I dimen
string can be given as rows or rows\^\(mu\^columns.
If columns is omitted it will be set to rows.
By default
.B postmd
assumes each matrix is square and sets the number of rows
and columns to the square root of the number of elements in
each input file.
.TP
.OP \-g list
.I list
is a comma- or space-separated string of integers, each lying between
0 and 255 inclusive,
that assigns PostScript gray scales to the regions of the real line
selected by the
.OP \-i
option.
255 corresponds to white and 0 to black.
.B postmd
assigns a default gray scale that omits white (i.e., 255) and gets
darker as the regions move from left to right along the real line.
.TP
.OP \-i list
.I list
is a comma- or space-separated string of
.I N
floating point numbers that
partition the real line into
.RI 2 N +1
regions.
The
.I list
must be given in increasing numerical order.
The partitions are used to map floating point numbers read from the input
.I files
into gray scale integers that are assigned automatically by
.B postmd
or arbitrarily selected using the
.OP \-g
option.
The default interval
.I list
is ``\*(mB\-1,0,1\fP'' which partions the real line into 7 regions.
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which by default is located at the center of
each page.
The default magnification is 1.0.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP
.OP \-w window
.I window
is a comma- or space-separated list of four positive integers that
select the upper left and lower right corners of a submatrix from
each of the input
.IR files .
Row and column indices start at 1 in the upper left corner and the
numbers in the input
.I files
are assumed to be written in row major order.
By default the entire matrix is displayed.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed at the
center of the page, with positive
x to the right and positive y up the page.
Positive
.I num
moves everything right.
The default offset is 0 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves everything up the page.
The default offset is 0.
.TP
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ/ name .enc \f1.
A nonexistent encoding file is silently ignored.
The default selects file
.MR \*(dQ/Default.enc .
.TP
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/postmd.ps .
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include
.I string
in the output file;
.I string
must be legitimate PostScript.
.TP
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request ,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0, the request
applies to all pages.
If
.I file
is omitted, the request
lookup is done in
.MR \*(dQ/ps.requests .
.PP
Only one matrix is displayed on each logical page,
and each of the input
.I files
must contain complete descriptions of exactly one matrix.
Matrix elements are floating point numbers arranged in row major order in
each input file.
White space, including newlines, is not used to determine matrix
dimensions.
By default
.B postmd
assumes each matrix is square and sets the number of rows and columns
to the square root of the number of elements in the input file.
Supplying default dimensions on the command line using the
.OP \-d
option overrides this default behavior, and in that case the
dimensions apply to all input
.IR files .
.PP
An optional header can be supplied with each input file and is used
to set the matrix dimensions, the partition of the real line, the gray scale
map, and a window into the matrix.
The header consists of keyword/value pairs, each on a separate line.
It begins on the first line of each input file and ends with the
first unrecognized string, which should be the first matrix element.
Values set in the header take precedence, but only apply to the
current input file.
Recognized header keywords are
.MR dimension ,
.MR interval ,
.MR grayscale ,
and
.MR window .
The syntax of the value string that follows each keyword parallels what is
accepted by the
.OP \-d ,
.OP \-i ,
.OP \-g ,
and
.OP \-w
options.
.SH EXAMPLES
For example, suppose
.I file
initially contains the 1000 numbers
in a 20\(mu50 matrix.
Then the command line:
.EX
postmd -d20x50 -i"-100 100" -g0,128,254,128,0 \f2file
.EE
and prepending the header,
.EX
dimension 20x50
interval -100.0 .100e+3
grayscale 0 128 254 128 0
.EE
to
.I file
and typing the command line:
.EX
postmd \f2file
.EE
produce exactly the same output.
The interval list partitions the real line into five regions and
the gray scale list maps numbers less than \-100 or greater than 100
into 0 (i.e., black), numbers equal to \-100 or 100 into 128
(i.e., 50 percent
black), and numbers between \-100 and 100 into 254 (i.e., almost white).
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.SH WARNINGS
The largest matrix that can be adequately displayed is a function
of the interval and gray scale lists, the printer resolution,
and the paper size.
A 600\(mu600 matrix is an optimistic upper bound for a two element interval
list (i.e. five regions) using 8.5\(mu11 inch paper on a 300 dpi printer.
.PP
Using white (i.e., 255) in a gray scale list is not recommended and will not
show up in the legend and bar graph that
.B postmd
displays below each image.
.SH FILES
.MW \*(dQ/postmd.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy (1),
.BR postdmd (1),
.BR postio (1),
.BR postprint (1),
.BR postreverse (1),
.BR posttek (1),
.BR psencoding (1)
0707070014230006071006440057030057030000010111200522627503700003100000103300post.src/postmd/postmd.c/*
 *
 * postmd - matrix display program for PostScript printers.
 *
 * A simple program that can be used to display a matrix as a gray scale image on
 * a PostScript printer using the image operator. Much of the code was borrowed
 * from postdmd, the bitmap display program DMD screen dumps. May help if you have
 * a large matix (of floating point numbers) and want a simple way to look for
 * patterns.
 *
 * Matrix elements are a series of floating point numbers arranged in the input
 * file in row major order. The actual matrix elements can be preceeded by a simple
 * header that sets things like the matrix dimensions, interval list, and possibly
 * a window into the matrix that we'll use for display. The dimension statement is
 * perhaps the most important. If present it determines the number of rows and
 * columns in the matrix. For example, either of the following defines a 50x50
 * matrix,
 *
 *		dimension	50
 *		dimension	50x50
 *
 * If no dimension statement appears in the input file, the matrix is assumed to
 * be square, and the number of rows (and columns) is set to the square root of
 * the number of elements in the input file.
 *
 * Each matrix element is mapped into an integer in the range 0 to 255 (actually
 * 254) and PostScript's image operator then maps that number into a gray scale
 * appropriate for the particular printer. The mapping from the floating point
 * matrix elements to integers is accomplished using an interval list that can be
 * set using the -i option. The format of the interval string is,
 *
 *		num1,num2,num3,...,numn
 *
 * where each num is a floating point number. The list must be given in increasing
 * numerical order. A list of n numbers partitions the real line into 2n+1 regions
 * given as,
 *
 *		region1		element < num1
 *		region2		element = num1
 *		region3		element < num2
 *		region4		element = num2
 *		   .
 *		   .
 *		   .
 *		region2n	element = numn
 *		region2n+1	element > numn
 *
 * Every number in a region is mapped one integer in the range 0 to 254, and that
 * number, when displayed on a printer using the image operator, prints as a square
 * filled with a gray shade that reflects the integer that was chosen. 0 maps to
 * black and 255 maps to white (which by default will not be used).
 *
 * The default gray scale gets darker as the region number increases, but can be
 * changed by supplying a gray scale list with the -g option or in the optional
 * matrix header. The color map is again a comman or space separated list that
 * looks like,
 *
 *		color1,color2, ... ,color2n+1
 *
 * where color1 applies to region 1 and color2n+1 applies to region2n+1. Each
 * number in the list should be an integer between 0 and 255. If less than 2n+1
 * colors are given default assignments will be used for missing regions.
 *
 * The size of the matrix that we can display reasonably well is a function of the
 * number of elements in the interval list, paper size, and printer resolution.
 * For example a 300dpi printer using 8.5x11 inch paper gives us an image area of
 * about 2400x2400 pixels. An interval list of two numbers generates five separate
 * regions and will therefore need that many different shades of gray. Since we're
 * not using white we'll need to partion our image area into 4x4 pixel squares,
 * and that means a 600x600 matrix is about as big as we can go. In practice that's
 * optimistic, but the argument illustrates some of the limitations.
 *
 * A submatrix can be selected to display by windowing into the matrix. The window
 * list can be given using the -w option or can be set in the optional header that
 * can preceed each matrix.  The list should be a comma or space separated list
 * that looks like,
 *
 *		lower-column, lower-row, upper-column, upper-row
 *
 * where each element in the list must be a positive integer. Rows and columns in
 * the input matrix start at 1. The dimension of the displayed window will be from
 * lower-column to upper-column and from lower-row to upper-row inclusive.
 *
 * The encoding produced by the program is essentially identical to what's done
 * by postdmd. See the comments at the beginning of that program if you need more
 * details. The prologue also shares much of the same code. 
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following PostScript procedures
 * are defined in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how this program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects
 *	    to find the current page number on the stack.
 *
 *	bitmap
 *
 *	  columns rows bitmap -
 *
 *	    Prints the image that's read as a hex string from standard input. The
 *	    image consists of rows lines, each of which includes columns elements.
 *	    Eight bits per pixel are used to encode the matrix elements.
 *
 *	labelmatrix
 *
 *	  matrixname matrixlimits labelmatrix -
 *
 *	    Prints string matrixname just below the lower left corner of the image
 *	    and prints string martixlimits near the lower right corner. Outlines
 *	    the entire image with a (one pixel wide) box and then draws tick marks
 *	    along the top and left sides of the image. One tick mark is printed
 *	    for every ten elements.
 *
 *	legend
 *
 *	  n1 ... nN N c1 m1 ... cM mM total regions legend -
 *
 *	    Prints the legend as a bar graph below the matrix image. n1 ... nN are
 *	    strings that represent the interval list. c1 m1 ... cm mM are pairs
 *	    that consist of a region's color and the statistics count. Actually
 *	    the c's are trivial procedures that just leave a one character string
 *	    on the stack when they're executed by image - which is the way the
 *	    bar graph is drawn.
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable declarations */
#include "postmd.h"			/* special matrix display definitions */

char	*optnames = "a:b:c:d:g:i:m:n:o:p:w:x:y:A:C:E:J:L:P:R:DI";

char	*prologue = POSTMD;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */
char	*temp_dir = TEMPDIR;		/* temp directory for copying stdin */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */
int	bytespp = 6;			/* bytes per pattern - on output */

int	dostats = ON;			/* permanent statistics flag */
int	nxtstat = ON;			/* and the one for the next matrix */

char	*interval = DFLTILIST;		/* string representations of the interval */
char	*colormap = NULL;		/* color map */
char	*window = NULL;			/* and window lists */
char	*matrixname = "pipe.end";	/* name for the next plot */

Ilist	ilist[128];			/* active interval list and color map */
int	next = 0;			/* one past the last element in ilist[] */
int	regions;			/* an index assigned to the last region */
int	wlist[4];			/* upper left and lower right corners */

int	page = 0;			/* last page we worked on */
int	printed = 0;			/* and the number of pages printed */

int	dfltrows = 0;			/* default rows */
int	dfltcols = 0;			/* and columns - changed by -d option */
int	rows;				/* real number of rows */
int	columns;			/* and columns in the matrix */
int	patcount = 0;			/* will be set to columns * rows */

double	element;			/* next matrix element */

char	*raster = NULL;			/* next raster line */
char	*rptr;				/* next free byte in raster */
char	*eptr;				/* one past the last byte in raster */

FILE	*fp_in = stdin;			/* read from this file */
FILE	*fp_out = stdout;		/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * Bitmap display program for matrices. Only one matrix is allowed per input file,
 * and each one will be displayed on a page by itself. Input files consist of an
 * optional header followed by floating point numbers that represent the matrix
 * elements - in row major order.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* really just for error messages */

    init_signals();			/* sets up interrupt handling */
    header();				/* PostScript header comments */
    options();				/* handle the command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Make sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);
    signal(SIGFPE, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */

/*
 *
 * Reads and processes the command line options. Added the -P option so arbitrary
 * PostScript code can be passed through. Expect it could be useful for changing
 * definitions in the prologue for which options have not been defined.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'b':			/* bytes per pattern - on output */
		    bytespp = atoi(optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'd':			/* default matrix dimensions */
		    sscanf(optarg, "%dx%d", &dfltrows, &dfltcols);
		    break;

	    case 'g':			/* set the colormap (ie. grayscale) */
		    colormap = optarg;
		    break;

	    case 'i':			/* matrix element interval list */
		    interval = optarg;
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'w':			/* set the window */
		    window = optarg;
		    break;

	    case 'x':			/* shift things horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

}   /* End of setup */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll process stdin.
 *
 */

    if ( argc < 1 )
	matrix();
    else  {				/* at least one argument is left */
	while ( argc > 0 )  {
	    matrixname = *argv;
	    if ( strcmp(*argv, "-") == 0 )  {
		fp_in = stdin;
		matrixname = "pipe.end";
	    } else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    matrix();
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */
    }   /* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files, so mark the end of the pages, make sure the
 * last page is printed, and restore the initial environment.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %d\n", PAGES, printed);

    if ( temp_file != NULL )
	unlink(temp_file);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct provided it's not NULL. Accounting
 * is requested using the -A or -J options.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

matrix()

{

    int		count;			/* pattern repeats this many times */
    long	total;			/* expect this many patterns */

/*
 *
 * Reads a matrix from *fp_in, translates it into a PostScript gray scale image,
 * and writes the result on stdout. For now only one matrix is allowed per input
 * file. Matrix elements are floating point numbers arranged in row major order
 * in the input file. In addition each input file may contain an optional header
 * that defines special things like the dimension of the matrix, a window into
 * the matrix that will be displayed, and an interval list.
 *
 * If we're reading from stdin we first make a copy in a temporary file so we can
 * can properly position ourselves after we've looked for the header. Originally
 * wasn't always making a copy of stdin, but I've added a few things to what's
 * accepted in the header and this simplifies the job. An alternative would be
 * to always require a header and mark the end of it by some string. Didn't like
 * that approach much - may fix things up later.
 *
 */

    if ( fp_in == stdin )		/* make a copy so we can seek etc. */
	copystdin();

    rows = dfltrows;			/* new dimensions for the next matrix */
    columns = dfltcols;

    buildilist(interval);		/* build the default ilist[] */
    addcolormap(colormap);		/* add the colormap - if not NULL */
    setwindow(window);			/* and setup the initial matrix window */
    nxtstat = dostats;			/* want statistics? */
    getheader();			/* matrix dimensions at the very least */
    dimensions();			/* make sure we have the dimensions etc. */

    patcount = 0;
    total = rows * columns;

    eptr = rptr + (wlist[2] - wlist[0] + 1);

    redirect(++page);

    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fprintf(fp_out, "/saveobj save def\n");
    writerequest(printed+1, fp_out);
    fprintf(fp_out, "%d %d bitmap\n", wlist[2] - wlist[0] + 1, wlist[3] - wlist[1] + 1);

    while ( patcount != total && fscanf(fp_in, "%f", &element) != EOF )  {
	if ( inwindow() ) *rptr++ = mapfloat(element);
	if ( ++patcount % columns == 0 )
	    if ( inrange() )
		putrow();
    }	/* End while */

    if ( total != patcount )
	error(FATAL, "matrix format error");

    labelmatrix();

    if ( fp_out == stdout ) printed++;

    fprintf(fp_out, "showpage\n");
    fprintf(fp_out, "saveobj restore\n");
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);

}   /* End of matrix */

/*****************************************************************************/

copystdin()

{

    int		fd_out;			/* for the temporary file */
    int		fd_in;			/* for stdin */
    int		buf[512];		/* buffer for reads and writes */
    int		count;			/* number of bytes put in buf */

/*
 *
 * If we're reading the matrix from stdin and the matrix dimension isn't set by
 * a dimension statement at the beginning of the file we'll copy stdin to a
 * temporary file and reset *fp_in so reads come from the temp file. Simplifies
 * reading the header (if present), but is expensive.
 *
 */

    if ( temp_file != NULL )		/* been here already */
	unlink(temp_file);

    if ( (temp_file = tempnam(temp_dir, "post")) == NULL )
	error(FATAL, "can't generate temp file name");

    if ( (fd_out = creat(temp_file, 0660)) == -1 )
	error(FATAL, "can't create %s", temp_file);

    fd_in = fileno(stdin);

    while ( (count = read(fd_in, buf, sizeof(buf))) > 0 )
	if ( write(fd_out, buf, count) != count )
	    error(FATAL, "error writing to %s", temp_file);

    close(fd_out);

    if ( (fp_in = fopen(temp_file, "r")) == NULL )
	error(FATAL, "can't open %s", temp_file);

}   /* End of copystdin */

/*****************************************************************************/

getheader()

{

    char	buf[512];		/* temporary string space */
    char	*cmap = NULL;		/* remember header colormap list */
    long	pos;			/* for seeking back to first element */

/*
 *
 * Looks for the optional header information at the beginning of the input file,
 * reads it if it's there, and sets *fp_in to be just past the header. That should
 * be the beginning of the matrix element list. The recognized header keywords are
 * dimension, interval, colormap (or grayscale), window, name, and statistics. All
 * are optional, but may be useful in a spooling environment when the user doesn't
 * doesn't actually run the translator.
 *
 * The dimension statement specifies the number of rows and columns. For example
 * either of the following two lines define a 50 by 50 element matrix,
 *
 *	dimension	50
 *	dimension	50x50
 *
 * The first integer is the number of rows and the second, if given, is the number
 * of columns. If columns are missing from the dimension statement we assume the
 * matrix is square.
 *
 * interval can be used to redefine the interval list used for mapping floating
 * point numbers into integers in the range 0 to 254. The string following the
 * interval keyword has the same format as the -i option. For example to set the
 * interval list to -1, 0, and 1 you can add the line,
 *
 *	interval	-1,0,1
 *
 * The numbers are floats given in increasing order, and separated by commas or
 * blanks. The last interval list in a header takes precedence.
 *
 * colormap can be used to redefine the grayscale list.  The string following
 * the colormap keyword has the same format as the -g option.  For example
 *
 *	colormap	0,50,100,150,200,250
 * or	grayscale	0,50,100,150,200,250
 *
 * The window keyword can be used to select a submatrix. The numbers following
 * window are the upper left and lower right matix coordinates. May not be
 * implemented yet but shouldn't be difficult. For example
 *
 *	window		10 10 40 40
 *
 * selects the submatrix with corners at (10, 10) and (40, 40). The edges of the
 * window are included in the display.
 *
 * The name keyword can be used to define the title of the display.  For example,
 *
 *	name		Plot Of Matrix 1
 *
 * prints the string "Plot Of Matrix 1" at the top of the page. Everything up to
 * the next newline is taken as the name string.
 *
 */

    pos = ftell(fp_in);

    while ( fscanf(fp_in, "%s", buf) != EOF )  {
	if ( strncmp(buf, "dimension", strlen("dimension")) == 0 )
	    fscanf(fp_in, "%dx%d", &rows, &columns);
	else if ( strncmp(buf, "window", strlen("window")) == 0 )  {
	    fgets(buf, sizeof(buf), fp_in);
	    setwindow(buf);
	} else if ( strncmp(buf, "name", strlen("name")) == 0 )  {
	    fgets(buf, sizeof(buf), fp_in);
	    matrixname = savestring(buf);
	} else if ( strncmp(buf, "colormap", strlen("colormap")) == 0 )  {
	    fgets(buf, sizeof(buf), fp_in);
	    cmap = savestring(buf);
	} else if ( strncmp(buf, "grayscale", strlen("grayscale")) == 0 )  {
	    fgets(buf, sizeof(buf), fp_in);
	    cmap = savestring(buf);
	} else if ( strncmp(buf, "interval", strlen("interval")) == 0 )  {
	    fgets(buf, sizeof(buf), fp_in);
	    buildilist(buf);
	} else if ( strncmp(buf, "statistics", strlen("statistics")) == 0 )  {
	    fscanf(fp_in, "%s", buf);
	    if ( strcmp(buf, "on") == 0 || strcmp(buf, "ON") == 0 )
		nxtstat = ON;
	    else nxtstat = OFF;
	} else break;
	pos = ftell(fp_in);
    }	/* End while */

    addcolormap(cmap);			/* must happen last */
    fseek(fp_in, pos, 0);		/* back to the start of the matrix */

}   /* End of getheader */

/*****************************************************************************/

dimensions()

{

    char	buf[100];		/* temporary storage for the elements */
    long	count = 0;		/* number of elements in the matrix */
    long	pos;			/* matrix elements start here */

/*
 *
 * Need to know the dimensions of the matrix before we can go any farther. If
 * rows and columns are still 0 we'll read the entire input file, starting from
 * the current position, count the number of elements, take the square root of it,
 * and use it as the number of rows and columns. Then we seek back to the start
 * of the real matrix, make sure columns is set, and allocate enough memory for
 * storing each raster line. After we're certain we've got the number of rows and
 * columns we check the window coordinates, and if they're not legitimate they're
 * reset to cover the entire matrix.
 *
 */

    if ( rows == 0 )  {
	pos = ftell(fp_in);
	while ( fscanf(fp_in, "%s", buf) != EOF )
	    count++;
	rows = sqrt((double) count);
	fseek(fp_in, pos, 0);
    }	/* End if */

    if ( columns <= 0 ) columns = rows;

    if ( raster != NULL ) free(raster);

    if ( (rptr = raster = malloc(columns)) == NULL )
	error(FATAL, "no memory");

    eptr = rptr + columns;

    if ( rows <= 0 || columns <= 0 )
	error(FATAL, "bad matrix dimensions");

    if ( wlist[0] > wlist[2] || wlist[1] > wlist[3] )  {
	wlist[0] = wlist[1] = 1;
	wlist[2] = columns;
	wlist[3] = rows;
    }	/* End if */

}   /* End of dimensions */

/*****************************************************************************/

buildilist(list)

    char	*list;			/* use this as the interval list */

{

    static char	*templist = NULL;	/* a working copy of the list */
    char	*ptr;			/* next number in *templist */
    int		i;			/* loop index - for checking the list */

/*
 *
 * Reads string *list and builds up the ilist[] that will be used in the next
 * matrix. Since strtok() modifies the string it's parsing we make a copy first.
 * The format of the interval list is described in detail in the comments at the
 * beginning of this program. Basically consists of a comma or space separated
 * list of floating point numbers that must be given in increasing numerical order.
 * The list determines how floating point numbers are mapped into integers in the
 * range 0 to 254.
 *
 */

    if ( templist != NULL )		/* free the space used by the last list */
	free(templist);

    while ( isascii(*list) && isspace(*list) )
	list++;

    for ( ptr = list, regions = 3; *ptr != '\0'; ptr++ )  {
	if ( *ptr == ',' || *ptr == '/' || isspace(*ptr) )
	    regions += 2;
	while ( isascii(*ptr) && isspace(*ptr) ) ptr++;
    }	/* End for */

    next = 0;
    templist = savestring(list);

    ptr = strtok(templist, ",/ \t\n");
    while ( ptr != NULL )  {
	ilist[next].count = 0;
	ilist[next++].color = 254 * (regions - 1 - next) / (regions - 1);
	ilist[next].val = atof(ptr);
	ilist[next].count = 0;
	ilist[next++].color = 254 * (regions - 1 - next) / (regions - 1);
	ptr = strtok(NULL, ",/ \t\n");
    }	/* End while */

    ilist[next].count = 0;
    ilist[next].color = 254 * (regions - 1 - next) / (regions - 1);

    if ( next == 0 )			/* make sure we have a list */
	error(FATAL, "missing interval list");

    for ( i = 3; i < next; i += 2 )	/* that's in increasing numerical order */
	if ( ilist[i].val <= ilist[i-2].val )
	    error(FATAL, "bad interval list");

}   /* End of buildilist */

/*****************************************************************************/

addcolormap(list)

    char	*list;			/* use this color map */

{

    static char	*templist = NULL;	/* a working copy of the color list */
    char	*ptr;			/* next color in *templist */
    int		i = 0;			/* assigned to this region in ilist[] */

/*
 *
 * Assigns the integers in *list to the color field for the regions defined in
 * ilist[]. Assumes ilist[] has already been setup.
 *
 */

    if ( list != NULL )  {
	if ( templist != NULL )
	    free(templist);
	templist = savestring(list);

	ptr = strtok(templist, ",/ \t\n");
	while ( ptr != NULL )  {
	    ilist[i++].color = atoi(ptr) % 256;
	    ptr = strtok(NULL, ",/ \t\n");
	}   /* End while */
    }	/* End if */

}   /* End of addcolormap */

/*****************************************************************************/

setwindow(list)

    char	*list;			/* corners of window into the matrix */

{

    static char	*templist = NULL;	/* a working copy of the window list */
    char	*ptr;			/* next window coordinate in *templist */
    int		i = 0;			/* assigned to this region in wlist[] */

/*
 *
 * Sets up an optional window into the matrix.
 *
 */

    wlist[0] = wlist[1] = 1;
    wlist[2] = wlist[3] = 0;

    if ( list != NULL )  {
	if ( templist != NULL )
	    free(templist);
	templist = savestring(list);

	ptr = strtok(templist, ",/ \t\n");
	while ( ptr != NULL )  {
	    wlist[i++] = atoi(ptr);
	    ptr = strtok(NULL, ",/ \t\n");
	}   /* End while */
    }	/* End if */

}   /* End of setwindow */

/*****************************************************************************/

inwindow()

{

    int		r;			/* row of the patcount element */
    int		c;			/* column of the patcount element */

/*
 *
 * Checks if the patcount element of the matrix is in the window.
 *
 */

    r = (patcount/columns) + 1;
    c = (patcount%columns) + 1;

    return((c >= wlist[0]) && (r >= wlist[1]) && (c <= wlist[2]) && (r <= wlist[3]));

}   /* End of inwindow */

/*****************************************************************************/

inrange()

{

/*
 *
 * Checks if the current row lies in the window. Used right before we output the
 * raster lines.
 *
 */

    return(((patcount/columns) >= wlist[1]) && ((patcount/columns) <= wlist[3]));

}   /* End of inrange */

/*****************************************************************************/

mapfloat(element)

    double	element;		/* floating point matrix element */

{

    int		i;			/* loop index */

/*
 *
 * Maps element into an integer in the range 0 to 255, and returns the result to
 * the caller. Mapping is done using the color map that was saved in ilist[]. Also
 * updates the count field for the region that contains element - not good!
 *
 */

    for ( i = 1; i < next && ilist[i].val < element; i += 2 ) ;

    if ( i > next || element < ilist[i].val )
	i--;

    ilist[i].count++;
    return(ilist[i].color);

}   /* End of mapfloat */

/*****************************************************************************/

putrow()

{

    char	*p1, *p2;		/* starting and ending columns */
    int		n;			/* set to bytes per pattern */
    int		i;			/* loop index */

/*
 *
 * Takes the scanline that's been saved in *raster, encodes it according to the
 * value that's been assigned to bytespp, and writes the result to *fp_out. Each
 * line in the output bitmap is terminated by a 0 on a line by itself.
 *
 */

    n = (bytespp <= 0) ? columns : bytespp;

    for ( p1 = raster, p2 = raster + n; p1 < eptr; p1 = p2 )
	if ( patncmp(p1, n) == TRUE )  {
	    while ( patncmp(p2, n) == TRUE ) p2 += n;
	    p2 += n;
	    fprintf(fp_out, "%d ", n);
	    for ( i = 0; i < n; i++, p1++ )
		fprintf(fp_out, "%.2X", ((int) *p1) & 0377);
	    fprintf(fp_out, " %d\n", (p2 - p1) / n);
	} else {
	    while ( p2 < eptr && patncmp(p2, n) == FALSE ) p2 += n;
	    if ( p2 > eptr ) p2 = eptr;
	    fprintf(fp_out, "%d ", p2 - p1);
	    while ( p1 < p2 )
		fprintf(fp_out, "%.2X", ((int) *p1++) & 0377);
	    fprintf(fp_out, " 0\n");
	}   /* End else */

    fprintf(fp_out, "0\n");

    rptr = raster;

}   /* End of putrow */

/*****************************************************************************/

labelmatrix()

{

    int		total;			/* number of elements in the window */
    int		i;			/* loop index */

/*
 *
 * Responsible for generating the PostScript calls that label the matrix, generate
 * the legend, and print the matrix name.
 *
 */

    fprintf(fp_out, "(%s) ((%d, %d) to (%d, %d)) labelmatrix\n", matrixname,
			wlist[0], wlist[1], wlist[2], wlist[3]);

    total = (wlist[2] - wlist[0] + 1) * (wlist[3] - wlist[1] + 1);

    if ( nxtstat == OFF )
	for ( i = 0; i < regions; i++ )
	    ilist[i].count = 0;

    for ( i = 1; i < next; i += 2 )
	fprintf(fp_out, "(%g) ", ilist[i].val);
    fprintf(fp_out, "%d ", (regions - 1) / 2);

    for ( i = regions - 1; i >= 0; i-- )
	fprintf(fp_out, "{(\\%.3o)} %d ", ilist[i].color, ilist[i].count);
    fprintf(fp_out, "%d %d legend\n", total, regions);

}   /* End of labelmatrix */

/*****************************************************************************/

patncmp(p1, n)

    char	*p1;			/* first patterns starts here */
    int		n;			/* and extends this many bytes */

{

    char	*p2;			/* address of the second pattern */

/*
 *
 * Compares the two n byte patterns *p1 and *(p1+n). FALSE if returned is they're
 * different or extend past the end of the current raster line.
 *
 */

    p2 = p1 + n;

    for ( ; n > 0; n--, p1++, p2++ )
	if ( p2 >= eptr || *p1 != *p2 )
	    return(FALSE);

    return(TRUE);

}   /* End of patncmp */

/*****************************************************************************/

char *savestring(str)

    char	*str;			/* save this string */

{

    char	*ptr = NULL;		/* at this address */

/*
 *
 * Copies string *str to a permanent place and returns the address to the caller.
 *
 */

    if ( str != NULL && *str != '\0' )  {
	if ( (ptr = malloc(strlen(str) + 1)) == NULL )
	    error(FATAL, "no memory available for string %s", str);
	strcpy(ptr, str);
    }	/* End if */

    return(ptr);

}   /* End of savestring */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014230006101006440057030057030000010112200522627503700003100000004462post.src/postmd/postmd.h/*
 *
 * An interval list used to map matrix elements into integers in the range 0 to
 * 254 representing shades of gray on a PostScript printer. The list can be given
 * using the -i option or can be set in the optional header that can preceed each
 * matrix. The list should be a comma or space separated list that looks like,
 *
 *		num1,num2, ... ,numn
 *
 * where each num is a floating point number. The list must be given in increasing
 * numerical order. The n numbers in the list partion the real line into 2n+1
 * regions given by,
 *
 *		region1		element < num1
 *		region2		element = num1
 *		region3		element < num2
 *		region4		element = num3
 *		   .		     .
 *		   .		     .
 *		   .		     .
 *		region2n	element = numn
 *		region2n+1	element > numn
 *
 * Every number in a given region is mapped into an integer in the range 0 to 254
 * and that number, when displayed on a PostScript printer using the image operator,
 * prints as a square filled with a gray scale that reflects the integer that was
 * chosen. 0 maps to black and 255 white (that's why 255 is normally omitted).
 *
 * The shades of gray chosen by the program are normally generated automatically,
 * but can be reassigned using the -g option or by including a grayscale line in
 * the optional header. The grayscale list is comma or space separated list of
 * integers between 0 and 255 that's used to map individual regions into arbitray
 * shade of gray, thus overriding the default choice made in the program. The list
 * should look like,
 *
 *		color1,color2, ... ,color2n+1
 *
 * where color1 applies to region1 and color2n+1 applies to region2n+1. If less
 * than 2n+1 numbers are given the default assignments will be used for the missing
 * regions. Each color must be an integer in the range 0 to 255.
 *
 * The default interval list is given below. The default grayscale maps 254 (almost
 * white) into the first region and 0 (black) into the last.
 *
 */

#define DFLTILIST	"-1,0,1"

/*
 *
 * The active interval list is built from an interval string and stored in an array
 * whose elements are of type Ilist.
 *
 */

typedef struct  {
	double	val;			/* only valid in kind is ENDPOINT */
	int	color;			/* gray scale color */
	long	count;			/* statistics for each region */
} Ilist;

/*
 *
 * Non-integer function declarations.
 *
 */

char	*savestring();

0707070014230004311006400057030057030000010063340522633076300003200000004021post.src/postmd/postmd.mkMAKE=/bin/make
MAKEFILE=postmd.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=postmd.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=postmd.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o\
       $(COMMONDIR)/tempnam.o

all : postmd

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp postmd $(POSTBIN)/postmd
	@chmod 755 $(POSTBIN)/postmd
	@chgrp $(GROUP) $(POSTBIN)/postmd
	@chown $(OWNER) $(POSTBIN)/postmd
	cp postmd.ps $(POSTLIB)/postmd.ps
	@chmod 644 $(POSTLIB)/postmd.ps
	@chgrp $(GROUP) $(POSTLIB)/postmd.ps
	@chown $(OWNER) $(POSTLIB)/postmd.ps
	cp postmd.1 $(MAN1DIR)/postmd.1
	@chmod 644 $(MAN1DIR)/postmd.1
	@chgrp $(GROUP) $(MAN1DIR)/postmd.1
	@chown $(OWNER) $(MAN1DIR)/postmd.1

clean :
	rm -f *.o

clobber : clean
	rm -f postmd

postmd : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postmd $(OFILES) -lm

postmd.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o\
$(COMMONDIR)/tempnam.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	postmd.1 >XXX.1; \
	mv XXX.1 postmd.1

0707070014230006121006440057030057030000010112400522627503700003200000007404post.src/postmd/postmd.ps%
% Version 3.3.2 prologue for matrix display files.
%

/#copies 1 store
/aspectratio 1 def
/font /Helvetica def
/formsperpage 1 def
/landscape false def
/magnification 1 def
/margin 10 def
/orientation 0 def
/rotation 1 def
/size 9 def
/statspace 1.6 def
/ticklength .06 def
/tickspacing 10 def
/xoffset 0 def
/yoffset 0 def

/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/show {show} bind def		% so later references don't bind
/stringwidth {stringwidth} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if

	pagedimensions
	height width lt {
		/statspace statspace height width div mul def
		/size size height width div mul def
		/ticklength ticklength height width div mul def
	} if
	/height height margin sub statspace inch sub ticklength inch sub size 6 mul sub def
	/width width margin sub ticklength inch sub def
	xcenter ycenter translate
	orientation rotation mul rotate
	xoffset inch yoffset inch translate
	0 height 2 div height width min 2 div sub translate
	0 statspace inch 2 div translate
	magnification dup aspectratio mul scale

	0 setlinewidth
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def} bind def

/bitmap {
	/scanlines exch def
	/scanlength exch def

	/picstr scanlength string def

	gsave
	height scanlines div width scanlength div min
	/scaling exch def
	scaling scaling scale

	scanlength neg 2 div scanlines neg 2 div translate
	scanlength scanlines scale
	getbitmap
	grestore
} bind def

/getbitmap {
	scanlength scanlines 8 [scanlength 0 0 scanlines neg 0 scanlines] {
		0 {
			currentfile token pop dup
			0 eq {pop pop exit} if
			/charcount exch def
			picstr 1 index charcount getinterval
			/repl exch def
			currentfile repl readhexstring pop pop
			charcount add
			currentfile token pop {
				picstr 1 index repl putinterval
				charcount add
			} repeat
		} loop
		picstr
	} image
} bind def

/labelmatrix {
	/matrixlimits exch def
	/matrixname exch def

	gsave
	scaling scaling scale
	font findfont size scaling div scalefont setfont
	scanlength neg 2 div scanlines 2 div translate

	0 scanlines size 1.5 mul scaling div add neg moveto
	matrixname show

	scanlength scanlines size 1.5 mul scaling div add neg moveto
	matrixlimits stringwidth pop neg 0 rmoveto
	matrixlimits show

	newpath
	0 0 moveto
	scanlength 0 rlineto
	0 scanlines neg rlineto
	scanlength neg 0 rlineto
	closepath stroke

	scanlength tickspacing idiv 1 add tickspacing 0 ticks
	scanlines tickspacing idiv 1 add 0 tickspacing neg ticks
	grestore
} bind def

/ticks {
	/dy exch def
	/dx exch def

	/tl ticklength inch scaling div def
	newpath
	0 0 moveto
	{
		gsave dx 0 eq {tl neg 0} {0 tl} ifelse rlineto stroke grestore
		dx dy rmoveto
	} repeat
} bind def

/legend {
	/regions exch def
	/total exch def

	gsave
	width height min 2 div neg dup size 2 mul sub translate
	0 statspace inch neg translate

	gsave
	regions {
		gsave
		total div statspace inch size 2 mul sub mul size 2 mul add
		width height min regions div exch scale
		1 1 8 [1 0 0 1 0 0] 5 -1 roll image
		grestore
		width height min regions div 0 translate
	} repeat
	grestore

	width height min size 1.5 mul neg translate
	font findfont size scalefont setfont
	dup dup add 1 add width height min exch div /interval exch def
	{
    		interval neg 0 translate
		interval 2 div neg 0 translate
    		dup stringwidth pop 2 div neg 0 moveto show
		interval 2 div neg 0 translate
	} repeat
	grestore
} bind def

/done {/lastpage where {pop lastpage} if} def
0707070014231310730407550057030057030000021027660522633077100002500000000000post.src/postreverse0707070014231307551006400057030057030000011031220522633077000004400000003131post.src/postreverse/postreverse.mkMAKE=/bin/make
MAKEFILE=postreverse.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=postreverse.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=postreverse.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/tempnam.o

all : postreverse

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	cp postreverse $(POSTBIN)/postreverse
	@chmod 755 $(POSTBIN)/postreverse
	@chgrp $(GROUP) $(POSTBIN)/postreverse
	@chown $(OWNER) $(POSTBIN)/postreverse
	cp postreverse.1 $(MAN1DIR)/postreverse.1
	@chmod 644 $(MAN1DIR)/postreverse.1
	@chgrp $(GROUP) $(MAN1DIR)/postreverse.1
	@chown $(OWNER) $(MAN1DIR)/postreverse.1

clean :
	rm -f *.o

clobber : clean
	rm -f postreverse

postreverse : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o postreverse $(OFILES)

postreverse.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/tempnam.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE)

0707070014231310751006440057030057030000011027670522627503700003400000000555post.src/postreverse/README
A simple program that reverses the pages in PostScript files that
conform to Adobe's Version 1.0 or Version 2.0 file structuring
conventions.

postrevese also handles a small class of files that violate page
independence (eg. output from dpost) and can be used with all the
translators in this package. The output can be conforming even if
the input file wasn't.

0707070014231310761006440057030057030000011030420522627503700004300000000604post.src/postreverse/postreverse.h/*
 *
 * An array of type Pages is used to keep track of the starting and ending byte
 * offsets for the pages we've been asked to print.
 *
 */

typedef struct {
	long	start;			/* page starts at this byte offset */
	long	stop;			/* and ends here */
	int	empty;			/* dummy page if TRUE */
} Pages;

/*
 *
 * Some of the non-integer functions in postreverse.c.
 *
 */

char	*copystdin();

0707070014231310771006440057030057030000011030600522627504000004300000040407post.src/postreverse/postreverse.c/*
 *
 * postreverse - reverse the page order in certain PostScript files.
 *
 * Page reversal relies on being able to locate sections of a document using file
 * structuring comments defined by Adobe (ie. the 1.0 and now 2.0 conventions) and
 * a few I've added. Among other things a minimally conforming document, according
 * to the 1.0 conventions,
 *
 *	1) Marks the end of the prologue with an %%EndProlog comment.
 *
 *	2) Starts each page with a %%Page: comment.
 *
 *	3) Marks the end of all the pages %%Trailer comment.
 *
 *	4) Obeys page independence (ie. pages can be arbitrarily rearranged).
 *
 * The most important change (at least for this program) that Adobe made in going
 * from the 1.0 to the 2.0 structuring conventions was in the prologue. They now
 * say the prologue should only define things, and the global initialization that
 * was in the prologue (1.0 conventions) should now come after the %%EndProlog
 * comment but before the first %%Page: comment and be bracketed by %%BeginSetup
 * and %%EndSetup comments. So a document that conforms to Adobe's 2.0 conventions,
 *
 *	1) Marks the end of the prologue (only definitions) with %%EndProlog.
 *
 *	2) Brackets global initialization with %%BeginSetup and %%EndSetup comments
 *	   which come after the prologue but before the first %Page: comment.
 *
 *	3) Starts each page with a %%Page: comment.
 *
 *	4) Marks the end of all the pages with a %%Trailer comment.
 *
 *	5) Obeys page independence.
 *
 * postreverse can handle documents that follow the 1.0 or 2.0 conventions, but has
 * also been extended slightly so it works properly with the translators (primarily
 * dpost) supplied with this package. The page independence requirement has been
 * relaxed some. In particular definitions exported to the global environment from
 * within a page should be bracketed by %%BeginGlobal and %%EndGlobal comments.
 * postreverse pulls them out of each page and inserts them in the setup section
 * of the document, immediately before it writes the %%EndProlog (for version 1.0)
 * or %%EndSetup (for version 2.0) comments.
 *
 * In addition postreverse accepts documents that choose to mark the end of each
 * page with a %%EndPage: comment, which from a translator's point of view is often
 * a more natural approach. Both page boundary comments (ie. Page: and %%EndPage:)
 * are also accepted, but be warned that everything between consecutive %%EndPage:
 * and %%Page: comments will be ignored.
 *
 * So a document that will reverse properly with postreverse,
 *
 *	1) Marks the end of the prologue with %%EndProlog.
 *
 *	2) May have a %%BeginSetup/%%EndSetup comment pair before the first %%Page:
 *	   comment that brackets any global initialization.
 *
 *	3) Marks the start of each page with a %%Page: comment, or the end of each
 *	   page with a %%EndPage: comment. Both page boundary comments are allowed.
 *
 *	4) Marks the end of all the pages with a %%Trailer comment.
 *
 *	5) Obeys page independence or violates it to a rather limited extent and
 *	   marks the violations with %%BeginGlobal and %%EndGlobal comments.
 *
 * If no file arguments are given postreverse copies stdin to a temporary file and
 * then processes that file. That means the input is read three times (rather than
 * two) whenever we handle stdin. That's expensive, and shouldn't be too difficult
 * to fix, but I haven't gotten around to it yet.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <fcntl.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for temporary directory */
#include "ext.h"			/* external variable declarations */
#include "postreverse.h"		/* a few special definitions */

int	page = 1;			/* current page number */
int	forms = 1;			/* forms per page in the input file */

char	*temp_dir = TEMPDIR;		/* temp directory for copying stdin */

Pages	pages[1000];			/* byte offsets for all pages */
int	next_page = 0;			/* next page goes here */
long	start;				/* starting offset for next page */
long	endoff = -1;			/* offset where TRAILER was found */
int	noreverse = FALSE;		/* don't reverse pages if TRUE */
char	*endprolog = ENDPROLOG;		/* occasionally changed to ENDSETUP */

double	version = 3.3;			/* of the input file */
int	ignoreversion = FALSE;		/* ignore possible forms.ps problems */

char	buf[2048];			/* line buffer for input file */

FILE	*fp_in;				/* stuff is read from this file */
FILE	*fp_out = stdout;		/* and written here */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that reverses the pages in specially formatted PostScript
 * files. Will work with all the translators in this package, and should handle
 * any document that conforms to Adobe's version 1.0 or 2.0 file structuring
 * conventions. Only one input file is allowed, and it can either be a named (on
 * the command line) file or stdin.
 *
 */

    argc = agc;				/* other routines may want them */
    argv = agv;

    prog_name = argv[0];		/* just for error messages */

    init_signals();			/* sets up interrupt handling */
    options();				/* first get command line options */
    arguments();			/* then process non-option arguments */
    done();				/* and clean things up */

    exit(x_stat);			/* not much could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Makes sure we handle interrupts properly.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

options()

{

    int		ch;			/* return value from getopt() */
    char	*optnames = "n:o:rvT:DI";

    extern char	*optarg;		/* used by getopt() */
    extern int	optind;

/*
 *
 * Reads and processes the command line options. The -r option (ie. the one that
 * turns page reversal off) is really only useful if you want to take dpost output
 * and produce a page independent output file. In that case global definitions
 * made within pages and bracketed by %%BeginGlobal/%%EndGlobal comments will be
 * moved into the prologue or setup section of the document.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'n':			/* forms per page */
		    if ( (forms = atoi(optarg)) <= 0 )
			error(FATAL, "illegal forms request %s", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'r':			/* don't reverse the pages */
		    noreverse = TRUE;
		    break;

	    case 'v':			/* ignore possible forms.ps problems */
		    ignoreversion = TRUE;
		    break;

	    case 'T':			/* temporary file directory */
		    temp_dir = optarg;
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't understand the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c\n", ch);
		    break;
	}   /* End switch */
    }   /* End while */

    argc -= optind;			/* get ready for non-option args */
    argv += optind;

}   /* End of options */

/*****************************************************************************/

arguments()

{

    char	*name;			/* name of the input file */

/*
 *
 * postreverse only handles one input file at a time, so if there's more than one
 * argument left when we get here we'll quit. If none remain we copy stdin to a
 * temporary file and process that file.
 *
 */

    if ( argc > 1 )			/* can't handle more than one file */
	error(FATAL, "too many arguments");

    if ( argc == 0 )			/* copy stdin to a temporary file */
	name = copystdin();
    else name = *argv;

    if ( (fp_in = fopen(name, "r")) == NULL )
	error(FATAL, "can't open %s", name);

    reverse();

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Cleans things up after we've finished reversing the pages in the input file.
 * All that's really left to do is remove the temp file, provided we used one.
 *
 */

    if ( temp_file != NULL )
	unlink(temp_file);

}   /* End of done */

/*****************************************************************************/

char *copystdin()

{

    int		fd_out;			/* for the temporary file */
    int		fd_in;			/* for stdin */
    int		count;			/* number of bytes put in buf[] */

/*
 *
 * Copies stdin to a temporary file and returns the pathname of that file to the
 * caller. It's an expensive way of doing things, because it means we end up
 * reading the input file three times - rather than just twice. Could probably be
 * fixed by creating the temporary file on the fly as we read the file the first
 * time.
 *
 */

    if ( (temp_file = tempnam(temp_dir, "post")) == NULL )
	error(FATAL, "can't generate temp file name");

    if ( (fd_out = creat(temp_file, 0660)) == -1 )
	error(FATAL, "can't open %s", temp_file);

    fd_in = fileno(stdin);

    while ( (count = read(fd_in, buf, sizeof(buf))) > 0 )
	if ( write(fd_out, buf, count) != count )
	    error(FATAL, "error writing to %s", temp_file);

    close(fd_out);

    return(temp_file);

}   /* End of copystdin */

/*****************************************************************************/

reverse()

{

/*
 *
 * Begins by looking for the ENDPROLOG comment in the input file. Everything up to
 * that comment is copied to the output file. If the comment isn't found the entire
 * input file is copied and moreprolog() returns FALSE. Otherwise readpages() reads
 * the rest of the input file and remembers (in pages[]) where each page starts and
 * ends. In addition everything bracketed by %%BeginGlobal and %%EndGlobal comments
 * is immediately added to the new prologue (or setup section) and ends up being
 * removed from the individual pages. When readpages() finds the TRAILER comment
 * or gets to the end of the input file we go back to the pages[] array and use
 * the saved offsets to write the pages out in reverse order. Finally everything
 * from the TRAILER comment to the end of the input file is copied to the output
 * file.
 *
 */

    if ( moreprolog(ENDPROLOG) == TRUE )  {
	readpages();
	writepages();
	trailer();
    }	/* End if */

}   /* End of reverse */

/*****************************************************************************/

moreprolog(str)

    char	*str;			/* copy everything up to this string */

{

    int		len;			/* length of FORMSPERPAGE string */
    int		vlen;			/* length of VERSION string */

/*
 *
 * Looks for string *str at the start of a line and copies everything up to that
 * string to the output file. If *str isn't found the entire input file will end
 * up being copied to the output file and FALSE will be returned to the caller.
 * The first call (made from reverse()) looks for ENDPROLOG. Any other call comes
 * from readpages() and will be looking for the ENDSETUP comment.
 * 
 */

    len = strlen(FORMSPERPAGE);
    vlen = strlen(VERSION);

    while ( fgets(buf, sizeof(buf), fp_in) != NULL )  {
	if ( strcmp(buf, str) == 0 )
	    return(TRUE);
	else if ( strncmp(buf, FORMSPERPAGE, len) == 0 )
	    forms = atoi(&buf[len+1]);
	else if ( strncmp(buf, VERSION, vlen) == 0 )
	    version = atof(&buf[vlen+1]);
	fprintf(fp_out, "%s", buf);
    }	/* End while */

    return(FALSE);

}   /* End of moreprolog */

/*****************************************************************************/

readpages()

{

    int		endpagelen;		/* length of ENDPAGE */
    int		pagelen;		/* and PAGE strings */
    int		sawendpage = TRUE;	/* ENDPAGE equivalent marked last page */
    int		gotpage = FALSE;	/* TRUE disables BEGINSETUP stuff */

/*
 *
 * Records starting and ending positions of the requested pages (usually all of
 * them), puts global definitions in the prologue, and remembers where the TRAILER
 * was found.
 *
 * Page boundaries are marked by the strings PAGE, ENDPAGE, or perhaps both.
 * Application programs will normally find one or the other more convenient, so
 * in most cases only one kind of page delimiter will be found in a particular
 * document.
 *
 */

    pages[0].start = ftell(fp_in);	/* first page starts after ENDPROLOG */
    endprolog = ENDPROLOG;

    endpagelen = strlen(ENDPAGE);
    pagelen = strlen(PAGE);

    while ( fgets(buf, sizeof(buf), fp_in) != NULL )
	if ( buf[0] != '%' )
	    continue;
	else if ( strncmp(buf, ENDPAGE, endpagelen) == 0 )  {
	    if ( in_olist(page++) == ON )  {
		pages[next_page].empty = FALSE;
		pages[next_page++].stop = ftell(fp_in);
	    }	/* End if */
	    pages[next_page].start = ftell(fp_in);
	    sawendpage = TRUE;
	    gotpage = TRUE;
	} else if ( strncmp(buf, PAGE, pagelen) == 0 )  {
	    if ( sawendpage == FALSE && in_olist(page++) == ON )  {
		pages[next_page].empty = FALSE;
		pages[next_page++].stop = ftell(fp_in) - strlen(buf);
	    }	/* End if */
	    pages[next_page].start = ftell(fp_in) - strlen(buf);
	    sawendpage = FALSE;
	    gotpage = TRUE;
	} else if ( gotpage == FALSE && strcmp(buf, BEGINSETUP) == 0 )  {
	    fprintf(fp_out, "%s", endprolog);
	    fprintf(fp_out, "%s", BEGINSETUP);
	    moreprolog(ENDSETUP);
	    endprolog = ENDSETUP;
	} else if ( strcmp(buf, BEGINGLOBAL) == 0 )  {
	    moreprolog(ENDGLOBAL);
	} else if ( strcmp(buf, TRAILER) == 0 )  {
	    if ( sawendpage == FALSE )
		pages[next_page++].stop = ftell(fp_in) - strlen(buf);
	    endoff = ftell(fp_in);
	    break;
	}   /* End if */

}   /* End of readpages */

/*****************************************************************************/

writepages()

{

    int		i, j, k;		/* loop indices */

/*
 *
 * Goes through the pages[] array, usually from the bottom up, and writes out all
 * the pages. Documents that print more than one form per page cause things to get
 * a little more complicated. Each physical page has to have its subpages printed
 * in the correct order, and we have to build a few dummy subpages for the last
 * (and now first) sheet of paper, otherwise things will only occasionally work.
 *
 */

    fprintf(fp_out, "%s", endprolog);

    if ( noreverse == FALSE )		/* fill out the first page */
	for ( i = (forms - next_page % forms) % forms; i > 0; i--, next_page++ )
	    pages[next_page].empty = TRUE;
    else forms = next_page;		/* turns reversal off in next loop */

    for ( i = next_page - forms; i >= 0; i -= forms )
	for ( j = i, k = 0; k < forms; j++, k++ )
	    if ( pages[j].empty == TRUE ) {
		if ( ignoreversion == TRUE || version > 3.1 ) {
		    fprintf(fp_out, "%s 0 0\n", PAGE);
		    fprintf(fp_out, "/saveobj save def\n");
		    fprintf(fp_out, "showpage\n");
		    fprintf(fp_out, "saveobj restore\n");
		    fprintf(fp_out, "%s 0 0\n", ENDPAGE);
		} else {
		    fprintf(fp_out, "%s 0 0\n", PAGE);
		    fprintf(fp_out, "save showpage restore\n");
		    fprintf(fp_out, "%s 0 0\n", ENDPAGE);
		}   /* End else */
	    } else copypage(pages[j].start, pages[j].stop);

}   /* End of writepages */

/*****************************************************************************/

copypage(start, stop)

    long	start;			/* starting from this offset */
    long	stop;			/* and ending here */

{

/*
 *
 * Copies the page beginning at offset start and ending at stop to the output
 * file. Global definitions are skipped since they've already been added to the
 * prologue.
 *
 */

    fseek(fp_in, start, 0);

    while ( ftell(fp_in) < stop && fgets(buf, sizeof(buf), fp_in) != NULL )
	if ( buf[0] == '%' && strcmp(buf, BEGINGLOBAL) == 0 )
	    while ( fgets(buf, sizeof(buf), fp_in) != NULL && strcmp(buf, ENDGLOBAL) != 0 ) ;
	else fprintf(fp_out, "%s", buf);

}   /* End of copypage */

/*****************************************************************************/

trailer()

{

/*
 *
 * Makes sure everything from the TRAILER string to EOF is copied to the output
 * file.
 *
 */

    if ( endoff > 0 )  {
	fprintf(fp_out, "%s", TRAILER);
	fseek(fp_in, endoff, 0);
	while ( fgets(buf, sizeof(buf), fp_in) != NULL )
	    fprintf(fp_out, "%s", buf);
    }	/* End if */

}   /* End of trailer */

/*****************************************************************************/

0707070014231311001006440057030057030000011030440522627504000004300000004523post.src/postreverse/postreverse.1.TH POSTREVERSE 1
.SH NAME
.B postreverse
\- reverse the page order in a PostScript file
.SH SYNOPSIS
\*(mBpostreverse\f1
.OP "" options []
.OP "" file []
.SH DESCRIPTION
.B postreverse
reverses the page order in files that conform to Adobe's
Version 1.0 or Version 2.0 PostScript file structuring conventions,
and writes the results on the standard output.
Only one input
.I file
is allowed and if no
.I file
is specified, the standard input is read.
The following
.I options
are understood:
.TP  0.75i
.OP \-o list
Select pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP 
.OP \-r
Do not reverse the pages in
.IR file .
.TP 
.OP \-T dir
Use
.I dir
as the temporary file directory when
reading from the standard input.
By default
.I dir
is set to
.MR /tmp .
.PP
.B postreverse
can handle a limited class of files
that violate page independence,
provided all global definitions are bracketed by
.MW %%BeginGlobal
and
.MW %%EndGlobal
comments.
In addition, files that mark the end of each page with
.MW "%%EndPage:\ label\ ordinal"
comments will also reverse properly, provided the prologue and
trailer sections can be located.
If
.B postreverse
fails to find an
.MW %%EndProlog
or
.MW %%EndSetup
comment the entire
.I file
is copied, unmodified, to the standard output.
.PP
Since global definitions are pulled out of individual
pages and put in the prologue, the output file can be
minimally conforming, even if the input
.I file
was not.
.SH EXAMPLES
Select pages 1 to 100 from
.I file
and reverse the pages:
.EX
postreverse -o1-100 \f2file
.EE
Print four logical pages on each physical page
and reverse all the pages:
.EX
postprint -n4 \f2file\fP | postreverse
.EE
Produce a minimally conforming file from output
generated by dpost without reversing the pages:
.EX
dpost \f2file\fP | postreverse -r
.EE
.SH DIAGNOSTICS
A 0 exit status is returned if
.I file
was successfully processed.
.SH BUGS
No attempt has been made to deal with redefinitions of global
variables or procedures.
If standard input is used, the input
.I file
will be read three times before being reversed.
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy(1),
.BR postdmd(1),
.BR postio(1),
.BR postmd(1),
.BR postprint(1),
.BR posttek(1),
.BR psencoding (1)
0707070014230550050407550057030057030000021527470522633077300002100000000000post.src/posttek0707070014230547611006400057030057030000011527400522633077200003400000003736post.src/posttek/posttek.mkMAKE=/bin/make
MAKEFILE=posttek.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=posttek.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h

OFILES=posttek.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o

all : posttek

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp posttek $(POSTBIN)/posttek
	@chmod 755 $(POSTBIN)/posttek
	@chgrp $(GROUP) $(POSTBIN)/posttek
	@chown $(OWNER) $(POSTBIN)/posttek
	cp posttek.ps $(POSTLIB)/posttek.ps
	@chmod 644 $(POSTLIB)/posttek.ps
	@chgrp $(GROUP) $(POSTLIB)/posttek.ps
	@chown $(OWNER) $(POSTLIB)/posttek.ps
	cp posttek.1 $(MAN1DIR)/posttek.1
	@chmod 644 $(MAN1DIR)/posttek.1
	@chgrp $(GROUP) $(MAN1DIR)/posttek.1
	@chown $(OWNER) $(MAN1DIR)/posttek.1

clean :
	rm -f *.o

clobber : clean
	rm -f posttek

posttek : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o posttek $(OFILES)

posttek.o : $(HFILES)

$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	posttek.1 >XXX.1; \
	mv XXX.1 posttek.1

0707070014230550071006440057030057030000011527770522627504000003000000000153post.src/posttek/README
Tektronix 4014 to PostScript translator. Much of the code was
borrowed from the 5620 Tektronix emulator.

0707070014230550101006440057030057030000011527620522627504000003300000007416post.src/posttek/posttek.h/*
 *
 * Tektronix 4014 control codes.
 *
 */

#define NUL '\000'
#define SOH '\001'
#define STX '\002'
#define ETX '\003'
#define EOT '\004'
#define ENQ '\005'
#define ACK '\006'
#define BEL '\007'
#define BS  '\010'
#define HT  '\011'
#define NL  '\012'
#define VT  '\013'
#define FF  '\014'
#define CR  '\015'
#define SO  '\016'
#define SI  '\017'
#define DLE '\020'
#define DC1 '\021'
#define DC2 '\022'
#define DC3 '\023'
#define DC4 '\024'
#define NAK '\025'
#define SYN '\026'
#define ETB '\027'
#define CAN '\030'
#define EM  '\031'
#define SUB '\032'
#define ESC '\033'
#define FS  '\034'
#define GS  '\035'
#define RS  '\036'
#define US  '\037'
#define DEL '\177'

/*
 *
 * A few definitions used to classify the different tektronix states. OUTMODED
 * is returned by control() and esc(), and typically means the state has changed.
 *
 */

#define OUTMODED	-1
#define ALPHA		0
#define GIN		1
#define GRAPH		2
#define POINT		3
#define SPECIALPOINT	4
#define INCREMENTAL	5
#define RESET		6
#define EXIT		7

/*
 *
 * The pen state, either UP or DOWN, controls whether vectors are drawn.
 *
 */

#define UP		0
#define DOWN		1

/*
 *
 * Coordinates of the upper right corner of the screen - almost the real screen
 * dimensions.
 *
 */

#define TEKXMAX		4096
#define TEKYMAX		3120

/*
 *
 * The size of the spot in SPECIALPOINT mode is controlled by a non-linear
 * function that has a domain that consists of the integers from 040 to 0175.
 * The next definition is used to initialize the special point mode intensity
 * array that implements the function. Data came from table F-6 in the tektronix
 * 4014 manual.
 *
 */

#define INTENSITY							\
									\
	{								\
	    14, 16, 17, 19, 20, 22, 23, 25,				\
	    28, 31, 34, 38, 41, 44, 47, 50,				\
	    56, 62, 69, 75, 81, 88, 94,100,				\
	    56, 62, 69, 75, 81, 88, 94,100,				\
	     0,  1,  1,  1,  1,  1,  1,  2,				\
	     2,  2,  2,  2,  3,  3,  3,  3,				\
	     4,  4,  4,  5,  5,  5,  6,  6,				\
	     7,  8,  9, 10, 11, 12, 12, 13,				\
	    14, 16, 17, 19, 20, 22, 23, 25,				\
	    28, 31, 34, 38, 41, 44, 47, 50,				\
	    56, 62, 69, 75, 81, 88, 94,100,				\
	    56, 62, 69, 75, 81, 88, 94,100,				\
	}

/*
 *
 * The next two definitions give the height and width of characters in the four
 * different sizes available on tektronix terminals. TEKFONT is the default index
 * into CHARHEIGHT and CHARWIDTH.
 *
 */

#define CHARHEIGHT	{88, 82, 53, 48}
#define CHARWIDTH	{56, 51, 34, 31}
#define TEKFONT		2

/*
 *
 * The entries defined in STYLES are passed on to the PostScript operator setdash.
 * They're used to implement the different tektronix line styles. Belongs in the
 * prologue!
 *
 */

#define STYLES								\
									\
	{								\
	    "[]",							\
	    "[.5 2]",							\
	    "[.5 2 4 2]",						\
	    "[4 4]",							\
	    "[8 4]",							\
	    "[]"							\
	}

/*
 *
 * Variables of type Point are used to keep track of the cursor position.
 *
 */

typedef struct {
	int	x;
	int	y;
} Point;

/*
 *
 * An array of type Fontmap helps convert font names requested by users into
 * legitimate PostScript names. The array is initialized using FONTMAP, which must
 * end with an entry that has NULL defined as its name field.
 *
 */

typedef struct {
	char	*name;			/* user's font name */
	char	*val;			/* corresponding PostScript name */
} Fontmap;

#define FONTMAP								\
									\
	{								\
	    "R", "Courier",						\
	    "I", "Courier-Oblique",					\
	    "B", "Courier-Bold",					\
	    "CO", "Courier",						\
	    "CI", "Courier-Oblique",					\
	    "CB", "Courier-Bold",					\
	    "CW", "Courier",						\
	    "PO", "Courier",						\
	    "courier", "Courier",					\
	    "cour", "Courier",						\
	    "co", "Courier",						\
	    NULL, NULL							\
	}

/*
 *
 * Some of the non-integer valued functions in posttek.c.
 *
 */

char	*get_font();

0707070014230550111006440057030057030000011530000522627504000003300000064244post.src/posttek/posttek.c/*
 *
 * posttek - PostScript translator for tektronix 4014 files
 *
 * A program that can be used to translate tektronix 4014 files into PostScript.
 * Most of the code was borrowed from the tektronix 4014 emulator that was written
 * for DMDs. Things have been cleaned up some, but there's still plently that
 * could be done.
 *
 * The PostScript prologue is copied from *prologue before any of the input files
 * are translated. The program expects that the following PostScript procedures
 * are defined in that file:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Handles special initialization stuff that depends on how the program
 *	    was called. Expects to find a mark followed by key/value pairs on the
 *	    stack. The def operator is applied to each pair up to the mark, then
 *	    the default state is set up.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Does whatever is needed to set things up for the next page. Expects
 *	    to find the current page number on the stack.
 *
 *	v
 *
 *	  mark dx1 dy1 ... dxn dyn x y v mark
 *
 *	    Draws the vector described by the numbers on the stack. The top two
 *	    numbers are the starting point. The rest are relative displacements
 *	    from the preceeding point. Must make sure we don't put too much on
 *	    the stack!
 *
 *	t
 *
 *	  x y string t -
 *
 *	    Prints the string that's on the top of the stack starting at point
 *	    (x, y).
 *
 *	p
 *
 *	  x y p -
 *
 *	    Marks the point (x, y) with a circle whose radius varies with the
 *	    current intensity setting.
 *
 *	i
 *
 *	  percent focus i -
 *
 *	    Changes the size of the circle used to mark individual points to
 *	    percent of maximum for focused mode (focus=1) or defocused mode
 *	    (focus=0). The implementation leaves much to be desired!
 *
 *	l
 *
 *	  mark array l mark
 *
 *	    Set the line drawing mode according to the description given in array.
 *	    The arrays that describe the different line styles are declared in
 *	    STYLES (file posttek.h). The array really belongs in the prologue!
 *
 *	w
 *
 *	  n w -
 *
 *	    Adjusts the line width for vector drawing. Used to select normal (n=0)
 *	    or defocused (n=1) mode.
 *
 *	f
 *
 *	  size f -
 *
 *	    Changes the size of the font that's used to print characters in alpha
 *	    mode. size is the tektronix character width and is used to choose an
 *	    appropriate point size in the current font.
 *
 *	done
 *
 *	  done
 *
 *	    Makes sure the last page is printed. Only needed when we're printing
 *	    more than one page on each sheet of paper.
 *
 * The default line width is zero, which forces lines to be one pixel wide. That
 * works well on 'write to black' engines but won't be right for 'write to white'
 * engines. The line width can be changed using the -w option, or you can change
 * the initialization of linewidth in the prologue.
 *
 * Many default values, like the magnification and orientation, are defined in 
 * the prologue, which is where they belong. If they're changed (by options), an
 * appropriate definition is made after the prologue is added to the output file.
 * The -P option passes arbitrary PostScript through to the output file. Among
 * other things it can be used to set (or change) values that can't be accessed by
 * other options.
 *
 */

#include <stdio.h>
#include <signal.h>
#include <fcntl.h> 

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* for the prologue */
#include "ext.h"			/* external variable definitions */
#include "posttek.h"			/* control codes and other definitions */

char	*optnames = "a:c:f:m:n:o:p:w:x:y:A:C:E:J:L:P:R:DI";

char	*prologue = POSTTEK;		/* default PostScript prologue */
char	*formfile = FORMFILE;		/* stuff for multiple pages per sheet */

int	formsperpage = 1;		/* page images on each piece of paper */
int	copies = 1;			/* and this many copies of each sheet */

int	charheight[] = CHARHEIGHT;	/* height */
int	charwidth[] = CHARWIDTH;	/* and width arrays for tek characters */
int	tekfont = TEKFONT;		/* index into charheight[] and charwidth[] */

char	intensity[] = INTENSITY;	/* special point intensity array */
char	*styles[] = STYLES;		/* description of line styles */
int	linestyle = 0;			/* index into styles[] */
int	linetype = 0;			/* 0 for normal, 1 for defocused */

int	dispmode = ALPHA;		/* current tektronix state */
int	points = 0;			/* points making up the current vector */
int	characters = 0;			/* characters waiting to be printed */
int	pen = UP;			/* just for point plotting */
int	margin = 0;			/* left edge - ALPHA state */

Point	cursor;				/* should be current cursor position */

Fontmap	fontmap[] = FONTMAP;		/* for translating font names */
char	*fontname = "Courier";		/* use this PostScript font */

int	page = 0;			/* page we're working on */
int	printed = 0;			/* printed this many pages */

FILE	*fp_in;				/* read from this file */
FILE	*fp_out = stdout;		/* and write stuff here */
FILE	*fp_acct = NULL;		/* for accounting data */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * A simple program that can be used to translate tektronix 4014 files into
 * PostScript. Most of the code was taken from the DMD tektronix 4014 emulator,
 * although things have been cleaned up some.
 *
 */

    argv = agv;				/* so everyone can use them */
    argc = agc;

    prog_name = argv[0];		/* just for error messages */

    init_signals();			/* sets up interrupt handling */
    header();				/* PostScript header comments */
    options();				/* handle the command line options */
    setup();				/* for PostScript */
    arguments();			/* followed by each input file */
    done();				/* print the last page etc. */
    account();				/* job accounting data */

    exit(x_stat);			/* nothing could be wrong */

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Make sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN )  {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;			/* return value from getopt() */
    int		old_optind = optind;	/* for restoring optind - should be 1 */

/*
 *
 * Scans the option list looking for things, like the prologue file, that we need
 * right away but could be changed from the default. Doing things this way is an
 * attempt to conform to Adobe's latest file structuring conventions. In particular
 * they now say there should be nothing executed in the prologue, and they have
 * added two new comments that delimit global initialization calls. Once we know
 * where things really are we write out the job header, follow it by the prologue,
 * and then add the ENDPROLOG and BEGINSETUP comments.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    prologue = optarg;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* get ready for option scanning */

    fprintf(stdout, "%s", CONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;			/* value returned by getopt() */

/*
 *
 * Reads and processes the command line options. Added the -P option so arbitrary
 * PostScript code can be passed through. Expect it could be useful for changing
 * definitions in the prologue for which options have not been defined.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
	switch ( ch )  {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'f':			/* use this PostScript font */
		    fontname = get_font(optarg);
		    fprintf(stdout, "/font /%s def\n", fontname);
		    break;

	    case 'm':			/* magnification */
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    if ( *optarg == 'l' )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 'w':			/* line width */
		    fprintf(stdout, "/linewidth %s def\n", optarg);
		    break;

	    case 'x':			/* shift horizontally */
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* and vertically on the page */
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* force job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'C':			/* copy file straight to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding */
		    fontencoding = optarg;
		    break;

	    case 'L':			/* PostScript prologue file */
		    prologue = optarg;
		    break;

	    case 'P':			/* PostScript pass through */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* special global or page level request */
		    saverequest(optarg);
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't know the option */
		    error(FATAL, "");
		    break;

	    default:			/* don't know what to do for ch */
		    error(FATAL, "missing case for option %c", ch);
		    break;
	}   /* End switch */
    }	/* End while */

    argc -= optind;
    argv += optind;

}   /* End of options */

/*****************************************************************************/

char *get_font(name)

    char	*name;			/* name the user asked for */

{

    int		i;			/* for looking through fontmap[] */

/*
 *
 * Called from options() to map a user's font name into a legal PostScript name.
 * If the lookup fails *name is returned to the caller. That should let you choose
 * any PostScript font.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].val);

    return(name);

}   /* End of get_font */

/*****************************************************************************/

setup()

{

/*
 *
 * Handles things that must be done after the options are read but before the
 * input files are processed.
 *
 */

    writerequest(0, stdout);		/* global requests eg. manual feed */
    setencoding(fontencoding);
    fprintf(stdout, "setup\n");

    if ( formsperpage > 1 )  {
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

}   /* End of setup */

/*****************************************************************************/

arguments()

{

/*
 *
 * Makes sure all the non-option command line arguments are processed. If we get
 * here and there aren't any arguments left, or if '-' is one of the input files
 * we'll process stdin.
 *
 */

    if ( argc < 1 )
	statemachine(fp_in = stdin);
    else  {				/* at least one argument is left */
	while ( argc > 0 )  {
	    if ( strcmp(*argv, "-") == 0 )
		fp_in = stdin;
	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    statemachine(fp_in);
	    if ( fp_in != stdin )
		fclose(fp_in);
	    argc--;
	    argv++;
	}   /* End while */
    }   /* End else */

}   /* End of arguments */

/*****************************************************************************/

done()

{

/*
 *
 * Finished with all the input files, so mark the end of the pages with a TRAILER
 * comment, make sure the last page prints, and add things like the PAGES comment
 * that can only be determined after all the input files have been read.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, fontname);
    fprintf(stdout, "%s %d\n", PAGES, printed);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Writes an accounting record to *fp_acct provided it's not NULL. Accounting
 * is requested using the -A or -J options.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

statemachine(fp)

    FILE	*fp;			/* used to set fp_in */

{

/*
 *
 * Controls the translation of the next input file. Tektronix states (dispmode)
 * are typically changed in control() and esc().
 *
 */

    redirect(-1);			/* get ready for the first page */
    formfeed();
    dispmode = RESET;

    while ( 1 )
	switch ( dispmode )  {
	    case RESET:
		    reset();
		    break;

	    case ALPHA:
		    alpha();
		    break;

	    case GIN:
		    gin();
		    break;

	    case GRAPH:
		    graph();
		    break;

	    case POINT:
	    case SPECIALPOINT:
		    point();
		    break;

	    case INCREMENTAL:
		    incremental();
		    break;

	    case EXIT:
		    formfeed();
		    return;
	}   /* End switch */

}   /* End of statemachine */

/*****************************************************************************/

reset()

{

/*
 *
 * Called to reset things, typically only at the beginning of each input file.
 *
 */

    tekfont = -1;
    home();
    setfont(TEKFONT);
    setmode(ALPHA);

}   /* End of reset */

/*****************************************************************************/

alpha()

{

    int		c;			/* next character */
    int		x, y;			/* cursor will be here when we're done */

/*
 *
 * Takes care of printing characters in the current font.
 *
 */

    if ( (c = nextchar()) == OUTMODED )
	return;

    if ( (c < 040) && ((c = control(c)) <= 0) )
	return;

    x = cursor.x;			/* where the cursor is right now */
    y = cursor.y;

    switch ( c )  {
	case DEL:
		return;

	case BS:
		if ((x -= charwidth[tekfont]) < margin)
		    x = TEKXMAX - charwidth[tekfont];
		break;

	case NL:
		y -= charheight[tekfont];
		break;

	case CR:
		x = margin;
		break;

	case VT:
		if ((y += charheight[tekfont]) >= TEKYMAX)
		    y = 0;
		break;

	case HT:
	case ' ':
	default:
		if ( characters++ == 0 )
		    fprintf(fp_out, "%d %d (", cursor.x, cursor.y);
		switch ( c )  {
		    case '(':
		    case ')':
		    case '\\':
			putc('\\', fp_out);

		    default:
			putc(c, fp_out);
		}   /* End switch */
		x += charwidth[tekfont];
		move(x, y);
		break;
    }	/* End switch */

    if (x >= TEKXMAX) {
	x = margin;
	y -= charheight[tekfont];
    }	/* End if */

    if (y < 0) {
	y = TEKYMAX - charheight[tekfont];
	x -= margin;
	margin = (TEKXMAX/2) - margin;
	if ((x += margin) > TEKXMAX)
	    x -= margin;
    }	/* End if */

    if ( y != cursor.y || x != cursor.x )
	text();

    move(x, y);

}   /* End of alpha */

/*****************************************************************************/

graph()

{

    int			c;		/* next character */
    int			b;		/* for figuring out loy */
    int			x, y;		/* next point in the vector */
    static int		hix, hiy;	/* upper */
    static int		lox, loy;	/* and lower part of the address */
    static int		extra;		/* for extended addressing */

/*
 *
 * Handles things when we're in GRAPH, POINT, or SPECIALPOINT mode.
 *
 */

    if ((c = nextchar()) < 040) {
	control(c);
	return;
    }	/* End if */

    if ((c & 0140) == 040) {		/* new hiy */
	hiy = c & 037;
	do
	    if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED))
		return;
	while (c == 0);
    }	/* End if */

    if ((c & 0140) == 0140) {		/* new loy */
	b = c & 037;
	do
	    if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED))
		return;
	while (c == 0);
	if ((c & 0140) == 0140) {	/* no, it was extra */
	    extra = b;
	    loy = c & 037;
	    do
		if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED))
		    return;
	    while (c == 0);
	} else loy = b;
    }	/* End if */

    if ((c & 0140) == 040) {		/* new hix */
	hix = c & 037;
	do
	    if (((c = nextchar()) < 040) && ((c = control(c)) == OUTMODED))
		return;
	while (c == 0);
    }	/* End if */

    lox = c & 037;			/* this should be lox */
    if (extra & 020)
	margin = TEKXMAX/2;

    x = (hix<<7) | (lox<<2) | (extra & 03);
    y = (hiy<<7) | (loy<<2) | ((extra & 014)>>2);

    if ( points > 100 )  {		/* don't put too much on the stack */
	draw();
	points = 1;
    }	/* End if */

    if ( points++ )
	fprintf(fp_out, "%d %d\n", cursor.x - x, cursor.y - y);

    move(x, y);				/* adjust the cursor */

}   /* End of graph */

/*****************************************************************************/

point()

{

    int		c;			/* next input character */

/*
 *
 * Special point mode permits gray scaling by varying the size of the stored
 * point, which is controlled by an intensity character that preceeds each point
 * address.
 *
 */

    if ( dispmode == SPECIALPOINT )  {
	if ( (c = nextchar()) < 040 || c > 0175 )
	    return(control(c));

	fprintf(fp_out, "%d %d i\n", intensity[c - ' '], c & 0100);
    }	/* End if */

    graph();
    draw();

}   /* End of point */

/*****************************************************************************/

incremental()

{

    int		c;			/* for the next few characters */
    int		x, y;			/* cursor position when we're done */

/*
 *
 * Handles incremental plot mode. It's entered after the RS control code and is
 * used to mark points relative to our current position. It's typically followed
 * by one or two bytes that set the pen state and are used to increment the
 * current position.
 *
 */

    if ( (c = nextchar()) == OUTMODED )
	return;

    if ( (c < 040) && ((c = control(c)) <= 0) )
	return;

    x = cursor.x;			/* where we are right now */
    y = cursor.y;

    if ( c & 060 )
	pen = ( c & 040 ) ? UP : DOWN;

    if ( c & 04 ) y++;
    if ( c & 010 ) y--;
    if ( c & 01 ) x++;
    if ( c & 02 ) x--;

    move(x, y);

    if ( pen == DOWN )  {
	points = 1;
	draw();
    }	/* End if */

}   /* End of incremental */

/*****************************************************************************/

gin()

{

/*
 *
 * All we really have to do for GIN mode is make sure it's properly ended.
 *
 */

    control(nextchar());

}   /* End of gin */

/*****************************************************************************/

control(c)

    int		c;			/* check this control character */

{

/*
 *
 * Checks character c and does special things, like mode changes, that depend
 * not only on the character, but also on the current state. If the mode changed
 * becuase of c, OUTMODED is returned to the caller. In all other cases the
 * return value is c or 0, if c doesn't make sense in the current mode.
 *
 */

    switch ( c )  {
	case BEL:
		return(0);

	case BS:
	case HT:
	case VT:
		return(dispmode == ALPHA ? c : 0);

	case CR:
		if ( dispmode != ALPHA )  {
		    setmode(ALPHA);
		    ungetc(c, fp_in);
		    return(OUTMODED);
		} else return(c);

	case FS:
		if ( (dispmode == ALPHA) || (dispmode == GRAPH) )  {
		    setmode(POINT);
		    return(OUTMODED);
		}   /* End if */
		return(0);

	case GS:
		if ( (dispmode == ALPHA) || (dispmode == GRAPH) )  {
		    setmode(GRAPH);
		    return(OUTMODED);
		}   /* End if */
		return(0);

	case NL:
		ungetc(CR, fp_in);
		return(dispmode == ALPHA ? c : 0);

	case RS:
		if ( dispmode != GIN )  {
		    setmode(INCREMENTAL);
		    return(OUTMODED);
		}   /* End if */
		return(0);

	case US:
		if ( dispmode == ALPHA )
		    return(0);
		setmode(ALPHA);
		return(OUTMODED);

	case ESC:
		return(esc());

	case OUTMODED:
		return(c);

	default:
		return(c < 040 ? 0 : c);
    }	/* End switch */

}   /* End of control */

/*****************************************************************************/

esc()

{

    int		c;			/* next input character */
    int		ignore;			/* skip it if nonzero */

/*
 *
 * Handles tektronix escape code. Called from control() whenever an ESC character
 * is found in the input file.
 *
 */

    do  {
	c = nextchar();
	ignore = 0;
	switch ( c )  {
	    case CAN:
		    return(0);

	    case CR:
		    ignore = 1;
		    break;

	    case ENQ:
		    setmode(ALPHA);
		    return(OUTMODED);

	    case ETB:
		    return(0);

	    case FF:
		    formfeed();
		    setmode(ALPHA);
		    return(OUTMODED);

	    case FS:
		    if ( (dispmode == INCREMENTAL) || ( dispmode == GIN) )
			return(0);
		    setmode(SPECIALPOINT);
		    return(OUTMODED);

	    case SI:
	    case SO:
		    return(0);

	    case SUB:
		    setmode(GIN);
		    return(OUTMODED);

	    case OUTMODED:
		    return(OUTMODED);

	    case '8':
	    case '9':
	    case ':':
	    case ';':
		    setfont(c - '8');
		    return(0);

	    default:
		    if ( c == '?' && dispmode == GRAPH )
			return(DEL);
		    if ( (c<'`') || (c>'w') )
			break;
		    c -= '`';
		    if ( (c & 010) != linetype )
			fprintf(fp_out, "%d w\n", (linetype = (c & 010))/010);
		    if ( ((c + 1) & 7) >= 6 )
			break;
		    if ( (c + 1) & 7 )
			if ( (c & 7) != linestyle )  {
			    linestyle = c & 7;
			    setmode(dispmode);
			    fprintf(fp_out, "%s l\n", styles[linestyle]);
			}   /* End if */
		    return(0);
	}   /* End switch */

    } while (ignore);

    return(0);

}   /* End of esc */

/*****************************************************************************/

move(x, y)

    int		x, y;			/* move the cursor here */

{

/*
 *
 * Moves the cursor to the point (x, y).
 *
 */

    cursor.x = x;
    cursor.y = y;

}   /* End of move */

/*****************************************************************************/

setmode(mode)

    int		mode;			/* this should be the new mode */

{

/*
 *
 * Makes sure the current mode is properly ended and then sets dispmode to mode.
 *
 */

    switch ( dispmode )  {
	case ALPHA:
		text();
		break;

	case GRAPH:
		draw();
		break;

	case INCREMENTAL:
		pen = UP;
		break;
    }	/* End switch */

    dispmode = mode;

}   /* End of setmode */

/*****************************************************************************/

home()

{

/*
 *
 * Makes sure the cursor is positioned at the upper left corner of the page.
 *
 */

    margin = 0;
    move(0, TEKYMAX);

}   /* End of home */

/*****************************************************************************/

setfont(newfont)

    int		newfont;		/* use this font next */

{

/*
 *
 * Generates the call to the procedure that's responsible for changing the
 * tektronix font (really just the size).
 *
 */

    if ( newfont != tekfont )  {
	setmode(dispmode);
	fprintf(fp_out, "%d f\n", charwidth[newfont]);
    }	/* End if */

    tekfont = newfont;

}   /* End of setfont */

/*****************************************************************************/

text()

{

/*
 *
 * Makes sure any text we've put on the stack is printed.
 *
 */

    if ( dispmode == ALPHA && characters > 0 )
	fprintf(fp_out, ") t\n");

    characters = 0;

}   /* End of text */

/*****************************************************************************/

draw()

{

/*
 *
 * Called whenever we need to draw a vector or plot a point. Nothing will be
 * done if points is 0 or if it's 1 and we're in GRAPH mode.
 *
 */

    if ( points > 1 )			/* it's a vector */
	fprintf(fp_out, "%d %d v\n", cursor.x, cursor.y);
    else if ( points == 1 && dispmode != GRAPH )
	fprintf(fp_out, "%d %d p\n", cursor.x, cursor.y);

    points = 0;

}   /* End of draw */

/*****************************************************************************/

formfeed()

{

/*
 *
 * Usually called when we've finished the last page and want to get ready for the
 * next one. Also used at the beginning and end of each input file, so we have to
 * be careful about exactly what's done.
 *
 */

    setmode(dispmode);			/* end any outstanding text or graphics */

    if ( fp_out == stdout )		/* count the last page */
	printed++;

    fprintf(fp_out, "cleartomark\n");
    fprintf(fp_out, "showpage\n");
    fprintf(fp_out, "saveobj restore\n");
    fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);

    if ( ungetc(getc(fp_in), fp_in) == EOF )
	redirect(-1);
    else redirect(++page);

    fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
    fprintf(fp_out, "/saveobj save def\n");
    fprintf(fp_out, "mark\n");
    writerequest(printed+1, fp_out);
    fprintf(fp_out, "%d pagesetup\n", printed+1);
    fprintf(fp_out, "%d f\n", charwidth[tekfont]);
    fprintf(fp_out, "%s l\n", styles[linestyle]);

    home();

}   /* End of formfeed */

/*****************************************************************************/

nextchar()

{

    int		ch;			/* next input character */

/*
 *
 * Reads the next character from the current input file and returns it to the
 * caller. When we're finished with the file dispmode is set to EXIT and OUTMODED
 * is returned to the caller.
 *
 */

    if ( (ch = getc(fp_in)) == EOF )  {
	setmode(EXIT);
	ch = OUTMODED;
    }	/* End if */

    return(ch);

}   /* End of nextchar */

/*****************************************************************************/

redirect(pg)

    int		pg;			/* next page we're printing */

{

    static FILE	*fp_null = NULL;	/* if output is turned off */

/*
 *
 * If we're not supposed to print page pg, fp_out will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	fp_out = stdout;
    else if ( (fp_out = fp_null) == NULL )
	fp_out = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014230550141006400057030057030000011527430522633077300003300000006774post.src/posttek/posttek.1.ds dQ /usr/lib/postscript
.TH POSTTEK 1 "DWB 3.2"
.SH NAME
.B posttek
\- PostScript translator for Tektronix 4014 files
.SH SYNOPSIS
\*(mBposttek\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B posttek
translates Tektronix 4014 graphics
.I files
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-f name
Print text using font
.IR name .
Any PostScript font can be used,
although the best results will only be
obtained with constant width fonts.
The default font is Courier.
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which by default is located at the center of
each page.
The default magnification is 1.0.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBlandscape\fP.
.TP
.OP \-w num
Set the line width used for graphics to
.I num
points, where a point is approximately 1/72
of an inch.
By default
.I num
is set to 0 points, which forces lines to be
one pixel wide.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed at the
center of the page, with positive
x to the right and positive y up the page.
Positive
.I num
moves everything right.
The default offset is 0.0 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves everything up the page.
The default offset is 0.0.
.TP
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ/ name .enc \f1.
A nonexistent encoding file is silently ignored.
The default selects file
.MR \*(dQ/Default.enc .
.TP
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/posttek.ps .
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include.
.I string
in the output file;
.I string
must be legitimate PostScript.
.TP
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0, the request
applies to all pages.
If
.I file
is omitted, the request
lookup is done in
.MR \*(dQ/ps.requests .
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully processed.
.SH BUGS
The default line width is too small for write-white
print engines, like the one used by the \s-1PS\s+1-2400.
.br
.ne 4v
.SH FILES
.MW \*(dQ/posttek.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR dpost (1),
.BR postdaisy(1),
.BR postdmd(1),
.BR postio(1),
.BR postmd(1),
.BR postprint(1),
.BR postreverse(1),
.BR psencoding (1)
0707070014230550131006440057030057030000011530100522627504000003400000004530post.src/posttek/posttek.ps%
% Version 3.3.2 prologue for tektronix 4014 files.
%

/#copies 1 store
/aspectratio 1 def
/fixlinewidth true def
/font /Courier def
/formsperpage 1 def
/landscape true def
/linewidth 0 def
/magnification 1 def
/margin 10 def
/orientation 0 def
/rotation 1 def
/screenheight 3120 def
/screenwidth 4150 def
/spotsize 1 def
/xoffset 0 def
/yoffset 0 def

/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/kshow {kshow} bind def		% so later references don't bind

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if

	pagedimensions
	/scaling
		height margin sub screenheight div
		width margin sub screenwidth div
	min def
	xcenter ycenter translate
	orientation rotation mul rotate
	xoffset inch yoffset inch translate
	magnification dup aspectratio mul scale
	scaling scaling scale
	screenwidth 2 div neg screenheight 2 div neg translate

	tietodevicespace
	linewidth scaling div setlinewidth
	1 setlinecap
	newpath
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def} bind def

/tietodevicespace {
	fixlinewidth linewidth 0 gt and linewidth 1 lt and {
		/moveto {
			2 copy /Y exch def /X exch def
			transform round exch round exch itransform
			moveto
		} bind def
		/lineto {
			2 copy /Y exch def /X exch def
			transform round exch round exch itransform
			lineto
		} bind def
		/rlineto {Y add exch X add exch lineto} bind def
		/v V 0 get bind def
	} if
} def

/V [{moveto counttomark 2 idiv {rlineto} repeat stroke}] def
/v V 0 get bind def
/p {newpath spotsize 0 360 arc fill} bind def

/l {{scaling div} forall counttomark array astore 0 setdash} bind def
/w {linewidth 0 eq {.3} {linewidth} ifelse mul linewidth add scaling div setlinewidth} bind def
/i {3 mul 4 sub -100 div mul .5 add /spotsize exch def} bind def

/f {/charwidth exch def font findfont charwidth .6 div scalefont setfont} bind def

/t {
	3 1 roll moveto
	currentpoint {
		pop pop
		exch charwidth add exch
		moveto currentpoint
	} 4 -1 roll kshow
	pop pop
} bind def

/done {/lastpage where {pop lastpage} if} def
0707070014230265710407550057030057030000020677160522633077500002300000000000post.src/printfont0707070014230265721006440057030057030000010677500522627504000004000000016641post.src/printfont/printfont.ps%
% Formatted font dump. Assumes all fonts include valid FontBBox arrays.
%

/#copies 1 store
/aspectratio 1 def
/landscape false def
/magnification 1 def
/margin 10 def
/orientation 0 def
/rotation 1 def
/xoffset 0 def
/yoffset 0 def

/axescount 0 def
/charwidth false def
/graynotdef 0.85 def
/hireslinewidth 0.2 def
/longnames false def
/maxsize 6.0 def
/minsize 4.5 def
/numbercell true def
/radix 16 def
/labelfont /Helvetica def
/labelspace 36 def
/zerocell 0 def

/roundpage true def
/useclippath true def
/pagebbox [0 0 612 792] def

/inch {72 mul} def
/min {2 copy gt {exch} if pop} def
/max {2 copy lt {exch} if pop} def

/LLx {0 get} bind def
/LLy {1 get} bind def
/URx {2 get} bind def
/URy {3 get} bind def
/BBoxHeight {dup URy exch LLy sub} bind def
/BBoxWidth {dup URx exch LLx sub} bind def

/setup {
	/graylevels [1 0 0] def
	/scratchstring 512 string def
	/Product statusdict begin /product where {pop product}{(Unknown)} ifelse end def
	/Resolution 0 72 dtransform dup mul exch dup mul add sqrt cvi def
	/Version /version where {pop version}{(???)} ifelse def

	landscape {/orientation 90 orientation add def} if

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	width 2 div neg height 2 div translate
	xoffset inch yoffset inch neg translate
	margin dup neg translate
	0 labelspace .75 mul neg translate
	magnification dup aspectratio mul scale
	0 0 transform round exch round exch itransform translate

	currentdict /linewidth known not {
		/linewidth Resolution 400 le {0}{hireslinewidth} ifelse def
	} if
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
} def

/CharSetup {
	/chcode exch def
	/chname Encoding chcode get def
	/chstring ( ) dup 0 chcode put def
	/chknown true def

	graylevels 0 1 put	% initial cell fill
	graylevels 1 0 put	% cell text
	graylevels 2 0 put	% cell border

	FontDict /CharStrings known {
		FontDict /CharStrings get chname known not {
			/chknown false def
			graylevels 0 0 put
			graylevels 1 1 put
		} if
	} if

	chname /.notdef eq {
		/chknown false def
		graylevels 0 graynotdef put
		graylevels 1 graynotdef put
	} if

	/chwid chknown
		{FontDict 1 scalefont setfont chstring stringwidth pop}
		{0}
	ifelse def
} bind def

/CellSetup {
	/gridwidth width margin 2 mul sub def
	/gridheight height labelspace sub margin 2 mul sub def
	/cellwidth gridwidth radix div def
	/cellheight gridheight Entries radix div ceiling div def

	cellwidth cellheight dtransform truncate exch truncate exch idtransform
	/cellheight exch def
	/cellwidth exch def

	labelfont findfont 1 scalefont setfont
	/LabelBBox currentfont /FontBBox get TransformBBox def

	LabelBBox 2 0 Encoding {
		scratchstring cvs stringwidth pop
		2 copy lt {exch} if
		pop
	} forall put

	/CellLabelSize
		cellheight .20 mul cellwidth .90 mul LabelBBox BestFit
		minsize max
		maxsize min
	def
	zerocell CellOrigin cellheight add neg exch neg exch translate
} bind def

/FontSetup {
	FontName findfont 1 scalefont setfont
	/BBox currentfont /FontBBox get TransformBBox def
	/PointSize cellheight .5 mul cellwidth .8 mul BBox BestFit def
	BBox {PointSize mul} forall BBox astore pop

	/xorigin cellwidth BBox BBoxWidth sub 2 div BBox LLx sub def
	/yorigin cellheight BBox BBoxHeight sub 2 div BBox LLy sub def
} bind def

/BestFit {
	/bbox exch def
	bbox BBoxWidth div exch
	bbox BBoxHeight div min
} bind def

/TransformBBox {	% font bbox to user space
	aload pop
	currentfont /FontMatrix get dtransform 4 2 roll
	currentfont /FontMatrix get dtransform 4 2 roll
	4 array astore	% should build user space bbox if all zeros
} bind def

/CellOrigin {
	dup
	exch radix mod cellwidth mul
	exch radix idiv 1 add neg cellheight mul
} bind def

/CellOutline {
	newpath
	CellOrigin moveto
	cellwidth 0 rlineto
	0 cellheight rlineto
	cellwidth neg 0 rlineto
	closepath
} bind def

/LabelCell {
	gsave
	chcode CellOrigin translate
	linewidth .5 mul setlinewidth
	labelfont findfont CellLabelSize scalefont setfont

	numbercell {
		cellwidth .025 mul cellheight .05 mul moveto
		chcode radix scratchstring cvrs show
	} if

	charwidth chknown and {
		/wid chwid 0.0005 add scratchstring cvs 0 5 getinterval def
		cellwidth wid stringwidth pop 1.10 mul sub cellheight .05 mul moveto
		wid show
	} if

	longnames chknown not or {
		cellwidth .025 mul
		cellheight LabelBBox URy CellLabelSize mul sub .05 sub moveto
		Encoding chcode get scratchstring cvs show
	} if

	axescount 1 ge chknown and {	% gsave/grestore if not last
		newpath
		xorigin yorigin translate

		BBox LLx 0 moveto	% baseline
		BBox URx 0 lineto stroke

		axescount 2 ge {	% vertical through current origin
			0 BBox LLy moveto
			0 BBox URy lineto stroke
		} if

		axescount 3 ge {	% vertical through next origin
			chwid PointSize mul BBox LLy
			dtransform round exch round exch idtransform moveto
			0 BBox BBoxHeight rlineto stroke
			%chwid PointSize mul BBox URy lineto stroke
		} if
	} if
	grestore
} bind def

/PlaceChar {
	FontName findfont PointSize scalefont setfont
	chcode CellOrigin moveto
	xorigin yorigin rmoveto
	( ) dup 0 chcode put show
} bind def

/LabelPage {
	labelfont findfont labelspace .75 mul .75 mul 18 min scalefont setfont
	0 labelspace .75 mul .25 mul moveto
	FontName scratchstring cvs show

	labelfont findfont labelspace .25 mul .75 mul 9 min scalefont setfont
	0 gridheight neg moveto
	0 labelspace .25 mul .75 mul neg rmoveto
	Product show ( Version ) show Version show
	( \() show Resolution scratchstring cvs show (dpi\)) show

	gridwidth gridheight neg moveto
        0 labelspace .25 mul .75 mul neg rmoveto
	(size=, ) stringwidth pop neg 0 rmoveto
	PointSize cvi scratchstring cvs stringwidth pop neg 0 rmoveto
	(gray=, ) stringwidth pop neg 0 rmoveto
	graynotdef scratchstring cvs stringwidth pop neg 0 rmoveto
	(linewidth=) stringwidth pop neg 0 rmoveto
	linewidth scratchstring cvs stringwidth pop neg 0 rmoveto
	(size=) show PointSize cvi scratchstring cvs show (, ) show
	(gray=) show graynotdef scratchstring cvs show (, ) show
	(linewidth=) show linewidth scratchstring cvs show
} bind def

%
% Formatted dump of the encoded characters in a single font.
%

/PrintFont {
	/saveobj save def
	/FontName exch def
	/FontDict FontName findfont def
	/Encoding FontDict /Encoding get def
	/Entries Encoding length def

	CellSetup
	FontSetup
	LabelPage
	zerocell 1 Entries 1 sub {
		CharSetup
		graylevels 0 get setgray
		chcode CellOutline fill
		graylevels 1 get setgray
		LabelCell
		PlaceChar
		graylevels 2 get setgray
		linewidth setlinewidth
		chcode CellOutline stroke
	} for
	showpage
	saveobj restore
} bind def

%
% Dump of all ROM and disk fonts - in alphabetical order.
%

/AllFonts {
	/AllFontNames FontDirectory maxlength array def
	AllFontNames 0 0 put

	FontDirectory {pop AllFontNames Insert} forall

	/filenameforall where {
		pop
		(fonts/*)
		{(fonts/) search pop pop pop AllFontNames Insert}
		200 string
		filenameforall
	} if

	1 1 AllFontNames 0 get {
		AllFontNames exch get cvn PrintFont
	} for
} bind def

/Insert {		% name in a sorted list
	/List exch def
	/Name exch 128 string cvs def

	/Slot 1 def
	List 0 get {
		Name List Slot get le {exit} if
		/Slot Slot 1 add def
	} repeat

	List 0 get -1 Slot {
		dup List exch get
		List 3 1 roll exch 1 add exch put
	} for
	List Slot Name put
	List 0 List 0 get 1 add put
} bind def

0707070014230265731006440057030057030000010677340522627504000004000000005147post.src/printfont/printfont.sh#
# Formatted dump of encoded characters in one or more PostScript fonts.
# Arguments should be PostScript font names or the word all, which dumps
# all ROM and disk based fonts.
#

POSTLIB=/usr/lib/postscript
PROLOGUE=$POSTLIB/printfont.ps

OPTIONS=
COPYFILE=
MODE=portrait
FONTENCODING=Default

NONCONFORMING="%!PS"
ENDPROLOG="%%EndProlog"
BEGINSETUP="%%BeginSetup"
ENDSETUP="%%EndSetup"
TRAILER="%%Trailer"

SETUP=setup

while [ -n "$1" ]; do
    case $1 in
	-a)  shift; OPTIONS="$OPTIONS /axescount $1 def";;
	-a*) OPTIONS="$OPTIONS /axescount `echo $1 | sed s/-a//` def";;

	-b)  shift; OPTIONS="$OPTIONS /radix $1 def";;
	-b*) OPTIONS="$OPTIONS /radix `echo $1 | sed s/-b//` def";;

	-c)  shift; OPTIONS="$OPTIONS /#copies $1 store";;
	-c*) OPTIONS="$OPTIONS /#copies `echo $1 | sed s/-c//` store";;

	-f)  shift; OPTIONS="$OPTIONS /labelfont /$1 def";;
	-f*) OPTIONS="$OPTIONS /labelfont /`echo $1 | sed s/-f//` def";;

	-g)  shift; OPTIONS="$OPTIONS /graynotdef $1 def";;
	-g*) OPTIONS="$OPTIONS /graynotdef `echo $1 | sed s/-g//` def";;

	-p)  shift; MODE=$1;;
	-p*) MODE=`echo $1 | sed s/-p//`;;

	-q)  OPTIONS="$OPTIONS /longnames false def /charwidth false def";;

	-m)  shift; OPTIONS="$OPTIONS /magnification $1 def";;
	-m*) OPTIONS="$OPTIONS /magnification `echo $1 | sed s/-m//` def";;

	-v)  OPTIONS="$OPTIONS /longnames true def /charwidth true def";;

	-w)  shift; OPTIONS="$OPTIONS /linewidth $1 def";;
	-w*) OPTIONS="$OPTIONS /linewidth `echo $1 | sed s/-w//` def";;

	-x)  shift; OPTIONS="$OPTIONS /xoffset $1 def";;
	-x*) OPTIONS="$OPTIONS /xoffset `echo $1 | sed s/-x//` def";;

	-y)  shift; OPTIONS="$OPTIONS /yoffset $1 def";;
	-y*) OPTIONS="$OPTIONS /yoffset `echo $1 | sed s/-y//` def";;

	-z)  shift; OPTIONS="$OPTIONS /zerocell $1 def";;
	-z*) OPTIONS="$OPTIONS /zerocell `echo $1 | sed s/-z//` def";;

	-C)  shift; COPYFILE="$COPYFILE $1";;
	-C*) COPYFILE="$COPYFILE `echo $1 | sed s/-C//`";;

	-E)  shift; FONTENCODING=$1;;
	-E*) FONTENCODING=`echo $1 | sed s/-E//`;;

	-L)  shift; PROLOGUE=$1;;
	-L*) PROLOGUE=`echo $1 | sed s/-L//`;;

	-*)  echo "$0: illegal option $1" >&2; exit 1;;

	*)   break;;
    esac
    shift
done

case "$MODE" in
    l*) OPTIONS="$OPTIONS /landscape true def";;
    *)	OPTIONS="$OPTIONS /landscape false def";;
esac

echo $NONCONFORMING
cat $PROLOGUE
echo $ENDPROLOG
echo $BEGINSETUP
cat ${COPYFILE:-/dev/null}
echo $OPTIONS

case "$FONTENCODING" in
    /*) cat $FONTENCODING;;
    ?*) cat ${POSTLIB}/${FONTENCODING}.enc 2>/dev/null
esac

echo $SETUP
echo $ENDSETUP

for i do
    case "$i" in
	all) echo AllFonts;;
	/*)  echo "$i PrintFont";;
	?*)  echo "/$i PrintFont";;
    esac
done

echo $TRAILER

0707070014230265631006400057030057030000010672360522633077400004000000003045post.src/printfont/printfont.mkMAKE=/bin/make
MAKEFILE=printfont.mk

OWNER=bin
GROUP=bin

MAN1DIR=/tmp
MAN5DIR=/usr/man/p_man/man5
POSTLIB=/usr/lib/postscript
POSTBIN=/usr/bin/postscript

all : printfont

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp printfont $(POSTBIN)/printfont
	@chmod 755 $(POSTBIN)/printfont
	@chgrp $(GROUP) $(POSTBIN)/printfont
	@chown $(OWNER) $(POSTBIN)/printfont
	cp printfont.ps $(POSTLIB)/printfont.ps
	@chmod 644 $(POSTLIB)/printfont.ps
	@chgrp $(GROUP) $(POSTLIB)/printfont.ps
	@chown $(OWNER) $(POSTLIB)/printfont.ps
	cp printfont.1 $(MAN1DIR)/printfont.1
	@chmod 644 $(MAN1DIR)/printfont.1
	@chgrp $(GROUP) $(MAN1DIR)/printfont.1
	@chown $(OWNER) $(MAN1DIR)/printfont.1

clean :

clobber : clean
	rm -f printfont

printfont : printfont.sh
	sed "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" printfont.sh >printfont
	@chmod 755 printfont

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^MAN5DIR=.*'MAN5DIR=$(MAN5DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	printfont.1 >XXX.1; \
	mv XXX.1 printfont.1

0707070014230265751006400057030057030000010672500522633077500003700000010150post.src/printfont/printfont.1.ds dQ /usr/lib/postscript
.TH PRINTFONT 1 "DWB 3.2"
.SH NAME
.B printfont
\- font listing program for PostScript printers
.SH SYNOPSIS
\*(mBprintfont\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B printfont
builds a PostScript program that prints character set tables for
one or more PostScript fonts.
The program is written on the standard output,
and when sent to a PostScript printer usually prints a 16\(mu16 table
that shows the available (encoded) characters in each font.
The following
.I options
are understood:
.TP 1.0i
.OP \-a num
Set the character cell axes mode to
.IR num .
0 disables axes printing, 1 draws a baseline,
2 adds a vertical line through the character origin,
and 3 adds a vertical line through the next character origin.
The default is 0.
.TP 1.0i
.OP \-b num
Print each table in base
.IR num .
The base determines the number of rows and columns in the table.
It also affects the character code placed in the lower left corner of each cell.
The default is 16 (hexadecimal).
.TP 1.0i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP 1.0i
.OP \-f name
Use font
.I name
for labeling the tables.
The default font is Helvetica.
.TP 1.0i
.OP \-g num
Use
.I num
as the gray level for marking cells not currently assigned to characters.
The gray level should fall between 0 (black) and 1 (white).
The default is 0.85.
.TP 1.0i
.OP \-m num
Magnify each logical page by the factor
.IR num .
Pages are scaled uniformly about the origin,
which is located near the upper left corner of each page.
The default is 1.0.
.TP 1.0i
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP
.IR mode .
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP 1.0i
.OP \-v
Completely label each character cell.
The full character name goes in the upper left corner and the
character width (at point size 1) goes in the lower right corner.
.TP 1.0i
.OP \-w num
Set the line width to
.I num
points, where a point is approximately 1/72 of an inch.
A line width of 0 means 1 pixel.
The default line width is resolution dependent.
.TP 1.0i
.OP \-x num
Translate the origin
.I num
inches along the x axis.
Positive
.I num
shifts the table to the right.
The default offset is 0.
.TP 1.0i
.OP \-y num
Translate the origin
.I num
inches along the y axis.
Positive
.I num
shifts the table up the page.
The default offset is 0.
.TP 1.0i
.OP \-C file
Copy
.I file
to the output file;
.B file
must contain legitimate PostScript.
.TP 1.0i
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ/ name .enc \f1.
A nonexistent encoding file is silently ignored.
The default selects file
.MR \*(dQ/Default.enc .
.TP 1.0i
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MR \*(dQ/printfont.ps .
.PP
Arguments should be PostScript
.I font
names or the word
.MR all ,
which means the full set of
.SM ROM
and disk based fonts available on a printer.
.B printfont
prints one font table per page.
Each page is labeled with the
.I font
name, the printer product name and interpreter version number,
and the gray level, linewidth, and printer resolution.
.PP
Black cells are used to mark characters listed in the font's
.MW Encoding
array but missing from its
.MW CharStrings
dictionary.
They usually indicate an incomplete font or a mistake in the
.MW Encoding
array.
The check is skipped if the font doesn't include a
.MW CharStrings
dictionary.
.br
.ne 4v
.SH EXAMPLES
Print the characters available in the Times-Roman, Symbol and
ZapfDingbats fonts:
.EX
printfont Times-Roman Symbol ZapfDingbats | lp ...
.EE
Print a baseline under each character and fully label the cells:
.EX
printfont -a1 -v Times-Roman Symbol ZapfDingbats | lp ...
.EE
Dump all the fonts available on a printer using the Latin1 character encoding:
.EX
printfont -ELatin1 all | lp ...
.EE
.SH WARNINGS
Printing a single table can take several minutes.
Dumping all available fonts can tie a printer up for an hour or more.
.SH FILES
.MW \*(dQ/printfont.ps
.br
.MW \*(dQ/*.enc
.SH SEE ALSO
buildtables(1),
dpost(1),
postio(1),
psencoding(1),
trofftable(1)
0707070014230643060407550057030057030000021712370522627504100001700000000000post.src/tests0707070014230643071006440057030057030000011714700522627504100002700000112244post.src/tests/postmd1   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

  -.5602721e+08   .1143984e+09  -.6207247e+08   .0000000e+00   .0000000e+00
  -.1149580e+09   .2301959e+09  -.1138958e+09   .0000000e+00   .0000000e+00
  -.5853962e+08   .1144553e+09  -.5355661e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.2468074e+08   .1401407e+07   .2608215e+08   .0000000e+00   .0000000e+00
  -.5473053e+06  -.2402412e+07  -.1855106e+07   .0000000e+00   .0000000e+00
   .2522804e+08   .1001005e+07  -.2422704e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00  -.5219836e+08   .1123168e+09  -.6715163e+08   .0000000e+00
   .0000000e+00  -.1138958e+09   .2284693e+09  -.1110422e+09   .0000000e+00
   .0000000e+00  -.6060955e+08   .1126212e+09  -.4850979e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.2391785e+08   .3480520e+07   .2739837e+08   .0000000e+00
   .0000000e+00  -.1855106e+07  -.5966605e+07  -.4111499e+07   .0000000e+00
   .0000000e+00   .2577296e+08   .2486086e+07  -.2328688e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00  -.4569685e+08   .1058615e+09  -.8114649e+08
   .0000000e+00   .0000000e+00  -.1110422e+09   .2277521e+09  -.1023531e+09
   .0000000e+00   .0000000e+00  -.6383463e+08   .1075339e+09  -.3707416e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.2260163e+08   .8226099e+07   .3082772e+08
   .0000000e+00   .0000000e+00  -.4111499e+07  -.1410188e+08  -.9990385e+07
   .0000000e+00   .0000000e+00   .2671312e+08   .5875785e+07  -.2083734e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.5644212e+08   .1144553e+09  -.6060955e+08   .0000000e+00   .0000000e+00
  -.1149657e+09   .2301010e+09  -.1139830e+09   .0000000e+00   .0000000e+00
  -.5811705e+08   .1144933e+09  -.5493231e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.2477196e+08   .1001005e+07   .2577296e+08   .0000000e+00   .0000000e+00
  -.3648702e+06  -.1601608e+07  -.1236738e+07   .0000000e+00   .0000000e+00
   .2513683e+08   .6006029e+06  -.2453622e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.5355661e+08   .1126212e+09  -.6383463e+08   .0000000e+00
   .0000000e+00  -.1139830e+09   .2279620e+09  -.1114623e+09   .0000000e+00
   .0000000e+00  -.5916407e+08   .1128241e+09  -.5140673e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.2422704e+08   .2486086e+07   .2671312e+08   .0000000e+00
   .0000000e+00  -.1236738e+07  -.3977737e+07  -.2740999e+07   .0000000e+00
   .0000000e+00   .2546378e+08   .1491651e+07  -.2397213e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.4850979e+08   .1075339e+09  -.7261747e+08
   .0000000e+00   .0000000e+00  -.1114623e+09   .2249648e+09  -.1047203e+09
   .0000000e+00   .0000000e+00  -.6060164e+08   .1086488e+09  -.4323591e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.2328688e+08   .5875785e+07   .2916266e+08
   .0000000e+00   .0000000e+00  -.2740999e+07  -.9401256e+07  -.6660257e+07
   .0000000e+00   .0000000e+00   .2602787e+08   .3525471e+07  -.2250240e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.5685856e+08   .1144933e+09  -.5916407e+08   .0000000e+00   .0000000e+00
  -.1149703e+09   .2300441e+09  -.1140353e+09   .0000000e+00   .0000000e+00
  -.5769602e+08   .1145123e+09  -.5632545e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.2486317e+08   .6006029e+06   .2546378e+08   .0000000e+00   .0000000e+00
  -.1824351e+06  -.8008039e+06  -.6183688e+06   .0000000e+00   .0000000e+00
   .2504561e+08   .2002010e+06  -.2484541e+08   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.5493231e+08   .1128241e+09  -.6060164e+08   .0000000e+00
   .0000000e+00  -.1140353e+09   .2276577e+09  -.1117143e+09   .0000000e+00
   .0000000e+00  -.5773604e+08   .1129256e+09  -.5438769e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.2453622e+08   .1491651e+07   .2602787e+08   .0000000e+00
   .0000000e+00  -.6183688e+06  -.1988868e+07  -.1370500e+07   .0000000e+00
   .0000000e+00   .2515459e+08   .4972171e+06  -.2465738e+08   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.5140673e+08   .1086488e+09  -.6456189e+08
   .0000000e+00   .0000000e+00  -.1117143e+09   .2232924e+09  -.1061407e+09
   .0000000e+00   .0000000e+00  -.5745266e+08   .1092063e+09  -.4987112e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.2397213e+08   .3525471e+07   .2749760e+08
   .0000000e+00   .0000000e+00  -.1370500e+07  -.4700628e+07  -.3330128e+07
   .0000000e+00   .0000000e+00   .2534262e+08   .1175157e+07  -.2416747e+08

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

  -.2468074e+08   .2531926e+08   .0000000e+00   .0000000e+00   .0000000e+00
  -.5473053e+06  -.5473053e+06   .0000000e+00   .0000000e+00   .0000000e+00
   .2522804e+08  -.2477196e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.1087220e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .2174439e+08   .2174439e+08   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.1087220e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

  -.2468074e+08   .1401407e+07   .2608215e+08   .0000000e+00   .0000000e+00
  -.5473053e+06  -.2402412e+07  -.1855106e+07   .0000000e+00   .0000000e+00
   .2522804e+08   .1001005e+07  -.2422704e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.2183162e+08  -.1095942e+08   .0000000e+00   .0000000e+00
   .2174439e+08   .4366323e+08   .2191884e+08   .0000000e+00   .0000000e+00
  -.1087220e+08  -.2183162e+08  -.1095942e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00  -.2391785e+08   .3480520e+07   .2739837e+08   .0000000e+00
   .0000000e+00  -.1855106e+07  -.5966605e+07  -.4111499e+07   .0000000e+00
   .0000000e+00   .2577296e+08   .2486086e+07  -.2328688e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.1095942e+08  -.2213817e+08  -.1117875e+08   .0000000e+00
   .0000000e+00   .2191884e+08   .4427633e+08   .2235749e+08   .0000000e+00
   .0000000e+00  -.1095942e+08  -.2213817e+08  -.1117875e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00  -.2260163e+08   .8226099e+07   .3082772e+08
   .0000000e+00   .0000000e+00  -.4111499e+07  -.1410188e+08  -.9990385e+07
   .0000000e+00   .0000000e+00   .2671312e+08   .5875785e+07  -.2083734e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.1117875e+08  -.2289026e+08  -.1171152e+08
   .0000000e+00   .0000000e+00   .2235749e+08   .4578053e+08   .2342304e+08
   .0000000e+00   .0000000e+00  -.1117875e+08  -.2289026e+08  -.1171152e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.2477196e+08   .2522804e+08   .0000000e+00   .0000000e+00   .0000000e+00
  -.3648702e+06  -.3648702e+06   .0000000e+00   .0000000e+00   .0000000e+00
   .2513683e+08  -.2486317e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.1087220e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .2174439e+08   .2174439e+08   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.1087220e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.2477196e+08   .1001005e+07   .2577296e+08   .0000000e+00   .0000000e+00
  -.3648702e+06  -.1601608e+07  -.1236738e+07   .0000000e+00   .0000000e+00
   .2513683e+08   .6006029e+06  -.2453622e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.2183162e+08  -.1095942e+08   .0000000e+00   .0000000e+00
   .2174439e+08   .4366323e+08   .2191884e+08   .0000000e+00   .0000000e+00
  -.1087220e+08  -.2183162e+08  -.1095942e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.2422704e+08   .2486086e+07   .2671312e+08   .0000000e+00
   .0000000e+00  -.1236738e+07  -.3977737e+07  -.2740999e+07   .0000000e+00
   .0000000e+00   .2546378e+08   .1491651e+07  -.2397213e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.1095942e+08  -.2213817e+08  -.1117875e+08   .0000000e+00
   .0000000e+00   .2191884e+08   .4427633e+08   .2235749e+08   .0000000e+00
   .0000000e+00  -.1095942e+08  -.2213817e+08  -.1117875e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.2328688e+08   .5875785e+07   .2916266e+08
   .0000000e+00   .0000000e+00  -.2740999e+07  -.9401256e+07  -.6660257e+07
   .0000000e+00   .0000000e+00   .2602787e+08   .3525471e+07  -.2250240e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.1117875e+08  -.2289026e+08  -.1171152e+08
   .0000000e+00   .0000000e+00   .2235749e+08   .4578053e+08   .2342304e+08
   .0000000e+00   .0000000e+00  -.1117875e+08  -.2289026e+08  -.1171152e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.2486317e+08   .2513683e+08   .0000000e+00   .0000000e+00   .0000000e+00
  -.1824351e+06  -.1824351e+06   .0000000e+00   .0000000e+00   .0000000e+00
   .2504561e+08  -.2495439e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.1087220e+08   .0000000e+00   .0000000e+00   .0000000e+00
   .2174439e+08   .2174439e+08   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.1087220e+08   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.2486317e+08   .6006029e+06   .2546378e+08   .0000000e+00   .0000000e+00
  -.1824351e+06  -.8008039e+06  -.6183688e+06   .0000000e+00   .0000000e+00
   .2504561e+08   .2002010e+06  -.2484541e+08   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
  -.1087220e+08  -.2183162e+08  -.1095942e+08   .0000000e+00   .0000000e+00
   .2174439e+08   .4366323e+08   .2191884e+08   .0000000e+00   .0000000e+00
  -.1087220e+08  -.2183162e+08  -.1095942e+08   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.2453622e+08   .1491651e+07   .2602787e+08   .0000000e+00
   .0000000e+00  -.6183688e+06  -.1988868e+07  -.1370500e+07   .0000000e+00
   .0000000e+00   .2515459e+08   .4972171e+06  -.2465738e+08   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00  -.1095942e+08  -.2213817e+08  -.1117875e+08   .0000000e+00
   .0000000e+00   .2191884e+08   .4427633e+08   .2235749e+08   .0000000e+00
   .0000000e+00  -.1095942e+08  -.2213817e+08  -.1117875e+08   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.2397213e+08   .3525471e+07   .2749760e+08
   .0000000e+00   .0000000e+00  -.1370500e+07  -.4700628e+07  -.3330128e+07
   .0000000e+00   .0000000e+00   .2534262e+08   .1175157e+07  -.2416747e+08
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00  -.1117875e+08  -.2289026e+08  -.1171152e+08
   .0000000e+00   .0000000e+00   .2235749e+08   .4578053e+08   .2342304e+08
   .0000000e+00   .0000000e+00  -.1117875e+08  -.2289026e+08  -.1171152e+08

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01   .0000000e+00

   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00
   .0000000e+00   .0000000e+00   .0000000e+00   .0000000e+00   .1000000e+01



0707070014230643101006440057030057030000011716100522627504100003000000063512post.src/tests/postbgi17B+@J@\6556I 03  09-23-84   22.961  frame no.  01    
   MH9220,M158,DREXLER                                     +BCD1@@`G+BxBu 0.1+BCD1AN@@@@`G@@@G+CtBu 0.2+DMCD1AO@@@@`G@@@G+EBBu 0.3+E\CD1AN@@@@`G@@@G+FPBu 0.4+FjCD1AN@@@@`G@@@G+G_Bu 0.5+GxCD1AN@@@@`G@@@G+HmBu 0.6+IFCD1AN@@@@`G@@@G+I{Bu 0.7+JTCD1AN@@@@`G@@@G+KIBu 0.8+KbCD1AN@@@@`G@@@G+LWBu 0.9+LpCD1AO@@@@`G@@@G+MeBu 1.0+HXB] X+BCD1`G@@+BmB}-1.0+BCD1@@A``G@@@G@@+BmDQ-0.8+BDd1@@A``G@@@G@@+BmEq-0.6+BFD1@@A``G@@@G@@+BmGQ-0.4+BGd1@@A``G@@@G@@+BmHq-0.2+BID1@@A``G@@@G@@+BmJK 0.0+BJd1@@A``G@@@G@@+BmKk 0.2+BLD1@@A``G@@@G@@+BmMK 0.4+BMd1@@A``G@@@G@@+BmNj 0.6+BOD1@@A``G@@@G@@+BmPJ 0.8+BPd1@@A``G@@@G@@+BmQj 1.0+BYJ] Y+BN~1ANBnAO@@ANbnANdZANdZANbnAN@@ANBnAODZ%7B+@J@\6556I 03  09-23-84   22.961  frame no.  02    
   MH9220,M158,DREXLER                                     +BCD1@@`J+BxBm107A+CNBw-1+BCD1CT@@@@`G@@@GA|@@@@`G@@@GAX@@@@`G@@@GAD@@@@`G@@@G@x@@@@`G@@@G@o@@@@`G@@@G@h@@@@`G@@@G@d@@@@`G@@@G@a@@@@`J@@@J7B+MwBm107A+NMBw07B+HXBX X+BCD1`G@@+BmB}-1.0+BCD1@@A``G@@@G@@+BmDQ-0.8+BDd1@@A``G@@@G@@+BmEq-0.6+BFD1@@A``G@@@G@@+BmGQ-0.4+BGd1@@A``G@@@G@@+BmHq-0.2+BID1@@A``G@@@G@@+BmJK 0.0+BJd1@@A``G@@@G@@+BmKk 0.2+BLD1@@A``G@@@G@@+BmMK 0.4+BMd1@@A``G@@@G@@+BmNj 0.6+BOD1@@A``G@@@G@@+BmPJ 0.8+BPd1@@A``G@@@G@@+BmQj 1.0+BYJ] Y+BN~1CTBnA|@@AXbnADdZ@xdZ@obn@h@@@dBn@aDZ%7B+@J@\6556I 03  09-23-84   22.961  frame no.  03    
   MH9220,M158,DREXLER                                     +BN~1CTBnA|@@AXbnADdZ@xdZ@obn@h@@@dBn@aDZ%7B+@J@\6556I 03  09-23-84   22.961  frame no.  04    
   MH9220,M158,DREXLER                                     7C+EWQhEXAMPLE OF A POLAR PLOT+J_Hr1@@`G+J_Hr1B@@@@@`G@@@G7B+LEHb 0.4+L_Hr1B@@@@@`G@@@G+NEHb 0.8+KmHJREAL AXES+J_Hr1`G@@+J_Hr1@@B@`G@@@G@@+JLJX 0.4+J_Jr1@@B@`G@@@G@@+JLLX 0.8+J_Lr1@@B@`G@@@G@@+JLNX 1.2+J_Nr1@@A`G@@@G@@+JLPX 1.6+IyL@IMAG AXES+B_Hr1@@`G+BXHb 1.6+B_Hr1B@@@@@`G@@@G+DFHb 1.2+D_Hr1B@@@@@`G@@@G+FFHb 0.8+F_Hr1B@@@@@`G@@@G+HFHb 0.4+H_Hr1B@@@@@`G@@@G+F^HJ +J_Dr1`G@@+JLDk 0.8+J_Dr1@@B@`G@@@G@@+JLFY 0.4+J_Fr1@@B@`G@@@G@@+IyFq +JdHm1@@@K@J@@@@`K`J@@+JiHr1@J@B@I@C@J@E@H@E@I@G@G@H@G@H@E@J@E@J@C@K+KmIr1@@@J@J@@@@`J`J@@+KrIw1@C@K@A@L@@@M`B@L`C@M`D@L`E@M`G@L`H@L`I@K+KJKk1@@@J@K@@@@`J`K@@+KPKp1`K@J`L@J`L@H`N@H`O@F`O@F`P@D`Q@C`Q@A`Q@@+HxLc1@@@J@K@@@@`J`K@@+H~Lh1`R`B`R`C`Q`E`R`F`Q`G`P`I`P`K`O`K`N`M`M`O+FWKQ1@@@J@J@@@@`J`J@@+F\KV1`L`O`K`P`J`R`H`R`G`R`F`T`D`S`B`T`A`T@A`T+E[HY1@@@J@J@@@@`J`J@@+E`H^1@B`T@D`T@F`S@G`S@H`R@J`Q@K`P@L`P@M`N@N`M+FrEm1@@@J@J@@@@`J`J@@+FwEr1@O`L@P`J@P`I@Q`H@R`F@Q`D@R`C@R`B@Q@@@Q@A+I[Dx1@@@J@J@@@@`J`J@@+I`D}1@Q@C@P@D@O@E@O@G@N@G@L@I@L@J@K@J@I@K@H@L+K\FF1@@@J@J@@@@`J`J@@+KaFK1@G@L@E@L@D@M@C@L@B@M@@@L`A@L`C@L`C@K`E@J+KeG}1@@@J@J@@@@`J`J@@+KjHB1`E@J`G@H`G@H`I@F`H@F`J@D`I@C`J@B`J@A@J@@+JdHm1@@@K@J@@@@`K`J@@%7B+@J@\6556I 03  09-23-84   22.961  frame no.  05    
   MH9220,M158,DREXLER                                     7C+EESHTHE USE OF CURVE AND GRAF+B_CD1@@`G7B+BXBu 0.0+B_CD1AM@@@@`G@@@G+CSBu 1.0+ClCD1AM@@@@`G@@@G+D_Bu 2.0+DyCD1AM@@@@`G@@@G+ElBu 3.0+FFCD1AL@@@@`G@@@G+FyBu 4.0+GRCD1AM@@@@`G@@@G+HFBu 5.0+H_CD1AM@@@@`G@@@G+IRBu 6.0+IlCD1AL@@@@`G@@@G+J_Bu 7.0+JxCD1AM@@@@`G@@@G+KlBu 8.0+LECD1AM@@@@`G@@@G+LyBu 9.0+MRCD1AM@@@@`G@@@G+MBu 10.0+GzB]X LABEL+B_CD1`G@@+BMB} 0.0+B_CD1@@A``G@@@G@@+BMDK 1.0+B_Dd1@@A``G@@@G@@+BMEk 2.0+B_FD1@@A``G@@@G@@+BMGK 3.0+B_Gd1@@A``G@@@G@@+BMHk 4.0+B_ID1@@A``G@@@G@@+BMJK 5.0+B_Jd1@@A``G@@@G@@+BMKk 6.0+B_LD1@@A``G@@@G@@+BMMK 7.0+B_Md1@@A``G@@@G@@+BMNj 8.0+B_OD1@@A``G@@@G@@+BMPJ 9.0+B_Pd1@@A``G@@@G@@+BMQd 10.0+AyIY LABEL+B^CC1@@OBLB@@@@oBlB@@+B_CD1@@O@L@@@@@o@l@@@+BaCF1@@N|K|@@@@n|k|@@+BbCI1@@@J@J@@@@`J`J@@+BgCN1@H@J@G@I@H@J@H@I@G@J@H@J@H@I@G@J@H@I@H@J+CoDi1@@@J@J@@@@`J`J@@+CtDn1@G@I@H@J@H@J@G@I@H@J@H@I@G@J@H@J@H@I@G@J+D{FI1@@@J@K@@@@`J`K@@+E@FN1@H@I@H@J@G@J@H@I@H@J@H@I@G@J@H@J@H@I@G@J+FHGi1@@@J@J@@@@`J`J@@+FMGn1@H@I@H@J@G@J@H@I@H@J@G@I@H@J@H@I@G@J@H@J+GUII1@@@J@J@@@@`J`J@@+GZIN1@H@I@G@J@H@I@H@J@G@J@H@I@H@J@G@I@H@J@H@J+HbJh1@@@K@J@@@@`K`J@@+HgJn1@G@I@H@J@H@I@G@J@H@J@H@I@G@J@H@I@H@J@G@J+InLH1@@@K@J@@@@`K`J@@+IsLN1@H@I@H@J@G@I@H@J@H@I@G@J@H@J@H@I@G@J@H@I+J{Mh1@@@K@J@@@@`K`J@@+K@Mm1@H@J@G@J@H@I@H@J@G@I@H@J@H@J@G@I@H@J@H@I+LHOH1@@@J@J@@@@`J`J@@+LMOM1@G@J@H@J@H@I@H@J@G@I@H@J@H@J@G@I@H@J@H@I+MTPh1@@@J@K@@@@`J`K@@+MZPm1@G@J@H@I@H@J@G@J@H@I@H@J@G@I@H@J@H@J+NYQ1@@@J@K@@@@`J`K@@+BdB1`B@C@@@E@B@C@F@@@B`C@@`E`B`C`F@@+CKCC1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+CqCK1`B@B@@@F@B@B@E@@@C`B@@`F`C`B`E@@+DXCX1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+D~Cj1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+EdD@1`B@C@@@E@B@B@E@@@C`B@@`E`C`C`E@@+FKD[1`C@C@@@E@C@C@E@@@B`C@@`E`B`C`E@@+FqD|1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+GWEa1`B@B@@@E@B@C@E@@@C`C@@`E`C`B`E@@+G~FJ1`C@C@@@E@C@B@E@@@B`B@@`E`B`C`E@@+HdFy1`B@B@@@E@B@C@E@@@C`C@@`E`C`B`E@@+IJGl1`B@C@@@E@B@B@F@@@B`B@@`E`B`C`F@@+IqHd1`C@C@@@E@C@B@E@@@B`B@@`E`B`C`E@@+JWIa1`B@C@@@E@B@B@E@@@C`B@@`E`C`C`E@@+J~Jc1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+KdKi1`C@C@@@E@C@C@E@@@C`C@@`E`C`C`E@@+LJLu1`B@B@@@E@B@C@E@@@C`C@@`E`C`B`E@@+LqNE1`C@B@@@E@C@C@E@@@B`C@@`E`B`B`E@@+MWOZ1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+M}Ps1`B@C@@@E@B@C@E@@@C`C@@`E`C`C`E@@+N\Q1`C@B@@@E@C@C@E@@@C`C@@`E`C`B`E@@+BgCD1@H@@@G@@@H@@@H@@@G@A@H@@@H@@@G@@@H@@@H@A@G@@@H@@@H@A@G@A@H@@@H@A@G@A@H@A@H@A@G@A@H@B@H@A@G@B@H@A@H@B@H@B@G@B@H@C@H@B@G@C@H@C@H@C@G@C@H@C@H@D@G@D@H@D@H@D@G@E@H@D@H@E@G@F@H@E@H@F@G@F@H@F@H@F@G@G@H@G+H_D|1@H@H@G@G@H@H@H@H@G@I@H@I@H@I@G@J@H@I@H@K@G@J@H@K@H@K@G@L@H@L@H@L@G@M@H@M@H@M@G@N@H@O@H@N@G@P@H@O@H@P@G@P@H@Q@H@R@G@Q@H@S@H@R@G@S@H@T@H@T@H@T@G@V@H@U@H@V@G@W@H@W@H@W@G@X@H@Y@H@Y@G@Z@H@Z@H@[@G@[@H@\+NWQg1@H@]+BwQZTHREE CURVES ON THE SAME AXIS SYSTEM HAVING+D}PjDIFFERENT MARKER TYPES%7B+@J@\6556I 03  09-23-84   22.961  frame no.  06    
   MH9220,M158,DREXLER                                     7C+D@I]XGRAF WITH A GRID+LcCo1@G@@7B+LsCh 0.0+LcCo1@@Ag@G@@`G@@+LsD| 0.1+LcEV1@@Af@G@@`G@@+LsFc 0.2+LcF|1@@Af@G@@`G@@+LsHI 0.3+LcHb1@@Ag@G@@`G@@+LsIo 0.4+LcJI1@@Af@G@@`G@@+LsKV 0.5+LcKo1@@Af@G@@`G@@+LsL| 0.6+LcMU1@@Ag@G@@`G@@+LsNb 0.7+LcN|1@@Af@G@@`G@@+LsPI 0.8+LcPb1@@Af@G@@`G@@+LsQo 0.9+LcRH1@@Ag@G@@`G@@+LsSU 1.0+MKJBX AXIS IS GRAF TYPE+LcCo1@@`G+LnC_1`E@@+LcCc1@@@@@@`I@@@@@B@B+L^Cc1@@@@`A@@@@@@@A@@+LXCc1`A@@`A@@`A`B@@`D@A`B@A`A@A@@@A@A@A@B@@@D`A@B`A@@+LcCo1b@@@@@`G@@@G+JzC_1`E@@+JpCc1`A@@`A@@`A`B@@`D@A`B@A`A@A@@@A@A@A@B@@@D`A@B`A@@+JjCc1@@@@`A@@@@@@@A@@+JeCc1`B@@`A@@`A`A@@`C@A`A@A@@@B@@@@`D`D@@+JcCo1a@@@@`G@@@G+HwCc1`B@@`A@@`A`B@@`D@A`B@A`A@B@@@@@A@A@B@@@D`A@B@@@@+HpCc1@@@@`A@@@@@@@A@@+HkCc1`B@@`A@@@@`B@@`D@@`B@A`A@B@@@A@A@@@B@@@D@@@B`A@@+HdCo1b@@@@@`G@@@G+FwCc1`B@@`A@@@@`B@@`D@@`B@A`A@B@@@A@A@@@B@@@D@@@B`A@@+FqCc1@@@@`B@@@@@@@B@@+FlCc1`C@@@@@@`A`A@@`C@A`A@@@@@C@@@@`D`D@@+FdCo1b@@@@@`G@@@G+DuCc1@@@@@@`I@A@@@B@B+DqCc1@@@@`B@@@@@@@B@@+DkCc1`B@@`A@@@@`B@@`D@@`B@A`A@B@@@A@A@@@B@@@D@@@B`A@@+JMCJ1@C`H@@@B+JMCO1@@@A@@`F`D`H@@@B+IsCK1@F@@+IzCO1@A@A`D`N`E@N@@`A+InCO1@A@A`I`N@A@B+InCD1@A`B`I@N@@`A+I`CB1@B@@+I`CP1@@`N`B@@+IbCP1`D@@+IZCM1`A@B`A@A`C@@`B`A@@`B@@`A@@`B@B`A@C@@@B`A@@`B@@@@@@`B`B`B`C@@`B@B@@@B+IBCB1@B@@+IBCP1@@`N`B@@+IDCP1`D@@+H|CM1`A@B`A@A`D@@`A`A@@`B@@`A@@`B@A`A@D@@@A`A@A`B@@@@`A`B`A`B`D@@`A@B@@@B+H`CJ1`B@@@@@F@F@@@@`A@A`B@@`G`A`C@@`A`D@@`A@B`A@B+HZCO1@@@A@@`N`F@@`A@B@@@B@@@@@@@B@A@A@F@@+HUCI1`C@G@A`A+HGCK1@F@@+HNCO1@A@A`E`N`E@N@A`A+HCCO1@@@A@@`N`F@@`A@B`A@B@@@A@A@B@A@A@F@@+GxCO1@@@A@@`N@@@B+GpCD1@@`B@@@N@@`A+GpCI1@H@@+G]CB1@D@@+G]CO1@@@A@@`N`E@@+GQCJ1@D`H`A@B+GQCO1@@@A@@`F`D`H@A@B+GJCO1@@@A@@`N`E@@`B@B@@@B@@@A@@@B@B@A@E@@+FwCP1@H@@@@`N`H@@+FwCI1@H@@+LcDI1g@@+DdDc1G@@+LcD|1g@@+DdEV1G@@+LcEo1g@@+DdFI1G@@+LcFc1g@@+DdF|1G@@+LcGV1g@@+DdGo1G@@+LcHI1g@@+DdHb1G@@+LcH|1g@@+DdIV1G@@+LcIo1g@@+DdJI1G@@+LcJb1g@@+DdJ|1G@@+LcKV1g@@+DdKo1G@@+LcLI1g@@+DdLb1G@@+LcL|1g@@+DdMU1G@@+LcMo1g@@+DdNI1G@@+LcNb1g@@+DdN|1G@@+LcOU1g@@+DdOo1G@@+LcPH1g@@+DdPb1G@@+LcP|1g@@+DdQU1G@@+LcQo1g@@+DdRH1G@@+LcRb1g@@+DdR|1G@@+LcSU1g@@+KcCo1@@P@+JcSo1@@p@+IcCo1@@P@+HcSo1@@p@+GdCo1@@P@+FdSo1@@p@+EdCo1@@P@+LcCo1g@@@@P@G@@@@p@+GfCz1`v@J`l@J``@J`R@K`D@J@J@J@V@J@_@J@g@K@l@J@m@J@l@J@h@K@b@J@[@J@Q@J@G@K`B@J`K@J`R@J`Y@J`]@K`^@J`_@J`^@J`Y@K`U@J`O@J`H@J`B@K@D@J@K@J@O@J@R@J@U@K@U@J@U@J@S@J@P@K@L@J@H@J@D@J`A@K`E@J`I@J`L@J`M@K`O@J`N@J+HdKo1`N@J`L@J`J@K`G@J`D@J`A@J@B@K@E@J@G@J@I@J@I@K@K@J@I@J@I@J@H@J@F@K@D@J@A@J@@@J`C@K`D@J`E@J`G@J`G@K`F@J`G@J`F@J`D@J`D@K`A@J`A@J@A@J@B@K@D@J@D@J@D@J@E@K@E@J@D@J@D@J@B@J@B@K@A@J@@@J`A@J`B@K`C@J`C@J`C@J+HgSd1`C@K+DsCz1@^@J@h@J@q@J@v@K@v@J@t@J@o@J@g@J@]@K@R@J@F@J`F@J`O@K`X@J``@J`c@J`f@K`e@J`b@J`]@J`X@J`P@K`H@J@@@J@G@J@N@K@S@J@W@J@Y@J@Z@K@Y@J@V@J@R@J@N@J@H@K@C@J`B@J`H@J`K@K`O@J`Q@J`Q@J`R@K`P@J`N@J`K@J`H@K`C@J@@@J+GkKo1@C@J@F@J@J@K@J@J@L@J@M@J@K@K@K@J@H@J@G@J@D@K@A@J`A@J`D@J`E@J`G@K`H@J`H@J`H@J`H@K`G@J`E@J`D@J`A@K@@@J@A@J@C@J@E@J@E@K@E@J@F@J@F@J@E@K@D@J@C@J@B@J@@@K@@@J`B@J`C@J`C@J`D@K`C@J`D@J`D@J`C@K`C@J`A@J`A@J+HWSd1@@@K%7B+@J@\6556I 03  09-23-84   22.961  frame no.  07    
   MH9220,M158,DREXLER                                     7C+ENRhLOG TYPE GRID USING YLOG+B^Ch1@@NALB@@@@nAlB@@+B_Ci1@@ML@@@@@ml@@@+BaCj1@@M}K|@@@@m}k|@@+B_Ci1@@`G7B+BXCZ-1.5+B_Ci1B@@@@@`G@@@G+DLCZ-1.0+D_Ci1B@@@@@`G@@@G+FLCZ-0.5+F_Ci1B@@@@@`G@@@G+HFCZ 0.0+H_Ci1B@@@@@`G@@@G+JFCZ 0.5+J_Ci1B@@@@@`G@@@G+LECZ 1.0+L_Ci1B@@@@@`G@@@G+NECZ 1.5+FlCAX AXIS IS GRAPH TYPE+B_Ci1`J@@+BKCa107A+BACx-2+B_Ci1@@BG`G@@@G@@@@AN`G@@@G@@@@@x`G@@@G@@@@@l`G@@@G@@@@@c`G@@@G@@@@@^`G@@@G@@@@@Z`G@@@G@@@@@W`G@@@G@@@@@U`J@@@J@@7B+BKJa107A+BAJw-1+B_Ji1@@BF`G@@@G@@@@AO`G@@@G@@@@@x`G@@@G@@@@@k`G@@@G@@@@@d`G@@@G@@@@@^`G@@@G@@@@@Z`G@@@G@@@@@W`G@@@G@@@@@T`J@@@J@@7B+BKQa107A+BAQw07B+AtJIY AXIS+C_Ci1@@M+D_Qh1@@m+E_Ci1@@M+F_Qh1@@m+G_Ci1@@M+H_Qh1@@m+I_Ci1@@M+J_Qh1@@m+K_Ci1@@M+L_Qh1@@m+M_Ci1@@M+B_DL1L@@@+N_Dj1l@@@+B_ED1L@@@+N_E[1l@@@+B_Ep1L@@@+N_FB1l@@@+B_FS1L@@@+N_Fc1l@@@+B_Fq1L@@@+N_F~1l@@@+B_GK1L@@@+N_GW1l@@@+B_Gb1L@@@+N_Gl1l@@@+B_Gv1L@@@+N_H@1l@@@+B_HI1L@@@+N_HR1l@@@+B_HZ1L@@@+N_Hb1l@@@+B_Hi1L@@@+N_Hq1l@@@+B_Hx1L@@@+N_H1l@@@+B_IE1L@@@+N_IU1l@@@+B_Ic1L@@@+N_Iq1l@@@+B_I}1L@@@+N_JI1l@@@+B_JT1L@@@+N_J_1l@@@+B_Ji1L@@@+N_KL1l@@@+B_Kj1L@@@+N_LD1l@@@+B_L[1L@@@+N_Lo1l@@@+B_MB1L@@@+N_MS1l@@@+B_Mb1L@@@+N_Mq1l@@@+B_M~1L@@@+N_NK1l@@@+B_NV1L@@@+N_Nb1l@@@+B_Nl1L@@@+N_Nv1l@@@+B_O@1L@@@+N_OI1l@@@+B_OQ1L@@@+N_OZ1l@@@+B_Oa1L@@@+N_Oi1l@@@+B_Op1L@@@+N_Ow1l@@@+B_O~1L@@@+N_PE1l@@@+B_PT1L@@@+N_Pc1l@@@+B_Pp1L@@@+N_P}1l@@@+B_QI1L@@@+N_QT1l@@@+B_Q^1L@@@+B_Ci1@@ML@@@@@ml@@@+I]Ci1@vBG@lAN@_@x@R@l@D@c`I@^`V@Z``@W`g@U`k@R`n@Q`l@P`h@N`b@M`Z@M`Q@L`G@K@B@J@J@J@S@J@X@I@]@H@_@I@_@H@]@G@Z@H@U@G@N@G@I@F@B@G`E@F`J@F`O@E`R@F`U@F`U@E`U@E`S@E`P@E`M@E`H@E`C@D@A@E@E@D@I@D@K@D@N@E@N@D@O@C+H_Oa1@N@D@L@D@J@D@G@C@D@D@A@C`C@D`D@C`G@D`I@C`J@C`J@C`J@C`I@C`G@C`F@C`D@C`B@C@A@C@B@C@D@C@F@B@F@C@G@C@G@B@F@C@F@B@E@C@C@B@B@C@@@B`A@C`B@B`C@B`D@C`E@B`E@B`D@B`E@C`C@B`C@B`B@B@@@B@@@B@A@B@B@B@B@B@C@B@D@B+H\Qf1@C@B+LOCi1`]BG`iAN`p@x`v@l`w@c`t@^`o@Z`f@W`]@U`R@R`F@Q@E@P@P@N@X@M@_@M@d@L@e@K@e@J@b@J@^@J@W@I@P@H@I@I@@@H`G@G`N@H`T@G`W@G`Y@F`Z@G`X@F`V@F`S@E`M@F`I@F`C@E@C@E@G@E@L@E@N@E@Q@E@R@D@Q@E@P@D@N@D@K@D@H@E@D@D@@@C+IXOa1`C@D`G@D`I@D`K@C`L@D`L@C`L@D`J@C`I@D`F@C`D@C`B@C@B@C@C@C@F@C@F@C@H@C@I@C@H@C@H@C@F@C@E@B@D@C@B@C@@@B`B@C`C@B`D@C`E@B`F@C`F@B`E@C`E@B`D@B`C@C`B@B`A@B@A@B@B@C@B@B@C@B@D@B@D@B@D@B@D@B@C@B@B@B@B@B@A@B+HlQf1@@@B%7B+@J@\6556I 03  09-23-84   22.961  frame no.  08    
   MH9220,M158,DREXLER                                     7C+E`QhA POLAR PLOT WITH GRID+H_Jr1@@`G+H_Jr1B@@@@@`G@@@G7B+JFJb 0.5+J_Jr1B@@@@@`G@@@G+LEJb 1.0+L_Jr1B@@@@@`G@@@G+NEJb 1.5+JJJRADIUS+H_Jr1`G@@+H_Jr1@@B@`G@@@G@@+HMLX 0.5+H_Lr1@@B@`G@@@G@@+HMNX 1.0+H_Nr1@@A`G@@@G@@+HMPX 1.5+GyMp +B_Jr1@@`G+BXJb 1.5+B_Jr1B@@@@@`G@@@G+DFJb 1.0+D_Jr1B@@@@@`G@@@G+FFJb 0.5+F_Jr1B@@@@@`G@@@G+E^JJ +H_Dr1`G@@+HMDk 1.5+H_Dr1@@B@`G@@@G@@+HMFY 1.0+H_Fr1@@B@`G@@@G@@+HMHX 0.5+H_Hr1@@B@`G@@@G@@+GyGq +N^J1a`D+L^KD1B@@H+N\KZ1a`N+L\KU1A@R+NYKt1c|`l+LYKg1A}@Z+NSLO1a|`_+LUKx1A{@c+NLLh1az`g+HkJv1E\A+NCMA1aw`o+LILZ1At@t+MxMZ1as`x+LALj1Aq@|+MkMr1c]b@+KxLy1AlAD+M]NH1ajaG+KnMH1AgAK+MMN^1adaO+HiJz1D\Cn+L|Nr1a_aU+KWMc1A\AY+LiOF1aXa\+KJMp1AVA_+LVOX1becD+J|M{1AOAe+L@Oh1aKag+JnNF1AGAj+KjOw1aDal+HeJ}1BzEA+KSPD1`|ap+JONX1@xAs+J{PP1`tau+IN_1@pAv+JbPZ1aWcp+InNe1@hAz+JIPc1`da{+I]Nj1@_A|+IoPi1`[a}+HaJ~1AAEn+ITPn1`Qa+HzNp1@MA+HzPp1`Ia+HhNq1@DB@+H_Pq1@@c+HVNq1`DB@+HDPp1@Ia+HDNp1`MA+GjPn1@Qa+H]J~1aAEn+GOPi1@[a}+GaNj1`_A|+FuPc1@ca{+GPNe1`hAz+F\PZ1AWcp+FN_1`pAv+FCPP1@tau+FoNX1`xAs+EkPD1@|ap+HYJ}1bzEA+ETOw1ACal+FPNF1aHAj+D}Oh1ALag+FBM{1aOAe+DhOX1BecD+EtMp1aVA_+DTOF1AYa\+EgMc1a\AY+DBNr1A_aU+HUJz1d\Cn+CqN^1AdaO+EPMH1agAK+CaNH1AjaG+EFLy1alAD+CSMr1C]b@+D}Lj1aq@|+CFMZ1As`x+DuLZ1at@t+B{MA1Aw`o+HSJv1e]A+BrLh1Az`g+DiKx1a{@c+BkLO1A|`_+DeKg1a}@Z+BeKt1C|`l+DbKU1a@R+BaKZ1B@`N+D`KD1b@@H+B`J1A`D+HRJr1es@@+B`Jd1A@E+D`J`1b@`I+BaJJ1B@@M+DbJN1a`R+BeIo1C|@m+DeI}1a}`[+BkIU1A|@_+DiIk1a{`c+BrH{1Az@h+HSJm1e]a+B{Hb1Aw@p+DuIJ1at`t+CFHJ1As@x+D}Hz1aq`|+CSGr1C]B@+EFHj1alaD+CaG[1AjAH+EPH[1agaK+CqGE1AdAO+HUJi1d\cn+DBFq1A_AV+EgH@1a\aY+DTF^1AYA\+EtGt1aVa_+DhFL1BeCD+FBGh1aOae+D}E{1ALAh+FPG^1aHaj+ETEl1ACAm+HYJg1bzeB+EkE_1@|Aq+FoGL1`xas+FCES1@tAu+FGE1`paw+F\EI1AWCq+GPF~1`hay+FuEA1@cA{+GaFz1`_a}+GODz1@[A~+H]Je1aAem+GjDv1@QA~+HDFs1`Ma+HDDs1@IB@+HVFr1`Db@+H_Dr1@@D@+HhFr1@Db@+HzDs1`IB@+HzFs1@Ma+ITDv1`QA~+HaJe1AAem+IoDz1`[A~+I]Fz1@_a}+JIEA1`dA{+InF~1@hay+JbEI1aWCq+IGE1@paw+J{ES1`tAu+JOGL1@xas+KSE_1`|Aq+HeJg1BzeB+KjEl1aDAm+JnG^1AGaj+L@E{1aKAh+J|Gh1AOae+LVFL1beCD+KJGt1AVa_+LiF^1aXA\+KWH@1A\aY+L|Fq1a_AV+HiJi1D\cn+MMGE1adAO+KnH[1AgaK+M]G[1ajAH+KxHj1AlaD+MkGr1c]B@+LAHz1Aq`|+MxHJ1as@x+LIIJ1At`t+NCHb1aw@p+HkJm1E\a+NLH{1az@h+LUIk1A{`c+NSIU1a|@_+LYI}1A}`[+NYIo1c|@l+L\JN1A`R+N\JJ1a@M+L^J`1B@`I+N^Jd1a@E+HlJr1Es@@+HlJr1`B@F`E@E`F@B`F`B`E`E`B`F@B`G@E`D@F`B@F@B@E@D@B@G+HJr1`A@F`B@F`C@F`D@E`E@D`F@C`F@A`G@A`F`A`F`C`F`C`D`D`D`F`C`F`A`F@@`G@A`F@C`F@D`E@D`E@F`C@F`B@F`A@G@@@F@B@F@C@E@D@D@D@C@F@B@F@A@G+I_Jr1@@@F`A@G`B@F`B@F`C@F`D@E`D@E`D@E`E@D`E@D`F@C`F@C`F@B`F@A`G@A`F@@`G`A`F`A`F`B`F`C`F`C`E`D`E`D`E`E`D`E`C`E`C`F`B`F`B`F`A`G@@`F@@`G@A`F@B`F@B`G@C`E@C`F@D`E@E`E@E`D@E`D@F`C@F`B@F`B@F`B@G@@@F@@@G@@@F@B+HoIt1@F@B@F@B@F@C@E@D@E@D@D@E@D@E@D@F@C@E@B@G@B@F@A@F@@@G+IJr1@@@F`A@F`A@G`B@F`A@F`C@F`B@F`D@F`C@E`D@E`D@E`D@E`E@D`E@D`E@D`F@C`F@C`F@B`F@B`F@B`F@A`F@A`G@A`F@@`G`A`F`A`F`A`F`B`G`B`E`B`F`C`F`C`E`D`E`D`E`D`D`E`D`E`D`E`D`E`C`F`B`F`C`F`B`F`A`F`A`G`A`F@@`F@@`G@A`F+G@Je1@A`F@A`G@B`F@C`F@B`F@C`E@D`F@D`E@D`E@D`D@E`E@E`D@E`C@F`C@F`C@F`C@F`B@F`B@F`A@F`A@G@@@F@@@G@@@F@A@F@A@F@B@F@B@F@C@F@C@F@C@E@C@E@D@E@E@D@D@D@E@D@E@C@F@D@E@B@F@C@F@A@F@B@G@A@F@A@F@@@G+J_Jr1@@@F`A@G`A@F`A@F`A@G`B@F`B@F`B@F`C@F`C@E`C@F`D@E`D@E`D@E`D@E`D@E`E@D`E@D`E@D`F@D`E@C`F@C`F@C`E@B`G@B`F@B`F@B`F@A`G@A`F@@`F@A`G@@`F`A`G`A`F`A`F`A`F`B`G`B`F`B`E`C`F`B`F`D`E`C`E`D`F`D`D`D`E`D`D`E`E`E+F{LB1`C`E`D`E`D`F`C`F`B`E`C`F`B`F`B`F`B`G`A`F`A`F`A`G@@`F@@`G@@`F@A`F@A`G@A`F@B`F@B`F@B`F@C`F@B`F@C`F@D`E@D`E@C`F@E`D@D`E@E`E@D`D@F`D@E`D@E`C@F`C@F`C@E`C@F`B@G`B@F`B@F`A@F`A@G`A@F@@@G@@@F@@@F@A@G@A@F@A+HzHu1@F@A@F@B@G@B@E@C@F@B@F@C@E@D@F@C@E@D@E@D@E@E@D@D@D@E@E@E@C@E@D@F@C@E@C@F@C@F@B@F@B@F@B@F@A@F@A@G@A@F@A@F@@@G+JJr1@@@F`A@F@@@G`A@F`A@F`B@G`A@F`B@F`B@F`C@F`B@F`C@F`C@E`D@F`C@E`D@E`D@E`D@E`D@E`E@D`D@E`E@D`E@D`E@D`F@C`E@D`F@C`E@C`F@B`F@C`F@B`F@B`F@B`G@A`F@A`F@A`G@A`F@@`F@A`G@@`F`A`G@@`F`A`F`A`F`B`G`A`F`B`F`B`F`B+GbMF1`F`C`E`C`F`C`F`C`E`C`E`D`E`D`E`D`E`D`E`E`D`D`D`E`D`E`D`E`D`F`C`E`C`F`C`E`C`F`B`F`C`F`B`F`A`F`B`F`A`G`A`F`A`F`A`G@@`F@@`F@@`G@A`F@A`G@A`F@A`F@B`F@A`G@B`F@C`F@B`F@C`E@C`F@C`F@C`E@D`E@D`E@D`E@D`E@D`E+FmIA1@E`D@E`D@E`E@E`C@E`D@E`D@F`C@F`C@E`C@F`B@F`B@F`C@F`A@G`B@F`A@F`A@F`A@G`A@F@@@G@@@F@@@F@@@G@A@F@A@F@A@G@B@F@B@F@A@F@C@F@B@F@C@E@C@F@C@E@C@F@D@E@C@E@D@E@E@D@D@E@E@D@D@D@E@D@E@D@E@C@F@D@E@C@F@C@F@B@E+JrIs1@C@F@B@F@B@G@A@F@B@F@A@F@A@G@@@F@A@F@@@G+K_Jr1@@@F`A@G@@@F`A@F`A@G`A@F`A@F`B@F`B@G`B@F`B@F`B@F`C@E`C@F`C@F`C@E`C@F`D@E`D@F`C@E`E@E`D@D`D@E`E@E`D@D`E@D`E@D`E@D`E@D`F@C`E@D`F@C`F@C`E@C`F@B`F@C`F@B`F@B`F@B`G@A`F@B`F@A`F@A`G@A`F@@`G@@`F@A`F`A`G@@+HRMq1`F@@`G`A`F`A`F`A`G`B`F`A`F`B`F`B`F`B`F`C`F`B`F`C`E`C`F`C`E`D`F`C`E`D`E`D`E`D`E`D`D`D`E`E`D`E`E`D`D`E`C`E`D`F`D`E`C`F`C`E`C`F`C`F`C`E`B`F`B`F`B`F`B`G`B`F`A`F`A`F`A`G`A`F@@`F`A`G@@`F@@`G@A`F@@`F@A`G+EaJX1@A`F@A`G@A`F@B`F@B`F@B`F@B`F@B`F@C`F@C`F@C`E@C`F@C`F@D`E@D`E@C`E@D`E@E`E@D`E@E`D@D`E@E`D@E`D@E`D@E`C@F`D@E`C@F`D@E`C@F`B@F`C@F`B@F`C@F`B@F`A@G`B@F`A@F`A@F`A@G`A@F`A@G@@@F@@@F@@@G@@@F@A@G@A@F@A@F@A+IEGv1@F@A@G@B@F@A@F@B@F@C@F@B@F@C@E@B@F@C@F@D@E@C@F@D@E@C@E@D@E@D@E@D@D@E@E@D@D@E@D@E@E@E@C@E@D@E@D@E@C@F@C@F@C@E@C@F@C@F@B@F@B@F@B@F@B@F@B@F@A@G@A@F@A@F@A@G@@@F@A@F@@@G+KJr1@@@F`A@G@@@F`A@F`A@G`A@F`A@F`A@G`B@F`A@F`B@F`B@F`C@F`B@F`C@F`B@F`C@F`C@E`D@F`C@E`D@F`C@E`D@E`D@E`D@E`E@E`D@D`E@E`D@D`E@D`E@E`E@D`E@C`F@D`E@D`E@C`F@C`F@C`E@C`F@C`F@B`F@C`F@B`F@B`F@B`F@B`G@A`F@A`F@A+IDNN1`G@A`F@A`F@A`G@@`F@@`G@A`F`A`F@@`G@@`F`A`G`A`F`A`F`A`G`B`F`A`F`B`F`B`F`B`F`B`F`C`F`C`F`B`E`C`F`C`E`D`F`C`E`D`E`D`E`C`E`D`E`E`E`D`E`D`D`E`E`E`D`E`D`E`D`E`D`E`C`E`D`F`C`E`C`F`C`E`C`F`C`F`B`F`C`F`B`F+EKKz1`B`F`B`F`A`F`B`G`A`F`A`F`A`F`A`G@@`F`A`G@@`F@@`G@@`F@A`F@@`G@A`F@A`F@A`G@A`F@B`F@A`G@B`F@B`F@B`F@C`F@B`F@C`F@C`E@C`F@C`F@C`E@D`E@C`F@D`E@D`E@D`E@D`E@E`E@D`D@E`E@E`D@E`D@E`D@E`D@E`D@E`C@F`D@E`C@F`C+FuGm1@E`C@F`C@F`C@F`B@F`B@F`C@F`B@F`A@G`B@F`A@F`B@F`A@G@@@F`A@G`A@F@@@F@@@G@@@F@@@G@A@F@@@F@A@G@A@F@A@F@A@G@B@F@B@F@A@F@B@F@C@F@B@F@C@F@B@E@C@F@C@F@D@E@C@E@C@F@D@E@D@E@D@E@D@E@D@D@E@E@D@D@E@E@E@D@D@D@F+KPHi1@D@E@C@E@D@E@C@F@D@E@C@F@C@F@B@E@C@F@B@F@C@F@B@F@B@F@A@G@B@F@A@F@A@F@A@G@A@F@A@F@@@G@A@F@@@G+L_Jr1@@@F`A@G@@@F`A@F@@@G`A@F`A@F`A@G`B@F`A@F`B@F`B@F`B@F`B@G`B@F`C@E`B@F`C@F`C@F`C@E`C@F`C@F`D@E`C@E`D@F`D@E`D@E`D@E`D@E`D@D`E@E`D@D`E@E`D@D`E@D`E@D`E@D`F@D`E@D`E@C`F@D`E@C`F@C`E@C`F@C`F@B`F@C`F@B`F@C+IuNc1`F@B`F@B`F@A`F@B`F@A`G@B`F@A`F@A`G@A`F@@`F@A`G@@`F@@`G@A`F`A`F@@`G@@`F`A`G`A`F`A`F`A`F`A`G`A`F`B`F`B`F`A`F`B`F`C`F`B`F`B`F`C`F`C`F`C`E`C`F`C`E`C`F`D`E`C`E`D`E`D`E`D`E`D`E`D`E`D`D`E`E`D`D`E`D`E`E`E+EYMT1`D`E`C`E`D`E`D`E`C`F`D`E`C`F`C`E`C`F`C`F`B`F`C`F`B`E`B`F`B`G`B`F`B`F`B`F`A`F`A`G`A`F`A`F`A`G`A`F@@`F`A`G@@`F@@`F@@`G@A`F@@`G@A`F@A`F@A`G@A`F@A`F@A`G@B`F@B`F@B`F@B`F@B`F@B`F@C`F@B`F@C`F@C`E@C`F@C`E+ECHo1@D`F@C`E@D`F@D`E@C`E@D`E@E`E@D`D@D`E@E`E@D`D@E`E@E`D@E`D@E`D@E`D@E`C@E`D@F`C@E`D@F`C@E`C@F`C@F`C@F`B@F`C@F`B@F`B@F`B@F`B@F`B@F`A@G`B@F`A@F`A@F`A@G`A@F@@@G`A@F@@@F@@@G@@@F@@@G@A@F@@@F@A@G@A@F@A@F@A+IPFw1@G@A@F@A@F@B@F@B@F@B@F@B@F@B@F@C@F@B@F@C@F@C@E@C@F@C@E@C@F@C@E@D@E@C@F@D@E@D@E@D@E@D@D@E@E@D@E@E@D@D@D@E@D@E@E@E@C@E@D@E@D@E@C@E@D@F@C@E@C@F@C@F@C@E@C@F@B@F@C@F@B@F@B@F@B@F@B@F@B@F@A@G@B@F@A@F@A@F+L\JK1@A@G@@@F@A@G@@@F@A@F@@@G+LJr1@@@F`A@G@@@F@@@F`A@G`A@F`A@F`A@G`A@F`A@F`B@G`B@F`A@F`B@F`B@F`B@F`C@F`B@F`C@F`B@F`C@F`C@E`C@F`C@E`D@F`C@E`D@F`D@E`C@E`D@E`D@E`D@E`E@E`D@D`D@E`E@E`E@D`D@D`E@D`E@E`E@D`E@C`F@D`E@D`E@C`F@D`E@C`F@C`E@C+JdNq1`F@C`F@C`F@B`F@C`F@B`F@B`F@C`F@B`F@A`F@B`F@B`G@A`F@A`F@A`G@A`F@A`F@A`G@A`F@@`F@@`G@@`F@@`G@@`F@@`F@@`G`A`F`A`G`A`F`A`F`A`F`A`G`A`F`B`F`B`F`A`F`B`F`C`F`B`F`B`F`C`F`B`F`C`F`C`E`C`F`C`E`C`F`D`E`C`F`D+EyN]1`E`D`E`C`E`D`E`E`E`D`D`D`E`D`E`E`D`E`D`D`E`E`D`E`D`E`D`E`D`E`C`E`D`F`C`E`D`F`C`E`C`F`C`F`C`E`B`F`C`F`B`F`C`F`B`F`B`F`B`F`B`F`A`F`B`G`A`F`A`F`A`G`A`F`A`F`A`G@@`F@@`F`A`G@@`F@@`G@A`F@@`G@@`F@A`F@A`G+DBJK1@A`F@A`F@A`G@A`F@B`F@A`F@B`F@B`G@B`F@B`F@C`F@B`F@C`F@B`E@C`F@C`F@C`E@C`F@D`E@C`F@D`E@C`E@D`F@D`E@D`E@D`E@E`D@D`E@D`E@E`D@E`E@D`D@E`D@E`D@E`D@E`D@F`D@E`C@E`D@F`C@E`D@F`C@E`C@F`C@F`B@F`C@F`B@F`C@F`B+F~Fc1@F`B@F`B@F`B@F`B@F`A@G`B@F`A@F`A@F`A@G`A@F`A@G@@@F`A@F@@@G@@@F@@@G@@@F@@@F@A@G@@@F@A@G@A@F@A@F@A@F@A@G@B@F@A@F@B@F@B@F@B@F@B@F@B@F@C@F@B@F@C@F@B@F@C@E@C@F@C@E@D@F@C@E@D@E@C@F@D@E@D@E@D@E@D@E@D@D@D+KbG^1@E@E@E@D@D@E@D@E@E@D@D@E@D@E@D@E@C@F@D@E@D@E@C@F@D@E@C@F@C@E@C@F@C@F@B@F@C@E@B@F@C@F@B@F@B@F@B@G@A@F@B@F@B@F@A@F@A@G@A@F@A@F@A@G@A@F@@@G@@@F@A@F@@@G+M_Jr1@@@F`A@G@@@F@@@F`A@G`A@F@@@F`A@G`B@F`A@F`A@G`B@F`A@F`B@F`B@F`B@F`B@F`B@F`B@F`C@F`B@F`C@F`C@F`C@E`C@F`C@F`C@E`C@F`D@E`C@E`D@F`D@E`D@E`D@E`D@E`D@E`D@D`D@E`E@E`D@D`E@E`E@D`E@D`D@D`E@D`E@D`F@D`E@D`E@C+KQN{1`E@D`F@C`E@D`F@C`F@C`E@C`F@C`F@B`F@C`E@B`F@C`F@B`F@B`F@B`G@B`F@B`F@B`F@A`F@A`G@B`F@A`F@A`G@A`F@A`F@@`G@A`F@@`F@@`G@@`F@@`G@@`F@@`F@@`G`A`F@@`G`A`F`A`F`A`F`A`G`B`F`A`F`A`F`B`F`B`G`B`F`B`F`B`F`B`F`C+FeOY1`F`B`E`C`F`B`F`C`F`C`E`C`F`C`E`D`F`C`E`D`E`C`E`D`F`D`E`D`E`D`E`D`D`D`E`D`E`E`D`D`E`E`D`E`D`D`D`E`E`E`D`E`C`E`D`E`D`F`C`E`D`E`C`F`C`E`D`F`C`F`B`E`C`F`C`F`B`F`C`F`B`F`B`F`B`F`B`F`B`F`B`F`B`F`A`F`A`G+CfKq1`B`F`A`F`A`G@@`F`A`F`A`G@@`F@@`G`A`F@@`F@@`G@A`F@@`F@@`G@A`F@A`G@@`F@A`F@A`G@B`F@A`F@A`F@B`G@B`F@B`F@B`F@B`F@B`F@B`F@C`F@B`F@C`F@C`E@B`F@C`F@D`E@C`F@C`E@D`F@C`E@D`E@D`E@C`E@D`E@E`E@D`E@D`E@D`E@E`D+D|GQ1@D`E@E`D@E`D@E`E@D`D@E`D@E`D@F`D@E`C@E`D@E`C@F`D@E`C@F`C@E`C@F`C@F`C@F`C@E`C@F`B@F`B@F`C@F`B@F`B@G`B@F`A@F`B@F`B@F`A@G`A@F`A@F`A@G`A@F`A@F`A@G@@@F`A@F@@@G@@@F@@@G@@@F@@@F@A@G@@@F@A@F@A@G@A@F@A@F@A+I[Ex1@G@A@F@A@F@B@F@B@F@A@G@B@F@B@F@B@F@C@F@B@E@B@F@C@F@C@F@C@F@C@E@C@F@C@E@C@F@D@E@C@E@D@E@C@F@D@E@D@E@D@D@D@E@E@E@D@E@D@D@E@E@D@D@E@D@E@D@E@D@E@D@E@D@E@D@E@D@E@C@E@D@F@C@E@C@F@C@E@D@F@B@F@C@E@C@F@B@F+MEHu1@C@F@B@F@B@F@B@F@B@F@B@F@B@F@A@G@B@F@A@F@A@F@B@G@A@F@@@F@A@G@A@F@@@G@@@F@A@F@@@G+MJr1@@@F`A@G@@@F@@@F`A@G@@@F`A@F`A@G`A@F`A@F`A@G`B@F`A@F`B@F`A@G`B@F`B@F`B@F`B@F`B@F`C@F`B@F`C@F`B@F`C@E`C@F`C@F`C@E`C@F`D@E`C@F`C@E`D@F`D@E`C@E`D@E`D@E`D@E`D@E`E@E`D@E`D@D`E@E`D@D`E@E`E@D`E@D`D@D`E@E+K|OD1`E@D`E@C`F@D`E@D`E@C`F@D`E@C`E@D`F@C`F@C`E@C`F@C`F@C`F@B`E@C`F@B`F@C`F@B`F@B`F@B`F@B`G@B`F@B`F@A`F@B`F@A`G@A`F@A`F@A`G@A`F@A`F@A`G@@`F@A`G@@`F@@`F@@`G@@`F@@`G@@`F@@`F`A`G@@`F`A`G`A`F`A`F`A`F`A`G`B+GTPI1`F`A`F`B`F`A`G`B`F`B`F`B`F`B`F`B`F`B`F`C`F`B`E`C`F`C`F`C`F`B`E`D`F`C`E`C`F`C`E`D`F`C`E`D`E`D`E`D`E`C`E`D`E`E`E`D`E`D`D`D`E`E`E`D`D`E`D`E`E`E`D`D`D`E`D`E`D`E`D`F`C`E`D`E`C`E`D`F`C`E`C`F`D`E`C`F`B`F+CeMO1`C`F`C`E`C`F`B`F`B`F`C`F`B`F`B`F`B`F`B`F`A`F`B`G`B`F`A`F`A`F`A`G`A`F`A`F`A`G`A`F`A`G@@`F@@`F`A`G@@`F@@`G@@`F@A`F@@`G@@`F@A`F@A`G@A`F@A`G@A`F@A`F@A`F@A`G@B`F@B`F@A`F@B`F@B`G@B`F@B`F@C`F@B`F@B`E@C`F+C_H`1@C`F@C`F@B`F@D`E@C`F@C`E@C`F@D`E@C`F@D`E@C`E@D`E@D`E@D`E@D`E@D`E@E`E@D`E@E`D@D`E@E`D@D`E@E`D@E`D@E`D@E`D@E`D@E`D@E`D@E`C@F`D@E`C@F`D@E`C@F`C@E`C@F`C@F`C@F`C@E`B@F`C@F`B@F`C@F`B@F`B@F`B@F`B@G`A@F`B+GHE]1@F`B@F`A@G`A@F`A@F`B@G`A@F@@@F`A@G`A@F@@@F`A@G@@@F@@@G@@@F@@@F@@@G@A@F@@@G@A@F@@@F@A@G@A@F@A@F@A@G@A@F@B@F@A@F@B@F@A@G@B@F@B@F@B@F@B@F@C@F@B@F@B@E@C@F@C@F@C@F@B@E@C@F@D@F@C@E@C@E@C@F@D@E@D@E@C@F@D+KrFX1@E@D@E@D@E@D@D@D@E@D@E@E@E@D@D@E@E@D@D@E@D@E@E@D@D@E@D@E@D@E@D@E@C@F@D@E@D@E@C@F@C@E@D@E@C@F@C@F@C@E@C@F@C@F@B@F@C@F@B@E@C@F@B@F@B@F@B@G@B@F@B@F@A@F@B@F@A@F@B@G@A@F@A@F@A@G@A@F@A@F@@@G@A@F@@@G@@@F+M~Je1@A@F@@@G+N_Jr1@@@F`A@G@@@F@@@F`A@G@@@F`A@F`A@G`A@F`A@G`A@F`A@F`A@F`B@G`A@F`B@F`B@F`B@F`B@G`B@F`B@F`B@F`B@F`C@F`B@E`C@F`C@F`C@F`C@E`C@F`C@F`C@E`C@F`D@E`C@F`D@E`C@E`D@E`D@E`D@F`D@E`D@D`D@E`E@E`D@E`D@D`E@E`D@E`E@D+LeOJ1`E@D`D@E`E@D`E@D`E@D`E@D`E@D`F@C`E@D`E@D`F@C`E@D`F@C`E@C`F@C`E@C`F@C`F@C`F@C`E@B`F@C`F@B`F@C`F@B`F@B`F@B`F@B`G@B`F@B`F@A`F@B`F@A`G@B`F@A`F@A`G@A`F@A`F@A`G@@`F@A`F@A`G@@`F@@`G@@`F@@`F@@`G@@`F@@`G@@+HEPq1`F`A`F`A`G@@`F`A`G`A`F`A`F`A`F`A`G`B`F`A`F`B`F`A`G`B`F`B`F`B`F`B`F`B`F`B`F`C`F`B`F`C`F`B`E`C`F`C`F`C`E`C`F`C`F`C`E`C`E`D`F`C`E`D`E`D`F`C`E`D`E`D`E`D`E`D`E`D`D`E`E`D`E`D`D`E`E`E`D`D`E`E`D`E`D`E`D`D+CvNe1`D`E`D`F`D`E`D`E`C`E`D`E`C`F`D`E`C`F`C`E`C`F`C`F`C`E`C`F`C`F`C`F`B`F`C`E`B`F`B`F`B`F`B`G`B`F`B`F`B`F`B`F`A`F`B`G`A`F`A`F`A`F`A`G`A`F`A`G`A`F@@`F`A`G@@`F@@`F`A`G@@`F@@`G@A`F@@`G@@`F@A`F@@`G@A`F@A`F+BcI1@A`G@A`F@A`F@A`G@A`F@B`F@A`F@B`G@B`F@B`F@B`F@B`F@B`F@B`F@B`F@C`F@B`F@C`F@C`F@C`E@C`F@C`F@C`E@C`F@C`E@D`F@C`E@D`E@C`F@D`E@D`E@D`E@D`E@D`E@D`E@D`E@E`D@D`E@E`E@D`D@E`E@E`D@D`D@E`D@E`D@E`D@E`D@E`D@F`D+EAEy1@E`D@E`C@F`D@E`C@E`C@F`D@F`C@E`C@F`C@F`C@F`B@E`C@F`C@F`B@F`B@F`C@F`B@F`B@F`B@F`B@G`A@F`B@F`B@F`A@G`A@F`B@F`A@G`A@F`A@F@@@G`A@F`A@F@@@G`A@F@@@G@@@F@@@F@@@G@@@F@@@G@A@F@@@F@A@G@A@F@@@F@A@G@A@F@A@F@B+IkDz1@G@A@F@A@F@B@F@B@G@A@F@B@F@B@F@B@F@B@F@C@F@B@F@B@F@C@E@C@F@B@F@C@F@C@E@C@F@C@E@D@F@C@E@C@F@D@E@C@E@D@F@D@E@D@E@D@E@D@E@D@E@D@D@D@E@D@E@E@D@D@E@E@D@E@D@D@E@E@D@E@D@E@D@E@D@E@D@E@D@E@C@F@D@E@C@E@D@F+MfGi1@C@E@C@F@C@E@C@F@C@F@C@E@C@F@C@F@B@F@C@F@B@F@B@F@B@F@B@F@B@F@B@F@B@F@B@G@A@F@B@F@A@F@A@G@A@F@A@F@A@G@A@F@A@F@@@G@A@F@@@G@@@F@A@F@@@G+DuJP1@@@J@K@@@@`J`K@@+DzJU1AP`I@p`B+FuJE1@@@J@J@@@@`J`J@@+FzJJ1@b@C@Y@F+GpJN1@@@J@J@@@@`J`J@@+GuJS1@S@I@N@K+HQJb1@@@J@J@@@@`J`J@@+HVJg1@I@K@F@L+H`Jy1@@@J@J@@@@`J`J@@+HeJ~1@B@L`A@K+HaKP1@@@J@J@@@@`J`J@@+HfKU1`D@J`F@I+HVKc1@@@J@K@@@@`J`K@@+H\Kh1`I@G`J@F+HDKp1@@@J@J@@@@`J`J@@+HIKu1`K@C`L@A+GmKt1@@@J@J@@@@`J`J@@+GrKy1`M`A`L`D+GSKo1@@@J@K@@@@`J`K@@+GYKt1`M`F`K`H+F{Ka1@@@J@K@@@@`J`K@@+GAKf1`K`K`I`L+FhKJ1@@@J@J@@@@`J`J@@+FmKO1`H`N`E`O+F[Jm1@@@J@J@@@@`J`J@@+F`Jr1`C`Q`A`Q+FVJK1@@@J@K@@@@`J`K@@+F\JP1@A`R@D`Q+F\Ig1@@@K@J@@@@`K`J@@+FaIm1@G`R@I`Q+FlIE1@@@J@J@@@@`J`J@@+FqIJ1@K`O@N`O+GEHg1@@@J@J@@@@`J`J@@+GJHl1@P`L@R`K+GgHP1@@@J@J@@@@`J`J@@+GlHU1@T`H@T`F+HOHB1@@@J@J@@@@`J`J@@+HTHG1@V`C@V@@+H{G1@@@J@J@@@@`J`J@@+I@HD1@V@C@V@F+IgHH1@@@J@K@@@@`J`K@@+IlHM1@V@I@T@K+JQH\1@@@J@K@@@@`J`K@@+JVHa1@S@O@R@Q+JvH{1@@@K@J@@@@`K`J@@+J{IA1@O@S@L@U+KQId1@@@J@J@@@@`J`J@@+KVIi1@J@W@G@X+KbJS1@@@K@J@@@@`K`J@@+KgJX1@D@Z@A@Z+KgKF1@@@K@J@@@@`K`J@@+KlKL1`C@Z`F@Y+K^Kz1@@@J@J@@@@`J`J@@+KcK1`J@Y`L@X+KHLk1@@@J@J@@@@`J`J@@+KMLp1`P@V`S@T+JeMU1@@@J@J@@@@`J`J@@+JjMZ1`U@R`W@O+IyMv1@@@J@J@@@@`J`J@@+I~M{1`Z@L`[@I+IDNK1@@@J@J@@@@`J`J@@+IINP1`\@E`\@B+HKNR1@@@J@K@@@@`J`K@@+HQNW1`]`B`]`E+GRNJ1@@@K@J@@@@`K`J@@+GWNP1`\`J`[`L+F[Mt1@@@K@J@@@@`K`J@@+F`Mz1`Y`Q`W`S+EkMQ1@@@J@J@@@@`J`J@@+EpMV1`T`V`R`Y+EELb1@@@J@J@@@@`J`J@@+EJLg1`N`[`K`]+DkKj1@@@J@K@@@@`J`K@@+DqKo1`H`^`C`_+DaJm1@@@J@J@@@@`J`J@@+DfJr1@@``@E`_+DfIn1@@@J@J@@@@`J`J@@+DkIs1@H`_@M`]+DzHr1@@@J@K@@@@`J`K@@+E@Hw1@P`\@S`Z+E^G|1@@@J@J@@@@`J`J@@+EcHA1@W`W@Y`T+FNGQ1@@@J@K@@@@`J`K@@+FSGV1@]`Q@^`N+GIFr1@@@K@J@@@@`K`J@@+GNFw1@_`I@a`E+HIFc1@@@K@J@@@@`K`J@@+HNFi1@b`B@a@C+ILFe1@@@J@J@@@@`J`J@@+IQFj1@a@G@`@L+JMFx1@@@J@J@@@@`J`J@@+JRF}1@_@O@\@S+KHGZ1@@@J@J@@@@`J`J@@+KMG_1@Z@W@W@Z+KyHK1@@@J@J@@@@`J`J@@+K~HP1@S@\@P@_+L\IF1@@@K@J@@@@`K`J@@+LaIK1@L@a@H@c+LpJI1@@@K@J@@@@`K`J@@+LuJO1@C@c+LsJm1@@@J@J@@@@`J`J@@%7B+@J@\6556I 03  09-23-84   22.961  frame no.  09    
   MH9220,M158,DREXLER                                     %0707070014230643111006440057030057030000011714540522627504100003200000001672post.src/tests/postdaisy1B
	9

	
	

	

	

	

	

	

	

	

This line is u
_n
_d
_e
_r
_l
_i
_n
_e
_.
_
	

	

This
 li
ne is bb
boo
oll
ldd
d...
	

	

This
 line
 is
 u_uun_nnd_dde_eer_rrl_lli_iin_nne_e
e 
_a_a
an_n
nd_d
d 
_b_b
bo_o
ol_l
ld_d
d._..
	

	

This line is 
S

u

b
Script.
	

	

This line is 
S

u

p

e

r
Script.
	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

B	
	0707070014230643121006440057030057030000011716700522627504100003000000037011post.src/tests/postdmd1 ²²UU²UU²UU²UU²UU²UU²UUUUU;¯»»»UUUU¯UUUU¯ÿÿüUUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUUÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀ UUUUÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ  UUUU@@@@@ UUUU¯UUUU‚?ðÿ€ÿ€?ñÿ€ U
UUUÀÀÌÀàÀÀÿ§U
UUUá ! !à‚€ð€ UUUU€‚‚@§U
UUU ? à? ÿ§U
UUUD @ @ §UUUUˆ@ž@ž@€¦UUUU‚€àxx¡UUUU‚`ü ¦UUUUƒ€ xx¡UUUUƒ€¦UUUU
‚`ýH¦UUUUŽ@ž@`ž@ü$¦UUUU@ @ @ ’¦U
UUU¿@¿@¿@
ð¤UUUU€€à€ÿ¦UUUU„
?ðÿ€ñ€0€¡UUUU¯UUUU‚@‚@‚@‚@‚@ UUUUÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÿÿ  UUUUÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀÿÿÿÿÀ UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUîUU°UU?ÿ€¯UU°UU°UU°UU°UU¯UU¯UUð¯UUè¯UU°UUà¯UUà¯UU°UUà¯UUø¯UU°UU°UU°UU°UU°UU°UU¯UU¯UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU¯UU¯UU°UU°UU°UU°UUÀ¯UU°UUÀ¯UU°UU°UU°UU°UU°UU°UU°UU¯UU¯UU°UU°UU°UU°UUÀ¯UU°UUÀ¯UU°UU°UU°UU°UU°UU°UU°UU¯UU¯UU°UU°UU°UU°UU°UU°UU¯ÿÿüUU°UU‚­UU°UU°UU°UUñøüa€¬UUòõz|R€¬UU€¼­UUôø-¬UUùx€ªUUƒ¬UUýx¼(€ªUUüþ­UUƒP¬UUƒ`¬UU°UU°UU°UU°UU®ÿÿŽîîUU¯UUUU…x„àþ~€€1€„‚€Àççø`‰UUUU„À´ƒ‚Ð0
‚~™€‚P‚€(-@ é‘øP‰UUUU„À8„ 0
‚$ƒ°„@ @‚@8‰UUUU¯UUUU„Àƒ
øü~f€ð0ü÷ø‚|€ÇæaøÀÿ€àŠUUUU„0ƒz½f/@Áè:ƒx‚	z«ÖbôÌ€ ‚€àŠUUUU„0‚ø‚ÀÀƒ÷øx„€Ì„ÿ€€‹UUUUˆø=†÷ø…€Іÿ€ŒUUUU‰x>Žƒà”UUUU†(
‚ø	Åè
÷ø$ƒ €€0P€ Pÿ€@(‰UUUU†À¿/B€ð
‚~™ƒP‚ñRô(@ éP‰UUUU„ÀÀÀ€ƒü0Æþ~`‚1†ðáø0?Ãa€Àçæ`‰UUUU‰zŽ ”UUUUŠü‚ü†€‚À‚`?ÀUUUU¯UUUU¯UUUUƒªUUUU¯UUUUƒ(ªUUUU¯UUUUø(ƒPªUUUUø®UUUUPƒ ªUUUUð®UUUUè ƒ@ªUUUU¯UUUUé@ƒ€ªUUUUð®UUUU€ƒªUUUU¯UUUU¯»»UU°UU‚€À0ð„‚	€Àççø0ƒà‚‚þ~€ŒÿüUU‚@@PÀ‚
€(-@ é‘øƒ‚Ð0
‚~™€UU‚а„@ @‚@‚
„0 ƒ4ŒUU°UU‚ƒ
€ÇæaøÀÿ€à‚
Àøü~f€ð0ü÷øŽUU‚3„«ÖbôÌ€ ‚€à‚ z½f/@Áè:ƒxŽUU‚3ƒ€Ì„ÿ€€„ø‚ÀÀƒ÷øxUU†€Іÿ€…ø=…÷øUU‡ƒàŽx>—UUƒ€ €€0P€ Pÿ€@‚
øøÅè
÷ø$€ŒUUƒ@PÌ‚
ñRô(@ é‚ƒ¿/B€ð
‚~™UU‚À0üðáø0?Ãa€Àçæ‚
`€ƒü0Æ‚þ~`UU‡ Žz˜UU‡À‚`?À†0ƒü‚ü”UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU‡¨UU°UUŠ(¥UU†™Œgóð¦UU†/Y€ðè8¥UU†§UU‡@‚8¥UU‡€¨UUˆÀ¥UU‡/ÅK€P¥UU†`Çæ`¥UU°UU°UU°UU°UU‚`¬UU°UU‚ ¬UU°UUø(‚@¬UUø¯UUP‚€¬UUð¯UUè ‚¬UU°UUé@‚
¬UUð¯UU€‚¬UU°UU°UU°UU°UU…`ªUU°UU‡§UU„ñù˜Æ?¨UU„òõ˜ƒ€§UU„©UU…ô€§UU…øªUU…‚€§UU„üT¸¨UU„ü8~`1†¨UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU„ð‚ÀÀðƒ
±À~aœæØ<€™UU„h¡Ah ™Rª	•(0@™UU„r€„ôÀ@„ ™UU¤-;@RÀ„`˜UU„ùü~3ø|c3±è
€ Ø‚à™UU„`ô<3€`ôº3‚PA ‚Ðp˜UU„`@€`„ (
 UUŒ	€xP€8‚p˜UUÔp --G
ÐUU…	ô€€ô€€‚0‚ ˜UU…ø
€@øº\
…Tp?R…Gõ(P3
@ ˜UU„‚€cÁ€þ|?8ÿaƒ€ö`?1€À˜UU°UU„„þ¥UU°UU°UUƒ«UU°UUƒ(«UU°UUø(ƒP«UUø¯UUPƒ «UUð¯UUè ƒ@«UU°UUé@ƒ€«UUð¯UU€ƒ«UU°UU°UU°UU‚‚<„
æÀ~a€ÀÀ›UU‚€€ÀZ€À*	•* ™R€‚›UU‚€8„ÐPô„›UU‹+PBÒ¤-„›UU‚?ŸÁ‡ã0?€Æ30€ è

€‚>œUU‚fCÀÓ1˜f@ 0A Pƒ=›UU‚f˜f„
  ( UUŠ8€xP€p›UU‹-G
ÒÔp - UU‚@(@0ƒ€
›UU‚€¨€¥À¨PGõ(Tp?R€0 
›UU‚†0p`çÃðp`€ö8ÿa€ðÀÃ›UU°UU‚0„0à§UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU€€ð†0¢UU@‚	ð€€¤UU‚¦P‚„ @¢UU‚0Ј`£UU €à|ÌfcøüfÀ ¢UU˜0ÀÁÑðºf `yz¿f`£UU˜
0ÀÀðf‚€a@¢UU €†ø¾À£UU‚0À…x}b€¢UU‚&@ƒ 0 £UU@(ððºËPxý£UU€‚	ö1ü|àãþþ¤UU‚0‰£UU‡¨UU°UU°UUø¯UUd¯UUœ¯UU°UU°UUøø¯UUä¯UUø¯UU°UU¯UUd¯UUø¯UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU‚‚<„`°„à<?ßãšUU‚
€€ÀZ€À*…PZ?‚€™UU‚€8„Ð…€¥0P™UU‹+P† à™UU‚?ŸÁ‡ã0?€Æ30€°~>1ŸŒÀP@ šUU‚fCÀÓ1˜f@ 0€‚½]LÀ @à™UU‚f˜f„
€‚ƒ(€šUUŠ8€pƒ 
à™UU‹-@…\ œUU‚
@(@0‚	`$¥@ ™UU‚€¨€¥À¨PW€ ½]. äZ3@™UU‚†0p`çÃðp`àÀ~>˜ÁÀü<?€™UU°UU‚0„0à§UU°UU°UU°UU°UU°UU°UUð¯UUè¯UU°UUà¯UUà¯UU°UUà¯UUø¯UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UUÀ¯UU°UUÀ¯UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UUÀ¯UU°UUÀ¯UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU‚€À0ð„‚	€Àççø0ƒà‚‚þ~€UU‚@@PÀ‚
€(-@ é‘øƒ‚Ð0
‚~™€UU‚а„@ @‚@‚
„0 ƒ4ŒUU°UU‚ƒ
€ÇæaøÀÿ€à‚
Àøü~f€ð0ü÷øŽUU‚3„«ÖbôÌ€ ‚€à‚ z½f/@Áè:ƒxŽUU‚3ƒ€Ì„ÿ€€„ø‚ÀÀƒ÷øxUU†€Іÿ€…ø=…÷øUU‡ƒàŽx>—UUƒ€ €€0P€ Pÿ€@‚
øøÅè
÷ø$€ŒUUƒ@PÌ‚
ñRô(@ é‚ƒ¿/B€ð
‚~™UU‚À0üðáø0?Ãa€Àçæ‚
`€ƒü0Æ‚þ~`UU‡ Žz˜UU‡À‚`?À†0ƒü‚ü”UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU…`ªUU°UU‡§UU„ñù˜Æ?¨UU„òõ˜ƒ€§UU„©UU…ô€§UU…øªUU…‚€§UU„üT¸¨UU„ü8~`1†¨UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU‚‚<„
æÀ~a€ÀÀ›UU‚€€ÀZ€À*	•* ™R€‚›UU‚€8„ÐPô„›UU‹+PBÒ¤-„›UU‚?ŸÁ‡ã0?€Æ30€ è

€‚>œUU‚fCÀÓ1˜f@ 0A Pƒ=›UU‚f˜f„
  ( UUŠ8€xP€p›UU‹-G
ÒÔp - UU‚@(@0ƒ€
›UU‚€¨€¥À¨PGõ(Tp?R€0 
›UU‚†0p`çÃðp`€ö8ÿa€ðÀÃ›UU°UU‚0„0à§UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU€€ð†0¢UU@‚	ð€€¤UU‚¦P‚„ @¢UU‚0Ј`£UU €à|ÌfcøüfÀ ¢UU˜0ÀÁÑðºf `yz¿f`£UU˜
0ÀÀðf‚€a@¢UU €†ø¾À£UU‚0À…x}b€¢UU‚&@ƒ 0 £UU@(ððºËPxý£UU€‚	ö1ü|àãþþ¤UU‚0‰£UU‡¨UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UUð¯UUh¯UU¯UU°UU°UU`¯UU`¯UU°UU°UU°UU°UU€¯UU°UU°UU°UU°UU‚€`¬UU0®UU°UU°UUñðþÌ?€ð«UUêé~Ì>	O€è«UU‚^€«UU|®UUú€«UUè‚«UUòéú*^ƒ…è«UUñü?¶Ïàð«UU°UU°UU°UU°UU°UU°UU°UU°UU¯UU°UU°UUÀ¯UU ¯UUÀ¯UU ¯UU¯UU°UU°UU°UU°UUÀ`ü<?­UU2ZL€­UUX¥b­UU€®UUH­UU0<€­UUø(<€­UU­UU ®UUÈ¥r­UU1™2ZL€­UUñøü<?­UU°UU°UU°UU°UU°UU°UU°UU°UUø¯UUà¯UU°UU°UU°UUà¯UUà¯UU°UU°UU¯UU°UU°UU‚€À‚€`¢UUƒÀƒ 0¥UUƒ „p§UUƒà¬UUðùŒÃñø~ñðþÌ?€ð¡UU(ô¥À*ô½?Ù€êé~Ì>	O€((¡U
UZ (€‚^€P¡UU$€ðP=?À|ƒ ¡UU$€ð>ƒú€ ¡UUZ h‚èƒСUUp¥Àð¿òéú*^ƒ€(¡UUÛüÃ`ÙýŒñü?¶ÏàÛ¡UU°UUˆ§UU°UU°UU†?…À0¢UU†L€ƒ¤UU†©UU°UU„ñø‚àøøfÀø¡UU„êôÿëÐõt¿f§Àô¡UU„‚0‚/À¡UU†ÿྥUUŠ}‚À¢UU„0ô‚¡UU„êôL€Ðùtý/ÁÂô¡UU„ñø?àøþÛgðø¡UU°UU‰¦UU°UU°UUü¯UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UUü¯UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU°UU?¯ÿÿUU¯UUîÿÿàUUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯UUUU¯ÿÿüUUUU¯UUUUn¯îîîU²UU²UU²UU²UU²UU²UU²UU0707070014230643131006440057030057030000011714550522627504100002600000000643post.src/tests/troff1.EQ
delim $$
.EN
.TS
doublebox;
c c
l l.
Name	Definition
.sp
.vs +2p
Gamma	$GAMMA (z) = int sub 0 sup inf t sup {z-1} e sup -t dt$
Sine	$sin (x) = 1 over 2i ( e sup ix - e sup -ix )$
Error	$ roman erf (z) = 2 over sqrt pi int sub 0 sup z e sup {-t sup 2} dt$
Bessel	$ J sub 0 (z) = 1 over pi int sub 0 sup pi cos ( z sin theta ) d theta $
Zeta	$ zeta (s) = sum from k=1 to inf k sup -s ~~( Re~s > 1)$
.vs -2p
.sp 2
.TE
0707070014230643141006440057030057030000011714560522627504100003200000000204post.src/tests/postprint1
An Ascii test		file for
	       postprint. Probably




should have more than one line, and
a few blank ones too.

			

That's it.
0707070014230643151007550057030057030000011717300522627504100003000000003150post.src/tests/runtests#
# Runs the test files that you'll find in this directory. You may want to change
# the definitions of PRINT and BINDIR. The default definition of BINDIR assumes
# the translators are installed in /usr/lbin/postscript, while PRINT just writes
# everything to stdout. Unrecognized options (ie. options other than -P and -B)
# are passed along to the translator.
#
# For example, if postio is installed in /usr/lbin/postscript, the following runs
# the dmd bitmap translator on the test file ./postdmd1 and sends the output to
# the printer attached to /dev/tty01.
#
#	runtests -P'/usr/lbin/postscript/postio -l /dev/tty01' -pland postdmd
#

OPTIONS=
PRINT=cat
BINDIR=/usr/lbin/postscript

for i do
    case $i in
	-P*) PRINT=`echo $i | sed s/-P//`;;

	-B*) BINDIR=`echo $i | sed s/-B//`;;

	-*)  OPTIONS="$OPTIONS $i";;

	*)   break;;
    esac
    shift
done

for i do
    for j in ${i}*; do
	if [ ! -r "$j" ]; then
	    break
	fi
	case $j in
	    dpost*)
		$BINDIR/dpost $OPTIONS $j | $PRINT;;

	    postbgi*)
		$BINDIR/postbgi $OPTIONS $j | $PRINT;;

	    posttek*)
		$BINDIR/posttek $OPTIONS $j | $PRINT;;

	    postdmd*)
		$BINDIR/postdmd $OPTIONS $j | $PRINT;;

	    postmd*)
		$BINDIR/postmd $OPTIONS $j | $PRINT;;

	    postdaisy*)
		$BINDIR/postdaisy $OPTIONS $j | $PRINT;;

	    postprint*)
		$BINDIR/postprint $OPTIONS $j | $PRINT;;

	    postplot*)
		$BINDIR/postplot $OPTIONS $j | $PRINT;;

	    postgif*)
		$BINDIR/postgif $OPTIONS $j | $PRINT;;

	    troff*)
		pic $j | tbl | eqn | troff -mm -Tpost | $BINDIR/dpost $OPTIONS | $PRINT;;

	    man*)
		troff -man -Tpost $j | $BINDIR/dpost $OPTIONS | $PRINT;;
	esac
    done
done
0707070014230643161006440057030057030000011717500522627504100003000000256752post.src/tests/posttek1`%cq+VbqXlrZhtZfvXgvVhtUlrUcqV,nj$[lj]gl^cn^lo]no[cnYglYnj[&ba#Afc"_ba#A%b"_3jjQckPomPfnQkjRjjTkjSgnSkmRjjUfnUenWomWckWijWjjUomXfnYfnZlm[dm[jlZ`l[`k[jjZjjYckXjlYjlZkj\ak]mm]gn\#jcQcdPofPfgQkcRjcTkcSggSkfRgfWofWegWdgVnfUbdUhcVicWcdWceWaeWgfXofXfgYfgZlf[df[cdXkcXhc[kc\ad]mf]gg\bxNhxNd{Nn{No{Qn{OfzOezQkyQkxQaxQaxPjxObyOhxUbxTbxShxSd{Sn{Sn{Td{UbxVaxXaxWm{Wb{V`xZayYmzYl{Zn{Znz[by[bxZ`xZ`x]kx]g{]l{](onMeoMarMkrMhrQkrNcqNbqPdpQdoQnnPnnOgoNooNmnTmnRirRirTaqRcqSonUnnWnnVjrVoqUmnYnoXjqXirYhrZkqZooZlnZmnYmn\do]`r]ir\$koMapMmrMgsMdsQgsNoqNnqPdqQ`pQjoPjoOcpNkpNioTioResResTmqRoqSkoUjoWjoVfsVkrUioYjpXfrXesYdsZgrZkpZhoZioYio\`p]lr]es\kiMejMamMkmMhmQkmNokNnkPdkQdjQjiPjiOgjNojNelTamTkmSkmRamRejRkiRkiSejTekTgkSkiUjiWjiVjmVolUiiYnjXflXimYhmZglZojZhiZiiYii\dj]`m]im\'ojMekManMknMhnQknNolNnlPdlQdkQnjPnjOgkNokNmjRinRinTmlRolSojUnjWnjVjnVomUmjYnkXjmXinYhnZkmZokZljZmjYmj\dk]`n]in\#njNdkN`nNjnNknQjnObmOamQklQgkQmjQmjPfkOnkOljSlmSknSinTlmUljUhlShlUnjVmjXmjWinWnmVljZmkYimYhnZjnZjm[nk[njZljZlj]gk]cn]hn](k}Ma~M)m`MgaMdaQgaN(kNjP`Q`~Qj}Pj}Oc~Nk~Ni}R)eaReaT(iRkSk}Uj}Wj}V)faVk`U(i}Yj~X)f`XeaYdaZg`Z(k~Zh}Zi}Yi}\`~])l`]ea\#brNlrNhuNbvNcvQbvOftOetQosQorQarQarPnrOfsOlrUbrTbrSlrShuSbvSbvThuUbrVarXarWavWbuV`rZesYmtY`vZbvZnt[fs[brZ`rZ`r]or]ku]`v]4`{Pj{Of~Ol~Pa{Q`{Sa{Rm~Ra~Q`{Tl~To~Ue~Vi{Vc{U`{Tc{Wa{Yb{Xn~Xc~W`{[j{[f~[l~[,bkNhkNdnNnnNonQnnOfmOemQklQkkQakQakPjkOblO`kS`nSonSmnT`nU`kUhlShlUbkVakXakWmnWbnV`kZalYmmYlnZnnZnm[bl[bkZ`kZ`k]kk]gn]ln]#n}Nh~N$daNnaNoaQnaOb`Oa`Q#kQk~Qm}Qm}Pj~ObO$h`UdaUnaTnaSdaS#h~Sn}Sn}Th~UhUjTn}Vm}Xm}W$maWbaV#l}ZaY$i`YlaZnaZj`[#b[n}Zl}Zl}]k~]$ga]la]4`uPjuOfxO`yP`yQaySexS`uQnwVfxV`yV`yUexTiuT`uU`uVjuVnvVlvVgxWayXayYdxZlwZewYlvZhuZauYauXkuWovWewXowWgxWewXewYbu[hu\dx\by[2csPisPevPovPdvTnvSmvRgvQksQasRbsShsThtTbuSauRktQ`sU`vUlvVnvVavWasWhtUitWjsX`sY`sZjsZfvZlvZlvYfvXbuXhtYhtZbuZas\ks\gv\mv\5l`PfaOfdOldPm`Ql`Sm`RmdRmcQicVedVodUodTddTdaTo`To`UeaVibVkbUjcWfdWldXldYfdYjcYfaWn`Wn`Ym`[ga[gd[md[3o`PiaPedPodPddTndSmdRgdQkaQm`Rn`ShaThbTbcSacRkbQl`U`dUldVndVadWm`WhbUibWjaXl`Yl`ZjaZfdZldZldYfdXbcXhbYhbZbcZm`\ka\gd\md\*jzQc{Po}Pf~QkzRjzTkzSg~Sk}RjzUf~Ue~Wo}Wc{WizWjzUo}Xf~Yf~Zl}[d}[j|Z`|[`{[jzZjzYc{Xj|Yj|Zkz\a{]m}]g~\&jwQcxPozPj{QkwRjwTkwSk{SkzRjwUj{Uk{WnyUmyWozXj{Yj{Zlz[dz[nyZdy[`x[jwZjwYcxXnyYnyZkw\ax]mz]k{\%n~QgP&cbPjbQ%o~Rn~To~S&kbSoaR%n~U&jbUibWcbWkaWaaWk`W%gWm~Wn~U&baUaaWcbXjbYjbZ`b[ha[baZh`[%d[n~Zn~YgX&baYbaZ%o~\e]&ab]kb\$ncQgdPcgPjgQocRncTocSkgSofRncUjgUigWcgWkfWafWkeWgdWmcWncUbfUafWkfXcgXjgYjgZ`g[hf[gdXocXlc[oc\ed]ag]kg\&fpQcqPosPftQgpRfpTgpSgtSksRfpUftUetWosWcqWepWfpUepYgpZdpZdtZisYfp\`q]ls]ft\)ngQghPckPjkQogRngTogSkkSojRogWngUjkUkkWbjUajW`i[ciXgkYgkYjkZngZog\eh]ak]kk\'f`QcaPocPfdQg`Rf`Tg`SgdSkcRf`UfdUedWocWccWibWcbWcaWe`Wf`UjbUibWccXocXfdYfdZlc[`c[caXg`Xd`[g`\aa]mc]gd\)boQkoPgrPbsQcoRboTcoScsScrRboUbsUasWgrWoqWeqWopWkoWaoWboUfqUeqWgrXbsYbsZdr[lq[fqZlp[ho[boZboYkoXfqYfqZco\io]er]cs\-niQgjPcmPnmQnmRomTcmTniRhlX`mXnmWnmVcmUgjUniVniWdjXhkXjkWamYomYomZam[il[clZik[ej[oiZoiYejYikYclYilYamYclYclZli]fj]bm]lm]+nrQgsPcvPjvQorRnrTorSkvSouRgsWmrWlrVfsUbvUhvVivWcvWcvXjvYjvZ`v[hu[ntZdt[ds[nrZnrYgsXntYntZor\es]av]kv\biQoiPklPbmQciRbiTciScmSglRbiUbmUcmWfkUekWokXklXbmYbmZhl[lk[oiXciX`i[ci\mi]il]cm\j{Qc|Po~PfQk{Rj{Tk{SgSk~Rj{UfUeWo~Wc|Wi{Wj{Ug~Xo~XfYfZl~[d~[c|Xk{Xh{[k{\a|]m~]g\.jnQcoPoqPjrQknRjnTknSkrSkqRjnUjrUkrWnpUmpWinYknZhnZhrZiqYjn\`o]lq]jr\fgQogPkjPbkQggRfgTggSckSgjRfgUbkUakWkjWogWegWfgU`k[ckXkiXjiZlh[lg[fgZfgYogXghXgg\mg]ij]ck\fzQozPo}Pf~QgzRfzTgzSg~Sg}RfzUf~Ug~Wj|Ui|WezYgzZdzZd~Ze}Yfz\lz]l}]f~\0jqQcrPotPfuQkqRjqTkqSguSktRcrWiqWhqVbrUntUduVeuWotWotXfuYfuZlt[dt[nsZ`s[`r[jqZjqYcrXnsYnsZkq\ar]mt]gu\'bc#Aee"_bc#Am`"_#ft#Aiv"_ft#Aar"_-al#Adn"_al#Ali"_4d}#@g"]d}#@c{"]dw#@ky"]dw#@cu"]5`c#@ge"]`c#@o`"]#je#Amg"_je#Aic"_.ip#Alr"_ip#Ahn"_#bm#Aeo"_bm#Amj"_$nk#Aan"_nk#Aii"_b`#Aeb"_b`#A#m}"_fz#Ai|"_fz#Aax"_$bf#Aeh"_bf#Amc"_&nr#Aau"_nr#Aip"_$nq#Aat"_nq#Aio"_&ny#Aa|"_ny#Aiw"_+nt#Aaw"_nt#Air"_)fi#Aek"_fi#Aag"_(fq#Ais"_fq#Aao"_'nl#Aao"_nl#Amj"_(f#A)ia"_(f#Aa}"_*b}#Ae"_b}#Amz"_)jq#Ams"_jq#Aio"_+fk#Aim"_fk#Aai"_.j|#Am~"_j|#Aez"_,fm#Aeo"_fm#Aak"_+n}#A,a`"_+n}#Ai{"_.ji#Aik"_ji#Aeg"_2bu#Aew"_bu#Aas"_0ns#Amu"_ns#Aiq"_3bc#Aee"_bc#Am`"_jl#Amn"_jl#Aij"_&ba#AbaAba&T%b"B&bcB%cD&ccD%cE&ccEbcGhbHlaHfaGl`H%lHbGcE&gaEfaGacI`cK%aI`KaJ&acJ`cL%`LaN'bc#Acc&Pg`"DkcDfdEddFhcGd`GcbD`bGedHddJe`Hd`Je`IedIddKd`Ke`M#ft#Agt%MgzMgz._*oe_ne/K#br!_bv_cr"AcvAdsClrCbrCbrDlrElsEftDftCltChuCbvCbvDhuEbvFavHbrFarHarGavGbrIarKarJavJbuI-`l&Wal#Ami![mm[ni]nm]nm^om"@nm!_ni_oi"AomAnmC`mDhlDblChkDdjDniCoiAclAblCdjEoiEoiFejGamGomFomE`mEdjEnmHfjHliIliJfjJnmJomKlmNomLoiL4dw#@dw2H/laHoa3L4by!]by_by^bu^cu"@cy@ayBdxClwCewBlvChuCauBcu@gw@ewBhuDbuDcuEiuFexFcyEbyDdxDhuDayGiuGcuG`uIjuIbyIbyJcyLcyKcuK5`c#@bc2D,nyDny3M5m`"@md@n`BndBo`CodCccDodEo`EldGmdIldHl`HmdJm`Jn`L4d}#@f}/K3feK4a{"@m~@b{Bn~Bo~Co~Eo~Dc{D`|Gh{Gb{Gb{Hi{Ii|If}Hf}Gl}Gd~Gn~Gn~He~Im~Ja{Jb{L#je#Aie7N&m`No`9])ol]ml:L#hc"DdgDheEegFicFegGfgIfgHjcHfgJjcJkcL.ip#AmpAmp&Qjn!]jr]jn_jr_kr"@knAhrC`oDjnDknEaoFmqFkrEjrDlqD`oDjrGirIjnGinIjnHjrHirJinJjnL#bm#Abm%CjhCih7K&eeKge9Z,c{Zb{:F#lj!^hn^mj"@in@nkAfkAljBljCgkCklC`mC`mBjmAbnAhnBhnCcnChnEknFljEojFojEknEnjHokGkmGjnHinIhmJlkJmjInjH$nk#AnkTbfTcf+E.csEcs[$nj"BfjBhiCiiDgjDgkDmkDlkCflBbmBhmCimDcmDhmFkmGhiFkiGhiGhmG`kKckHgmIgmIjmJjiJb`#Ab`+N)n}No}[#o}!^$oa^#l}"A$laA#aBi~Bo}Bo}Ci~DiD$c`Cc`Bi`BeaBoaBoaCeaDoaEnaG#o}En}Gn}F$naF#gJfH$iaIiaImaJ#m}Jfz#Afz%Cb}Cb}7B&bnBcn9T,kwTjw:F#by"BjxB`xCaxDkxDkyDezDdzCnzBf{Bl{Cm{Dg{Dl{Fo{G`xFcxG`xGl{GaxIcxJ`xJl{Ja{I$bf#AcfHccH`c+J+`rJcr[$oc"AkgAlcDhgDlcElfEhgFjgFmfGmcGheEieGkgHigJocHmcJncIjgIjgKncKocM&nr#Anr&Taq"@gp!_gp^`q^ls^gt^gt_ms"@cqCdpCdpBbqAnsAdtBdtCosCdtEgtFdpEgpFgpEgtEkqGcqGepHfpI`qJ`rJjrIirHgsGosGetHftIlsJdtKdpKepM$nq#Amq$CaiCai+A.mxAox[$ko!^gs^ho"AdsAipBapBkoBkoCapDeqDoqCoqBerBmrBgsBgsCmrDgsEfsGkoEjoGjoFfsFfrHnrHdsIesJorJgrJbpHjoHkoJ&ny#Aoy%PgPg&Pjw!]j{]jw_j{_k{"@kw@hwCaxFkwEjwD`xDlzDj{Dk{EmzFaxGkwGhwIbxInzIh{Ik{GmzGaxGj{JjwJkwL+my&Qny$SntSnt#Alr"AhvAmrCivCmrDivDhvFbvFjuFltFmtDntEnrForGouGjvHhvIluJlrJgtGdtJhvKlrKmrM)an&Qbn$JfiJfi#Alg"AhkAmgCikCmgDikDhkFbkFfhFlgFmgDohGghGmgHmgIdhJdiJajIajHkjGckGikHikI`kJhkKlgKmgM(eq&Sfq#Aoo"AgoAmnBnnCdoDdpDbqCaqBkqAcrAirBjrC`rDjrEhrGnnElnGmnFirFiqHarHkrHkrIarJiqJeoHmnHmnJ'nl#Anl%CjfCkf&Plk"AdkAnjAojBekCelColBnlAhmA`nAjnAknBanCknDinFojDmjFnjEjnEbnGhnHhnIbnIjmIllIflIfkIljIljHfkGllHllI(e&Qf#Ah}!^)da^(i}"@)ea@(j~Ab~Ah}Bh}Cc~CcChChB)f`An`AdaBdaCo`CdaEgaF(h}Ek}Fk}E)gaEo`GeaHfaIl`Jd`J(jI`J`~Jj}Ii}Hc~GiHjI*e}&Sf}#Ab}Ahz"Dd~Dg~Em}Fe}Fk|Eh|Dh|EizFizGe~Gd~In}If}Ih|Ib|Ib{IhzIizGi|Gh|If~JjzJkzL)iq&Qjq#A`o"D`sDcsEerFmqFgqEmpFioFcoE`oDdqDgqEbsGasIboGaoIboHbsHasJaoJboL+ek&Qfk#AfkA`m"A`iAaiCniF`iF`iEmiDilD`mE`mFjlFoiGaiHaiIliJhlJamIamHklGoiG`mK`iKaiM.j|#Ai|$CitCit&Qdz"Dd~Dh|Ee~FezFezGe~Gd~In}Ib}Ih|Ii|Gj|HfzIf~JfzJgzL,fm#Aem$\bl"BjkB`kCakDkkDklDemDdmCnmBfnBlnCmnDgnDlnFonG`kFckG`kGlnGckIclHomHonImnJlmK`lKakJckI+i}&Qj}#An}Ah{"AdAi{CeCi{DeDdFn~Ff~Fl}Fm}Dn}Ej{Fk{GgGeIl~Jd~Jm}Id}J`|Ji{Ik{Go}Gm}IdKh{Ki{M.ji#Aii&BamBamQdg"D`kDckEijFmgFggEdgDehGmgGggGdgIngInhIhiIkiGajGijGckG`kIjjIbkJfgJggL2cu&Tbu#Abs!ZnvZcs\ov\ov]lv"@ov!^cs^`s"A`vAlvBnvBavCasChtAitCisD`sE`sFjsFfvFlvFlvEevDisDovGksGasHasIhsJlvJlvKmvMlvL`sL0ms&Qns#Ahq"DduDguEmtFetFosElsDlsEiqFiqGitGeuHguHjtIjqIasGbsIfuJjqJkqL3ai&Qai#VacVbcAod!\od^od]o`]l`"@`d@od@mdAadBm`Bhb@ibBiaCo`Cl`EjaEfdEldEodCedCiaCndFjaFm`Gm`HkaHodHldJldLldKl`Kil&Qjl#Ajj!ZfnZkj\gn\`k"@jj!_ij^ck]om]en^fn_lm"@akCkjBjjA`kAlmAfnAgnBmmCgnDenFkjDijFjjEfnEjkGbkGhjHhjIbkIblIhlIhlHfmGnmGdnHdnInmIgnJkjJhjMee&Qfe$J-fz#Yez[`|]l}]e[fYl}X`|XfzY3jfUhfWchXoiXhkWjkUoiSchSjfU2irQhrSgtTcvThwSiwQcvOgtOirQ0fd:Fed9\5a`\a`#R2auR3aiV`iV4dzVgz/B,gjBfjK-c}&Tb}#Zn|Z0o{3Ln{E4ftEft#Z/f~Zf~Z+fkZnhYmh[dj]`l]mm[nmY`lXdjXnhY.bz$BazDo{Eg}EaDbBg}@o{@bzBgn#]fn_ap$AiqAfs#_gs]iq\ap\gn]op^4kq^iq2X.a~Xc~3Li|$Ci|C4inCkn2\,g}\f}3M0dq$FgqGmrIitIgvGdvFitDmrDdqFosF4kkFhk3J0ddJgdL)cn$JbnJ4jhJhh.N%hsNjs/K0bd$N`dPkeQggQ`iPbiNggLkeLbdN+mhNohOfjQblQomOmmNblLfjLmhN)kkIjkKamMmnMjpKkpImnHamHkkI3obInbKhdM`fMngKogI`fHhdHobI%j}&Th}$O+dkO0if&Qif$O+i}O4ieOje5V3feVee\+b{$N`{Po|Qg~Q,``Pb`N+g~Lo|Lb{N3ia0BkaNoyNoy$W&kvWkv&T3`c0ClbCebCdbDnbDjcDlcDmcCddChdCaeC`eDjdDebEaeEaeFkdFgdFmcFkcFobFebFebEmcEmcFkdHbeHceGjdGnbGgbGfbHobHkcHncHocGjcGjdI`eJceJhdKddKocJhcKlbKgbJdbJnbIjcIlcJfdIjdIlcJocJ+ny$S4nbSlb2Q,``Qc`3L1jm-G0nbGob*C*ceCbe$S%jrSkr&V+gw$RfwT`yVlzVf|Tg|RlzQ`yQgwR2ox&Tmx$\)ac\ac&Qac$\$mk\nk5J*n~Jo~6@.k`&Ti`$\)j`[h`]cb^oc^he]je[ocYcbYj`[+hg(_igNoiTkiTaiU`iViiVejVhjVijUckTgkTmkUlkVekV`iWlkWlkXfkXbkXhjXfjXjiX`iX`iWhjWhjXbiYbiZ`iZlkZfkYak[ek[nk[mk\gk\ck\ii[ai[ci\`j_bj]hk^hk^nk^bi^&l|%Po|Qi~S'a`SoaQlaPa`N&i~Nl|P+ir&Qjr%I2j|Ik|&T+mnQon%C(gqC+ac&Scc%@3o@n4D2beD*g{6@d{5O$lnOon$_'cc_-b~[`~]o^.ka^`c]bc[kaY-oYb~['h`_k`%@abBmcBke@he$_mc]ab]h`_-ko_jo%AaqCmrCjtAkt$_mr^aq^ko_`r&Wcr%@+c}+[`}*Q$lqQnq%C'jfC+ju+\ju*U$ntUlt%H)hqH(onBnnDipFarFnsDosBarAipAonB'cdBbdDleFhgFbiDciBhgAleAcdB.gd&Tdd%E/`dEbd-D(jfD&ml%GolHfnJbpJoqHmqGbpEfnEmlGbo&T`o%HdoH)aoGcoHnpJjrJctHatGjrEnpEaoG0jn/Kin.E$iwEkw%P&caP(o|Km|Mh~O)``OmaMoaK``J(h~Jo|K,njHmjJhlLdnLmoJnoHdnGhlGnjHfmIfm.R'jb3K$jzKjz%L(fL*mzLlzNg|Oc~OlNmLc~Jg|JmzLe}M3m|Mn|2T'j{Ti{5\(ep\jd+\idW'azWcz%P(gqP2`j&Wcj%PgjP)if&Qkf%P*gbPeb*HmvHmv0J+ecJecBieBaeBndBmdCceCoeCefCffBifBagBfgBegCcgCndDfgDfgE`gFhfFffEleF`eFndEndDffDffEegHggFgfFgfGmeHaeHodGldGceFkeFkfHcgHegIdgJagJifJceHodHmdJ&g%P'gwPfw/K(jaK3ep&Qgp%P*gbP%h~Pk~Q&e`SabSkcQhcPabNe`N%h~P(onOnnQipSarSnsQosOarNipNonO)lPoQ*eaSacSodQldPacNeaN)lP2lgPogQiiSakSolQllPakNiiNlgP(h{)Pi{*@)a@e&F*iqFjqX(`~)Sl}Si}Sh}Tn}Tj~Tl~Tm~SdShS)a`S``T(jTi}U)a`Ua`V(jVfVm~Vj~Vn}Vi}Vi}Um~Um~Vj}Wk}Xh}X)``X(jWeYiY)c`Yb`Z(kZgZm}Yi}Yk}Zk}[k}\i}\)a`\(k[0el&Qdl%^(ntTltVgvWcxWlyVnyTcxRgvRntTew&Sew%U/ey&Qey%U#etUet4J(ayJby3^f{4AnzAkzAjzBlzCh{Cb|Bc|Af|An|Ac}Ab}Bl|CkzCc}Cc}Dl|Ed|Ec|Dh{ElzEkzDkzCc|Cc|Do|Ea}F`}Gm|Ge|G`|Gi{GmzGhzGizFozEa|F`|Gf{Id{Hn|Hn|Ha}IizI)eu&Qeu%UiuU.ax&Qcx%Y#gqYfq7E'ndEld6NdfV`fVieVheWbfWjfW`gWagVdgVlgVahV`hWngWieXahXahYogYggYagYkfYcfYieYieXagXagYog[bh[chZngZbfZkeZje[cf[kf[bg[cgZjfZfg\ng\`h]ch]lg^dg^bf\je\he^)bs%T`sVktWgvW`xVbxTgvRktRbsT0iy&Qhy%^#hn^jn3E0bhEchL/a&QbB1bfBbf*UnwUmw0M2ikMhk/]om0CkmC`mDcmDimEanEknDhnDonCgoChoDkoDeoE`mFhoFhoGfoGnnGhnGbnGjmG`mG`mFhnFhnGbnIanHkoHkoHioIamIgoKjoKkoJeoJimJcmJbmKkmKcnKjnKknJanJ.ii&B,apB`p+S-`fScf[0mi%]li_jk&@fm@ln%_mn]fm[jk[mi],ea&QfaB#jkBik7H&iiHki9W(c~Wa~:L.bg&AagCkhDgjDalCblAgj%_kh_bg&A2ddWfdB1biB`i*Q`|Q`|,_3hg_igVniUfiUciUbiVdiW`jWjjVkjUnjUfkUkkUjkVdkWciWkkWkkXekYmjYkjXajYeiYciXciWkjWkjX`iZai[biZjkZ`kZbi\li\lj\jk\kk\mj]mi]ci\bi\di^bi^ai_fi_fk_ik_jk^dk^hj^bj^aj_jj_(je&XieF'etFet*@&aj@aj)PflRnkRhkSkkSlkThlTcmS`mSfmRjmR`nScnShmTkkTcnT`nVimVemV`mVilVmkVhkVkkTcmT`mVikWikXkkWcnWimWikYikZkkYcnYimYlk[jk[ik\nk\jm\an\bn[hm[`m[jl[il\bm\%`j&IcjJikLemLcoJ`oIemGikG`jI&ndTmdFivF-ow)Pmw*@/aa@aa&FaoFaoV-`z)ShySeySdyTjyTfzTlzTmzS`{Sh{Sm{Sl{Tj{TeyUm{Um{Vj{Vb{VmzVfzVjyVeyVeyUmzUmzVfyWgyXdyXl{Xf{Wa{Yi{Yo{Yn{Zk{Zc{ZiyYeyYgyZl{]n{[nz[oz\dz]hy]gy\dy\jy[bz[+kgPig*@,ej@ej&Fe}Fe}\+ni)RjiR`iSciShiTdjTkjShjSbkRfkRlkSokSdkTciTokTlkVekVakVhjVejViiV`iVciTkjThjVaiWaiXciWokWekW`kYdkYmkYlkZfkZbkZhiY`iYbiZek[nk[mk\gk\ck\ij\gj\ki\ai\bi[ii[jj[ij\0obPmb*@1ac@ac&FiuFiu\0`e)ShdSedSddTjdTfeTleTmeS`fShfSmfSlfTjfTedUmfUmfVjfVbfVmeVfeVjdVedVedUmeUmeVfdWgdXddXlfXffWafYifYofYnfZkfZcfZidYedYgdZnf[lf]hf]fd['lg0X#dwXgw&I'gjIgjP&btEatGkuHgwHayGbyEgwCkuCbtE%klVklIklI.hf'Bhf&Z-lzZlz'Bk{&Zo}Zo}[d}\`}\o|[h|\l{\k{[k{Zo|Zo|[f}\l}]n}]g}]c}]n|]k|]o{]j{]h{]n{\l|]n|].mpQmpVhkWdmWnmWomWemXikXhlWilXilZhlYnmYnmYomYkkY,nsM.f}Md}(T,lsTns&M.amQamVdoW`qWjqWkqWaqXeoXdpWepXdqYiqYkqYeqZmpZkpYepZioZgoYeoYhoYipYkpY`sWltWfuWguWmtXasX`tWatXhtYltYeuYguYmtZitZdsY`sYasZitQitVlvWdxWnxWoxWexXmvXhwWiwXlvYlvZnvYnxYdxYaxQaxVobZceZce[ld\dd\cd[lc\`c\ob[obZcdZcd[ob\ob]mb]ae]kd\-cZ.gaZga[`a\l`\g`[``\-h\c[cZ.g`Zg`[n`\ba\da]fa]ca]o`]-j\b\c]c}T`}Z.k`Th`ZgdTddZ-`lWal\.jy'@iy&VakVbk'@-mj&^kj]ij]lj]hl]ml]ol]il^cl^kl^ll_ol_hl'@`l@oj&^kj^hj'@mp&^kp]ip]lp]dr]ir]kr]er^hp_hp'@jp&_jr_dr_`rWar\.dr'HgrS-o}Sn}\lzBlzC`{Dk{Dc|Ej|Fd}Gf~GgG.``H`aHcbGbcGlcGjdFgeEoeDdfDhfChfB,e}&\d}'H`~B-d`Bd`Ca`C,e~C`~C`~B-ctBat&\mi\oi'B.bk@ckAdkClkDhlEdmFgnFeoGkpGlqHlrHctGeuGgvFdwF`xElxDdyCkyAjy@,d}Hg}S-krSjr\oiBoiCbjDijE`kFjkFdlGbmGomGhnHdoHgpGbqGlqGjrF`sFisEnsDctCctB`oHboNfvNev].h`Hj`N-bzNaz]kp[eq\br\or\hs]et]au]nu]jv]fw]fx]by]ny]iz]e{]d|]c}\n}\i~\c[kp(Akp'[c(Ac'[,fu_fw_lw(@nw@dwAduAfv'_dv(AkuAduBguBiuCiwCowBlwBkwAkuAlwDmwEduDeuEfuDnwDfvGdvFjwFjwFlwGduGhwHnwHmwIjwIbwImvIfvIjuIeuIfuHhuHnvHmvIawJiwJowJnwKkwKcwKiuJeuJguKguLguMeuMmwMgwL-nwPaxPexPexPixPhxPlxPoxOnxOmxOmxOlxOoxNoxNjxNjxNexNexNaxNmwNiwNiwNewNbwNbwNovNovNlvOmvOmvOnvOovOlvP`wPawPewPiwPiwPnwPkpAjpBipChpDopDcqEfqFiqGoqGfrHirI`sJjsJatKktKeuLouLivMcwMmwNcAbBaC`Do~Dk~Ef~Fa~Go}Gf}Ha}Ih|Jb|Ji{Kc{KezLoyLayMkxMmwNnwPowQixKjxLevKfvLkwKiwL.jy'_fy_ox_nx(@dyA`zAfz@gz'_nz_b{_k{_j{(@`{AoxAk{Ak{Ba{CmzCgzBazCeyCoxBoxAgzAgzBlxDmxEnxDj{DlzDlzF`{Fi{Fh{Gb{GnzGdyFlxFnxGb{Ii{Ij{H`{HdyHnxHmxIfyIbzIezIfzH`zH(ff&^jh^ih_ch_kf_ef_ff^)dpWlqWfrWgrWmqXepX`qWaqXlqY`rYerYgrYarZmqZhpYdpYepZhaWhcWhcXecXacXlbXebXmaXhaXhaWlbWlbX`cYdcYicYkcYecZacZlaYhaYiaZ(l}W)``W``X(iXeX`Xm~Xa~Xl}Xl}W`W`XhY)a`Yc`Y(iZeZcYm~Za~Zo}Ym}Y`~YaYcY'j}M)f{Mg{(Q'k}Qj}&M(eQeV)acQacV`eWdgWdgXagXmfXdfXafXieX`eX`eWdfWdfX`eY`eZbeYfgYlfYifQifVhlWdnWnnWonWenXilXhmWimXdnYmnYonYenZanZomYimZmlZklYilYllYmmYomYanQanV(eqSfqX)lsWhuWbvWcvWiuXmsXltWmtXlsYlsZnsYbvYhuYiqQiqVeuQeuV(bpZmoZnoYapYmqYbrYarZnqZdq[lq[br[`r\mq\eq\`p[lo[mo\ewSfwXbvZmuZnuYavYiwYnwYmwZjwZmu[mu\ou[ow[iw[)nh^mhV(a}Vb}^)jw^iwVmkVnk^(dt'^dtXao&_eo'@ioAepBaqCcrCasDetDeuDkvCiwCexBmxAey@ey&_ey_fyXboXao_jeXie'Db}&^g}_h}'Ad~BdC)g`CiaDacDedDkeChfChgBdhAoh&_nh^nk^ok_dl'A`mB`nCcoCepDiqDasDgtCduCdvB`wAgw&_jw^(et'DdtK`zKbzYieDhePhvPkvX)acD`cK(l}Kn}Y)iqDhqPhaPkaX`c^lb_lb(@hbAdbB`bChaDgaDo`Eb`F(iGl~Hc~Hf}Ih|Jj{J)`c'^`cX(dtXfuXdvYewYfxYgyYkzYk{Yo|Yo}Yn~YmY)`aYbbX`cX'l~^(`a^ja^ha_ba_'n~_(``^b`_'e(@n~@m~AgA(caAiaAja@aa@'e@(jaBkaC'n~Bo~Cm~C(iaCbaDkaDjaE`aFl`Ff`E``F'dFn~Eo~DfD(g`Df`EcaFhaGkaG`aHl`Hg`G``H'dHo~Gl~GgF(d`Gg`Go`HcaHiaIhaJaaJm`J'gHo~Hm~Jm~Km~Lo~K(kaKaaKdt'^dt_et(@itAmtBeuCmuDevEmvFhwGcxGbyHmyIhzJj{Jk{Lo{Lb|Lf|Le|Li|Lh|Lo|Kn|Ki|Kh|Kg|Jg|Jb|Jn{Jj{Jf{Jb{Jc{JozJhzKizKjzKkzKhzLizLmzLb{Lb{Lg{Lk{Lk{Li{Nf|Gg|HbzGczHd{Hf{H)hw'^`w^mv^lv_bw_nw_dx_ex^hx^`y^ey^dy_by_mv(@ey@eyAcyAkxAexAowAcwAmvAmv@ex@exAnvBovCmvCeyCnxBjxDbyDgyDfyE`yFhxFbwDnvDlvFkxFcyFdyGgyG`yHhxHcwFovFlvH%bk&\fm\fm]cm]gk]bk]bk\jl^bm^gm^em_cm_kl_fk^bk^ck_&b`[%m[oZ&a`ZiaZoaZma[ja[ea\ia\na\ma]ja]fa]a`\%m\n]'kfPhfV&o}VkV'a`Wb`W&hXl}Xo~Vl~Xk~Yj~XlYlY'b`Y&n}Y%`fM'hoMko(S%cfS`f&M&gPdV'kaVgcVmcWncWdcXhaXkbVhbXfcXocXncYgcYccYnbYkbYoaYjaYkaXnaXobXnbYccP`cVohVkjVakWbkWhjXlhXoiVliXohXohYmhYakYkjXgeVofVegWfgWlfXdeXcfV`fXnfXbgXggXfgYcgYofYjeXfeXgeYgjPdjV%j}Tj}Yf|[a|[c|Ze|Zm}Zg~Ze~[n}[m}\f~\e~]n}]j}]e}]b}]f|]a|]b|\e|\f}\e}]&nrTnrYndTndYbaTbaYnc[ec[gcZmcZeeZkeZie[fe[fc\ec]gc\ke\be\imZmoZmo[jo[fo[mn[jn[bn[im[imZmnZmn[io\no\mo]jo]fo]mn]jn]bn]im]jm\an\nn\mn]boTboYjvTjvYeqZisZis[fs[nr[ir[fr[jq[eq[eqZirZir[mr\es\js\is]fs]nr]iq\eq\fq]auZewZew[nv[jv[ev[bv[fu[au[auZevZev[bu\au]cu\gw\nv\'mk'@lk&V&`}Va}'@%kl&Vkl[&nr'GmrNelNdl]a}@d}Bc~C`E'e`FlaGjcGfeG`gGihF`jEckChkBmk@&cgAbg&Y%f{Yg{'Abq&\fs\fs]or]gq]bq]bq\bq^bq_`q_ds_nr^krVkr[&ox'Anx&YbmYcm'A%jtBkt&[gj[fj'BfjBkjCckDkkEklFmmGnnGbpGeqGkrFgsEctDktCjtBg{Ah{Cb|Dn|En}FaG&j`GnaGecGjdFjeEffDlfCcgAcmA`mCjmDfnEjoFmpGbrGjsGmtGbvFfwEbxDhxCoxA%joGioS&mdSmd\baGaaNihNhh]ib(Ajb'['jdGidS&moSmo\jb[lc\md\cf\`g]dh]ei]ij]lk]ll]cn\eo\dp\fq[eq(Afq'[%hg_hi_cj_`j(@ji@jg@hh'_jh(@mgAkgAjgBogBkiBbjBcjAiiAmgAcjCcjDkgCkgDigDajDdhGfhEliFliFcjFkgFkiG`jHcjHiiIeiIohHihImgIkgHhgHogGlhHohHhiJajJ`jKjiKfiKlhKjhKngKhgKigJlgJmhJlhKeiLiiLbjLajMkiMgiMmgLigLkgM&`jPdjPhjPojOnjOakO`kOckNbkNmjNljNhjNgjMcjMoiMhiNdiNaiNbiNohNlhOaiObiOgiOhiPliP`jPibAnbBobCccDdcFlcGddHldIheJdfKcgKbhLaiMcjMeqAfqBcqCopDhpF`pGhoH`oIdnJhmKolKblLakMcjM`jPbjQojJljLkhJhhLmiKoiK'lk'_hk_bk_ak(@jk@bl@il@jl'_ll_dm_jm_im(@fm@akAimAjmBgmBolBjlBclBkkBbkBakAilAjlBckCckDakDimDcmCckEckFakFimFcmEjkG`kHckHhkIdmIkmHhmHfmGjlG`lHclHhlIckIkmIakKimK*fr&^ft^et_ct_kr_er_fr^+`|Wl}Wf~Wg~Wm}Xa|X`}Wa}Xh}Y`~Ye~Yg~Ya~Zi}Zd|Y`|Ya|ZdmWhoWhoXeoXaoXhnXenXmmXdmXdmWhnWhnX`oYdoYioYkoYeoZaoZlmYdmYemZliWlkWlkXikXekX`kXijXajXliXliW`kW`kXhkYmkYokYikZekZckYijZajZoiYmiY`jYakYckY*fiM,bgMcg(Q*giQfi&M+ekQekVmnQmnV`qWdsWdsXasXirXdrXarXeqX`qX`qWdrWdrX`qY`qZbqYfsYlrYirQirVdxW`zWjzWkzWazXexXdyWeyXdzYizYkzYezZazZkyYeyZmxZgxYexYlxYiyYkyYmyQmyV*e}Sf}X+lW,haWbbWcbWiaX+mX,l`Wm`X+lYlZnY,bbYhaY+i}Qi}V,eaQeaV*b|Zm{Zn{Ya|Yi}Yb~Ya~Zj}Zd}[h}[b~[`~\i}\e}\`|[l{[m{\+acSbcXbbZiaZjaYabYicYncYmcZjcZia[ia\ka[oc[ec[nt^mtVaiVbi^,jc^icV+iwVjw^``'^``X*a{&_a{'@d{Al{Bk|Bf}Cd~DaD+a`DaaD`bDbcCocBhdBldAee@ee&_ee_feX*b{Xa{_jqXiq'D+bi&^bi_gi'@cjAnjBikCklCmmDmnDapDcqCarCbsBosAgt@jt&_nt^jw^nw_cx'@kxAfyBezCg{Ce|Di}Dm~DoC,m`CnaBkbAcc@fc&_jc^+a`'D``K`fKbfY*iqDhqP+dbPgbXmnDlnKliKniYi}Dh}PdmPgmXln^ln_on_kn(@fnAbnBmmChmDcmDklEblFhkGckGfjHliIbiIdhJjgJln'^lnX``XbaXlaYmbYncYjdYkeYkfYkgYkhYgiYfjYfkYelY`mYbnXlnX*lj^ll^fm^dm_nl_nj_`l^bl_ek(@nj@mjAgkAcmAemAfm@am@ek@fmBgmCnjBojCmjCemCbmDgmDfmE`mFhlFflE`lFdkFnjEojDfkDglDflEcmFdmGgmG`mHhlHglG`lHdkHojGljGgkFdlGglGklHcmHemIdmJamJilJgkHojHmjJmjKmjLojKgmKmlK+``'^d`_d`(@k`@k`AcaBfaCjaDabEhbFgcFncGidH`eIneIlfJjgJkgLogLogLbhLfhLehLhhLhhLkhKjhKihKhhKdhKghJchJngJngJjgJfgJbgJofJofJhfKhfKifKffKgfKhfLhfLifLnfLnfLcgLggLkgLkgLigNfhGghHbfGcfHdgHfgH,hc'^`c^mb^lb_bc_nc_`d_ad^hd^ld^ee^de_nd_mb(@ee@eeAodAkdAadAocAccAmbAmb@ad@adAnbBobCmbCeeCndBjdDndDgeDfeEldFhdFbcDnbDlbFhcHkcFaeGaeGgeGobG2l~'Bl~&Z`sZ`s'Bos&ZouZou[hu\du\cu[ht\`t\os[osZcuZcu[ju\lu]nu]ku]gu]bu]kt]ct]ns]ls]bt\`u]bu]3aiQaiVlcWheWbfWcfWieXmcXldWmdXidZhdYneYneYcfYocY1blM3juMhu(T1`lTbl&M3eeQeeVhgWdiWniWoiWeiXigXhhWihXdiYmiYoiYeiZaiZohYihZmgZkgYigYlgYmhYohYdkWllWfmWgmWmlXekX`lWalXllY`mYemYgmYamZmlZhkYdkYekZilQilVlnWhpWbqWcqWipXmnXloWmoXlnYlnZnnYbqYhpYepQepV2c{Zg}Zg}[l|\h|\g|[`|\d{\c{[c{Zg|Zg|[c{\c{]a{]e}]o|\gwZkyZky[dy\lx\kx[dx\hw\gw[gwZkxZkx[nx\fy\hy]jy]gy]ox]jw\fw\gw]cuT`uZoxTlxZk|Th|ZddWed\3nq'@mq&VacVbc'@2ac&^ob]mb]`c]hd]ae]ce]id^gd^kd^`e_ce_hd'@dd@cc&^ob^lb'@ai&^kh]ih]`i]hj]mj]oj]ij^hh_hh'@jh&_nj_dj_`jWaj\3hj'HkjS2ouSnu\`sBcsBcsCjsDlsEgtEmtFkuFavGnvGkwGdxHdyHczGnzGi{Gg|Fm|Fg}El}Ef~Dk~Ck~Bl~B1iu&\hu'HdvBhxBhxCaxCivCdvCdvB2glBel&\ab\cb'B3bc@fcAfcBncCfdDmdEheFffF`gGbhGciG`jH`kHclGbmGlmGnnFhoFapEnpDfqCjqBnqAnq@1huHkuS2ojSnj\cbBbbCebDkbDnbEdcFjcFddGmdGkeGcfGlfHhgHghGohGiiG`jGnjF`kFjkEokDalDflCglBdgHfgNjnNin]lxHnxNfrNer]kh[di\mi\jj\ck\lk]el]am]nm]fn]bo]jo]fp]bq]jq]fr]as]is]dt]ot\ju\av\lv\gw[kh(Akh'[gw(Agw'[1jm_jo_`p(@bp@hoAhmAjn'_hn(AomAhmBkmBmmCioCcpB`pBkoAomA`pDapEhmDimEjmDbpDfnGdnFnoFnoF`pGhmGhoHbpHapIjoIfoImnIjnInmIimIjmHlmHnnHmnIeoJioJcpJbpKkoKgoKmmJimJkmKkmLkmMimMapMkoL2bpPapPepPepPipPipPlpPlpPcqOcqObqObqOaqOaqO`qOcqNcqNnpNnpNjpNipNepNepNapNapNmoNmoNioNioNfoNfoNboNcoNcoN`oOmnOmnOnnOboOcoOcoO`oPdoPeoPioPioPmoPmoPbpPkhAihBlhCohCmhD`iEfiEeiFkiFniG`jHkjHmjIckIikJclJelKolKemLomLdnMnnMkoMapNgwAewBdwCfwCawDcwDnvEhvFkvFevGcvGnuHduIbuIltJftJlsKjsK`sLirLcrLiqMbqMkpMapNbpPcpQmpKnpLinKjnLooKmoL3nq'_jq_cq_bq(@hqAdrAjr@kr'_nr_fs_ks_js(@dsAcqAksAksBesCmrCkrBerCiqCcqBcqAkrAkrB`qDaqEbqDjsD`sDdsFisFhsGfsGnrGhrGfrGjqG`qGaqFhqFirFhrGcqHlqHlrHksHhsInrInqI`qIcqH0l{&]m{ViqVhq]ljW`mW`mXmlXilX`lXmkXekXljXljW`lW`lXljYljZnjYbmYhlY/aQaVeyQeyVjgM0jMk(O/kgOjg&MaxXlwXmwW`xWhyWazW`zXiyXdyYhyYazYczYiyZeyZ`xYlwYmwZ0`eWdgWdgXmfXifXdfXafXeeX`eX`eWdfWdfXhfYlfYegYggYmfZifZdeY`eYaeZ/a~Xh}Xi}W`~WhWmWlXiXh}Yh}Zj}YnYdY0ifQifVelQelViyQiyVdrW`tWjtWktWatXerXdsWesXlsY`tYitYktYatZmsZhrYdrYerZmsQmsV`xWlyWfzWgzWmyXaxX`yWayX`xY`xZbxYfzYlyY/mo\mq\lq]jq]bp]lo]mo\aoV`o'B0da&]eaV/awV`w]0hn]inVedVdd]/h{'Va|Vn|Vk}V`~Wm~WiW0f`WbaWoaWkbWccWocWjdWfeWafWmfWhgWchVnhViiV`jV/`oBcoMk}Mk}V0dd&]gd]jd^md_ce_je'@dfAnfAkgAdhB`iBliBhjBgkAblAhlAfm@om&_an_fn^kn]hn]/`w]cw]fw^iw_cx_fx'@`yAjyAgzA`{Bl{Bh|Bd}Bc~An~AdA0b`@k`&_m`_ba^ga]da]hq]kq]nq^ar_gr_nr'@hsAbtAotAhuBdvB`wBlwBkxAfyAlyAjz@oz&_e{_j{^o{]l{]di'BgiHceHbeW/d|Bg|H0gaHfaWhvBkvMohMohV/k{[h{Vk{[j{\i{]h{^o{^n{_`|(@g|@j|Al|Bg}Bi}C`~Dj~Dl~EgEmF0k`F`aGjaGdbHmbH/`i'[`k[jk[hk\bk\bi\dj[fj\ii]ci]ai^ki^gk^ik^kk]ek]ii]kk_kk(@ci'_ci(@ai@ik@njAfkAkkAjkBdkCljCjiAbiA`iCojCgkChkDkkDekEmjEkiCciCaiEljFdkFikFhkGfkGnjGhiF`iFbiGaiHbiIciHkkHakH0cj'[`jVnb(JbcJbcJfcJicJicJhcJlcJocIocIncImcImcIlcIocHkcHjcHjcHfcHacHacHmbHibHibHfbHfbHbbHcbHoaHlaImaImaInaIoaIoaIlaJ`bJabJebJfbJjbJjbJnbJcj'[bj\aj]`j^oi^ni_hi(@gi@biAlhBghBahChgDbgDlfEgfEmeFgeFhdGbdGhcHmbHnbJlbLicEjcFeaEfaFkbEibFl{'[h{[b{[a{\j{\b|\i|\j|[l|[d}[j}[i}\f}\a{]i}]i}^g}^o|^i|^c|^k{^a{^a{]i|]i|^c{_c{(@a{@i}@c}'_n|(Af}Ak}Aj}Bd}Cl|Cj{Ab{A`{Cg}Ch}Dk}De}Em|Ek|Da|Ei{Ec{D`{Dk{Cc|Ch|Do|Cg}Ch|Dk|Dlb_lbLaeSidSgdSfdTkdTgeTneToeSafSifSofSnfTkfTfdUnfUofVhfW`fWoeVdeWhdWgdVfdUneUoeVddXddYfdXnfXdfXcfYkfYlfZofZif[af[kdYgdYed[hf\mf\lf]jf]bf]le]fe]jd]dd]ed\hd\de\me\`f\hf\me\le](i{^i{Nk}Tc}Tm|Ul|Va}Vm}V`~Va~Uk~To~TeUdVm~Vl|WdWdXn~Xj~X`~Xn}Xb}Xl|Xl|W`~W`~Xn|Yn|Zl|ZdZn~Yi~[m~[f[e\o~\k~\a}[m|[o|\j~]n~]g]f^l~_h~_b}]n|]l|_%oi+DniFekHamHnnFonDamCekCoiD(ie*PheRfgSbiShjRijPbiNfgNieP/j)LjMb}Lb}M`}MhMa}NiNc}OkOb}PjPkQ`Rl~Rg~Qf~Pe~Q`}Rc}RkRkSaTm~Tg~Sa~Te}Tc}Sc}Rg~Rg~S0daE`cEjcEkcEacFeaFdbEebFlb(_mb)DahD/i}D0lbMahDmbOacOacOecOdcOhcOhcOocNocNncNncNmcNlcNlcNocMocMncMjcMicMecMecM`cM`cMlbMhbMhbMebMebMabMbbMnaMoaMoaMlaNlaNmaNnaNnaNoaNoaN`bO`bOdbOebOibOibOmbOmbOobPkcHhcJgaHdaJhbIjbInjCjjCcjCbjDhjEdkEjkDkkCblCflColCnlDdlEcjEolEolFelGalGkkFekGijGcjFcjEkkEkkF`jHajIcjHolHdlH`lJdlJmlJllKflKblKhjJ`jJbjKmlLnlMflMajL(gxKgxLouKouLmuLexLnuMfxMluOdxOouOgxOdxQmwQiwQdwQgwOfwPmuQluRdxRdxSnwSjwSdwSnvSbvSluSluRdwRdwSazDm{Dg|Dd|En{EbzEa{Db{Ei{(^j{)C)n`C(jvCi{L)n`C(j{Nn{Nb|Na|Ne|Nh|Nh|Nk|Mn|Mm|Mh|Mh|Mk|Lf|Lb|Lb|Lm{Li{Le{Lf{Lb{LnzLozLhzMhzMizMjzMkzMhzNlzNmzNa{Nf{Nf{Nj{Nj{Nh{Pd|He|I`zHazIf{Hg{H)ncCfcCccCbcDdcE`dEfdDgdCndCbeCkeCjeD`eEccEkeEkeFaeGmdGgdFadGecGccFccEgdEgdF`cHacIccHkeH`eHldJ`eJieJheKbeKndKdcJ`cJbcKacLbcMccLkeLaeL-lw(_owQbzUjyUdyVgyVhyWdzWozVlzVb{Uj{Ul{Vo{Vh{WgyWo{Wo{Xi{Ya{YozXezYiyYgyXgyWozWozXdyZey[gyZo{Zd{Z`{\h{\m{\l{]j{]b{]hy\dy\fy]k{_m{_n{^i{^iy^fy^ey_ky_gz_mz_nz^ez^&bj^bjQelUmkUkkUjkVokVklVbmVcmUemUimUcnUbnVkmVjkWbnWcnXhmYdmYcmXhlYlkYkkXjkWbmWcmXhkZhk[jkZbnZhmZhk\hk]jk\bn\hm\ok]ik^hk_mk_im_`n_an^km]cm]il^hl_am_hk)@`n@jkAbnA2cp(Qap*Hi`Hj`1S1fsSgs3L2dr(TlqTjqTiqUnqUjrUasUbsTdsTlsTbtTatUnsUiqVatVatWosWgsWasWkrWoqWiqWiqVasVasWkqXkqYiqYatYksXnsZctZbt[ls\ds\bs[hr\lq\jq[kqZnqZcsZbs[iq]gr\gs\at]bt]es^er^jq]iq]+fd)LfdMjaLjaMhaMddMiaNedNkaOgdOjaPfdPgdQlcRhcRccQbcPacQhaRkaRgdRgdSmcTicTccSmbTabTkaSkaRccRccS`fElgEfhEghEmgFafF`gEagFhg(_ig)DilDebDhgMilDigOmgOmgOahOdhOdhOghNjhNjhNihNhhNhhNkhMfhMfhMehMahMlgMlgMhgMdgM`gMagMmfMnfMjfMkfMhfNdfNefNjfNjfNkfNlfOlfOagOagOegOigOigOkgPghHdhJcfH`fJdgIfgImnDinDbnDanEknEgoEioEjoDapDepDnpDmpEgpEbnFnpFnpGdpH`pHjoGdoHhnHbnGbnFjoFjoGcnH`nJbnInpIcpHcpJgpJlpKopKepLapLknJcnJanLgpLmpMlpNepNapNhoNeoNinN`nNanMknLioMhoN&lfLlfM`dL`dMbdLnfLcdMofMadOmfO`dPlfPlfQffQbfQheQhePkePbdQadRmfRmfSgfScfSieSgeSkdSadSadRieRieSjhDfjDljEmjEgjEkhEjiDkiEbj(^cj)CcoCodCbjLcoCcjNgjNgjNjjNnjNmjN`kNckMbkMbkMakMljMojLkjLfjLfjLbjLniLjiLgiLgiL`iMaiMnhMnhMohM`iNaiNfiNfiNkiNoiNcjNcjNajPljHmjIhhHihIniHliIcrCoqCdqDgqDmqEirEorDlrDgsCksClsDosDisEdqFlsFlsGisGesGlrGirGmqGdqGdqFlrFlrGeqHfqIgqHosHesHeqJfqKgqJosJesJmqLfqLeqMnqMjsMmsMnsLisLmrLjrLirMnrM-jtLjtMbrLbrM`rMhtMarNitNcrOktObrPjtPktQ`tRlsRgsQfsPesQ`rRcrRktRktSatTmsTgsSasTerTcrScrRgsRgsSdvE`xEjxEkxEaxFevFdwEewFlw(_mw)Da}DirDlwMa}DmwOaxOaxOexOhxOhxOoxNoxNnxNnxNmxNlxNlxNoxMnxMnxMixMixMexM`xM`xMlwMhwMhwMewMewMawMbwMnvMovMlvNlvNmvNnvNnvNovNcwN`wOdwOewOiwOiwOmwOmwOowPkxHhxJgvHdvJhwIjwImDiDbDaEkE.g`Ei`Ej`DaaDeaDnaDmaEgaE-bF.naFnaGdaH`aHj`Gd`H-hHbGbF.j`Fj`G-cH`JbI.naIgaHcaJgaJlaKoaKeaLaaL-kJcJaL.maNoaLk`Lh`Ne`N-iN`NaMkLoL$fl*KelM`nOhoOeqMfqKhoJ`nJflK*ce+[be*L2kh+[jh*L$nnL,jyLiy.X-maXna/K,bw*KawMlxOdzOa|Mb|KdzJlxJbwK*jbKibMddO`fOigMjgK`fJddJjbK(bh+\`h*Q*ka+[ja*]ja]$bxXaxZly\d{\a}Zb}Xd{WlyWbxX%no+\no*Y1gp+[fp*Y$jzY)cz+[bz*YjwXiwZdy\`{\i|Zj|X`{WdyWjwX%fmXemZ`o\lp\erZfrXlpW`oWfmX1kj+[jj*]$jw]3ia5\ia1Z/mZm+A.mxA)c*\b^*l`+@hb@bd*^cd\hb[l`[)c\$cu\bu^lv+@hx@bz*^cz\hx[lv[cu\&cq+[aqA.fv@dvBcxCoyCd{Bf{@oy*^cx^fv+@&jn@hnBcpCoqChsBjs@oq*^cp^jn+@%gl[glE+gyEfy\0cm[cmN/cw[cwJ4gzJ3gb[ebG2om[mmG4ihGkhF+ovDnvFixHazHn{Fo{DazCixCovD4`fFcfGmgIiiIckG`kFiiDmgD`fF*j/Kh+JhJ2mFlH3kaIgcIldHmdFgcDkaD2mF*a}I`}Kj~L+f`L`bKabIf`G*j~Ga}I&crMarOlsQhuQawOcwMhuLlsLcrMkt[jtN4lwJowKeyMa{Mo|Kl|Ja{HeyHlwJ(ok[nkN4gtN-clNcl[(giMeiO`kQhlQenOgnMhlL`kLgiM/cq[cqNgqN4nbU3bfUbf\l|R0`sRcs[kjMjjOelQanQjoOkoManLelLkjM/onMnnOepQarQnsOosMarLepLonM4oqMnqOisQeuQnvOovMeuLisLoqM(o`[m`S#a}S3ezQgzRb|Tn}TgReQn}Ob|OezQ#jzRhzTg|Uc~UhTjRc~Pg|PjzR(idWeuWgu,_/ol_nl/K+a}+V.iiVki3L4g`+Te`VlaXhcXeeVgeThcSlaSg`T+izUhzWc|Xo}XhWiUo}Sc|SizU%ks[jsWjsW&gm[fmW#fzW(bbVabXkcYgeYagXbgVgeTkcTbbV#owVnwXdyZ`{Zn|Xo|V`{UdyUowV,``2Q'lrQnr:@(jz@izL-fy/KfyF.jiF%mzLoz.I4`l+[bl\im^eo^bq\`q[eoYimY`l[/gy,Cfy+_ju,AfwAlwBnwBgwBkuBjvAkvBnoAnqAnqBkqBgqBbqBkpBcpBnoBnoAbqAbqBcq+[cq,@bo+_go_ho,@ap@fp@op@dqAhqAarAirAbsAfsAnsAftAntAfuAmuAavAhvA`wAgw@nw@ex@hx@ox+_fy_cw[cw,@coCbo+_gy,CeyDfyD`yEbyEcyEmxFnxFhxGixGgxG`xHbxHowHhwIfwIcwIlvJivJbvJouJhuKauKntKktK`tLcoCaoDboD`oEboEgoEeoFfoFhoGmoGooG`pHfpHkpHlpIbqIgqIhqJmqJbrJgrJlrKasKfsKosK`tLijEamEkjFcmFjjGbmGbmHllIdlIblHblGalHhjIglIolI`mJcmJmlKelKojIkjIijK`tNbtO`tNdtNdtNhtNhtNltNotMcuMbuMbuMauMeuMduMduMguLcuLbuLbuLauLmtLltLhtLhtLdtLdtL`tL`tLlsLlsLhsLhsLesLesLbsLbsLcsLcsL`sM`sMasMasMbsMbsMgsMgsMhsNhsNlsNlsN`tN`tNltImtJhrIirJnsIlsJi{Ea{EozEnzFc{Fo{Ff|Fg|Ei|Ea}Eg}Ef}Fc}FnzGf}Gf}H`}Ih|If|Hl{I`{InzHnzGf|Gf|Hi{Kk{Ia}Ja}Jg}JozJnzLh{Lh|Lf}Lg}Li|Mi{MozLnzL)fyAb{Ah{Bj{Bc{BgyBfzAgzB*caBn`Bl`BbaAjbA`cBbcBkbBfdAjfAjfBgfBodBfdBfdAce+[ce,@ka+[ka,@)b}AfAfBcBk~Bf~Bc~Bg}Bb}Bb}Af~Af~Bo}+[o},@cz+[cz,@*egKegLagMifNafOhePodPadQccQabRbaRb`R)bRm}Rc}Qa|Qc{PhzPmyOeyNayMmxLixKixKkx@*gg@egK`iLlkLaiMmkM`iNlkNmkOfkOjiOaiO`iNcjQajPkkPkkPnkQbiQc`Ta`Vc`Tc`Tg`Tj`Tj`Tn`Tm`Tm`T`aT`aTcaSbaSbaSaaSaaSl`Sl`So`Rk`Rj`Rf`Rb`Rb`R)nRjRjRgRgR`S`SaSaSn~Sn~So~S`T`TaTaTfTfTjTkToT*c`TjaOkaP)fOgP*h`Pj`P)duL`uLitLhtMauMmuM`vMavLhvLlvLawL`wMmvMhtN`wNawOnvOjvOavOnuObuOitOhtN`vNavOivPmvPcwPbwQovQkvQauPitPktQbuRhtSjtS`uTlvTbwS`wSnvRbvRluSnuS`vT&`kIck@ov@lvIcq+[cq,@gtBbtB`tBftAnuA`vBbvBouBkt+[kt,@gm+[gm,@fpAjrAjrBcrBoqBjqBgqBkpBfpBfpAjqAjqBjlAfnAlnBnnBgnBklBjmAkmBlvIovIkvJfvKnuL`uMktMisNnrNoqNcqNcpNboNenNkmMllMflLnkKgkJckI`kImxKe{KoxLg{LmxMe{Mf{NozNcyNnxNmxMnzOd{Pg{PlzQhzQczPlyQ`yQoxPlxPbyO`zPczP`qQbqR`qQ`qQdqQhqQkqPoqPnqPbrParP`rP`rPcrObrObrOmqOmqOhqOhqOdqOcqNcqNopNhpOhpOdpOepOapObpOnoOooOloPloPmoPbpPbpPgpPgpPhpQhpQlpQ`qQhrLirMdpLepMiqLkqLmgKegKbgKagLggLchLihLjhKmhKeiKjiKiiLgiLagMiiMjiNgiNohNjhNchNggNbgNagMihMjhNnhOfiOhiPkiPdiQlhQfgObgO`gQiiSkiQkhQhhSahSegS`gSagRggQogQ%ajEaj@ks+[ks,@gl+[gl,@ckBnjBljBbkAjlA`mBbmBklBbrAnsAdtBftBosBcrBbsAcsBno+\no,AenBipBipCfpCbpCioCfoCnnCenCenBioBioCaj@jj@gk@lkAhlAemAmmAjnAfoAnoAjpAfqAmqAirAdsAlsAkt@bu@mu@jeJbhJheL`hLkeLchLchMlgNhgNcgMcgLagMheNogNahO`hPmgPigP`gPmfPafPhePieOcfNagO`gPajE`jFbjFejGdjHjjHmjIckIekJhkKblKdlLnlLdmMnmMgnMmnNfoNooNmuEmu@muEluFnuFiuGhuHfuHauIotIitJdtKnsKhsLbsLhrMbrMkqMaqNjpNooNloQ`pQdpQhpQkpPopPnpPaqPaqP`qPcqObqOnpOmpOhpOhpOdpOcpNooNooNhoOdoOdoOaoOboOnnOonOlnPmnPmnPboPcoPgoPdoQhoQloQloQloQnoRhpLipMdnLenMioLkoLbxJjwJgwJfwKhwLdxLnxKoxJbyJjyJoyJnyKhyLgwLoyLoyMhyN`yNoxMdxNhwNgwMgwLoxLoxMcyNkyNmyOlyPiyPayPkwNgwNewPbxR`xQjyQjyQmyRewR(an@fm@kl@`lAekAjjAniAciAkhAogAcgAgfAkeAodAcdAfcAnbAabAdaAk`@b`@'e@(o`+[o`,@ok+[ok,@bkAfmAfmBcmBgkBbkBbkAb`AnaAdbBfbBoaBc`BbaAcaBbh+\bh,AngCegCggBmgBeiBkiBiiCfiCmcBmeBmeCjeCfeCaeCjdCbdCmcCmcBaeBaeCjd+\jd,AmoKerKooLgrLmoMerMfrNcrNkqNfqNeqMdqNooNlpQnpOdrPdrPgrPooP'dFe@(`nFan@`nFcnFnmGmmHhmIkmIfmJamKllLflLalMhkNfkNmjOgjOmiPciPihQchQdgRjfR'dFgFfGiHhIoI(b`Je`Kh`Ln`LeaMhaNbbNibOccOicPcdPmdQgeQ`fRjfRkfTofTcgTbgTfgTfgTigTigThgTogSogSngSmgSigShgShgSggRggRbgRbgRnfRjfRjfRffRbfRcfRoeRleSleSieSieSjeSkeSkeSheTmeTmeTneTbfTbfTgfTkfTkfTkfTifVbhOchPneOoeP`gPbgP'a|Ki{Kf{Ke{Lk{Lg|Lm|Ln|Ka}Ki}Kn}Km}Lk}Le{Mm}Mn}Nk}Nc}Nn|Ng|Nk{Nf{Ne{Mm|Mn|Nb}Oj}Ol}Po}Ph}Q`}Qj{Of{Od{Qk}Qm}Rl}Si}Sa}Sl|Se|Si{Sd{Se{Rk{Qg|Qm|Rc}Qk}Qm|Rl|S-gnCfn+_jj,AflAllBnlBglBkjBjkAkkBndAnfAnfBkfBgfBbfBkeBceBndBndAbfAbfBcf+[cf,@bd+_gd_ld,@ae@je@cf@hfAmfAegAngAfhAnhAfiAniAfjAmjAekAlkAgl@nl@am@hm@om+_fn_cl[cl,@cdCbd+_gn,CenDgnD`nEbnE`nFnmFomFimGgmGdmHbmHolHilIflIclIikJfkJckJhjKejKniKkiK`iLcdCadDcdD`dEbdEddFfdFkdFidGodG`eHfeHkeHmeIbfIgfIifJnfJggJhgKahKfhKohK`iL,iE-abE,kF-cbF,jG-bbGbbHlaIdaIbaHbaGaaH,hI-gaIoaI`bJcbJmaKeaKc`I,kIiK-`iNbiO`iNdiNdiNhiNliNoiMoiMcjMbjMajMejMdjMdjMgjLcjLbjLajLmiLmiLliLhiLdiLdiL`iL`iLlhLlhLhhLehLehLehLbhLchLchL`hM`hMahMahMbhMghMghMghMhhNlhNlhN`iN`iNliImiJhgIigJnhIlhJipEapEooEnoFcpFopFfqFgqEiqEarEgrEfrFcrFnoGfrGfrH`rIhqIfqHlpI`pInoHnoGfqGfqHcrIdrJgrJarKiqKgqJmpKapKooJloJcpIdqJgqJarMdrMerL`rL`pLmoLloMapMmpMdqMeqLlpL+mo@jp@cq@lqAirAbsAnsAktAguAcvAovAkwAgxAcyAkyAfzAb{Am{Ah|Ac}@n}@i~@c}+[c},@cr+[cr,@jpAnrAnrBgrBopBjpBjpAj{Af}Al}Bn}Bg}Bk{Bj|Ak|Bju+\ju,AjtCetCgtBitBavBgvBevCbvCmwBazBazCnyCfyCayCnxCbxCmwCmwBayBayCfy+\fy,AekKanKgkLcnLekManMbnNkmNgmNnlNmlMllNgkNdlQflOlmPlmPcnPgkPh~Fi~@loFmo@loFooFnoGapH`pIfpIipJhpKcqKeqLhqMbrMerNorNesOosOetPotPeuQouQivRbwRh~Fk~Ff~Ge~Hd~Ib~Im}Jh}Kg}Ka}Ll|Mf|Mm{Nk{Na{OkzOazPkyPayQgxQmwRbwRcwTgwTkwTjwTnwTnwTaxTaxT`xTgxSgxSfxSexSaxS`xS`xSowRowRjwRjwRfwRbwRbwRnvRjvRkvRgvRdvS`vSavSavSbvScvScvS`vTavTevTfvTjvTjvTovTcwTcwTcwTawVnwOowPjuOkuPlvPnvP,m`Ke`Kb`Ka`Lg`LcaLeaLfaKmaKabKjbKibLcbLa`MibMjbNcbNoaNfaNcaNg`Nb`Na`MeaMfaNbbOhbPkbP`bQlaQgaP`aQd`Qc`P``Pf`OdaPgaPa`Ro`QoaQibRkbRmaSm`Sc`Ra`R.c{Cb{+_jw,AbyAhyBjyBcyBkwBfxAgxBjqAnsAnsBgsBcsBnrBkrBoqBjqBjqAnrAnrBcs+[cs,@np+_cq_hq,@mq@fr@or@dsAhsAatAitAbuAjuAbvAjvAnvAewAmwAdxAlxAcy@jy@az@dz@oz+_b{_ox[ox,@opCnp+_c{,Ca{Dc{D`{Eb{ElzFmzFkzFhzGfzGczGazHnyHhyIeyIbyIlxJexJbxJowJdwKawKnvKgvK`vLopCmpDopDlpEbqE`qFaqFgqFhqGjqGoqGarHfrHhrImrIbsIdsJisJnsJctJhtKmtKfuKkuK`vLelEaoEglFcoFflGboGboHhnIdnInmHnmGmmHdlIgnIknI`oJcoJinKenKolIglIelK`vNbvO`vN`vNdvNdvNhvNkvMovMovMnvMbwMawMawM`wMcwLcwLbwLnvLmvLmvLhvLhvLdvLdvL`vL`vLluLluLhuLduLduLeuLauLbuLbuLotLotLltMmtMmtMbuMbuMcuMguMguMduNhuNluNluN`vNlvImvJhtIitJnuIluJe}Ea}Ek|Ej|Fc}Fo}Fb~Fc~Ee~Em~EcEbFo~Fj|GbGbHl~Id~Ib~Hl}I`}Ij|Hj|Gb~Gb~Ho~I`JcJm~Ke~Kc~Jm}Ka}Kk|Jh|Jc}I`~Jc~Jl~LaL`Mm~Me~M`~Mm}Ma}Mh|Mi|L`}Ll}La~Ld~Ll~La~L`~M3a`@n`@fa@oa@dbAmbAecAncAjdAceAkeAcfAofAdgBlgBghAciAkiAcjAjjAbkAmkAelAllAgm@nm@fn@mn@gm+[gm,@gb+[gb,@n`AbcAbcBobBgaBn`Bn`AblAjmA`nBbnBkmBclBnlAolBbf+\bf,AndCidCkdBmdBifBofBmfCjfCehBijBijCbjCniCiiCfiCjhCehCehBiiBiiCni+\ni,A2m{Ke~Ko{Lg~Lm{Me~Mf~Nc~Nk}Nf}Ne}Md}No{Nl|Qn|O`~P`~Pg~Po{P3lnFmn@``Fa`@``Ff`Fe`Gg`Ge`Hk`Hi`Il`Jn`J`aKfaKhaLnaL`bMfbMhbNnbNdcOicOcdOedPndPdeQieQbfQhfRagRjgRlnFnnFmnGonGmnHknHinIdnJbnJ`nKnmKhmLfmL`mMnlMhlNblNlkOikOckOijPfjPliQeiQbiQhhRahRjgRkgTkgTogTogTbhTbhTfhTehTehTihThhThhTkhSkhSjhSjhSihSihShhSdhSghRghRchRchRngRngRjgRjgRfgRfgRbgRcgRofRofRofRhfShfSifSifSjfSjfSkfSkfShfThfTifTifTmfTnfTnfTbgTcgTggTggTkgTkgTigVfhOghPbfOcfPdgPfgPaqKmpKfpKepLopLkqLmqLnqKerKirKnrKmrLkrLepMmrMnrNkrNgrNnqNkqNopNfpNepMmqMnqNgpOgpPepPmrPgrOepRbqQfrQmrRnrRdrS`qSfpRepRopSepTdpUmpUirUlrUmrTkrSoqSiqThqUmqU1krCjr+_nn,AjpA`qBbqBkpBonBnoAooBbiAfkAfkBojBkjBfjBcjBgiBbiBbiAfjAfjBkj+[kj,@fh+_kh_`i,@ei@ni@cj@kj@ljAekAmkAblAjlAbmAjmAnmAfnAnnAeoAioA`pAkp@op@fq@iq@`r@gr+_jr_gp[gp,@ghCfh+_kr,CirDjrDhrEirEgrEdrFfrFcrFmqGnqGhqHeqHfqH`qImpIjpIgpI`pJnoJgoJ`oKlnKinKbnKomKhmLghCehDfhDdhEihEkhEhhFnhFohFaiGbiGdiHiiHniHliIajIfjIkjIljJfkJkkJlkK`lKelKnlKcmKhmLmcEifEocFkfFncGjfGjfH`fIleIfeHfeGeeHlcIoeIcfIhfJkfJafKmeKgdIocImcKhmNjmOhmNhmNlmNlmN`nN`nNgnMgnMfnMfnMjnMinMinMhnMknLknLjnLfnLenLenLenL`nL`nLlmLlmLhmLhmLdmLdmL`mL`mLllLmlLilLilLjlLflLglLglLdlMelMelMflMjlMjlMklMolMllN`mN`mNdmNdmNhmN`nIanJ`lIalJfmIdmJmtEitEctEbtFktFcuFjuFkuEmuEevEkvEjvFgvFbtGjvGjvHdvIluIjuH`uIhtIbtHbtGjuGjuHauKcuIivJivJkvJctJauM`uLjvLjvLhvM`tM0guCfu+_jq,AfsAlsBnsBgsBkqBjrAkrBjkAnmAnmBkmBgmBnlBklBclBjkBjkAnlAnlBcm+[cm,@nj+_gk_hk,@al@fl@ol@`mAhmAanAinAnnAfoAnoAfpAnpAfqAiqAarAhrAlrAgs@ns@at@ht@ot+_fu_cs[cs,@ojCnj+_gu,CeuDbuD`uEauEcuEltFntFktFitGftGdtHatHnsHhsIesIbsIorIhrJfrJcrJlqKdqKaqKnpKgpK`pLojCmjDbkD`kEbkEckEekFfkFhkGikGokG`lHflHglHhlInlIcmIdmJmmJbnJgnJhnKaoKfoKooK`pLifEaiEkfFciFjfGbiGbiHlhIdhIbhHbhGahHhfIghIohI`iJciJmhKehKofIkfIifK`pNbpO`pN`pNdpNhpNhpNhpNopMopMbqMbqMbqMaqMaqM`qMcqLcqLbqLbqLaqLmpLmpLhpLhpLhpLdpL`pL`pLloLloLhoLhoLdoLeoLeoLaoLboLboLcoLcoL`oMaoMaoMboMboMboMgoMgoMdoNhoNhoNloNloN`pNlpImpJhnIinJnoIloJewEawEkvEjvFcwFowFbxFcxEixEmxEgyEfyFoxFjvGfyGfyHlxIhxIbxHlwI`wIjvHjvGbxGbxHiwKkwIayJayJgyJkvJhxLlxLeyLdyMmxMixM`wLhvLivM2krFcuFirHauHhrI`uI`uJntJbsJhrJhrIetKmtKbuKauLotLgtLasKirKkrLbhAjiA`jBbjBkiBchBnhAohBbmAfoAfoBcoBknBfnBcnBgmBbmBbmAfnAfnBom+[om,@kh+[kh,@jfGkf@op@npGkkNokNokNclNclNglNflNflNjlNilNilNhlNhlNolMolMnlMjlMilMilMilMhlMdlMglLglLclLclLokLokLkkLkkLgkLgkLckLckLojLljMljMijMijMijMjjMjjMkjMkjMhjNhjNijNijNnjNnjNnjNckNckNgkNgkNkkNkkNnpGlpHkpHipIgpIapJkoJdoKnnKgnKlmLemLnlLblLkkLbkLjjLmiLdiLohKfhK`hKkgJegJcgImfIkfHhfHjfGkkNikPbmJcmKnjJojK`lKalKccFobFdbGgbGmbHicHocGlcGgdFkdF`eGceGidHdbI`eI`eJjdJfdJlcJjcJnbJdbJdbIlcIlcJgcLecKodKodKaeLebLceNaeMmcMncNkcNobNfbNgbMmbMacM4`o+XcoYjp[fr[ctY`tXfrVjpV`oX3ni\liY4hqY3gm[4kn[&bq,Rbq/Kkr-McrMlqNoqNarOmrOgsNdsNksMosMdtNgtNmsOlqPdtPdtQnsQjsQdsQnrQbrQlqQlqPdsPdsQhsRlsRftRetSnsSjsS`rRlqRnqSgtUetTesTfsUorUcrUnqUoqTarTirT/bt,Obt/Kgv-JcvJiuKkuKavLmvLcwKawKgwJowJaxKcxKmwLhuM`xM`xNnwNfwN`wNnvNbvNhuNhuM`wM`wNkvPivOcxOcxOaxPiuPhuRfvQfwQ`xRaxRgwRgvRiuRhuR-bi,Obi/Kkj-JgjJmiKoiKejLakLgkKekKokJclJelKglKalLliMdlMdlNblNnkNdkNbkNfjNliNliMdkMdkNalOflOelPclPokPekPckPgjPmiPniOejOfkOekPclRflRglQblQfjQoiQniRgjRckRfkRgkQbkQ0bp,Obp-C3juCku4^)oa^ma:L0fr,OnqOhqPkqPlqQhrQcsP`sPfsOnsO`tPctPlsQkqQctQ`tSmsSesS`sSirSmqShqSkqQcsQ`sSjrUhrTnsTnsT`tUhqUesVmsVbtVatWosWgsWmqViqVkqW.bvObv/Kkw-JcwJmvKovKawLmwLcxKaxKkxJoxJeyKgyKmxLlvMdyMdyNnxNjxN`xNnwNbwNlvNlvM`xM`xNmxOfyOeyPoxPkxPaxPowPcwPmvPnvOawObxOaxPnxQgyQfyRoxRkxRbxRowRcwRnvRovQbwQnwQcxQjxQnxQcxQbxR2ik,Pjk/Kom-JkmJamKcmKimLanLknKinKonJgoJioKkoKeoL`mMhoMhoNfoNnnNhnNbnNjmN`mN`mMhnMhnNcnPanOkoOkoOioPamPkoRjoQjnQjnRcnRkmRbmRcmQjmQnmQ1jm,Ojm/Kjo-KfoKonKnnLdoM`pMfpLgpKnpKbqKkqKjqL`qMonMkqMkqNaqOmpOgpNapOeoOonNonMgpMgpNnoQloPfqPfqPhqQlnQnoSloRgqRgqRiqSmnS/jp/Kjp.R%noRno,Rcr-MoqMdqNgqNmqOirOorNlrNgsMksM`tNctNisOdqP`tP`tQjsQfsQlrQjrQnqQdqQdqPlrPlrQdsRhsRbtRatSjsSfsSlqRdqRfqSgrUerTlsUlsUbtUfqU(cdCadEleGhgGaiEciChgBleBcdC*a`,Vb`/Kgb-MoaMhaNkaNmaOibOccN`cNgcMkcM`dNcdNicOhaP`dP`dQjcQfcQ`cQjbQnaQhaQhaP`cP`cQdcRhcRbdRadSjcSfcSlaRhaRjaSmaTkaTjaUoaUkcUbdUcdTicTacTkbTjbUccU(if,Vjf/Koh-MkhM`hNchNihOeiOkiNhiNcjMgjMljNojNejO`hPljPljQfjQbjQhiQfiQjhQ`hQ`hPhiPhiQ`jRdjRnjRmjSfjSbjShhR`hRbhSejTojTnjUgjUcjUjiUgiUkhUbhUchTihTeiTkiTajTejTkiTjiU+aw,Vbw/Kdy-K`yKixKhxLbyLnyL`zLazKhzKlzKa{K`{LnzLixMa{Ma{NozNkzNazNoyNcyNixNixMazMazNmzOc{Ob{PozPkzPbzPoyPcyPjxPkxOayOczObzPhxRfyQjzQ`{Rb{RhzSdySjxRhxRec.EecEec/L1bk-FakHhlJdnJapHbpFdnEhlEbkF+n`.Dl`FgbGcdGleFneDcdBgbBn`D)fk/Kgk.I#khIkhI,ji:Fji5J3feJfe1P/baP`a.Z-`iZ1bf/K`f.N'opHnpJirLetLnuJouHetGirGopH(f{/Kg{.I)g|3Ld|2H'dsHgs.I%gxHfxJazLm{Lf}Jg}Hm{GazGgxH#`fIcfJmgLeiLckJ`kIeiGmgG`fI(oxHnxJezLa|Ln}Jo}Ha|GezGoxH0ox9W2osWls.N)cnQanSloUdqUasScsQdqPloPcnQ2eqMdqObsPjtPdvOevMjtKbsKeqM1icMhcOfePbgPhhOihMbgKfeKicM)jp/Kjp.R'nj/Kmj.W$mkW,ojQmjShlUdnUmoSooQdnPhlPojQ$fiVeiXckYolYenXfnVolTckTfiV-cn/AbnCioEeqEbsCcsAeq@io@cnA,jqKhq._-`i_+f|/Kf|.[#b}[-ifYhf[fh\bj\hk[ikYbjWfhWifY#jzZiz\d|^`~^i\jZ`~Yd|YjzZ-hf^kf_fh/AbjAkk._hk^bj\fh\hf^0jt/Kht._3`q_bq7E.flEdl6NjnWfnWomWnmXdnY`oYfoXgoWnoWbpWkpWjpX`pYomYkpYkpZap[mo[goZao[en[omZomYgoYgoZip]kp[go[do]ao]en]lm]mm\gn[kn[hp^jp_bp_lm^-kp3Lkp/B'fbCdbEcdFkeFdgEfgCkeAcdAfbC&hnCknDbpFnqFksDhsCnqAbpAhnC'ndKldD&`qD'mdD+agDbgK/ctE0obEob1J3oiJli5O1dsOfs:F,n~Fo~9T3kxTkx1M/cdMcd/E.cvEksDjsFauHmvHjxFkxDmvCauCksD/kqDjqFesHauHjvFkvDauCesCkqD.hsIksJbuLnvLkxJhxInvGbuGhsI'bzVn|V`zXl|XczXo|Xo|Ye|ZizZczYczX`|[d|[m|[l|\f|\b|\hz[`z[bz\(aeQmfQggQegRnfRbeRafQbfRa`QebQebRnaRjaReaRbaRf`Ra`Ra`QeaQeaRjaKjaPjfKjfPmhWnhP'j~Pi~W(nc^nc^bd^bd^fd^ed^id^hd^ld^od]od]nd]nd]md]ld]ld]kd\kd\fd\fd\bd\bd\nc\nc\jc\fc\fc\bc\bc\ob\ob\lb]hb]ib]jb]jb]kb]kb]lb^lb^mb^ac^bc^fc^fc^jc^nc^'i~Wh~Xn~XaYdZnZ(d`[n`[ga[`b\ib\ec\ad\md\de\cf[jf[dg[ngZ`hZehYjhXlhXmhWnc^lc0@ed/Zfd[ebZfb[kcZhc[bkVnjVgjVfjWljXdkXnkWokVblVjlVolVnlWhlXgjXolXolYilZalZokYekZmjZgjYgjXokXokYdj[ej\gj[ol[dl[dj]ej^gj]ol]dl]nl0@ll/_lk_lk0@fk@nj@dj@ej/_lj_`k_%j~Kj~G&bqG'ld4G&duGgu2@3cn@`n/GhaGiaL,jn4[in1ZiyZky/F-keFjeK.cgEagGhhIdjIalGclEdjDhhDcgE1niKliG0d}Gg}0T&cqT`q/]es0EmrEjrEirForFksFmsFnsEetEitEbuEauFktFjrGbuGbuHktHgtHnsHksHorHjrHjrGnsGnsHftIjtI`uJcuJhtKdtKnrIjrIhrKitM`uMauLktKorKirLhrMmrMisMlsMmsLksK2bi/F`iHojIglI`nHbnFglDojDbiFikGa~Gb~K%ewLfwG$jzGcxFbxHlyJd{Jb}Hc}Fd{ElyEcxF&knFjnH`pJlqJjsHksFlqE`pEknF(bvKbvGjfGcdFbdHleJhgJbiHciFhgEleEcdF&hmYhmZ`kY`kZbkYjmYckZkmZak\im\`k]hm]hm^fm^bm^hl^hl]kl]bk^ak_im_im0@fm@bm@il@fl@jk@ak@ak/_il_il0@io/QeqQoqQmqRfqRjoRipQjpRbqKbqPbvPnkPbqYbvPcq[cq[fq[jq[jq[mq[mq[mq[`r[crZcrZbrZbrZarZ`rZlqZoqYoqYjqYjqYfqYbqYbqYnpYjpYjpYfpYgpYcpY`pZ`pZmoZnoZnoZooZooZ`p[ap[ap[ep[fp[jp[jp[op[cq[cq[`q]lqUmqVhoUioVnpUlpVguXcuXhtYktYauZmuZcvY`vYkvXovXdwYgwYmvZht[dw[dw\nv\jv\`v\nu\bu\ht\ht[`v[`v\hv]lv]fw]ew^nv^jv^`u]ht]jt^ov0@fw@gw/_mv_au_kt_jt0@cu@ou@bv@cv/_mu_%dqParPjrPgsP`tQhtQeuQbvQjvQfwQbxQoxQfyQbzQnzQj{Qa|Ql|Qh}Qc~Pn~PiP&``P%j~Kj~PjsKjsParQetQetRbtRfrRarRarQa}Qm~QgQeRn~Rb}Ra~Qb~RewLewQavSluSnuR`vRhwRbxR`xSiwShyRh{Rh{Se{Sa{SlzSezSmyShyShyRlzRlzSmzLmzQ`m[ho[bm\jo\`m]ho]io^bo^nn^en^dn]gn]bm^om0@mm/_go_go_jo0@bm@&c`/U``P%gqUdqPgqUfqViqWkqWjqXmqYcrYbrZer[or[bs\ds]ns]at^kt^au_ku_mu0@kv@`wAjwA`xBmxB&c`/Ub`Va`W%oWnXiYkYfZa[o~[j~\`~]n}]e}^o|^i|_c|_i{0@c{@hzAnyAdyBmxBnxDnxDbyDayDeyDiyDhyDhyDoyCoyCnyCmyCmyClyClyCkyBkyBjyBfyBayBayBmxBmxBixBexBexBbxBbxBowBowBlwChwCiwCiwCjwCkwCowClwDlwDaxDaxDexDfxDjxDnxDnxDlxFiy/_jy0@ew/_fw0@kx/_ix0@&db/[la[ia[ha\na\jb\`c\ac[dc[lc[ad[`d\nc\ha]`d]ad^nc^fc^ac^jb^na^ia^ha]`c]ac^cd0@ad/_ac_bc0@kb@oa@ja@ka/_ma_eb_ha0BfbAfcA`dBbdBdcCdbCjaBhaB'jb/SibOadQmeQgfQefRneRbdRaeQbeRajQalQalRnkRjkRekRnjRfjRajRajQekQekRnjKnjPmlOjlOclOlkPekPnjPkjP`jQhiQaiQihQahQigQagQifQ`fQheQcePjdPedPlcPgcObcOibOndKndPnlSmlOjbShbTjbTobTmbUobUacVbcVdcWjcWocWmcXbdXddYidYbeYdeZieZneZgfZhf[ag[fg[og[nlSllTnlTolTmlUklUilVflVdlWblWokWikXfkX`kYmjYjjYdjZajZjiZgiZlh[ih[bh[og[lnUdqUnnVfqVmnWeqWeqXcqXkpXepXepWdpXonXjpYbqYgqYfqZ`q[hp[boYnnYln[og]mg_og]og]ch]gh]gh]jh]jh]jh]mh]lh]lh]oh\oh\nh\mh\mh\hh\hh\hh\gh[gh[ch[og[og[kg[kg[gg[gg[`g\`g\lf\mf\mf\nf\kf\kf\lf]lf]mf]nf]bg]bg]gg]gg]kg]kg]og]giXdiZcgX`gZehYghY&dU`Uj~Ui~VbVnV'a`Vb`Ud`Ul`UbaUaaVn`V&i~W'aaWaaXo`Xg`Xa`X&oXcXi~Xi~W'a`Wa`X`a[baYb`Yb`Z&l[`[j~Zk~YbYfY'l`]ca\`a\o`[&c[h~\k~\`]l]'c`\``\&o[-brVjtV`rXhtXcrXktXktYatZerZcrYcrXls[`t[it[ht\bt\ns\dr[`r[br\a}Qm~QcQaRn~Rb}Rm}Qn}RmwQazQazRnyRfyRayRnxRbxRmwRmwQayQayRfyKfyPj~Kj~P.i`Wj`P-fvPevWj{^j{^n{^n{^b|^b|^e|^e|^d|^h|^k|]k|]j|]j|]i|]i|]h|]h|]g|\g|\g|\b|\b|\n{\n{\j{\j{\f{\f{\b{\b{\nz\oz\kz\kz\hz]hz]ez]ez]fz]fz]gz]kz]hz^hz^iz^mz^nz^b{^b{^f{^f{^j{^evWgvWjvXlvYbwYewZkwZ`x[jx[cy[hy\ez\mz\j{\a|\m|\d}\o}[f~[l~[gZmZ.b`Yd`Yj`Xk`Wi`W-j{^h{0@e|/Zf|[azZbz[g{Zd{[.nbVjbVcbVbbWhbXdcXjcWkcVbdVfdVodVndWddXcbXodXodYedZadZkcYecZibZcbYcbXkcXkcYnd\ld[hc[hc\fc\jb\`b\ab[hb[lb[hb]bb]ab^jb^fd^md^nd]dd]hc]fc]ec^jc^*d}Ud}P+bgKbgP*jKjPj~Ra~Rc~Qi~Q+a`Qg`Qe`Rb`RieQegQkgQigRfgRjeRefQffRecLecQlaR`dR`dSmcSecS`cSmbSabSlaSlaR`cR`cS*d}Pl}Pe~Pn~PgPoP+d`Ql`QdaQmaQebQmbQecQmcQedQmdQdeQleQdfQofPggPngPehPlhP`iP*ayZi{Zcy[k{[by\j{\j{]g{]oz]jz]jz\hz]cy]f{^h{_k{_d{0@lz@kz/_`z0@dy@cy/_`y_fy^hz_kz_d}Uf}Uh}Vj}Vh}Wj}Wl}Xb~Xc~Xe~Yk~Ym~ZcZd[j[o[+a`\j`\l`]ea]ja]cb]db^mb^fc^`iU`iP`iUbiU`iVbiV`iWnhWlhXjhXkhXehYchYmgZkgZdg[bg[of[ef\bf\le]ee]be]kd]`d^mc^fc^gc0@gc@kc@oc@oc@bd@bd@ad@ed@dd@dd@gd/_gd_fd_fd_ed_ed_`d_`d_cd^oc^oc^jc^fc^fc^bc^bc^ob^ob^kb^hb_db_eb_eb_fb_fb_cb_gb_db0@db@eb@eb@jb@jb@ob@ob@cc@cc@gc@gc@ecBcd/[`d]oa[la]`c\bc\ekZakZjjZij[ck[ok[al[blZilZmlZfmZem[ol[jj\fm\fm]ol]kl]bl]ok]ck]jj]jj\bl\bl]dm0@fm/^bl^cl_lk0@`k@kj/_hj_bk^fk^kl0@ol@emAdmBmlBilBck@kj@ijB)bd/VjfV`dXhfXcdXkfXkfYefZedZcdYcdXle[df[if[hf\ff\ne\dd[`d[bd\aoQmpQgqQeqRnpRboRapQbpRajQalQalRnkRjkRekRnjRfjRajRajQekQekRfkKfkPjpKjpPmrWnrPjhPihWjm^nm^nm^bn^bn^en^en^in^hn^hn^kn]nn]nn]mn]in]hn]hn]kn\gn\fn\bn\bn\nm\nm\jm\jm\fm\fm\bm\bm\ol\ol\hl]hl]il]il]jl]jl]kl]hl^hl^ml^ml^am^bm^fm^fm^jm^jm^ihWhhXjhXmhYciYiiZcjZij[ck[hk\el\am\jm\en\ao\ho\gp[mp[gqZmqZcrYerYjrXlrXmrWjm^hm0@en/Zfn[alZbl[gmZdm[buVjtVgtVftWhtXduXnuWouVbvVjvVovVnvWhvXgtXovXovYivZavZouYeuZitZgtYgtXouXouYhv[mv[lv\jv\bv\lu\fu\jt\dt\et[ht[mu[lu\hv]nv]mv^jv^bv^mu^fu^jt^et^ft]ht]nu]mu^b`VjbV``XhbXc`XkbXkbYebZe`Zc`Yc`Xla[db[ib[hb\fb\na\d`[``[b`\(euQawQkwQiwRbwRfuRevQfvRizQm|Qm|Rf|Rb|Rm{Rj{RnzRizRizQm{Qm{Rf{Kf{PbvKbvPmsWnsPb~Pa~Wby^by^fy^jy^jy^my^my^my^`z^`z^cz]bz]bz]az]az]`z]`z]oy\oy\ny\jy\jy\fy\by\by\nx\nx\jx\jx\fx\gx\cx\`x]`x]ax]ax]nw]bx]cx]`x^`x^ax^ex^ex^jx^jx^nx^nx^by^a~W`~Xb~Xm}Yk}Ya}Zk|Za|[k{[`{\ez\my\by\ex\mw\`w\kv[mu[guZauZktYetYbtXlsXmsWby^`y0@iz/Zjz[exZfx[kyZhy[jpVfpVooVnoWdpX`qXfqWgqVjqVbrVgrVfrW`rXooXgrXgrYarZiqZgqYaqZepZooYooXgqXgqYlo[mo\oo[gr[lq[lo]mo^oo]gr]lq]np0@lp/_fr_fr_dr0@lo@*bh/SahOedQafQkfQifRbfRfdReeQfeR)i~Q*m`Qm`Rf`Rb`R)mRjRn~Ri~Ri~QmQmR*b`Kb`P)m}Ob~Ok~Ol~PePnP*c`Pk`P`aQhaQabQibQacQecQmcQddQldQgePoePbfPifP`gPggOngOahOneKneP)n}Sm}O*bhS`hTbhTchTmgUogUlgVjgVkgVegWbgWlfXmfXkfXdfYmeYkeYdeZaeZndZgdZ`d[ic[fc[cc[)n}Sl}Tn}To}Ta~Uc~U`~Vf~Vg~Vi~Wn~W`XeXgXhY*a`Yg`Yh`Zm`ZbaZkaZla[eb[jb[cc[)dyU`|UfyVb|VeyWa|Wa|Xk{Xg{XmzXmzWlzXgyXf{Yj{Yc|Yb|Zh{[d{[nyYfyYdy[*cc]ac_cc]cc]gc]gc]kc]jc]nc]nc]mc]ad]`d]`d]cd\bd\bd\ad\mc\lc\lc\kc[kc[gc[gc[cc[cc[ob[kb[kb[gb[gb[`b\`b\ab\ma\na\na\oa\la]la]ma]ab]bb]bb]fb]gb]kb]kb]ob]cc]kcXhcZkaXhaZmbYobYdjUliUjiUiiVniVjjVakVbkUdkUlkUblUalVnkViiWalWalXokXgkXakXkjXoiXiiXiiWakWakXnkYclYblZlk[dk[bkZhj[li[jiZkiYniYckYbkZgk[ok[`l\cl\lk]dk]oi[ki[hi],osXnsPbhPchXnmKnmPbiRmhRohQaiQijQckQakRjjRfjKfjPjqKjqPilQinQinRfnRbnRmmRfmRnlRilRilQmmQmmRapQmqQgrQerRnqRbpRaqQbqRchXbhYehZkhZnh[ai\ki\aj]oj]dk^al^nl^jm^fn^bo^mo^dp^cq]iq]gr\ir\bs[gsZisZnsYosXhc[df[jc\ff\hc]df]ef^ne^bd^ic^hc]me_gf_ff0@oe@ke@be@od@cd@jc@kc/_ad_ce_be0@om@mmBom@cn@gn@gn@kn@jn@jn@nn@mn@mn@`o@`o@co/_bo_bo_ao_mn_ln_ln_hn_kn^kn^gn^fn^bn^nm^nm^jm^km^gm^gm^`m_`m_`m_ml_ml_nl_nl_ol_ll0@ll@ml@am@bm@bm@fm@gm@km@km@om@om@kn/[hn]kl[hl]lm\nm\`v[hu[eu[du\ju\fv\lv\mv[`w[hw[mw[lw\jw\du]lw]mw^jw^bw^mv^fv^ju^eu^du]lv]mv^iw_ow_nw0@kw@cw@nv@gv@ku@fu@gu/_iu_ev_ov_aw_iw_ov_nv0@juAduBfuBhuChwCnwBlwBjwAnvAdvBfvBlvC+no/VfrVloXdrXooXgrXgrYarZapZooYooXhq[`r[er[dr\br\jq\`p[lo[no\mzQi|Qc}Qa}Rj|RnzRm{Qn{RiuQmwQmwRjwRfwRmvRjvRbvRiuRiuQmvQmvRbwKbwPf|Kf|Pi~Wj~PftPetWfy^jy^jy^ny^ny^az^az^ez^dz^dz^gz]gz]jz]jz]ez]ez]dz]dz]gz\cz\bz\ny\ny\jy\jy\fy\fy\by\nx\nx\nx\kx\kx\dx]dx]ex]ex]fx]fx]gx]gx]dx^dx^ix^ix^mx^nx^nx^by^fy^fy^etWgtWftXhtYotYauZkuZav[jv[`w\lw\ex\ay\iy\ez\lz\h{\b|[i|[c}Zi}Zo}Y`~Yf~Xk~Wi~Wfy^dy0@az/Zbz[mwZnw[cyZ`y[,n`Vf`Vc`Vb`Wd`X`aXfaWgaVnaVbbVkbVjbW`bXc`XkbXkbYabZmaZgaYaaZe`Zc`Yc`XgaXgaY`b[ib[hb\bb\na\da\ba\f`\``\a`[d`[ea[da\a`]b`^c`]kb]ab]-gkXfkP,jPkX-jeKjePj`Re`Rg`Qi`QabQkbQibRbbRnaKnaPbiKbiPadQafQafRneRjeReeRndRfdRadRadQeeQeeRigQeiQoiQmiRfiRjgRihQjhR,kXjYmZ-c`Zf`[m`\ca\ma]gb]`c^ic^fd^be^ne^jf^eg^`h^kh]ei]oi\ej\jj[ojZakZfkYgkX,`{[l}[b{\n}\`{]l}]m}^f}^j{^a{^`{]e}_o}_n}0@g}@c}@j|@g|@k{@b{@c{/_i{_k|_j|0@-ke@ieBke@ke@oe@oe@cf@bf@ff@ff@ef@if@hf@hf@kf/_jf_jf_if_if_df_df_df_cf^cf^oe^ne^je^je^fe^be^ce^od^od^ld_hd_hd_id_ed_fd_fd_gd_dd0@dd@id@id@jd@nd@nd@od@ce@ce@ge@ke@cf/[`f]cd[`d]de\fe\hm[`m[ml[ll\bm\nm\dn\en[hn[`o[eo[do\bo\ll]do]eo^bo^jn^en^nm^bm^ml^ll]dn]en^am_ol_nl0@cm@co@fo@go/_ao_en_om_nm0@gn@llBjmAjnAdoBfoBhnChmCnlBllB1ko/XjoPncPocXniKniPbeRidRkdQaeQifQofQmfRjfRbfKbfPjmKjmPehQijQijRfjRniRiiRfiRjhRehRehQiiQiiRalQmmQcnQanRnmRblRmlQnlRocXadY`dZgdZid[od[ae\ke\af]kf]dg^mg^jh^bi^ni^jj^bk^mk^dl^ol]im]cn\en\on[ao[goZhoZioYkoX0h[1`b[0j\1bb\0h]1`b]ab^na^0n^i^h]1ma_cb_bb0@oa@ga@ba@k`@0o@j@k/_m_1ca_ba0@oi@miBoi@oi@cj@cj@gj@fj@jj@jj@ij@mj@mj@lj@lj@oj/_oj_nj_nj_mj_mj_lj_hj_hj_kj^gj^gj^cj^bj^ni^ni^ji^ji^gi^gi^gi^ci^`i_lh_lh_mh_mh_nh_nh_kh_oh_lh0@lh@mh@mh@mh@bi@bi@fi@gi@gi@ki@ki@oi@kj/[hj]gh[dh]hi\ji\lq[hq[aq[`q\jq\fr\hr\ir[`s[ds[ms[ls\fs\`q]ls]ms^fs^bs^ir^fr^jq^aq^`q]hr]ir^bq_bq0@`q@ls@bs/_bq0AbqB`qBlsBbsAasCesCosCnsDgsDcsDiqCaqCcqD/gv/XfvPjjPkjXjpKjpPjkRekRgkQikQamQkmQimRbmRnlKnlPbtKbtPaoQaqQaqRnpRjpRepRnoRfoRaoRaoQepQepRirQetQotQmtRftRjrRisQjsRkjXjjYljZckZfk[hk\bl\hl]bm]lm^en^bo^no^jp^bq^nq^ir^`s^ns]dt]nt\du\ju[cvZ`vZfvYgvX`f[lh[bf\nh\`f]lh]mh^fh^jf^af^`f]eh_oh_nh0@gh@ch@jg@gg@kf@bf@cf/_if_kg_jg0@kp@ipBkp@kp@op@op@op@bq@bq@fq@eq@eq@hq@hq@hq@kq/_jq_jq_iq_iq_eq_dq_dq_cq^cq^op^op^np^jp^jp^fp^bp^cp^cp^oo^oo^ho_ho_io_eo_eo_fo_fo_go_do0@do@do@io@io@jo@no@no@cp@cp@cp@gp@kp@cq/[`q]co[`o]dp\fp\hx[`x[mw[lw\bx\nx\dy\ey[hy[`z[ez[dz\bz\lw]dz]ez^bz^jy^ey^nx^bx^mw^lw]dy]ey^ez_gz0@cz@mw/_dz0CfzAfyAfyBlxC`xCnwBlwBbxAjxA.hr/YhrZ`pY`pZbpYjrYcpZkrZap\ir\`p]hr]hr^fr^nq^hq^hq]kq]bp^ap_ir_ir0@fr@nq@iq@fq@jp@ap@ap/_iq_iq0@it/QevQovQmvRfvRjtRiuQjuRbvKbvPb{PnpPbvYb{Pcv[cv[fv[fv[jv[jv[mv[mv[mv[`w[`w[cwZcwZbwZbwZawZawZ`wZlvZovYovYkvYjvYfvYfvYbvYbvYnuYnuYjuYjuYguYguYcuY`uZ`uZauZmtZntZntZotZotZ`u[`u[au[au[eu[fu[ju[ju[nu[ou[cv[cv[`v]lvUmvVhtUitVnuUluVgzXczXhyYkyYazZmzZc{Y`{Yk{Xo{Xd|Yg|Ym{Zhy[d|[d|\n{\j{\`{\nz\bz\hy\hy[`{[`{\l{]f|]e|^n{^j{^a{^nz^bz^iy^jy]`z]b{]a{^e|_g|0@o{@iy/_0jvSivOasQmtQcuQauRntRbsRmsQnsRamQeoQeoRboRjnRenRbnRfmRamRamQenQenRjnKjnPelOjlOcmOdmPimPanPfnPonPcoPhoQloQepQmpQaqQiqQmqQerQmrQ`sQhsQosPgtPjtPauPeuPluPcvOfvOivOjtKjtPflSelOjvShvTivTkvThvUivUgvUdvVfvVcvV`vWnuWkuWhuXeuXcuXltYitYftYctYlsZisZfsZcsZlr[hr[ar[nq[kq[flSdlTelTklThlUilUklUllVnlVcmV`mWfmWgmWhmXmmXcnX`nYenYjnYonY`oZeoZnoZcpZdp[hp[mp[fq[kq[`hUhjUbhVjjVahWijWijXcjXoiXeiXeiWdiXchXniYbjYkjYjjZ`j[li[fhYbhY`h[kq]iq_kq]kq]oq]oq]cr]cr]fr]fr]fr]ir]ir]hr]hr]kr\kr\jr\jr\jr\ir\ir\dr\dr\dr\cr[cr[oq[oq[kq[kq[gq[gq[cq[cq[op[lp\lp\hp\ip\ip\jp\jp\fp\gp\gp\hp]hp]ip]ip]jp]np]np]op]cq]cq]gq]gq]kq]grXdrZcpX`pZeqYgqYlxUhxUbxUaxVjxVfyViyVjyU`zUdzUnzUmzVfzVaxWmzWmzXgzXczXiyXgyXkxXaxXaxWiyWiyXdz[nzZozYfzYjxYcxYbxZhx[dy[jyZkyYfyY`y]cy[iz\iz\oz\cx\3hgUhgP2b~Kb~P3feKfePndRidRkdQmdQifQofQmfRjfR2e}QaQkQiRbRf}Re~Qf~R3iaLiaQ`aR`cR`cSmbSibSdbSmaSeaS`aS`aRdbRdbShgPdgPmfPifPbfPnePgePcePhdQddQlcQicQacQmbQebQabQiaQeaQm`Qi`Qa`Q2mQdQ`Qh~Qg~Po}Pj}Pb}Pm|Pi|P`|Pl{P3eiZalZgi[cl[fi\bl\bl]kk]gk]nj]nj\lj]gi]jk^`l_cl_hk0@dk@oj/_hj0@li@gi/_di_ni^lj_oj_hgUjgUkgUigVfgVdgWegWggW`gXbgXofXlfYjfYgfYefZbfZoeZhe[fe[ce[`e\id\fd\cd\lc]ic]fc]cc]hb^eb^bb^ja^2l{Ul{Pl{Un{Uo{Um{Vn{V`|Wa|Wc|Wd|Xf|Xk|Xh|Yn|Yo|Ya}Zf}Zk}Zh}[n}[c~[d~\i~\n~\c\h]m]3b`]g`]h`^aa^fa^ja^ka0@oa@oa@cb@cb@gb@fb@fb@jb@ib@ib@ib@lb@lb@ob/_ob_ob_nb_nb_mb_ib_hb_hb_hb_gb^gb^gb^cb^cb^na^na^ja^ja^fa^ga^ga^ca^ca^ca^l`_l`_l`_i`_i`_j`_j`_k`_k`_k`_h`0@h`@i`@m`@m`@n`@ba@ba@ca@ga@ga@ga@ka@ka@ka@iaBcc/[`c]ca[`a]db\fb\2ixZaxZnwZmw[cx[ox[ey[fyZiyZazZfzZez[cz[nw\fz\fz]cz]ky]fy]ox]cx]nw]nw\fy\fy]`z0@gz/_dz_bz^bx^lw_ow_`x0@lx@gy/_dy_nx^cz0@ezAdzBazBiyBdyBmxBaxBlwBmwAcx@ox@eyAky@cz@eyAdyBdh/YdhZleYleZneYfhYoeZghZme\eh\le]dh]dh^ng^jg^dg^dg]gg]ne^me_eh_eh0@ng@jg@eg@nf@bf@me@me/_eg_eg0@aj/QmkQglQelRnkRbjRakQbkRjkKjkPnpPjfPjkYnpPkk[ok[nk[bl[bl[bl[fl[el[il[il[hl[hl[klZolZnlZnlZmlZilZilZhlZhlZklYglYglYblYblYblYnkYnkYjkYjkYfkYfkYbkYbkYojYojYojYljZhjZijZijZijZjjZjjZkjZkjZhj[hj[mj[mj[mj[nj[bk[bk[fk[fk[kk[kk[kk[hk]dlUelV`jUajVfkUdkVcpXkoXdoYgoYioZepZopYlpYcqXkqXlqYoqYiqZdo[lq[lq\jq\bq\lp\fp\jo\do\do[lp[lp\fp^dp]kq]kq]mq^eo^kq0@nq@oq/_iq_io_go_fo0@ko@gp@np@op/_ep_,nmKnmH*foHeo0JacJac/_le0@he@be@aeAjeAffAifAjf@`g@dg@ng@mgAfgAaeBmgBmgCggCcgCifCgfCkeCaeCaeBifBifCfgDogDngEdgF`gFjfEdfFheFbeEceDjeDkfDjfEcgFggFlgGogGegHagHkeFceFaeH-j~/Kh~J.`vJ'ee0WdeYbgZjhZdjYejWjhUbgUeeW)hm@km3Llo0YhoYboYaoZjoZfpZipZjpYlpYdqYjqYiqZfqZao[iq[iq\gq\op\ip\gp\ko\ao\ao[ip[ip\fq]kq]jq^dq_lp_jp^dp_ho_bo^co]jo]kp]jp^gq_hq1@kq@eqAmpAkp@epAioAco@`o@ko0_hp1@kp@'mg/_ng3Kei0EmhEjhEihFohFkiFajFbjEejEmjEbkEakFojFjhGbkGbkHojHgjHbjHkiHohHjhHjhGbjGbjH`kKbkIbjIcjJhiKlhKkhJhhJnhIfiImjM`kMakLojKohKihLhhMmhMiiM`jMajLkiKot/JmtLdvN`xNmyLoyJ`xIdvIotJe5FewFfw/K.`v]cv3LgoLhw0Y`wYnvYmvZbwZnwZaxZbxYhxYlxYfyYeyZnxZmv[ey[ey\ox\kx\ax\ow\cw\mv\mv[ax[ax\nx]gy]fy^lx_hx_bx^lw_`w_nv^ov]bw]cx]bx^gy_ey1AmxAov0_(oc3Llc0@leYheYbeYaeZjeZffZifZjfY`gYdgYngYmgZfgZae[mg[mg\gg\cg\if\gf\ke\ae\ae[if[if\ce]ce^ae^mg^gg]ce_ce1@ae@mg@gg0_lg1CngAjfAjfBdfCheCbeBceAjeAneA+nt:Fnt@2np@op1]0kq]iq/_`s0YhrYfrYerZjrZfsZmsZnsY`tYhtYntYmtZjtZer[mt[mt\kt\ct\ms\gs\kr\er\er[ms[ms\ht_nt^ot]jt]jr]gr]fr^hr_ds_ns^os]fs]as1Acs0_it1@it@ot@gr@(`y0@by1SfgSgg3Lhz0Y`zYnyYmyZbzZnzZe{Zf{Yh{Y`|Yf|Ye|Zb|Zmy[e|[e|\c|\k{\e{\oz\cz\my\my[e{[e{\oy]oy^my^e|^o{]oy_oy1@my@e|@o{0_hz1CjzA`|B`|Bf|BnyB*ov3Lnv1P-jePie0BhgYdgYnfYmfZfgZbhZehZfhYlhY`iYjiYiiZbiZmf[ii[ii\ci\oh\eh\ch\gg\mf\mf[eh[eh\fg]of]nf^dg_`i_ji^ki]bi]fh]ch]bh^dh_mf1@kg0_oh_ii1@ji@mhAigAnf@mf@h{0@k{3Ll}0Yd}Yb}Ya}Zf}Zb~Zi~Zj~Yl~Y`YjYiZbZa}[i[i\c\o~\i~\c~\g}\a}\a}[i~[i~\h_j]j~]j~^`~_d}_b}^c}]f}]n}]g}_`}1@c}@e}AaAk@h@c0_k~_`~1@c~@i~A+dy0@dy3J*dbJgbL+h{0Y`{YnzYmzZb{Zn{Ze|Zf|Yh|Y`}Yf}Ye}Zb}Zmz[e}[e}\c}\k|\e|\o{\c{\mz\mz[e|[e|\b}]g}]f}^`}_h|_f|^l{_`{_nz^oz]b{]g|]f|^oz_lz1Anz@f}@o|0_*cs3Lcs1M,omMmm0BdoY`oYjnYinZboZnoZapZbpYhpYlpYfqYeqZnpZin[eq[eq\op\kp\ap\oo\co\in\in[ap[ap\np]gq]fq^lp_hp_bp^lo_`o_jn^kn]bo]no]cp]jp]np]cp]bp^co_hn1@kn@aoAmpAgq@dq@op0_cp_lo1@oo@apA1ko3Lko1GoiGmi0B`lYhkYfkYekZjkZflZmlZnlY`mYhmYnmYmmZjmZek[mm[mm\km\cm\ml\gl\kk\ek\ek[ml[ml\gk]gk^ek^mm^gm]gk_gk1@ek@mm@gm0_bm1AjmAomAnmBhmC`mCjkAfkAdkC/az5\`zRhpRip0BlqYhqYbqYaqZjqZfrZirZjrY`sYdsYnsYmsZfsZaq[ms[ms\gs\cs\ir\gr\kq\aq\aq[ir[ir\ns]ls_ds_bq]ms1Aos0_kr_kr1@erAiqAcq@`q@kq0_oq_%lxFnx3Egz0HoyHiyIhyJmyJizJlzJmzIg{Hk{Ha|I`|Ji{JhyK`|Ka|Lj{Lf{LmzLjzLnyLiyLhyKlzKmzLc|Na|MmzMnzNkzNoyNjyNkyMmyMezMhyPfzOf{O`|Pb|Pd{QdzQjyPhyP0k`3Lh`2H`t1]ct^mu2@iw@cy1^`y]iw[mu[`t]3oc6Vlc7A2hyAjy1V(bkVck3L3ge6VceVhdWkdWaeXmeXcfW`fWgfVofV`gWcgWmfXhdY`gY`gZnfZffZ`fZneZbeZhdZhdY`fY`fZid[jd\kd[cg[if[id]jd^hd^`g^if]mf_bg_ag7@of@gf@af@oe@ce@id@jd6_ae_bf_af7@1cl3Lbl1S*jzSkz3L0kvLkv1],h~2@j~A-e`CmaCjcAhc@ma1^e`^,h~2@-ca3Lca2@ca@)d|H-lwHnw3M4mt2GltIjvJbxJlyImyGbxEjvEmtG)myGlyIj{Jb}Jl~Im~Gb}Ej{EmyG3ai5\ciZ4gwZdw2H/a~G`~InJ0jaJ`cIacGjaE/nEa~G,bvL2nsL,cv3Lbv2L)ngLog3L,ks2KisM`uOlvOixMkxKlvJ`uJksK2gqKeqM`sOhtOevMgvKhtJ`sJgqK,bl4Zal\lm^ho^aq\bqZhoYlmYblZ+n}3Vm}Q,ggLdgRc`L``R+l~Tk~Sh~So~R,g`Rh`Sk`Sd`ToeRkgRahSbhShgTleTofRlfTjcMkcRbbSfdSfdTcdTocTfcTccTkbTbbTbbSfcSfcT+m}Qb~Qk~QcQdRlR,e`Ri`RbaRjaRnaRfbRobRgcRkcRcdRkdRbeRfeRneRffRifRagRhgRlgRghQohQbiQiiQ+fy[n{[dy]l{]gy]o{]o{^i{_a{_oz^oz]nz^ey_h{4@m{@l{Aj{Ab{AlzAjzAnyAdyAey@ly@mz@lzAn}3Vo}Vm}Wo}Wl}Xb~X`~Ya~Yg~Ye~Zj~Zl~[m~[c[d\j\o\,``]f`]k`]l`^ea^ja^oa^db_ib_nb_gc_hc4@ji3ViiQjiVkiViiWkiWdiXfiXdiYaiYciYmhZnhZhh[eh[ch[lg\ng\kg\dg]nf]kf]df^af^ne^ge^`e_md_fd_cd_hc4@icBmcBmcB`dB`dBddBddBgdAkdAkdAjdAjdAmdAmdAldAldAod@kd@jd@jd@jd@ed@ed@ed@`d@`d@lc@lc@hc@hc@dc@dc@`c@ac@ac@mb@nb@nb@jb@kb@kb@hbAhbAibAibAjbAjbAobAobAobA`cB`cB`cBdcBecBicBicBicBkcCdd3]ed^`b]ab^fc]dc^nk[fk[`k\ck\dk]`l]kl\hl\nl[fm[hm\km\dm]ck]km]km^em_ml_kl^al_ek_ck^ck]kl]kl^`k4@hm@bkAjmAimBkmCgmCakB`kEnkDnlDhmEimEolEokEakE`kE+jm3Mhm2]lm],by6Zby7E+j{Ej{4WbaWba2X*jzX,ez6[az[ny[my\bz\nz\a{\b{[i{[m{[f|[e|\n{\my]e|]f|^o{^k{^b{^oz^cz^ny^my]a{]b{^oy_oy7@my@e|@o{6_oy7AoyBmyBe|Bo{Af|Cd|El{EnyC+oi3Lni2Th}Pk}QbS,n`SkbQhbPn`N+bNh}P2cb3L`b2Q1hPkQ2faSnbSkdQhdPnbNfaN1hP*go3Leo2X&exXex<Z(mvZmvIbyNjxNdxOfxOhxPdyPnyOlyObzNjzNlzOnzOhzPgxPozPozQizRazRoyQeyRixRgxQgxPoyPoyQdxSexTgxSozSdzSfyVdyUjzUjzUlzVdxVexWfxXdxXlzXezW+gg2SfgU`iWljWflUglSljR`iRggS/c}3La}2X-`yXbyYiz[e|[b~Y`~Xe|VizV`yX*cxWaxYhy[d{[a}Yc}Wd{VhyVcxW/fzWdzYc|Zo}ZhYjWo}Uc|UfzW-k{X,ggXgg3Lmd2XodYjf[bh[oiYmiXbhVjfVmdXdgY+dqYgq3L,jcMhc2]$lk]%gv3DevFlwHhyHe{Fg{DhyClwCgvD#jz@hzBg|Cc~ChBj@c~2^g|^jz3@+dk2\gk]nl_jn_gp]dp\jnZnlZdk\$di\gi]bk_nl_gn]dn\nlZbkZdi\-bt3MatA#a}A4`cAbcBmdDifDbhB`hAif2_md_`c3AkeA/geAgeLciLbiE(muZnu[asZbs[csZouZ`s\lu\bs]nu]as^mu^nu_gu_cu_jt_it^ht_cs_bs4@nu@ouAduB`uBktAdtBhsBcsAbs@jt@ktAkw3RgyRmySnySdyThwTkxRhxTcyL`yR`~RlsRcyZ`~R`y]`y]dy]dy]hy]ky\oy\oy\ny\bz\az\az\`z\`z\cz[cz[bz[bz[bz[my[my[ly[hy[hy[dy[gyZcyZcyZoxZoxZhx[hx[dx[dx[ex[ax[bx[bx[bx[cx[ow[lw\`x\ax\ax\bx\bx\gx\gx\gx\hx]hx]lx]lx]`y]`y]by^nyVoyWjwVkwWlxWmxWi}Wa}Wn|Wm|Xb}Xn}Xa~Xb~Wi~Wm~WfWeXn~Xm|YeYfZo~Zk~Zb~Zo}Zc}Zn|Zm|Ya~Yb~Zn~[d\g\l~]h~]c~\l}]`}]o|\l|\b}[`~\c~\i}_k}]a^a^g^o|^&f{Vn}Vd{Xl}Xf{Xn}Xo}Yh}Zh{Zg{Yf{Xc}Zk}Zm}[l}\i}\a}\k{Zg{Ze{\'efQahQkhQhhRbhRffRegQfgRaaQecQecRbcRnbRebRbbRjaRaaRaaQebQebRjbKjbPngKngPajWbjP&nPmW'nd^be^be^fe^fe^ie^ie^ie^le^le^oe]oe]ne]ne]me]me]le]le]oe\oe\ke\je\je\fe\ee\ae\ae\md\md\id\id\fd\fd\bd\cd\cd\oc\lc]lc]mc]mc]nc]nc]oc]oc]lc^`d^ad^ad^ed^fd^jd^jd^nd^nd^&mWoWmX'``Yf`Yh`Zn`Zda[ma[fb[lb\dc\ad\id\ae\me\df\lf\fg[mg[dh[nhZ`iZfiYhiYmiXcjWajWnd^ld4@he3Zie[dcZec[jdZhd[blVnkVkkVjkWlkXhlXnlWolVfmVjmVcnVbnWhmXjkXbnXcnYhmZdmZolYhlZlkZkkYjkXnlXolYim\`n\an[kmZokZik[hk\mk\il\ll\ml[klZik]ik^kk]cn]im]/kfDifFdhHliHikFkkDliCdhCkfD(haZhaRdmRdmZggLdgRhjTgjSdjSkjRglRhlSklSdlTckL`kRocLlcRkfRohRohShhTdhTogShgT`gTkfSkfRogRogSccRodRaeSbeSldT`cTocRlcTdmZgmZbm[`m\ol\el]cl]ik^ck^hj_bj_gi_oh_`h4@dg@lf@cf3_ke_nd_dd_oc^ec^ob]eb]cb\la\ja[kaZhaZao\iq\co]kq]bo^jq^jq_dq4@ho@bo3_bo^gq4@hqAkqAeqBaqBkpAepBioBcoA`oAko@hpAkpAegBggCegBigBigBlgBlgB`hB`hBchAghAghAfhAfhAihAihAhhAhhAkh@gh@fh@fh@fh@ah@ah@ah@lg@lg@hg@hg@dg@dg@`g@`g@lf@mf@mf@if@jf@jf@ff@gf@gf@dfAdfAefAefAffAffAkfAkfAkfAlfBlfBlfB`gBagBegBegBlh3]mh^hf]if^ng]lg^'e~\m}\k}\j}]o}]k~]n~]o~\e\i\(c`\b`]'k](c`^c`_'k}^k}_i}_(a`_'j}4@(b`@c`A'hBl}Bk}Aj}@e~Dg~BmCmC(c`C'k}C*dd3UfdPo`RkbRmbSnbShbTl`TkaRhaT)ozRc}Rc}Sl|Td|Tc|Sl{T`{TozSozRc|Rc|Sg|Ld|RbzPgzPlzQa{Qf{Qo{Q`|Rh|Rm|Re}Rj}Rb~Rj~Rn~RgRjR*b`Rj`Rn`ReaRiaR`bRdbRobQbcQicQlcQcdPfdPgbLdbR)`zUbzP*ddUedUgdUddVfdVgdV`dWbdWcdWmcXjcXkcXdcYfcYccYlbZibZfbZ`b[ma[ja[ga[`a\l`\i`\f`\)o\k\d]`zUazUczU`zVfzVgzVdzWjzWkzWmzXnzXc{X`{Yf{Yk{Yl{Zm{Zb|Zd|[i|[n|[c}[d}\l}\a~\f~\k~\c\d]nuVfxVluXdxXnuXfxXgxYlwZhwZcwYbwXawYluZkwZowZex[dx\mw\iw\cvZouZmu\e_g4@e3_e_i_i_m_l_*``_``_c`^g`^f`^f`^f`^e`^e`^d`^d`^g`]g`]f`]b`]a`]a`])m]m]h]h]d]d]`]`]l~]m~]i~]i~]i~]f~]f~]g~]g~]`~^`~^a~^a~^b~^f~^f~^g~^g~^h~_h~_h~_m~_m~_a_a_e_*``Za`[)l}Zm}[bZ`[*jfVffVoeVneWdfX`gXfgWggVngVbhVkhVjhW`hXneXjhXkhY`hZlgZggY`gZdfZoeYneXfgXggYmf\ofZfh[fh[hh\le\`h]jh]ih^bh^ng^eg^bg^ff^me^ne]df]`g]fg]lg]`h]fg]eg^)loUnoPclRomRenSfnSlmT`lTcmR`mTgfRkhRkhS`hTlgTkgSdgThfTgfSgfRkgRkgSogLlgRjePoeP`fQifQnfQcgQhgRlgRehRihRbiRjiRniRfjRkjRbkRjkRnkRflRilRamRhmRlmRgnQjnQmnQdoQkoPnoPkmLhmRheUjePloUmoUooUloVnoVkoVioWjoWdoXeoXboXlnYmnYjnYdnZanZnmZkmZdm[am[nl[kl[dl\al\jk\gk\ck\hj]heUieUkeUheVjeVoeVmeWneW`fXafXffXhfYifYnfY`gZegZjgZogZ`h[eh[jh[oh[`i\ei\ni\cj\gj\hj]baVncV`aXlcXbaXncXocYdcZ`cZkbYjbXibY`aZccZgcZmc[lc\ec\ac\kaZcaZaa\ij_kj4@ij3_mj_mj_ak_ak_dk_dk_hk_kk^kk^jk^nk^nk^mk^mk^lk^lk^ok]kk]jk]jk]ik]ek]ek]ak]`k]lj]lj]hj]hj]dj]dj]ej]aj]aj]mi]ni]ni]ki]ki]hi^hi^ii^ii^ji^ji^ji^oi^oi^li_`j_`j_ej_ej_ej_ij_ij_dkZek[diZei[jjZhj[brVjqVgqVfqWhqXdrXnrWorVbsVjsVosVnsWhsXfqXnsXosYhsZ`sZorYdrZhqZgqYfqXnrXorYms\osZorZlr\er\iq\dq\eq[kqZcrZfr^dr]js]js]ms^eq^*cyRozRa{Sb{SlzT`yToyRlyT`rTkqShqScrRksRlsSosShsTcnRcpRcpSloTdnTcnScnRgoLdoRcsL`sRguRkwRkwSdwTlvTkvSdvThuTguSguRkvRkvSovLlvRkzLhzRem\dm]dm^km^bn_en4@lnAfoA`pBjpBdqCarCbsCnsCktCfuCfvCawClwCjxB`yBnyAdzAmz@f{3_k{^l{^l{]m{\m{\l{RdmRem\lh]dk]nh^fk^mh_ek_ek4@ck@ci@mh@mh3_li4CniAdkBdkBfkBnhBktEitGktEotEotEcuEcuEcuEfuEfuEjuEiuEiuEhuEhuEkuDkuDkuDjuDjuDiuDiuDhuDduDduDcuCcuCcuCotCotCktCktCgtCgtCctCctClsDlsDlsDisDisDjsDjsDksDksDksDhsEhsEisEisEnsEnsEnsEctEctEgtEgtEktEktEgu@duBcs@`sBetAgtA`~3]l}]f}]e}^n}^j~^m~^n~]d]h]+b`]a`^*j^+b`_b`4@*f}3_f}4@d}@+``@*e}A+a`Aa`B*kBo}Be}Be}AfCjC+c`Cb`D*hEdEn}Cf}Cd}E+ng3VmgQgqLdqRoiLliRlhTghSdhSohRgjRhjSkjSdjTooRkqRarSbrShqTloTopRlpTjmMkmRblSfnSfnTcnTkmTfmTcmTglTblTblSfmSfmTmgQbhQkhQohQdiRliRajRijRbkRfkRnkRflRolRcmRkmRcnRknRnnRfoRnoRbpRipRaqRhqRlqRgrQkrQbsQisQfc[ne[dc]le]gc]oe]oe^ie_ae_od^od]nd^ec_he4@me@leAjeAbeAldAfdAjcAdcAec@hc@md@ldAng3VogVmgWogWlgXngX`hYahYghYehZjhZhh[mh[ci[di\ji\oi\`j]fj]kj]lj^ak^jk^ok^`l_il_nl_gm_hm4@js3VisQjsVksVesWgsWdsXfsX`sYasYorYmrZjrZhr[er[cr[lq\jq\gq\`q]np]kp]dp^ap^jo^go^`o_in_fn_cn_hm4@imBmmBmmB`nB`nB`nBdnBgnAknAknAjnAjnAinAinAhnAhnAkn@kn@jn@jn@jn@en@en@an@`n@`n@lm@lm@hm@hm@dm@dm@`m@am@ml@ml@nl@jl@jl@kl@kl@hlAhlAilAilAjlAjlAklAolAolAllB`mB`mBdmBemBimBimBimBkmCdn3]en^`l]al^fm]dm^ju[fu[lt\ot\du]`v]gv\dv\nv[bw[hw\kw\`w]ot]kw]kw^aw_mv_gv^av_eu_ot^ot]gv]gv^lt4@hw@ntAjwAcwCiwCjwBawBeuBntBmtCguCcvCevCfvBavBfuDotDntEguEcwEjwEkwDbwDfvDcvDbvEgvE)g@d5X+dqXgq6@*ka4KcaKl`Lo`LaaMmaMgbLdbLkbKccKdcLgcLacMl`NdcNdcObcOjbOdbOnaObaOl`Ol`NdbNdbOjaQiaPccPccPecQm`QacRgcRfcSccSkbSfbSoaScaSn`So`RaaRmaRgbRibRacRgbRfbS2`j3UbjPkfRchRihSjhS`hThfTggRdgTk`RobRobShbT`bToaShaTl`Tk`Sk`RoaRoaScbL`bR1nP2c`Pd`Qi`QbaQfaQkaQlaRdbRibRmbRfcRjcRncRfdRkdRceRgeRneRbfRffRnfRagRegRlgR`hRghQnhQbiQeiQhiQoiPbjPogLlgR1lUnP2`jUajUbjU`jVajVbjVoiVmiWniWkiWhiXiiXgiXdiYaiYnhYohYhhZehZbhZchZlg[ig[fg[cg[of[hf\ef\bf\ne\ke\de]`e]1lUmUnUlVmV2b`Vc`Va`Wf`Wg`Wd`Xi`Xk`Xl`Ym`YbaYgaYdaZiaZnaZcbZdb[eb[jb[ob[cc[dc\ic\nc\bd\gd\ld]`e]1f{Vb~Vd{X`~Xf{Xb~Xc~Yh}Zd}Zo|Yn|Xm|Yd{Zg}Zk}Za~[`~\i}\e}\o{Zg{Ze{\2ae_ce4@ae3_ae_ee_ee_ee_he_he_he_le_oe^oe^cf^bf^bf^af^af^af^`f^`f^cf]cf]bf]ne]ne]me]ie]ie]ie]de]de]de]`e]`e]ld]ld]hd]hd]id]ed]ed]ed]bd]bd]bd]cd]oc]lc^lc^mc^mc^mc^nc^bd^cd^cd^cd^dd_dd_dd_hd_id_id_md_md_ae_leZme[hcZic[ndZld[flVblVkkVjkW`lXllXbmWcmVjmVnmVcnVbnWlmXjkXbnXcnYlmZhmZcmYllZ`lZkkYjkXbmXcmYmm\`n\an[omZclZik[hk\al\ml\`m\am[olZnm^an^bn]lm]`l]jk]ik^bl^nl^am^bm]ll]/kgRgiRmiSniSdiThgTkhRhhTh`Tg`Sd`Sk`RcbRhbSkbS`bT.k|Ro~Ro~Sh~Tl|Tk|Sk|Rc~L`~R/oaLlaRcdRcfRcfSleTheTgeSldTddTcdScdRgeRgeSgeLdeRciL`iR.m{\l{]c|]f|^i|_l|4@f}@m}Ag~Am~BkB/d`Cm`CjaCjbCgcCbdCndCieCdfCofBigBchAihAbi@hi@mi3_fj^gj]hj]ij\ij\hjR.l{Rm{\hw]`z]jw^bz^iw_az_az4@ky@ow@iw@iw3_dx4CfxAlyBlyBbzBjwB/gcEecGgcEgcEgcEkcEkcEocEocEbdEbdEbdEadEedEddEddEgdDgdDgdDfdDfdDedDadD`dD`dD`dDocCocCkcCkcCgcCgcCgcCccCccCobCobCkbCkbChbDdbDdbDebDebDbbDbbDcbDcbDcbD`bE`bEebEebEfbEfbEjbEkbEkbEobEobEccEccEgcEoc@lcBoa@laBacAccAll3]dl]bl]al^fl^bm^im^jm]lm]dn]jn]in^fn^al_in_in4@gn@om@im@cm@gl@al@al3_im_im4@jnAhnCdnCblAgnChnDknDdnElmEkmD`mEdlEclD`lDglChmDkmD-en3QnnQgoQloRdpRmpRfqRnqRgrRorRgsRlsSdtSltSduSluSdvS`wShwScxRkxRcyRjyRbzRizR`{Rh{Rc|Qj|Qa}Qk{Lh{RkpLhpRcoRgqRgqSlpTdoTcoScoRczRo{Re|Sf|Sl{T`zTc{R`{TbtMctRcsTjrTkrSbsSjtSotSntTktTfvSjxSjxTgxTowTjwTgwTkvTfvTfvSjwSjwTnwMowRmi\el\oi]gl]ni^fl^fl_`l4@lk@fk3_fk^ek_li4@mjBoj@elAelAglAoiAa}3Wa}QenWenQenWgnWenXgnXenYknYinZonZmn[co[eo\go\io]oo]ap^fp^hp_bq_dq4@iq@cr@drAjrAcsAisBnsBgtBltCbuCkuCa}3Wc}Wa}Xo|Xm|Yo|Yi|Zk|Ze|[g|[a|\o{\i{]g{]a{^nz^hz_fz_`z4@iy@gy@`yAjxAcxAmwBfwBcwBhvCbvCkuCkuEouEouEcvEcvEgvEgvEfvEjvEivEivEivElvElvEovDovDnvDnvDivDivDivDhvDdvDgvCgvCcvCcvCouCouCkuCkuCguCguCcuCcuCcuCltDltDmtDitDitDjtDjtDktDktDhtEhtEitEitEmtEntEntEcuEcuEcuEguEguEkuEkuEkuEiuGgv@dvBct@`tBeuAguAa3\m~\k~\j~]o~]k]n]o\.e`\i`\ca\ba]k`]-j~^.ba^ba_h`4@d`@-n3_h4@l~@j~3_j~^n^n_k~4@.ca@-i~B.aaB`aCbaDj`D-h~C.d`Eh`EbaEaaFj`Ff`F-l~Eh~Ej~F,ms3QftQotQduRluRevRnvRfwRowRkxRcyRhyS`zShzS`{Sl{Sd|Sl|Sg}Ro}Rg~RbRjR-a`Rh`R`aRkaQbbQibQcaL`aR,cvL`vRktRovRovSdvTltTktSktRkR-gaRmaSnaSdaT,hT-k`Rh`T,nyMoyRkxTfxTgxSjxSbzSgzSfzTczTn{Sb~Sb~To}Tk}Tb}To|Tg|Tn{Tn{Sb}Sb}Tf}Mg}Reo\ar\go]cr]fo^br^br_hq4@dq@np3_np^mp_do4@epBgp@mqAmqAcrAgoA-ib3WibQ,msWmsQmsWosWmsXosXatYctYbtZdt[jt[ht\nt\`u]fu]hu^nu^cv^ev_kv_aw4@fw@lwAbxAkxAlxBfyBoyBdzCnzCc{C-ib3WkbWibXgbXebYgbYbbZ`b[na[ha\ja\da]ba]l`^j`^g`^a`_,k_e4@b@h~Af~Ao}Ad}Bb}Bk|B`|Cj{Cc{Cc{Eg{Eg{Ek{Ek{Eo{Eo{En{Eb|Ea|Ea|Ea|Ed|Ed|Eg|Dg|Df|Df|Da|Da|Da|D`|Dl{Do{Co{Ck{Ck{Cg{Cg{Cc{Cc{CozCozCozCkzCkzCdzDdzDezDazDazDbzDbzDczDczD`zE`zEazEazEezEfzEfzEkzEkzEozEozEozEc{Ec{Ec{Ea{Go{@l{Boy@lyBa{Ac{A-md3\ed\cd\bd]gd]ce]je]ke\me\af\kf\jf]cf]bd^jf^jf_`f4@le@je3_`e4@dd@bd3_bd^je^je_cd4@kf@adBifBhfCjfDbfD`dCadEbdFcdEkfEafE.hq3UjqPomRkoRapSbpShoTlmTonRlnTchRgjRgjSliThiTgiS`iTdhTchSchRgiRgiSkiLhiRfgPkgPlgQahQjhQohQciQhiRmiRajRjjRnjRfkRjkRclRglRolRbmRjmRnmRfnRinRaoRdoRooQcpQfpQmpQ`qQgqPjqPgoLdoRdgUfgPhqUiqUjqUhqViqVfqVdqWeqWbqW`qXmpXnpXkpXipYfpYcpY`pZmoZjoZgoZ`o[mn[jn[gn[`n\mm\im\fm\cm\ll]dl]dgUegUfgUdgVegVfgVhgWigWjgWlgXmgXbhXchXehYjhYkhYlhZaiZfiZkiZli[mi[bj[gj[lj\ak\ek\jk\ok\`l]dl]nbVfeVlbXdeXnbXfeXgeY`eZldZgdYfdXedYlbZodZceZee[de\ae\md\gcZobZmb\el_gl4@el3_il_il_ml_ml_`m_`m_`m_gm^gm^gm^fm^jm^im^im^im^hm^hm^km]gm]fm]fm]fm]am]am]am]ml]ll]hl]hl]dl]dl]`l]`l]al]mk]mk]ik]jk]jk]jk]gk]gk]dk^dk^ek^ek^ek^fk^fk^kk^kk^kk^hk_lk_lk_al_al_al_el_el_`mZam[`kZak[flZdl[nsVfsVcsVbsWdsX`tXjtWktVntVfuVkuVjuWduXbsXjuXkuYduZltZktY`tZdsZcsYbsXjtXktYiu\kuZktZht\at\es\`s\as[gsZosZdu]ju]iu^fu^nt^it^bt^fs^as^bs]ds]`t]jt]lt]du]jt]it^1h`X`cXi`YacYh`Z`cZac[nb[ba[i`[h`Zeb\mb\cc\bc]ob]gb]aa\i`\k`]0cvRkwRaxSbxShwT`vTovRlvTc{Rg}Rg}S`}Th|Tg|S`|Td{Tc{Sc{Rg|Rg|So{Ll{RkvLhvRjtXhtRl~Rn~Xhy4@ly@ly@ly@`z@cz3_gz_gz_gz_jz_jz_jz_iz_iz_lz_lz_oz^oz^oz^jz^jz^iz^iz^iz^dz^dz^dz^`z^cz]oy]oy]oy]ky]ky]gy]gy]gy]`y^`y^lx^lx^mx^mx^ix^jx^jx^kx^kx^kx^hx_hx_ix_ix_jx_nx_nx_ox_ox_cy_cy_dy4@dy@dy@hy@hy@n~3Xl~Yj~Yh~Zf~Z`~[n}[h}\e}\n|\h|]a|]j{]b{]kz]cz]ky]cy]kx]bx]jw]aw]lv]fv\av\hu\fu[`u[ntZhtZjtYhtYjtXhy4@jyAb{3[c{\nx[ox\`z\bz\`qXlpXepXdpYmpYiqYlqYmqXdrXhrXasX`sYirYdpZ`sZas[jr[fr[mq[jq[np[ep[dpZlqZmq[as\cs]kr]ep\hr4@bs3_cs^jr^np^gp^fp_lp4@hq@nq3_oq^jq^kfRghRihSjhSdhThfTggRdgT/hTcS`SkR0caRdaSgaS`aT/k{Rk}Rk}Sd}Tl{Tk{Sk{Rc}L`}R0k`Lh`RobRceRceSldTddTcdSlcT`cTobSobRcdRcdSgdLddRchL`hR/mz\lz]oz]b{^e{_l{4@b|@i|Ac}Am}Bg~B`CmC0j`CfaCcbCnbCjcCedC`eCoeBefBcgAigAbh@hh@mh3_bi^gi]di]ei\ei\diR/lzRmz\dv]lx]fv^nx^ev_mx_mx4@kx@ov@ev@ev3_dw4CfwAlxBlxBnxBfvB0cbEabGcbEgbEgbEgbEkbEkbEobEnbEnbEbcEacEacE`cE`cEccDccDccDbcDbcDacDacD`cDlbDlbDobCkbCkbCgbCgbCgbCcbCcbCoaCoaCkaCkaCgaCdaDdaDdaDaaDaaDbaDbaDcaDcaDcaD`aE`aEaaEaaEfaEfaEfaEgaEkaEkaEoaEoaEcbEcbEob@lbBk`@h`BmaAoaAhk3]dk]nj]mj^fk^bl^el^fl]ll]`m]jm]im^bm^mj_im_im4@cm@ol@el@cl@gk@mj@mj3_el_el4@jmAhmC`mCnjAlkEokCemDemDkmDojD1li3ZliRhuRhuZkoLhoRlrTkrShrSorRktRltSotShtTgsLdsRclL`lRcoRcqRcqSlpThpTgpSloTdoTcoScoRgpRgpSgkRcmRimSjmS`mTdkTglRdlThuZkuZiu[gu[au\ot\it]gt]ms^js^`s_ir_br_kq_cq_hp4@`p@do@ln@gn3_om_fm_ml_dl_nk^ek^ck]mj]kj\ej\cj[mi[oiZliZew\az\gw]cz]fw^bz^bz_hy4@lw@fw3_fw^ky4@`zAczAiyBeyBoxAixBmwBgwAdwAow@lxAoxAioBkoCioBmoBmoBapB`pB`pBdpBdpBgpAkpAkpAkpAjpAnpAmpAmpAmpAlpAlpAop@op@jp@jp@jp@ip@ep@ep@ep@`p@`p@`p@lo@lo@ho@ho@ho@do@do@`o@ao@ao@mn@mn@nn@nn@jn@kn@kn@hnAhnAinAinAinAjnAjnAonAonAonAonA`oB`oB`oBdoBeoBioBioBioB`q3]aq^`o]ao^fp]dp^if\af\oe\ne]cf]of]fg]gg\ig\ah\gh\fh]ch]gh^gh_oe^oe_me_eh_ne4@fh@ghA`hB`fBoeAne@chBdhCghCahDigDggCmfDafDoeCleCcfBdgCggC0la3IoaJjcLbeLofJlfIbeGjcGlaI)ckHbkJllLhnLbpJcpHhnGllGckH(cyLbyI)jmI+km6@im5F/atF`t3J0ddJ'md5\ld4@gfKcfKheLkeLafMifMcgL`gLggKogK`hLchLmgMheN`hN`hOngOfgO`gOjfObfOheOheN`gN`gOngQahQbhPmgPafPjePieQbfQjfQagQbgPifPjeRkeSheS`hSjgR)hj6Nij8G2ivGkv3LogL)ll6VhlValV`lWjlWfmWhmWimV`nVdnVmnVlnWfnWalXmnXmnYgnYcnYimYgmYklYalYalXimXimYon[nnZjmZjm[gm[kl[bl[clZjlZnlZfn\ln]on]dn^`n^km]dm^hl^cl]`l]jl\hm]km]ij5\kj4@clKokKdkLgkLmkMilMolLllLgmKkmK`nLcnLimMdkN`nN`nOjmOfmOllOjlOnkOdkOdkNllNllObnQanPmlPmlQjlQnkQekQfkPmkPalPglSelRlmSlmSbnSfkS2jbCibE`dGleGigEjgCleB`dBjbC&ms=Pns4W(fgWggC&mr=SerSoqSlqUfrUfsUlsUosSitSauSkuShuUbuUkuVjuXoqVnqXoqWkuWnqYjuYiu[cu[gr[mq[nqYas_`s]gu]gu]ju^nq^2ce4@ae5\a~\jf4IbfIleJoeJ`fKlfKggJdgJjgIngIdhJghJlgKoeKghKghLmgMigMggLmfMafMoeLoeKggKggLngOdhOehNlgN`fNmeNleObfOnfOdgOegNlfNngQehQfhPmgPafPnePmeQbfQnfQegQfgPmfP.el5\gl4@jnIfnIlmJomJdnK`oKgoJdoJnoIbpIhpJkpJ`pKomKkpKkpLapMmoMgoLaoMenMomLomKgoKgoLjpOhpNdoNdoOboOfnOlmOmmNdnNhnNapPjpPipQbpQnoQeoQboQfnQmmQnmPenPaoPfoPmoPapPfoPeoQ0jyAiy5\/i}\0n{4Ij{I`{Jc{Jh{K`|Kk|Jh|Jn|If}Ih}Jk}Jd}Kc{Kk}Kk}Le}Mm|Mk|La|Mi{Mc{Lc{Kk|Kk|Lh}Nj}Of}O`{Nf}Qi}Qj}Pe}Pi{Pb{Pa{Qj{Qb|Qi|Qj|Pa|P,kw6@kw5WkcWkc4CaeJmdJgdJedKodKkeKmeKoeJefJifJcgJagKkfKfdLbgLbgMhfNdfNneMheNldNfdMfdLneLneMgdNcgNedPagP`gQagRifRddQgdS`eSdfScgS`gTffTbeTddTgdSls6@``@b`4T+jmTkmCboFjnFdnGgnGhnHdoHooGloGbpFjpFlpGopGhpHgnHopHlpJipJapJloJeoJinJdnJgnHooHloJdnKlpKfnLnpLkpNmpNnpMipMinMfnMenNknNgoNmoNnoMeoMjnOgnOfnPhnQhpQnpPopOjpOnoOgoOfoPloQ1koCjoZ2j`Zk`=N1oQgQm~Rn~SdT2d`TbaSaaRkaQcbQibRjbS`bTjbUhbW1n~Ul~Wm~V2ibV1m~X2ibXkbYabZ1eZo~Ym~X2bb[hb\hb]cb]ka]`a]g`]1g]l~]l~\f[2`a\`a],l~6@-hu@iu4GnwIjwI`wJcwJhwKdxKkxJhxJnxIfyIhyJkyJdyKcwKkyKkyLeyMmxMkxLexMiwMcwLcwKkxKkxL`wNhyNbwOjyOiyPjyQfyQawPmxReyRkyRjySgySoxSiwRawRcwS'en=Pen4[*it[itG'em=SmlSclS`lUnlUnmUdnUgnSaoSioScpS`pUjoUcpVbpXclVblXclWcpWblYbpYap[ko[ol[al[blY`o]ho]bp]bp^io_ao_ll]`l]al_eb4FgbGbdIjeIggGegFjeDbdDebF,c{6@a{4Gf}Ib}Ih|Jk|J`}Kl}Kc~J`~Jj~In~IdJgJl~Kk|KgKgLm~Mi~Mc~Lm}Ma}Mk|Lk|Kc~Kc~Lh|NdNj|OfOePfQn~Qi|Pj|Rk|Sh|SdSj~R0abG`b5U/dvUev\0jc4IbcIlbJobJ`cKlcKgdJddJjdIbeIdeJgeJ`eKobKgeKgeLaeMidMgdLmcMacMobLobKgdKgdLdeNfeObeOlbNncQmcPgePgePeeQmbQ/ir5\ec\ec4GjdIfdI`dJcdJddK`eKgeJdeJneIbfIhfJkfJ`fKcdKkfKkfLafMmeMgeLaeMedMcdLcdKgeKgeLhfNjfObfO`dNafPjfPifQbfQneQeeQbeQfdQadQbdPedPfePeeQ+kb6@ib4[.el[niZmi\kk]gm]mn\nnZgmXkkXniZ(dr7Wfr:Nls8VhsVasV`sWjsWftWhtWitV`uVduVmuVluWfuWasXmuXmuYfuYbuYitYftYjsYasYasXitXitYasZauZlu[mu[cu[cs[etZgt[bs\nu\ou]du^hs^cs]bs\`s_`s9@bs8_nu_`u_cs9@ou@asBmuB)m|5Wo|Xf~Z*b`ZoaXmaWb`U)f~Um|WorInrKdtM`vMnwKowI`vHdtHorI2jbAibCcdDoeDigCjgAoe4_cd_jb5A*hp4^kp_er5AatAku4_hu^at\er\hp^cs6Bcs4^(eu5\euB2aeB'm|El|Gk~H(c`HlaGmaEc`C'k~Cm|E+oi6@mi5F'eFd9R(hlRjl:N+noFoo9])gu]fu5J0mx<GnxT-bTb5S*jaSha6H0gz<HczHhyIkyI`zJlzJc{I`{Ik{Ho{H`|Ic|Il{JkyJc|J`|Lm{Li{L`{LmzLazLhyLkyJc{J`{LiyMiyNkyMc|Mi{Ml{Ob|Oa|Pn{Pj{Pa{PnzPbzPiyPjyO`zOb{Oa{PkzRizQc|Qc|Qb|RjyR*ix5NkxObzQn{Qk}Oi}Nn{LbzLixN1bl:F`l5O*`{O&ii7H(acHbc5S)jjS,fd:Fdd9R(l~Rl~5X)dXbhRahTliVhkVamTbmRhkQliQbhR*gm6Bdm5X`mX/e|6Bm}Bf~Bd~Cn}Cf|Ca}Bb}CbuCltCntBauBmvBbwB`wCnvCaqBesBdsCbsCjqC`qCaqBir5\jr6Aev5\fv6AixBmzBlzCfzCbzClyCjyCnxChxCixBmyBlyCaz5\bz6Ai}5\j}6AkpKjpLipMopMbqNeqOkqOarPhrQbsQosQetRbuRkuRdvS`wSlwShxSdySoyRjzRe{Ro{Qj|Q`}Qi}Po}Oe~Oj~No~MaMbLcKcKbAjpAkpKblLjnL`lNhnNclNknNknOdnPdlPclOclNamRcmPfnQfnQhnR`lRmwUowVmwUmwUaxUaxUexUdxUdxUhxUhxUkxToxToxTnxTnxTmxTmxTmxTlxTlxToxSoxSoxSnxSjxSixSixSexSexSexS`xS`xSlwSlwShwShwShwSewSewSawSawSawSbwSnvSovSovSovSlvTlvTmvTmvTmvTnvTnvTovTovTcwT`wU`wU`wUdwUewUiwUiwUiwUmwUhxPixQdvPevQjwPhwQ0faLbaLk`Lj`M`aNlaNbbMcbLjbLnbLccLbcMlbNk`NccNccOlbPhbPcbOlaP`aPk`Ok`NcbNcbOh`Qi`Rj`QbcQhbQobRacS`cTmbTibT`bTmaTaaTh`Ti`ScaRabS`bThbUlbUbcUacVnbVjbV`aUh`Uj`V'kaIkaJ&cIcJaJ'iaJ&bK'jaK&`M'haM&cM'kaMkaNaaOm`Og`Ng`Mf`N&aO`P'haPhaQbaQn`Qd`Qb`Q&fQ`Q`P'd`Pd`QecBaeBjeBheCbeCfcCedBfdCmd5\nd6AbjA&nA'mdJbjAndLbeLbeLaeLeeLeeLieLieLheLleLoeKoeKneKneKneKmeKmeKleKleKoeJoeJjeJjeJjeJfeJeeJaeJaeJaeJmdJmdJidJidJedJfdJbdJbdJbdJocJocJlcKlcKmcKmcKncKncKncKocKocKlcL`dLadLadLedLedLidLjdLndLndLndLldNkeEheGgcEdcGidFkdFfiInhIkhIjhJlhKhiKbjJcjIfjInjIckIbkJljKkhKckKckLmjMejMcjLiiMmhMkhLkhKcjKcjLmjO`kOakNljNlhNihNhhOmhOiiO`jOajNhiNdjPljPbkPakQnjQfjQlhPhhPjhQ.el5X1ioXjo:F*ij5WkjXflZbnZkoXioWbnUflUijW.miWliYkkZgmZlnYmnWgmUkkUmiW)gg6IggJodIodJmdJegJndKfgKldMdgModMggMggNagOifOgfNgfMffNmdOldPdgPdgQbgQjfQdfQneQbeQldQldPdfPdfQeiBmjBfkBdkCnjCfiCajBbjCij5\jj6AnoAjeAijJnoAjjLnjLnjLbkLakLekLekLekLhkLhkLhkLkkKokKnkKnkKmkKmkKlkKlkKhkKkkJkkJjkJfkJfkJekJakJakJmjJmjJijJijJijJejJejJajJbjJbjJniJoiJoiJhiKhiKhiKiiKiiKjiKjiKkiKkiKliLliLliLajLajLajLejLfjLjjLjjLjjLjjLhjNgkEdkGgiEdiGijFkjFboInnIgnIfnJlnKhoKnoJooIfpIjpIopInpJhpKgnKopKopLipMepMooLioMmnMgnLgnKooKooLmpOlpNloNloOioOmnOdnOenNlnN`oNhpPnpPmpQjpQfpQmoQjoQnnQenQfnPlnPnoPmoQ(mhGekGohHgkHnhIfkIfkJ`kKdiKnhJnhIojKckKdkLgkLakMmjMgiKohKmhMmsBiuBbvB`vCjuCnsCmtBntCmnBmpBlpCjpCfpC`pCjoCboClnCmnBapB`pCep5\fp6Aeu5\fu6AhwHjwAfmAdmHerOirOirOmrOmrOasOasO`sOdsOdsOgsNgsNjsNjsNjsNisNisNhsNhsNgsMgsMfsMfsMbsMbsMasMmrMmrMirMirMerMerMarMarMarMmqMnqMjqMjqMjqMkqMgqMdqNdqNeqNeqNfqNfqNfqNgqNkqNhqOhqOhqOmqOmqOarOarOarOerOerOdmHfmHdmIjmIlmJbnJdnKjnKcoKeoLnoLgpLlpMdqMmqMerMasMhsM`tMktLbuLiuLouKfvKhvKnvJ`wJfwIhwIjwHhwHerOgrP`sKasL`qKaqLfrKdrLmyGeyGcyGbyHgyHczHjzHkzGmzGe{Gk{Gj{Hg{HbyIj{Ij{Jd{KlzKjzJ`zKdyKbyJbyIjzIjzJcyKc{Ki{Lj{La{MayMczKazM`yNh{Nh{Oe{OeyO`yO`yNayPbyQcyPk{Pa{P.ciIciJkfIkfJifJaiJjfKbiKhfM`iMkfMciMciNmhOehOchNchMbhNifOhfP`iP`iQnhQfhQ`hQjgQnfQhfQhfP`hP`hQakBilBbmB`mCjlCbkCmkBnkCel5\fl6AjqAfgAelJjqAflLjlLjlLnlLmlLmlLamLamLdmLdmLdmLgmKgmKkmKjmKjmKimKimKhmKhmKdmKgmJgmJgmJfmJbmJbmJmlJmlJmlJilJilJelJelJelJalJalJmkJnkJnkJjkJkkJkkJkkJdkKdkKdkKekKekKfkKfkKgkKgkKkkKhkLhkLhkLmkLmkLmkLalLblLflLflLflLflLdlNcmE`mGckE`kGelFglFnpIjpIcpIbpJhpKdqKjqJkqInqIfrIkrIjrJdrKcpKkrKkrLerMmqMkqLeqMipMcpLcpKkqKkqLirOhrNhqNhqOeqOipO`pOapNhpNlpNhrPjrQfrQ`pP(grPfr7Els6VhsVasV`sWjsWftWhtWitV`uVduVmuVluWfuWasXmuXmuYguYcuYitYgtYksYasYasXitXitYbsZbuZlu[mu[cu[cs[ftZgt[bs\nu\ou]du^hs^cs]bs\`s_`s7@bs6_nu_`u_,iqDbrDkrD`sEdsEmsEftEntEguEouEgvElvFdwFlwFdxFlxFdyFlyF`zFhzF`{Fk{Ec|Ek|Eb}Ej}Ea~Eh~E`EgDnD-e`D,l~@l~Els@lsEgrEktEktFdtGhrGgrFgrEg}EcEiFjF`Gd}Gg~Ed~Gkw@kwEgvGbvGcvFfvFnwFgxFfxGowGnyFn{Fn{Gk{Gg{Gb{GkzGczGnyGnyFb{Fb{Gc{@c{EemOmoOgmPooPfmQnoQooRdoS`oSknRjnQinRdmSanUcnSioTioTloUdmU-e`Je`D,iqJiqDiqJkqJiqKkqKmqLoqLmqMcrM`rNfrNdrOjrOlrPbsPgsPisQosQ`tRftRhtSmtScuShuTmuTcvThvUmvUgwUlwVaxVjxVcyV-e`Jg`Je`Kg`Ka`Lc`La`M,oMlNjNhOfO`Pn~Po~Pi~Qg~Q`~Rj}Rd}Sa}So|Sd|Ta|To{Td{Ua{UkzUdzVmyVfyVcyV`yY`yY`yYdyYgyXkyXkyXkyXnyXnyXnyXazXazX`zX`zX`zXczWczWbzWbzWazWmyWmyWlyWhyWhyWkyVgyVgyVcyVcyVcyVoxVoxVkxVkxVgxVdxWdxW`xWaxWaxWaxWnwWnwWowWowWlwXlwXlwXmwXaxXbxXbxXbxXgxXgxXgxXkxXhxYlxYlxY`yY`yYbyZkyShyUkwShwUmxToxT-ibOabOoaOnaPcbPobPfcPgcOicOadOgdOfdPcdPnaQfdQgdR`dShcSgcRlbS`bSoaRnaQfcQgcRlaTlaUnaTfdTlcTlaVlaWnaVfdVlcVgdWedYadYoaW2e}BaBjBhCbCf}Ce~Bf~C3ndChdCjdBmdBifBnfBlfCjfCehBijBhjCbjCjhCdhCehBai5\bi6Aee5\fe6AaaBacB`cCnbCjbCdbCnaCfaC`aCaaBebBdbCia5\ja6A2a~5\b~6A3gkKakL`kMbkMmjNkjNejOliPjiP`iQihQchQhgRagRffRoeR`eShdSlcSdcShbScbRfaRm`R``R2kQaQh~Qf~Pl}Pi}Og}Na}Nn|Mh|Mi|Lk|Kk|Kj|A3fkAgkKbmLjoL`mNhoNcmNkoNkoOdoPdmPcmOcmNanRcnPjoQjoQhoR`mRmcUocVmcUadUadUadUedUedUddUhdUhdUhdUodTodTodTndTndTndTaeTaeTaeT`eT`eTodSodSodSndSndSndSidSidSidSedSedSddS`dS`dS`dSlcSlcShcShcShcSecSecSecSacSacSbcSbcSnbSobSobSobSlbTlbTmbTmbTmbTnbTnbTnbTobTccTccT`cU`cUdcUdcUecUicUicUicUmcUmcUdePeeQ`cPacQfdPddQ2lEhEbEaFjF3b`Fi`Fj`El`EdaEjaEiaFfaF2aG3iaGjaHgaHo`Hj`Hc`H2kHbHaG3i`Gj`H2cIcJaJ3iaJcaI2cKcLaL3iaLcaKfaMhaNkaNdaOl`Ok`N``O2hOcN`NjM3h`Nk`N*dbNddNgdNadOibOgbNdbN+blFnmFdnGenGomGclGbmFcmGjmHbnHgnHenIcnIkmIflHblHclI*f}FjFjGgGcGj~Gg~Go}Gf}Gf}Fj~Fj~GbHfHkHiIgIcIn}Hf}Hg}InyFn{Fn{Gk{Gg{Gb{GkzGczGnyGnyFb{Fb{Gj{Ho{Hm{Ik{Ig{Ia{IkzIczImyIoyHbzHc{Ha{I)dy5]+`w]aw8A)eyAdy5]*g{6@g{Eo~@o~E+baFfcFfcGccGkbGfbGcbGgaGbaGbaFfbFfbGbaHbaI`aIdcInbHkb@kbEfhFbjFhjGijGcjGghGfiFgiGfjHkjHijIgjIcjIiiIgiIohIehIghHnhHkiHiiIoi@oiE*gmBdmH+noFjqF`rGarGkqGooGnpFopGnoHnoIloI`rIjqHkm@kmEgq@gqE*`lJokIlkIclHkmH`nIcnIhmJgmJkmJ`nKbnKhmLdmLclJokJlkLcsB`sH`rJkqIhqIcrHksHlsIosIhsJkqJkqKiqKmsKgsJ+ldNodE*cyE`yN+hsNksEogElgN*bp7McpGck6NakOckOekPkkPmkQclQdlRnlRcmRhmSanSjnScoSkoScpSopSgqSnqSerSlrSgsRjsR`tRgtQitQotPauPguOeuOguNguNduH`kHckNhaHkaS`yNbyN`yOgyOiyPoyPazQkzQa{Rg{Rl{Si|Sb}Sk}Sg~So~SkS+c`Sn`SeaSlaSgbRmbRgcQicQcdPedPkdOhdOndNldNlgNngNlgOchOehPkhPmhQgiQiiRcjRhjSakSnkSglScmSkmSgnSonSfoSapShpScqRiqRcrQerQkrPasPcsOdsOfsNhsN*cpSbpZbvZ`v7Ika6Sja_fr_er7Ho~6Sn~ZnyZly7I+km6Sjm_*f}_e}7Hn~Ml~Nn~Nl~On~Oh~Pj~Pd~Qf~Q`~Rb~Rl}Sj}Sg}Sa}To|Ti|Uf|U`|Vn{Vg{Va{WnzWdzXazXjyXdyYmxYfxYcxYhwZn~Mo~GcpGkpG`qHiqHbrHjrHcsHhsI`tIhtIauIiuIavIivIawIjwIaxIixIayIiyIazIhzI`{Ih{Ic|Hj|Hb}Hi}H`~Hg~Go~G)nzMn|Md}Nf}Nl|OlzOb|M`|Og{OlzPozPe{Qa}Qg}Pd}Pc}Og{Od}Re}SlzRmzSozRg}R`}Te}Td}Ub}Un|Ud|Ub|Uf{UlzUmzTd{Te|Td|Ua}Vf}Ve}Wb}Wn|We|Wb|Wf{WmzWnzVe{Vf|Ve|Wm|Xa}Xg}Xf}Yc}Yo|Ye{XmzXozYozZoz[mz[e}[o|Z*bpM`pNfpNdpOfpOdpPjpPhpQnpQlpRbqRdqSjqSkqSmqTcrTerUnrU`sVfsVksVatWftWhtXauXfuXluYevYjvYcwYhwZiw\iw\mw\mw\`x\`x\`x\dx\gx[gx[kx[jx[jx[ix[ix[hx[hx[hx[kxZkxZjxZfxZfxZexZaxZaxZ`xZlwZlwZhwZhwZdwZdwZ`wZ`wZawZmvZmvZnvZjvZjvZkvZkvZhv[dv[dv[ev[iv[jv[jv[kv[kv[ov[lv\lv\`w\`w\aw\ew\ew\iw\iw\kw]dxWexX`vWavXfwWdwX+jsMbsMlrNnrN`sOlsOftNdtNjtMntMduNfuNltOorOguOguPmtQitQgtPmsQasQorPorOgtOgtPlrRmrSorRguRltRltTeuTduUntUjtUdtUnsUbsUlrUmrT`sTetTdtUeuVfuWntWmrV(coR`oTklRhlTjlSboSklTcoTilVaoVhlW`oW`oXmnXenX`nX`nWbnWilXhlY`oYaoZnnZfnZanZjmZnlZilZhlY`nYanZaqKirKcsK`sLjrLbqLmqKnqLfrEfrJjwJfmJfrSjwJfrUjrUjrUnrUnrUbsUbsUasUesUesUdsUdsUhsUksTksTjsTjsTisTisThsTdsTdsTgsSgsScsSbsSbsSnrSnrSjrSjrSfrSfrSfrSbrSbrSnqSnqSoqSkqSkqShqTdqTdqTeqTeqTfqTfqTgqTgqTdqUdqUhqUiqUiqUmqUnqUnqUbrUbrUfrUfrUfrUfrUdrW`sOasP`qOaqPfrOdrPovRkvR`vScvSivTewTkwShwSowRgxRhxSkxSexTcvTkxThxVexVmwVhwVewVivV`vVcvTkwThwV`vW`xWjxWhxXbxXbvXdwWfwXavYixYjxZgxZkvZbvZavYcv[cv\av\ix\cx[bv]jx]`v_hx_/mwKow6VdyYlxYixYhxZnxZjyZ`zZazYdzYlzYa{Y`{ZnzZix[a{[a{\nz\fz\az\jy\nx\ix\ix[az[az\jx]kx^hx^`{^jz]mz_c{_b{7@oz@gz@bz@ky@ox@jx@kx6_mx_cz_bz7@fzAnzA`{Bc{BlzCdzCnxAjxAhxCktXktYoqXoqYmqYitYnqZjtZlq\ht\oq\kt\kt]at^ms^gs]gs\fs]mq^lq_ht_ht8@bt@ns@ds@bs@fr@lq@lq7_ds_ds8@ev7QaxQkxQhxRbxRfvRewQfwRmwKnwPb}PjrPmwYb}Pnw[nw[bx[bx[fx[ex[ex[ix[ix[hx[hx[lx[oxZoxZoxZnxZnxZnxZmxZmxZlxZlxZlxZoxYkxYkxYjxYjxYfxYfxYexYaxYaxYmwYmwYmwYiwYiwYewYfwYfwYbwYbwYcwYovYovYlvZlvZlvZmvZmvZnvZnvZnvZovZovZovZlv[lv[`w[aw[aw[ew[ew[fw[jw[jw[nw[nw[nw[lw]kxThxVgvTdvViwUkwUf|Xn{Xh{Yk{Yl{Zh|Zc}Y`}Yf}Xj}X`~Yc~Yh}Zk{Zc~Zc~[i}\e}\c}[i|\m{\k{[k{Zc}Zc}[i{]i{^k{]c~]i}]h}_a~_`~8@j}@f}@`}@j|@n{@h{@i{7_l{_a}_`}8@e}Ai}Ab~Aa~Bk}Bg}Bm{Ai{Ak{Bj{Cb~Ck{Dc~D&bg7GagIohJkjJalIblGkjEohEbgG1ku:SjuKniKoiSjoFjoKnjMijMkjLmjLelLolLmlMflMblFblKfsFfsKenLepLepMbpMnoMioMboMjnMenMenLioLioMmqLisLctLatMjsMnqMmrLnrMoiSmiToiTajUcjUejVjjVljWbkWgkWlkXblXklX`mYimYanYfnYnnYfoYnoYfpYnpYeqYmqYdrYorXbsXhsXosWftWhtWntVauVguUeuUkuTiuTkuSdeV`hVfeWbhWdeX`hXahYjgYneYeeYdeXigZchZbh[kg[gg[nf[kf[oe[fe[geZmeZofZnf[ko[io]ko[oo[oo[cp[cp[cp[gp[fp[fp[fp[jp[ip[ip[ip[lp[lp[lp[opZopZopZnpZnpZmpZmpZipZhpZhpZhpZdpZgpYgpYgpYcpYcpYbpYnoYnoYjoYjoYjoYfoYgoYgoYcoYcoYcoYlnZlnZlnZlnZinZinZinZjnZjnZknZknZknZhn[hn[hn[in[mn[mn[nn[nn[bo[bo[co[go[go[go[ko[ko[ko[gpVdpXgnVdnXhoWjoWlwVdwVawV`wWfwWbxWhxWixVlxVdyViyVhyWfyW`wXhyXiyYfyYnxYixYbxYfwYawY`wXhxXixYbwZbw[`w[hy[byZey\ky\jy]gy]ox]jx]cx]gw]bw]cw\ew\kx\jx]lw;@nw:^dy_dy_ky_cw_cw;@cy@iyAkyAayBawBcx@axB0fi:Ffi@)ipLhp9R/lw7]ow;L0osL/dy8VlxVixVhxWnxWjyW`zWazVdzVlzVa{V`{WnzWixXa{Xa{YnzYfzYazYjyYnxYixYixXazXazYjxZkx[hx[`{[jzZnz\c{\b{]oz]gz]bz]ky]ox]jx]kx\nx\cz\bz]fz^nz^`{_c{_lz9@dz@nx8^jx^hx9@kx@c{@ixBa{B6ea3S5ayS6ea%G5ayG(m}!L)ecLecOaaLbaN1hlRklI'hyRkyI,heDheRfhMbcMheR"mc @6ig@kg?^"oc^mc @%`m!RcmI,dsRgsI*dfRgfI.lRoI+djOdjLloLloOdmLemN$dgLdgOddLhiLddOhiO3`yRcyI&duO`vOmvNovL`vLdrLgqLeqNdrOlsOmsN0`dOecNgcL`dLlgLkhLihNlgO-dwLh|Li|Nl{O`xOewNdwL2hpLluLmuN`uOdtOisNlrOdqOipNhpLhsLisN4l|L5l`L`bMcbMl`O4l|O`L`O,heRbfMheRbdMheRfcMfhMkeMbcMieNfhMjeNbcMheRncMheRndMheRjdMheRfeMheRnfMheRjgMheRbgMheRffMheRngM"ii#UakTemTmnUlnVemWakWhiViiUlq!R5`yRay?P"mqPlq!R5a|#Ui}TmT6eaUdaV5mWi}W`|Va|U"ii%GmqGgm/\jm_em0Bbn/_gm\fn_em0B6ea*_5ay_6ea(C5ayCb|&P`|Sc|Q6gaQf`P"jiPhiSkiQonQjmPii(CmqC5m)L6i`LdaMfaNi`O5mOm|La|La|O"emLanLlnMnnNanOemOejLiiLiiOii*_mq_6ea-[5ay[6i`,HdaIfaJi`K5mKbJe~Km|Kb|J`|Im|H`IbJ"anHlnInnJanKemKjlJmkKejKjiJhiIejHhlIjlJii-[mq[5a~/Ga~D6baEbaEfaF5b|F"ekGekDfnEfnEnnFjiFnc_nq_em0Bgm/\nq_nc_nq_gm\em0Bnq/_nq_em0@nq/_em^nq_fm]nq_em]nq_dm^nq_dm_nq_gm^nq_dm0Anq/_gm0@iiWmqWnq/_dm0@nq/_fm0Anq/_gm0Aln2Con1_kl_il2BlkCdjCiiBji@gj1_ck_6ea0W5ayW6da2Cga1_5c_a2Bd~Cl|Ca|Bb|@o|1_k}_"ii3SmqS%ak7Z#e{ZedZ"mqZ6ea6O5ayO6h`4_ea^ga\k`[5o|[c|\a|^l|_d~_a^c\g~["`n_mn^on\cn[gj[ki\ii^dj_lk_il^kl\ok[ii6OmqO6da7Yda\h`\5`|Y"lnYln\`n\hiYmqZ%ekZek?P"mqPmq7Z$iwZjw?P#ec7Zfc?P%ek7Zek?P"ii9KmqK6eaK5ayK"ii<GmqGan:TlnUnnVanWemWjlVmkWejWjiVhiUejTmkThlUemTanThlUjlV#fcN"nqN6i`TdaUfaVi`W5mWbVe~Wm|Wb|V`|Um|Te~T`UmT6i`T5`UbV#av=DezDdzFnyFnvF`vFavDgzGcvGhxIavJezJgyMoyMezMdzLnyKnvK`vLavMovMcxMaxMfwQnvQ`vRavSlvT`xTixShxRfyQnyQdzRezSlyTfzUezWbvUavWavVezVfzXdz[bvX`v[jxYixZbv^`v\dz\fz^hx\hx^$iw<[#ec[6eaG5ayG#i}[j}?P"dj=PkiPiiRdjS`nSmnRonP`nPhlPokPmkRhlS#ckNckIcpKcpKjpMngMejQaiQngRmgUbiVjkVmlUnlRanQeoQjpRipUfoV5l|Pc|Pa|Rl|S6h`SeaRgaPh`P5`Pg~Pe~R`S,ie?PgfTiePghTccTieP#dz>SgzT`vScvT`vTdzTdwVlvVcvVcvWnvXbxXkxWkxVdyVlyVgzVgzWnyXgwYovYavZbv[lv\`x\jx[ixZgyYoyYezZfz[ly\ez]mv]`v^av_ov_gz_bv?C`vAdzAfzChxAkxBh}>F"lqF%am?PbmX"d}>Sh|Sc|S`|Uj|Un}Uh~Uk~S`SlS#g`Sd`U"nUk~Vi~Yc|V#g`V"a|Y#e`Y"c|\b|Z#f`Zg`\"j~Zi~\b|?@`|>^#d`^f`?@"h~>^k~_#g`?Ad`Dd`C"`|C'iyPjyX*efPffX,iePcdTiePgcTie^iePghTccTiePiePocTiePodTiePkdTiePgeTiePcgT(l}S)dcSdcV`aSaaU,iePofTiePcfTiePkgTiePogT.mPnX,esPfsX1ilPjlX3ayPbyX-ewSi|Sj|Um{VaxVfwUewS&euVavVnvUlvTavSerSdqTfqUerVmsVnsU$egSegVedSiiSedViiV+ejVejSmoSmoVemSfmU2ipSmuSnuUauVetVjsUmrVeqVjpUipSisSjsU0adVfcUdcTadSmgShhTjhUmgV4m|S5m`SbbTabUm`V4m|VaSaV,ghTjeTccTheTghTkeSccT"hx8Pn|RjxRl|Po|S`{Um|V`{UhxUn|Wo|YjxWkxYa{Xa{Ydy9@ix8_hx^fy]f|]l|^m|_d|9@dyAkxAhxCfyCf|Cl|Co|Ad|AdyAkxDo|D`{Fm|GixGjxHn|Hm|Jg|Jo{Ja{Jb{HhxL`|Ll|Mn|Mb|NjxNhzLjzNkxOo|OhxRl|Rm|Sb{To|Ub{TjxT$h:[%hd^$h^%hd[id_gb;@idBgb@$k@%kdCjdF$kCjF%gbDgbEc`M$hMjK%c`JocJjdKhdMocM``O$kOiQ%``RlcRidQkdOlcO``O$iS%idSgbTidV$iVkW%kdWkdYncZbcZgbYgbW$h\%dc\hd]kd]gc^$k^%ha\ka^$i<@%id@$hC%hdCjdDdbFidGdbF$hFmc8NejNdjQdiRhhRhgQigNkeSodSocTocVndWjfWkgVkgTkhSgiSgjTgjVfiWncYfjYej\ei]md]mc\ncYod9BlcBlc@ld8_di_dj9@djBgiBncHfjHigJejLmcLldNlcOlcQodQgiQdjQdjOdiNldNocSgjSfjVfiWndWncVocSlc]mcYejYdj]igYig\ke:BodBocCncEndFjfFjgEkgCkhBgiBgjCfjEfiFlcLmcHejHdjLigHhgKdjNlcNocQmcWncSfjSejWjgSigVld]lc\lcZmdYeiYdjZdj\di]gj^fj;Bgj@oc@mcHejHdjKdiLldLlcKmcHncQocMgjMfjQkgMjgPfjSmcUejWfjYej\ncYmc\lc[dj[ld<BlcAlc;_md^ei^dj_dj<AdiBncGocCgjCfjGkgCjgF#n{8Wb{WbzXbzZa{[m|[n}Zn}Xn~WjW$j`Xj`Z#i[$i`]h`9Ah`8_#`z_cz9BgB$i`Di`E#fFbzFo|Bn|F$j`Hi`Li`J#azJczQ`zN$h`Nk`Q#l}Nl}QbzW$j`W#m}Y$i`[#az[`z]d]$j`^j`_#g:@cz@l|9]o|:@b{FbzEczCc{BkB$k`Cj`E#jFm}Hl}LazH$i`H#`zL$h`Lj`Ni`Q#bzNazQczO$k`O#`zS$h`S#czV$k`V#bz\czX$k`Xj`\#o}Xn}[e}^d};Bd}Dg}Gn{Ib{IbzJbzLa{Mm|Mn}Ln}Jn~IjI$j`Jj`L#iM$i`Oh`Sh`Q#`zQczT$k`T#o}V$j`X#bzXbzZ$j`Zi`]#i^m~^m}]m|^a{^az]bzZn}Zm}]bn>XfoXkpYip\fo]bn]biXngXng]"dtW`zWbzYeyZixZjwYmvZauZftYdtWhwWjwYdy\`z]cz^fy_jx_kw^nv_bu_gt^dt]`u\hw]kw^m};WawW`w[aw]aw<@cw;^o}^e|]l{<Bl|Bl}Cl}El|Fl{F`xB`wB`wFo|Go}Ho}Jn|Kn{KozJbzKbxKcwJcwHcxGozHozJiyQjyMd}Od}Om}PawPl}Wm}SmzSlzV`zW`xW`wV`wTaxSaySo|\o}[o}Yo|XcxXcwYcw[cx\cz\oz[ozYczX$ia=FegFldHfgIjaIiaKafKfgLegMbfNjaNadKbdNiaPegPggRjfSneSodRmdPldRjaSfbXkaWhaVebUifUdgVggWjfXmdZnd]iaZegZja]fg]ha>CjaEiaDegD`fCebGhaHkaIfbJjfJggIdgHifGmdG`dHcdIndJdbMgbMgbMkaM#nMnM$jaMhaMhaMdbMiaSkaUjaTfgTafSebWiaXkaYgbZkfZggYegXifWmdWadXcdYodZif\eg]gg^kf_oe_od^cd_gb_ka^ia]eb\ad\md]me\if\md]od^gg?DegAmdAodCcdDgbDkaCiaBebAecAem=[as[kp\bs^fm^ao>@an@dmAgmBbnCnoCkpBhpAiq@er@`sAcsBfrCasEemEfmHdmK`nKcnKgmKdmKfrMasN`sPgrPkqPhpPooPcnPdmPemNbnMipNhpP*kw7]kw;L+gL*ly8VdyVayV`yWfyWbzWhzWizVlzVd{Vi{Vh{Wf{WayXi{Xi{Yf{YnzYizYbzYfyYayYayXizXizYbyZcy[`y[h{[b{Zf{\k{\j{]g{]oz]jz]cz]gy]by]cy\fy\kz\jz]j{^h{9@d{@by8^0nx:Fox9W)giWei:L`n9QcnRnoTfqTcsR`sQfqOnoO`nQ0dvWfvXaxZmyZf{Xd{WmyUaxUdvW+fh:QbkQdhS`kSghSckSckTijUmhUghTghSdjVhjVakV`kWjjWfjWlhVdhVfhWisLauLkuLiuMbuMjsMetLftMenLipLipMfpMnoMioMfoMjnMenMenLioLioMnoFnoKntFntKawRbwKnlKmlRbrYbrYbrYfrYfrYjrYjrYirYmrYmrYmrYlrY`sY`sYcsXcsXcsXbsXbsXasXasXasX`sX`sXorWorWorWorWjrWjrWjrWfrWfrWbrWbrWbrWnqWnqWnqWjqWjqWfqWfqWgqWgqWcqWcqW`qX`qXaqXmpXmpXnpXnpXopXopXcqX`qY`qY`qYaqYeqYeqYeqYfqYjqYjqYnqYnqYnqYbrYmlRolRmlSbmS`mTfmTkmTmmUbnUdnVmnVboVkoV`pWepWmpWeqWmqWerWirWasWisW`tWgtVntVeuVhuVnuUavUgvTjvTlvTbwSawScwRawRbrY`r[mrUnrVipUjpVoqUlqVfyQbyQkxQjxR`ySlySbzRczQjzQnzQc{Qb{RlzSkxSc{Sc{TmzUizUczTmyUayUkxTkxSczSczThxVixWkxVc{VhzVlzXa{X`{YnzYjzY`zYnyYbyYhxYixX`yXazX`zYmzZb{Za{[nz[jz[az[ny[by[ix[jxZayZmyZbzZizZmzZbzZaz[cy]jx]kx\ay\mz\c{\b{]oz]0of9_nf:AhhCdjCblAcl9_dj^hh^of_b~:Fb~@k{9_j{:A`}Cl~C1j`Ak`9_0l~^`}^k{_-ca:SbaK,fuKguSb{Fb{KfvMavMcvLevLmwLgxLexMnwMjwFjwKn~Fn~KmyLm{Lm{Mj{Mf{Ma{MjzMbzMmyMmyLa{La{Me}LaLkLiMbMf}Me~Lf~MguSeuTguTiuUkuUmuVcvVevWnvW`wXiwXnwXdxYlxYeyYnyYfzYnzYf{Yb|Yj|Ya}Yh}Y`~Yf~Xm~XdXjWmW-g`Vi`Vk`Um`UcaTaaTcaS,lpVhsVnpWjsWlpXhsXisYbsYfqYmpYlpXasZksZjs[cs[or[fr[cr[gq[np[opZeqZgrZfr[c{[a{]c{[g{[g{[k{[k{[k{[o{[n{[n{[b|[b|[a|[a|[`|[d|[d|[g|Zg|Zg|Zf|Zf|Ze|Za|Za|Z`|Z`|Z`|Zo{Yo{Yo{Yk{Yk{Yj{Yf{Yf{Yb{Yb{Yb{YnzYozYkzYkzYkzYgzYdzZdzZdzZezZazZazZbzZbzZczZczZczZ`z[`z[`z[ez[ez[fz[fz[fz[jz[kz[kz[oz[oz[c{[c{[c{[o{Vl{XoyVlyX`{Wb{W-dcVlbVibVhbWnbWjcW`dWadVddVldVaeV`eWndWhbX`eXaeYndYfdYadYjcYnbYibYhbX`dXadYjbZjb[hb[`e[jdZmd\ce\be]od]gd]bd]kc]ob]jb]kb\mb\cd\bd]nd^`e_ce_ld;@dd@cd:_hc;@lb@kb:_hb_nb^jc^`d_fd^nd^`d_cd_kb;@kd@aeAceAidBibBkc@icB+b}:QjQ`}ShSc}SkSkTeUe}Uc}Tc}Sl~VdViVhWfWn~Wd}V`}Vb}W,ahLmiLgjLejMniMbhMaiLbiMmbLaeLaeMndMjdMadMncMfcMmbMmbLadLadMfdFfdKjiFjiKmkRnkKfaKeaRjfYjfYnfYnfYbgYbgYbgYegYegYegYegYhgYhgYhgYkgXkgXkgXjgXjgXigXigXigXhgXhgXkgWggWggWggWfgWbgWbgWbgWnfWnfWjfWjfWjfWffWffWbfWbfWbfWneWoeWoeWoeWkeWheXheXieXieXieXjeXjeXkeXkeXkeXheYheYheYmeYmeYmeYmeYbfYbfYbfYffYffYjfYjfYeaRkaRiaSjaSlaTbbTcbTebUnbU`cVecVncVcdVhdWaeWeeWmeWefWmfWegWmgWahWhhWciVfiVmiV`jVjjUmjUckTfkTdkTjkSikSokRmkRjfYhf[egUfgVaeUbeVgfUdfVnmQjmQgmQfmRhmSdnSjnRknQboQfoQooQnoRdoSgmSooSooTeoUaoUknTenUimUgmTgmSknSknTdmVemWgmVooVdoVdoXmoXloYfoYboYhnYfnYjmYdmYemXhmXinXhnYeoZnoZmo[fo[bo[in[fn[jm[em[fmZimZenZjnZaoZeoZjnZin[em\mo\no]go]co]jn]gn]km]fm]em\in\jn]/b}QjQ`}ShSc}SkSkTaUe}Uc}Tc}Sl~V`ViVhWbWn~Wd}V`}Vb}W0ahLiiLcjLajMjiMbhMmhLnhMmbLaeLaeMndMfdMadMncMbcMmbMmbLadLadMfdFfdKfiFfiKikRjkKfaKeaRjfYjfYjfYnfYnfYbgYbgYbgYegYegYegYegYdgYhgYhgYkgXkgXjgXjgXjgXigXigXigXhgXhgXdgXggWggWggWfgWbgWbgWbgWnfWnfWjfWjfWjfWffWffWffWbfWbfWbfWneWneWoeWkeWkeWheXheXheXieXeeXeeXfeXfeXfeXgeXkeXheYheYheYieYieYmeYmeYneYbfYbfYbfYffYffYffYjfYeaRgaRdaSjaShaTmaTcbTdbUjbUobU`cVecVncVcdVhdWaeWeeWmeWefWmfWagWigWahWdhWohVfiViiVliVgjUjjUljUckTakTdkTjkShkSkkRikRjfYhf[egUfgVaeUbeVgfUdfVnmQjmQcmQbmRhmSdnSjnRknQboQfoQkoQjoRdoScmSkoSkoTeoUaoUknTenUimUcmTcmSknSknT`mVamWcmVkoV`oVdoXioXhoYfoYboYhnYfnYjmY`mYamXhmXinXhnYbn[anZkoZkoZio[am[km]bm]cm\im\eo\ko\jo]go]jqQbtQhqS`tSkqSctSctTmsUmqUkqTkqSdsVlsVatV`tWnsWfsWlqVhqVjqWi|Le~Lo~Lm~Mf~Mj|Mi}Lj}MewLiyLiyMfyMbyMixMfxMnwMewMewLixLixMnxFnxKb~Fb~K1e`Rf`K0nuKmuRb{Yb{Yf{Yf{Yj{Yj{Yj{Yj{Ym{Ym{Ym{Ya|Y`|Y`|Y`|Yc|Xc|Xc|Xb|Xb|Xb|Xa|Xa|X`|X`|X`|X`|Xc|Wo{Wo{Wn{Wj{Wj{Wj{Wj{Wf{Wf{Wb{Wb{Wb{WnzWnzWnzWjzWjzWjzWfzWgzWgzWgzW`zX`zX`zX`zXazXazXbzXbzXbzXczXczXczX`zY`zY`zYezYezYezYezYjzYjzYjzYnzYnzYnzYb{Yb{YmuRcvR`vSbvSdvTevTkvTlvUbwUgwUhwVaxVfxVoxV`yWiyWazWezWmzWe{Wm{Wa|Wi|W`}Wg}Vn}Va~Vh~Vo~UbUdUkTmTlT1b`S``Sg`Re`R0b{Y`{[m{Un{ViyUjyVozUlzV1fbQbbQoaQnaR`bSlbSbcRccQjcQncQgdQfdRlcSoaSgdSgdTmcUicUccTmbUabUoaToaSccSccTlaVmaWoaVgdVlcVlcXedXddYncYjcY`cYnbYbbYlaYmaX`bXacX`cYjb[ibZcdZcdZed[ma[ma\ed\fd]oc]kc]bc]ob]cb]na]ma\ac\bc]0o~;L1koLio:]cq^op^dp_gp_mp;@iq@oq:_lq_gr^kr^`s_cs_ir;@dpA`sA`sBjrBfrBlqBjqBnpBdpBdpAlqAlqBepCfpDdpD`sDerCirEbsEasFkrFgrFmqFkqFopFepFfpEmpEnqEmqFgqHeqGlrHlrHbsHfpHfpIfrIasJbsJdrKdpKjqIhqK,hf:[kf;Lmh:]eh]ch]ah^gh^ci^ii^ki]mi]ej]kj]ij^gj^bh_jj_jj;@djAliAji@`iAdhAbh@bh:_ji_ji;@chA`hCbhBjjBcjAgjChjDkjDejEmiEkiDaiEehEchD`hDghChiDkiDdjFijFhjGejGmiGhiGaiGehG`hGahFdhF`iFiiFliFdjFiiFhiG`hHhjHijIfjIniIiiIbiIfhIahI`hHhiHiiI(ja:YncYncZgcZoaZjaZjaY)ekRamRkmRhmSbmSfkSelRflS`mTdmTjmThmUemUamUlkTdkTekU(m|Rm~Rm~Sj~Sf~Sa~Sj}Sb}Sm|Sm|Ra~Ra~Sd~Th~Tn~Tl~Ui~Ue~U`}Tl|Tm|UayRe{Re{SnzSjzSezSbzSfySaySayRezRezSlzTf{Td{UmzUizUdzUazUeyU`yUbyTdyTfzTdzU'kxH)kvHhv<M'hxMkx:H(izLjzQa~Lb~Q)e`RibRibSfbSbbSiaSfaSn`Se`Se`RiaRiaSe`Te`Ug`TkbTabTmaLnaQmgRiiRoiRliSjiSngSihRjhShiTniTliUiiUeiU`iUihUahUlgUngT`hTbiT`iUeiLfiQ(jlNklS)aoRmpRgqRdqSnpSboSapRbpSaoTaoUcoTgqTmpTmlLnlQipLjpQ(gkUbkUckTfkTbmTgmTfmUcmUilVamVgmVemWbmWjlWekVakVbkWfrNgrSgqUbqUcqTfqTnrTcsTbsUorUbqVbqW`qW`sWjrV)bdYbdQ(fxQfxY)nrYnrQbgQbgY(io;YioSej:ZgjZej[kj[ij\nj\`k]fk]kk]`l^fl^ol^`m_hm_an_jn_bo_jo_bp_fp_mp_dq_lq_cr^jr^`s^gs]js]ls]bt\et\gt[it[ktZitZitZktSgjSejZo`Sn`_fxYexZgxZix[ox[mx\cy\iy]ny]dz^iz^b{^k{^`|_i|_a}_j}_b~_n~_e_m_)d`_o`^fa^ma^`b^jb]mb]cc\ic\kc[mc[cdZadZbdYbgYagZcgZeg[gg[ig\og\eh]jh]lh^ei^ni^gj^lj_ek_mk_fl_nl_fm_an_in_`o_ko^bp^ep^lp^fq]iq]oq\ar\gr[ir[krZmrZnrY(jo_ho;FduFguTn`:_m`;KiqKhqTb~:_`~;F`yFcyT)nl:_ml;K(m|Kl|Ta~Yc~Y`~Zb~Z`~[b~[o}[m}\o}\i}]j}]d}^b}^c}^m|_k|_d|<@f|@c|@m{Aj{Ad{BmzBjzBdzCazCnyCdyDayDnxDgxD`xEiwEfwEovEa~;Ya~SioSnoSgpSopS`qTiqTarTfrTnrTgsTosTctThtU`uUhuUluUdvUlvUdwUlwU`xUhxU`yUkyTczTgzTnzTf{Ti{Ta|Th|Tc}Sg}Sn}Sa~S'azYa|Yo|Yl|Zc|ZczZe{Yg{Zjz[cz[bz\kz\g|\n|\o|[f|[jz[o|]l|_cz]`z_az^m|^g|_l|<@o|@d|A`|Ak{@d{AhzAcz@`z@kz;_h{<@k{@g|Am|Bl|Ce|Ca|Ch{Ce{CizC`zCazBkzAi{Bh{C`|Dd|Dn|Dm|Ef|Eb|EhzD`zDbzEbzFbzG`zGl|Gb|F(io;YkoYhoZjoZho[jo[oo[mo\oo\ap]bp]dp^jp^kp^mp_cq_dq<@jq@kq@mqAbrAhrBmrBbsBdsCisCbtCdtDitDbuDguDhuEavEjvEovElvHlvH`wHcwGgwGgwGgwGkwGjwGjwGnwGnwGmwGmwGlwGlwGlwGowFowFnwFnwFnwFmwFmwFmwFhwFhwFhwFgwEgwEgwEcwEcwEovEovEovEkvEkvEgvEgvEgvE`vF`vF`vFavFmuFmuFnuFnuFnuFouFouFluGluGluGmuGmuGnuGbvGbvGbvGcvGgvGgvGgvGkvGhvHlvHlvHlvHmvIkwBhwDguBduDivCkvC)mr;YerYbrYarZgrZcsZisZjsYmsYetYjtYitZgtZbr[jt[jt\gt\os\js\cs\gr\br\br[js[js\cr]`r_ar^it^ct]`s<Acs;_et<@et@kt@cr@`rB`rCbrBjtB`tB,edGedZ*m`Zn`:C(n`Co`S,jf<KffKleLoeLdfM`gMggLdgLjgKbhKdhLghL`hMoeMghMdhOahOigOdgOagOefOleOoeMggMdgOmePmeQoePghPmgP`hRfhRdhSbhSjgSdgSbgSffSleSneRdfRfgRdgSahTfhTehUchUkgUegUcgUgfUmeUneTefTagTfgTigTahTfgTegUob;LlbI+`rI`r:[gt[os[is\hs]ms]it]lt]mt\gu[ku[av\`v]iu]hs^`v^`v_ju_fu_lt_jt_ns_hs_hs^lt^lt_js;@jsAhsA`vAju@iuBbvBavCkuCguCmtCktCosCisCjsBmsBntBmtCjuDcvDbvEhuFduFntEhtFlsFjsEksDnsDjtDotDfuDjuDotDntElsHksGhsGosFkuF`vGcvGhuH0c{L`{:[k|^c|^l{_o{_a|;@m|@g}:_d}_k}^c~^d~_g~_a~;@l{Ad~Ad~Bb~Bj}Bd}Bn|Bb|Bl{Bl{Ad}Ad}Bm{Cn{Dl{Dd~Dm}Ca~Ef~Ee~Fc~Fk}Fe}Fo|Fc|Fm{Fn{Ea|Ef}Ee}Fo|Hm|Gd~Hd~Hf~Hn{Hn{If~Ig~J`~Kh}Kg}Jl|K`|Ko{Jn{If}Ig}Jhf:[hf;IdwIgwL`h:[hg[fg[eg\jg\fh\mh\nh[`i[di[ni[mi\fi\eg]mi]mi^gi^ci^mh^gh^kg^eg^eg]mh]mh^gg_gg;@eg@mi@gi:_fi;AoiAniBdiC`iCnhBdhChgCfgBggAjgAohAnhBahEchCiiDiiDoiDggDigGdgGegFhgFdiFmiFliGeiG,gjLc{La{:]i|]e|]o{]m{^g|^c}^e}^g}]m}]a~]k~]i~^c~^n{_j~_j~;@`~Al}Af}@`}Ad|An{@n{:_f}_f};@o{Al{Cn{Bj~Bo}Ac~Ch~Dk~Da~Em}Eg}Da}Ee|Eo{Dl{Dg|Cd}Dg}D`~Fi~Fh~Ga~Gm}Gd}Ga}Ge|Gl{Gm{Fd|F`}Fe}Fl}F`~Fe}Fd}Gl{Hl}Hk~Hh~In}In{I`}Hb}I&ms=PavNmsPmqN0f};RbRhSiScSg}Sf~Rg~SgvSnuSluSfvRnwR`xSbxSowSfrRjtRjtSctSkrSfrSfrRosLosQgwLgwQjyRn{Rn{Sk{Sc{SnzSkzSoySjySjyRnzRnzSc{Lc{Qo~Lo~Qiq\kq\iq]lq^nq^`r_gr_mr<@cs@hsAnsAdtBmtBfuBouBhvCawCjwCfxCnxCjyCbzCizCd{Co{Bf|Bm|Bd}Bn}Ad~Ak~@a@g;_h_n^1``^a`]g`\e`\e`\g`Q0kqQiq\cm\ko\am^io^`m_ho_io<@fo@jm@am@`m;_cn<BanAkoAkoAjoBbmBoxEmxGoxEcyEcyEcyEgyEfyEfyEjyEjyEjyEiyEmyEmyElyElyElyEczDczDczDbzDbzDbzDazDmyDmyDlyDlyDlyDkyCkyCkyCkyCfyCfyCfyCbyCbyCbyCnxCnxCnxCjxCjxCfxCfxCgxCgxCcxCcxC`xD`xDlwDmwDmwDmwDnwDnwDnwDowDowDowDlwElwElwEaxEaxEaxEbxEfxEfxEfxEfxEkxEkxEoxEoxEoxEjy@kyAfw@gwAhxAjxA1gb;\cb\ma]la^ab^mb^`c^ac]kc\oc\ed]dd^mc^la_dd_ed<@nc@jc@ac@nb@bb@ma@la;_`c_ac<@naAnaBlaBddBncAmcCgdCfdDocDkcDbcDobDcbDnaDoaCabCccCbcDhbGjbE`dF`dFfdFnaF,nh;RjjR`kSakSkjSohSniRoiSoaSfaSdaSnaRfcRhcSjcSgcS+n}R,b`Rb`S+kSc~Sn}Sn}RgLgQ,obLobQbeRfgRfgScgSkfSffScfSgeSbeSbeRffRffSkfLkfQgjLgjQ+a}\c}\b}]d}^k}^m}_c~_e~<@o~@aAkA,a`Bn`BgaBlaCibCbcCncCfdCbeCjeCefClfCkgBbhBihBciAiiAcj@ej@oj;_ak_gk^hk^jk]ok\mk\mk\okQ+c}Qa}\kx\c{\ix^a{^hx_`{_a{<@nz@by@ix@hx;_ky<BiyAc{Ac{Ab{BjxB,gdEedGgdEkdEkdEkdEodEndEndEbeEbeEaeEeeEeeEeeEdeEdeEdeEkeDkeDjeDjeDjeDeeDeeDeeDdeDdeDdeDceCceCceCodCndCndCjdCjdCjdCfdCfdCbdCbdCbdCncCocCocCkcCkcChcDhcDdcDecDecDecDfcDfcDfcDgcDgcDdcEdcEdcEecEicEicEicEjcEncEncEncEcdEcdEcdEgdEgdEbe@ceAnb@obA`dAbdAom;\km\em]dm^im^en^hn^in]co\go\mo]lo^eo^dm_lo_mo<@fo@bo@in@fn@jm@em@dm;_hn_in<@fmAfmBdmBloBfoAeoCooCnoDgoDcoDjnDgnDkmDfmDgmCimCknCjnDfoEloFnoFdoG`oGjnFdnGhmGfmFdmFjmEfnEhnFboEfoEhnFjnF2k`=NobLk`N1g~Le~>Bn~A2jaAebBfbEebCi`Ch`Eb`E1n~Ed~Eg~Cm~CiCf~F2fbFgbHj`Fi`HhaLfbKfbJhaJ1l~Jf~Jf~Kl~L2``Lj`Kj`J``J1g~Mm~N2iaNgbM'en=PipNenPalN&lq>CerBauBhuCiuFhuDlsDosEesFerFoqEnqDdrDlrDjtIbuIhuIkuGauGerGoqGlqIfrIfsIdsIcuLiuLiuKbuJfrJmqKmqLgrLgsLmsLmsKfsJnqNdrO`uOjuN'`lCmlBioB`pCapF`pDdnDgnEmmFmlFclEblDllDdmDblIalGapGbpIenGdnIkoLapLapKjoJnlJalKalLolLomLenLenKnmJblNllOhoObpN7`s @ 0707070014230643171006440057030057030000011717320522627504100003000000014000post.src/tests/postgif1GIF87a@È´fD3UUU"3DDU"f""w""ˆ3™33ª3Dª3D»3DÌDUÝDUwffˆˆˆ™™™Ý™Dªf™UU"ÿÿîÝÝÌ»»»DDD333""",@Èþ  Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðÅ	

úûüûÿø.P@0‚
 ïL="Hà ¡¢‰2jÜÈ‚GBòh¡Â†\þ>tø ¢Å‹>ÊœI“£M"0À§ dB†(£túáCÄ(]Ê´©S¥÷þ…|@óルè$yðgP%&tðP‚†ª]˶m‡ xÚ4*ƒ°bÕzÖçɯC>ˆ-*À¬‚•+^̘qQǶ…K°rÝ»xõjÕI` @ÀìJ¤nÌ:1ä´p)W.hóÔ½†~æñA4ÙÔ
|¡òtq·n_]þA@sÇ"¿…kdu¼y¯¥Ða7Ñc›>@Ñ	Èð€¾½û÷ð'ˆ=z,ÙæÏ?žn/¸u©¨4ƒyCo£ýþ6žp"ÕzÃ	ß„Â^xËé—üÓSÿD÷ žfà
€§`p©™‡àê¥8ߌ4Öhã5B¶š†¤Ôˆ8`‰åH‚J*ŠÇbƒ"eÞ†ÈE)å”c¥f_†@R;ýdZChäPõ­ÈqM†·•l¶9”zÇ]ù\“HÕÀR@
IAb†d}„-ˆ&”ƹiè”1&w_btÞõÀ^ꉞ_Éøæs‚2Ih¢‡vÚÖpYJ	aÎÁ ¤	ä	&zÝÁƒ¤Z
pÖ lEèé­°ÚÊæ}s¾…”H?Y{&ª#b™
Ö©À ¯)·^³ÐF+í´Ôþ6;\µÔ’ªRÿà…ª)V«çDwᨩ)‹¦[ºâzk„„º¹¨sCu‹ªH7®9ڗ쬚J{-¶,ð³O«m½Ý†äÀK…Kh‘Þû&º.p´ð&ì1¶ ~œ­bi!¥ÃÛ$¥Þ@¦"ºÀìb¶‹l³µOÞ<­k˜|²Ã+®Ý-p63†q –Ì)œ³Î:LµÀ‰õì3Ê!ÀÁéct5\¶Ty$ÁJ`3+õÕU«w´ˆ9Ç%fØqôë#—
âŠ5nZ¯2Ïù`À|ð€F°íöÁÑÍ-rÇpGÇ\QÜÞ½×þ!%•*ßÐÀ@D:
p1´›Ç¾ù)€øè€ÐjzE^ÔÆo[þ1¨•Û¬yìd@pwÛÛ×]âsÐåf­ìØ/GJíô 0Û÷•É%~fþù觯þú­•ÁûïËUY>ýÔo?×:ýè0X)—}ö£¨Ýíúst¨y\Bˆ&¼ÎM|•A óìGÁûõ-)¤cBò5ªÿiñ÷nÇ<Йð„îP•ºð…0Œa ~ä„ZÉIwXA”ý#U`€g^ ÀJŒp.%‰
k‘D$¨šžM¦HÅ*ZñŠXÔˆ²HEœè‡`¤ÿàS%ÄàŒhL£âÖx´Epo.Ba±(“)	@£î–ÈÇ>ú±†~üHõ’•Í„‘‡25:’‚x#%Çr1‹°‰×ðqÉNzò“[´bU™6:j¦‡¬ŸHD—3Nw°l#$™®õN&ŸŒ‰UHÉKB>Ì„\@ ‡ILš’'LÛEéR~ñAŒXBèËÅÉò+ÀÏl©LAf†½tæ	I:ÏáðœèLg:)¾4`(ЊÔi¼‰ä*ËäbDdòÌ0†$bÔî;½0&¹|a!é	ºZ‚N\²'C'JÑb‘€Eyþ(Ú0®á²Š~4d7*MÅÍANt¦âÍ\v‘&W™h?èGÁˆ¦ò¦8ýÜpæ瀔'žóT'D;ê°™\R&áÄ
H é¥ À¤r¸K8éÒO"5¦8ìR(Á®zõ«`
kó\"úÍŒ6-êG­šÔ^öS•Mm¥@ô¸èR†U½	°úPÜ«b
¬`Ø ´°Ø1ªF,Â
8–"/™b8¹éÌþ3q¸ðá‘0¶”#Œ},d_ÊÏDz°„M­jUË<¯ä.jõÈb+’/5#éˆ8“IÈ¥ÞO'²dDðˆSÙÎö"Õ‰M?[Û*W‚)`0§þKÝêZ÷ºØÍîtÁ¼y“¶¸J_œ2¿öÔ&•Ý&èH™ÜçÝ©
¦{>nj\Œ<àrQœBR»3>d£ùŒÉ£†ºÕ`JW»N°‚LêÎ&Ž¸Dî};c   Ì«¯€±ú\ŸYP©­f×[w¦Ò¸ÍB,¬‚y¤Ê‰٫خ¾ÛøÆ8αŽwü=Þ–/¸Û'Ÿ{-ä`ù‘ªˆtÄiMÁøÄf
Ñ,~í4«ñîÄ€=汘ÇLæ2û¸Æøˆm—®ÔÀÈx\mQ¹Z{å%/ùKÃð¢CV9…pó‘¢&°ß‘àÃ
¯x£[ÿã3—ùÑ63ŽÓì^-ç*C4¡ýghÐ#ÎÍ]e=×€@ÙÀGóv¸ÏûwfTêà…M×êàØёε®=é±ms÷Í´‹Ò$ªŠ`Ïr.(_TkéØ¡ÁrA­Mùa•3 Tñ’ÖZœ5D7ót±±÷vMîr‡ïƪþõrøÇA«f?Û†V[Fuá$û.«ýÀ0°oðûû.´d°î#mÿ¸v¨^çAé\©ÛÂÜëYn<ns[<ן¯cÇnA»fCœÆžÃé-‚Ø;#,dp_À´S»$\<¹£æ¯n×Ö⾸ÐqðþåFvÿðx–®·óåH2#0y ˜o€æÿÆúË®{=–Ḣĭ­š¥wKæÛ´|~•p׸èC;ŽáAu/'8Jg:©ÒÎÂA]ð+aWn˜¼ðZßnÁÚŠ4îñ½‰|ãf‡s³3‡}Œrúkº-^ŠËýó8>ºí^!V>ä˜wŽÓíñª¿¼ð¯‡=¶ j°: ;¸wîÉå¢ÓŸ1Í{Àâ±lABæ5è—ÿ=ºÄ8›#ˆïy|ệø‹Ñüßm'x±6Ûƒ°š‚ZdW«ßEÈ<è/’¡?N}× =6‚¿ô³é’3ÏÆPa>óE?šþhsÞ3}h—"ðW#òGÆ'ðuiÔ€þ%,šCÈt!oEÁrÿÓ{ç×hRvœ¦ÂçÓb}e“y	Ð!>¸¦B—qùW,Ú6GÃ~h7‚0R‚ï'Ø,"àN³aGU_ Hx„G8E´•B*ñwLèX낉ñ~	|7"íñƒ$gŽæ|0hnüGJaQ†68§…¡!’#`ˆb¨&7„ÒÖ<²ƒ~µ'A3…Kào­8éwˆê÷†¿·…òA€£ñð“Á'‡=x‡€§†Ma†gHnãVs$à"pÈ…ŽX7‘8‰ÿôa‡(è,©6„`e…è§m„2lŸˆx‹g‹ç×{S³w¤È*ù!ÿïó òQ‰™Çmd˜‰tÑŒÎøŒÐÎè=äU‹#0ayùñ‹ƒ±ÃXŒèa}ôç,yèŠ^¥‹´@ÌѺ#>î(±ÔâmXÂ…\Œ‰ñoûÎaª¨}—Ø‚³!?›xqüçÖØ n˜3õxŒòÂÈrÀ½á°Šçv
öUèØt´è’ô +€…‹hŒ\˜°ª¡+É(þ8ªW9ÃQâ!:¹“<IõP€#W4I*()*É’Ùrú“9E·‡\‚Žÿ.`lP üu•X™•¼8”ÏÁ…FÙo‰1 €Xç9šWp“Ma=ù–p	?‰+0nÆ•Œ˜’`0–e™}g9“ôVŽåÕUè88)>LBüÕHÔÔuïhæÑ"þ“5òa”.·o¡Ñðr@‘€)|œ©z$7tá–q™šªÙJO$%‰C”—9*ùo+9	s ©)“QSiÔ•¥™ïÈ‹Œ‰F	Kr±•Q††—q˜’ü&{Š¡”Pù!#¸ŠâQ_‡8"9žäYžæyžæžò¸‹è•´YÙ™š™Ûé#˜âÁgÿ•¸ˆFÈYjDMîèœÒ‹Êðið À(u^™øÙ"Æç@Ú¡t䢠pÑ ¡J/Ïa¡—‰¡N'Ôh\×uŽôŸg”eG¢ýå˜ÌÙœýYÚ~ð·#
p@)@‰Á ,÷™—IÍq±Bœ} AªCzEºH*JÊrФOú.Úá)£åiaÎÆ9ª£í˜>ª¡‹H >¸2#0±‡xð¥èAó¥ßyÒ)§'H2Š1wš§ˆÇ§ò§bšk£áYžqɦºc
À(ħr‘$S£y|°¤ÿKʨܑ%:èÙª®úª°«lK
â©B§¢ê#Pª¦
p¨Ê™€Ú"‹ôuæY©j@°Ž’ª×©íG ŒC!š†º )§¹ji-¢‚²®â:ž›3®<Z«Ïú©ÒÊ™Õz­Ù:¢À­Àzy€§;Åj£n‘¬Ñiƒ
­£y‰çoYR¤Š¡<Ð*ªÇƒ)%§8ˆcœâS¦±+±%0±öúH<:bý: ÿšž9{c¹’@°‰a°‚°íu!i¬vÐtÆF¥Ðº¥Â({
ÒrÓª{2$+‘²Ë°
ë°@´;´^§~Kž™ê¬Xò©$¢d™xÿú¶o7Ë(9K";‹%†P|}H'Y¢ðé«#ëdyŽ1|Bp„<{aË:®p·¯Ú€%е_ûaû™c[¶g›¶k+¦
›		û ª…°÷™@ek¶úQ¸ÀN“°‰±ƒ›…Û‡›¸üȸ†—}+¹WK*›¸Ï1™{¸¾Ê@Ÿë°¶°éÑA$©¦–©[°ºÞèºÇ(±; ´[™•[º}çjË'‡û’BÚ¸²»“Û¶¸›¼°¼¨Ë»Îk¥Ð+½Ä[½XË	jGš+¹{R¸…Z²O¯±K"Ô+óò­×›–çËé[ÿë+*Yxî‹¿³Ëò»wž€¿9²èË…«¿+é‹¿%ÀZøL“Á\¨àÀ…Áñ;Áž€‚ÆWŽE½
¼À(,¹’«¼ˆô»"Ü,$,Z(œÂ*ÌÂì p‡GÚX%¬Â@ÜX8ì§p	<¬¶%lÂA,ÄÔKÄ:
s²i=¼PÅVlÅM;,	Q¼¡H|Å`œÅLw»¢€€z¤3\Â^Ë1hW	f-{’Ä°ÆZ¼Åmà.x%“9“g\0—w¼#Ç‚<È„ì%ÐÅ}L0l%…ÜÈžB4Žì/.ëlÙ§}ŠŒvôû}“¼ÉœÜÉžüÉÇWv1l0ÿ‹œŸÜÉÍÉlɃ¬s,	ÁX¾…†É/l	±Üw
SʵãèpŽ,8Ì4Âpv\øØt‘©·ÌÌÜÌÎœz&pÌ;—ÌLÀ('ÌØ\#ÀœÍt(Éœl>&àÌ'°Ì„qÊæ|άzÎÑáÜÌíLΧükÁÍô,rÏÇÈT;µÌ>ãü?Ð]Ç›ÓÏëÓβ3Ðm1øÜÐíaÏ]!5‚dzË+@šò¦Ê½Ñ‡;€ŒØ&Ï%ÖÑ

Ñ&-Ñô¼Ò3â&,ýÒ0Ó2=Ó/í)4}Ó3’Ò)Ò:ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHýÐÔLÝÔÿNýÔPÕR=ÕJÓV}ÕXÕZ½Õ\ÝÕ^MÓ¬<Òb=Öd]Öf}Ög-Š½ÖlÝÖnýÖp×ÔÂ$è\×v}×x×z½×|Ý×{M×~Ø‚=Ø„]؆}Ø“؈½ØŒÝØŽýØ­Ø=Ù”]Ù–}Ù˜Ž˜½ÙœÝÙžÝ×’ýÙ¢=Ú¤]Ú[Ø>€=¼Ay«¦­M•:°ŽhbΚ&¥6€Úš×¢üÌ,IɼÝÛëøÛŒ¡Ù»-ÜÍVÜ¿mi ˆÎË­=ÂÍšŒ×¡-Ýýè.:R*ÁM/õá)s¢ÜÚ+¿áÁí ÛÇãý*‚<ÞѽÉïæÝèÞ~=ÝwÝÞÌÝÎ=¸ÿŸLß÷½Þ‰-ÞûÍ×ïFzv­ß´mß¿cà¢-ߎàùà~Êþà
®ªÿý×>ßÞɞᜭàu-áé¼áøíÉ"ÎßÈÜÜß^ß#®á¾â˜íá,žÖ¬Þ,îÞ4¾¸³³Î} ;Þâî:ð⚸Ú<.Üvâ.>¸ïöܾÇÂŽLäúÚÌNžäÆ}ä*'ÖMÉ@ÎÞD|àM’	MÑùáÞ&áßí."NæƒÌå 
ãæýåvî²f¬ÛD¾æ
žçÙç¥-ãç\å7~è^à®×%àtèxîç”Mèu.éMŽÎ«éõ½èxéî=瀾sÿNÚ”Îæ¡NâëŒ5žèlÎé<°ê)nÛ>žâ–@DÞã3 çŽ~ê¨þÜ:nã…îßî뿾ŽWÞÌjŽè)NìµNâ¹-Ýã××ñÞÎí´míÃÑÈØãÈëˆíùí®Ãíñýì¦]îæ~î]êè¾îìÞîNîîïò>ï‰
ïô~ïø~ïêžïüÞï¤nïþðïÙ•GìðŸð
¿ðßðÄ^ðñ?ñ_ñÏðF’ñ¿ñßñÿñ ßk‡0\ûw¤Zò›òXÊ¢Øò.¿«0ÿò*Ÿ,¿1_ó'oó3Ï)_3,ƒó@¨Ö5¿óVðó7o9ϵDOó1¯ó8ßô2¿ôM0-JïòT/ô=O!;0707070014230643201006440057030057030000011714570522627504100003100000000421post.src/tests/postplot1s  mtstarts at the lower left corner
m tshould start just above the upper left corner
fsolid
mddndôfdotted
nôôpÐÐfshortdashed
cÐÐèp¸¸flongdashed
c¸¸ôfdotdashed
aÄ	Ä	Ðи¸funknown
lôôÐÐmn n  n nmܸttop of the big circle
0707070014230735720407550057030057030000020015070522633100700002400000000000post.src/trofftable0707070014230732641006400057030057030000011777300522633100700004100000006043post.src/trofftable/trofftable.1.ds dF /usr/lib/font
.ds dQ /usr/lib/postscript
.TH TROFFTABLE 1 "DWB 3.2"
.SH NAME
.B trofftable
\- output a PostScript program that builds a font width table
.SH SYNOPSIS
\*(mBtrofftable\f1
.OP "" options []
.OP "" shortname
.OP "" longname []
.SH DESCRIPTION
.B trofftable
writes a PostScript program on the standard output that builds a
font width table or typesetter description file.
The following
.I options
are understood:
.TP 1.0i
.OP \-t name
Use
.I name
as the template for fonts not in the default set.
Choose
.MW R
for proportionally spaced fonts and
.MW CW
for fixed width fonts.
Try
.MW ZD
(ZapfDingbats) if the font has a non-standard
character set.
The default is
.MR R .
.TP 1.0i
.OP \-C file
Copy
.I file
into each PostScript table program;
.I file
must contain legitimate PostScript.
.TP 1.0i
.OP \-H hostdir
Use
.I hostdir
as the host resident font directory.
A file in
.I hostdir
that matches the name of the troff font is assumed to be a host
resident font program and is included in the PostScript width
table program.
There is no default.
.TP 1.0i
.OP \-L file
Use
.I file
as the PostScript prologue.
.br
The default is
.MW \*(dQ/trofftable.ps
.TP 1.0i
.OP \-S file
Use
.I file
as the shell library file.
Overrides the choice made with the
.OP \-T
option.
.TP 1.0i
.OP \-T name
Set the target device to
.IR name .
Device
.I name
means
.br
.MI \*(dF/dev name /shell.lib
is the shell library file.
There is no default.
.PP
One of
.OP \-T
or
.OP \-S
is required.
If both are given
.OP \-S
wins.
Either
.OP \-H
or
.OP \-C
can be used to include a host resident font.
.PP
The shell library file defines a collection of functions used to
build troff tables.
The default set of tables is the list of names returned by the
.MW AllTables
function.
Changes to the default list can be made by updating the
.MW BuiltinTables
function.
.PP
.I Shortname
is the name of the
.B troff
font and
.I longname
is the name of the PostScript font;
.I longname
can be omitted only if
.I shortname
is a default table name.
PostScript table programs created by
.B trofftable
return data to the host computer using PostScript's
.MW print
operator.
See
.BR hardcopy (1)
if you don't have access to the printer's serial port.
.SH EXAMPLES
Get the PostScript program that builds a width table for font
.MR R :
.EX
trofftable -Tpost R >R.ps
.EE
If a font is not in the default set include the
.B troff
and PostScript font names:
.EX
trofftable -TLatin1 GL Garamond-Light >GL.ps
.EE
A font must be available on the printer when the table is built.
Use
.OP \-H
or
.OP \-C
to include host resident fonts.
.SH WARNINGS
A width table will not build properly if the printer cannot access
the PostScript font.
.PP
The
.OP -TLatin1
option only works on PostScript printers that support the full
.SM ISO
Latin-1 character set.
The error message from older printers will likely indicate a missing
.MW ISOLatin1Encoding
array.
.SH FILES
.MW \*(dF/dev*/shell.lib
.br
.MW \*(dQ/dpost.ps
.br
.MW \*(dQ/trofftable.ps
.SH SEE ALSO
.BR dpost (1),
.BR hardcopy (1),
.BR postio (1),
.BR troff (1),
.BR buildtables (1),
.BR font (5)
0707070014230735741006440057030057030000010015700522627504200004200000007136post.src/trofftable/trofftable.ps%
% Prologue for building troff width tables. The gsave/grestore pairs are
% for hardcopy.
%

/slowdown 25 def
/flagduplicates false def

/ascenderheight -1 def
/descenderdepth 0 def
/octalescapes 256 def
/startcomments 256 def
/currentfontdict null def
/scratchstring 512 string def

/Print {
	scratchstring cvs print flush
	slowdown {1 pop} repeat
} def

/ReEncode {	% vector fontname ReEncode -
	dup
	findfont dup length dict begin
		{1 index /FID ne {def}{pop pop} ifelse} forall
		/Encoding 3 -1 roll def
		currentdict
	end
	definefont pop
} bind def

/SelectFont {	% fontname SelectFont -
	findfont
		dup /PaintType get 0 eq {
			/scaling 1 def
			unitwidth resolution 72.0 div mul
		}{
			/scaling resolution 72 div def
			unitwidth
		} ifelse 
	scalefont
	/currentfontdict exch def
} def

/ChangeMetrics {DpostPrologue begin addmetrics end} def

/NamedInPrologue {
	dup
	DpostPrologue exch known {
		DpostPrologue exch get type /nametype eq {
			(named in prologue\n) Print
		} if
	}{pop} ifelse
} def

/SetAscender {
	/str exch def

	gsave
		currentfontdict setfont
		newpath
		0 0 moveto
		str false charpath flattenpath pathbbox
		/descenderdepth 4 -1 roll .5 mul def
		exch pop exch pop

		newpath
		0 0 moveto
		str 0 1 getinterval false charpath flattenpath pathbbox
		4 1 roll pop pop pop
		dup 3 1 roll sub .25 mul add
		/ascenderheight exch def
	grestore
} def

/GetAscender {
	ascenderheight descenderdepth ge {
		gsave
			currentfontdict setfont
			newpath
			0 0 moveto
			( ) dup 0 4 -1 roll put
			false charpath flattenpath pathbbox
			exch pop 3 -1 roll pop
			ascenderheight gt {2}{0} ifelse
			exch descenderdepth lt {1}{0} ifelse
			or
		grestore
	}{0} ifelse
} def

/GetWidth {
	gsave
		currentfontdict setfont
		( ) dup 0 4 -1 roll put
		stringwidth pop scaling mul round cvi
	grestore
} def

/GetCode {
	256 3 1 roll		% last unprintable match
	0 3 -1 roll {
		2 index eq {
			dup 127 and 32 ge {exit} if
			3 -1 roll pop
			dup 3 1 roll
		} if
		1 add
	} forall
	exch pop
	dup 255 gt {pop}{exch pop} ifelse
} def

/BuildFontCharset {
	0 2 charset length 2 sub {
		/i exch def
		/chcode -1 def
		/chname null def
		/key charset i get def
		/val charset i 1 add get def

		val type /integertype eq {
			/chcode val def
			/chname currentfontdict /Encoding get chcode get def
		} if

		val type /nametype eq {
			/chname val def
			/chcode currentfontdict /Encoding get chname GetCode def
		} if

		val type /stringtype eq {/chcode 0 def} if

		chcode 0 lt chcode 255 gt or {
			chcode 0 lt {(syntaxerror: )}{(undefinedname: )} ifelse
			Print key Print (\t) Print val Print (\n) Print
			quit
		} if

		val type /stringtype eq {
			key Print
			(\t) Print val Print
			(\n) Print
		}{
			chcode octalescapes ge key (---) eq and {
				(\\0) Print chcode 8 (   ) cvrs Print
			}{key Print} ifelse
			(\t) Print chcode GetWidth Print
			(\t) Print chcode GetAscender Print
			(\t) Print chcode Print
			chcode startcomments ge {
				(\t# ) Print chname Print
			} if
			(\n) Print
			chcode octalescapes ge (---) key ne and {
				key (\\0) anchorsearch not {
					pop
					(\\0) Print chcode 8 (   ) cvrs Print
					(\t"\n) Print
				}{pop pop} ifelse
			} if
		} ifelse
	} for
} def

/BuildDescCharset {
	/DescDict 512 dict def
	/Characters 0 def

	0 1 charset length 1 sub {
		/i exch def
		/key charset i get def

		key length 2 eq {
			DescDict key cvn known {
				flagduplicates {	% for debugging
					(<<<duplicated character: ) Print
					key Print
					(>>>\n) Print
				} if
			}{
				DescDict key cvn 1 put
				key Print
				/Characters Characters 1 add def
				Characters 20 mod 0 eq {(\n)}{( )} ifelse Print
			} ifelse
		} if
	} for
} def

0707070014230735751006440057030057030000010016050522627504200004200000005052post.src/trofftable/trofftable.sh#
# Writes a PostScript program on standard output that builds a width
# table or typesetter description file. The program uses PostScript's
# print procedure, which means the table comes back on the printer's
# serial port. Try hardcopy if you don't have access to the port.
#

POSTBIN=/usr/lbin/postscript
POSTLIB=/usr/lib/postscript
FONTDIR=/usr/lib/font

PROLOGUE=$POSTLIB/trofftable.ps
DPOSTPROLOGUE=$POSTLIB/dpost.ps

COPYFILE=
HOSTFONTDIR=
DEVICE=
LIBRARY=
TEMPLATE=

SLOWDOWN=25
STARTCOMMENTS=256

NONCONFORMING="%!PS"
ENDPROLOG="%%EndProlog"
BEGINSETUP="%%BeginSetup"
ENDSETUP="%%EndSetup"
TRAILER="%%Trailer"

while [ -n "$1" ]; do
    case $1 in
	-C)  shift; COPYFILE="$COPYFILE $1";;
	-C*) COPYFILE="$COPYFILE `echo $1 | sed s/-C//`";;

	-F)  shift; FONTDIR=$1;;
	-F*) FONTDIR=`echo $1 | sed s/-F//`;;

	-H)  shift; HOSTFONTDIR=$1;;
	-H*) HOSTFONTDIR=`echo $1 | sed s/-H//`;;

	-L)  shift; PROLOGUE=$1;;
	-L*) PROLOGUE=`echo $1 | sed s/-L//`;;

	-S)  shift; LIBRARY=$1;;
	-S*) LIBRARY=`echo $1 | sed s/-S//`;;

	-T)  shift; DEVICE=$1;;
	-T*) DEVICE=`echo $1 | sed s/-T//`;;

	-c)  shift; STARTCOMMENTS=$1;;
	-c*) STARTCOMMENTS=`echo $1 | sed s/-c//`;;

	-o)  shift; OCTALESCAPES=$1;;		# only for Latin1 tables
	-o*) OCTALESCAPES=`echo $1 | sed s/-o//`;;

	-s)  shift; SLOWDOWN=$1;;
	-s*) SLOWDOWN=`echo $1 | sed s/-s//`;;

	-t)  shift; TEMPLATE=$1;;
	-t*) TEMPLATE=`echo $1 | sed s/-t//`;;

	-*)  echo "$0: illegal option $1" >&2; exit 1;;

	*)   break;;
    esac
    shift
done

if [ ! "$DEVICE" -a ! "$LIBRARY" ]; then
    echo "$0: no device or shell library" >&2
    exit 1
fi

if [ $# -ne 1 -a $# -ne 2 ]; then
    echo "$0: bad argument count" >&2
    exit 1
fi

if [ -d "$HOSTFONTDIR" -a -f "$HOSTFONTDIR/$1" ]; then
    COPYFILE="$COPYFILE $HOSTFONTDIR/$1"
fi

#
# Include the shell library and get the command used to build the table.
# Make awk call a separate library function??
#

. ${LIBRARY:-${FONTDIR}/dev${DEVICE}/shell.lib}

if [ $# -eq 1 ]
    then TEMPLATE=$1
    else TEMPLATE=${TEMPLATE:-R}
fi

CMD=`BuiltinTables | awk '$2 == template"" {
	if ( pname == "" )
		pname = $3
	printf "%s %s %s", $1, tname, pname
	exit 0
}' template="$TEMPLATE" tname="$1" pname="$2"`

if [ ! "$CMD" ]; then
    echo "$0: $TEMPLATE not found" >&2
    exit 1
fi

#
# Build the PostScript font table program.
#

echo $NONCONFORMING
cat $PROLOGUE
echo "/DpostPrologue 100 dict dup begin"
cat $DPOSTPROLOGUE
echo "end def"
echo $ENDPROLOG

echo $BEGINSETUP
cat ${COPYFILE:-/dev/null}
echo "/slowdown $SLOWDOWN def"
echo "/startcomments $STARTCOMMENTS def"
echo $ENDSETUP

$CMD

echo $TRAILER

0707070014230733371006400057030057030000010015740522633100600004200000003474post.src/trofftable/trofftable.mkMAKE=/bin/make
MAKEFILE=trofftable.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript
MAN1DIR=/tmp

all : trofftable

install : all
	@if [ ! -d $(POSTBIN) ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp trofftable $(POSTBIN)/trofftable
	@chmod 755 $(POSTBIN)/trofftable
	@chgrp $(GROUP) $(POSTBIN)/trofftable
	@chown $(OWNER) $(POSTBIN)/trofftable
	cp trofftable.ps $(POSTLIB)/trofftable.ps
	@chmod 644 $(POSTLIB)/trofftable.ps
	@chgrp $(GROUP) $(POSTLIB)/trofftable.ps
	@chown $(OWNER) $(POSTLIB)/trofftable.ps
	cp trofftable.1 $(MAN1DIR)/trofftable.1
	@chmod 644 $(MAN1DIR)/trofftable.1
	@chgrp $(GROUP) $(MAN1DIR)/trofftable.1
	@chown $(OWNER) $(MAN1DIR)/trofftable.1

clean :

clobber : clean
	rm -f trofftable

trofftable : trofftable.sh
	sed \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	trofftable.sh >trofftable
	@chmod 755 trofftable

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dF.*'.ds dF $(FONTDIR)'" \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	trofftable.1 >XXX.1; \
	mv XXX.1 trofftable.1

0707070014231031441006440057030057030000010307200522627504200002000000014711post.src/READMEStuff appears to work, but it's obviously not well tested. I fully
expect several iterations before things are correct!! Make sure you
can back this out quickly.

This code supports UTF encoding. Directory dpost.utf is a version that
reads UTF encoded files. Directory dpost is DWB 3.3 source and should be
close to what you're currently using. Main source code changes were in
dpost.utf (files font.h, font.c, and dpost.c). Select either dpost or
dpost.utf in TARGETS in postscript.mk. Both build and install a program
called dpost!!

dpost.utf is more general and includes code that lets it read either
format. Only catch is troff must tell it (with x E UTF) that the file
is UTF and troff currently doesn't output encoding info, so you're
stuck with two post-processors!

Added common/rune.h and common/rune.c so code can be compiled elsewere.
Both files are only used by dpost. Remove RUNELIB in commmon/rune.h if
fullrune(), chartorune(), and runetochar() are available on your system.
You will also need to set READING in common/gen.h. It controls how dpost
(from dpost.utf) reads troff output. It should be UTFENCODING on Plan 9
and ONEBYTE elsewhere. If troff includes encoding hint (x E UTF) then
READING selects the default which sould be ONEBYTE.

Leave WRITING (in common/gen.h) set to ONEBYTE. It only controls dpost
output and dpost (right now) does not work 100% with UTF.enc. Fix should
be easy, but I don't have time now.

Other translators passed bytes through so only needed slightly modified
proglogues and a new encoding scheme (psencoding/UTF.enc). It works for
Latin1, but still needs a bit more attention. Prologue changes were easy
and only involved adding lines like,

	/show {show} bind def
	/stringwidth {stringwidth} bind def

Guarantees text procedures used in prologues aren't operators and can be
successfully redefined in UTF.enc. Unbinding means a small but probably
not noticeable speed penalty. You may not want to include those changes
on other system.

-------------
Major Changes
-------------

See the VERSION file.

-------------------
Tuning The Makefile
-------------------

Source files, man pages, and low level makefiles can all be updated
to reflect settings in postscript.mk in one simple step (described
later). In most cases you only need to edit file postscript.mk.

First save a copy of file postscript.mk. Then adjust the following
definitions in file postscript.mk:

  SYSTEM    best match for your version of Unix. Current choices for
	    SYSTEM are:

			SYSV	- System V
			V9	- Ninth Edition
			BSD4_2	- Berkeley (eg. Sun)

	    Controls conditional compilation in a few places.

  GROUP	    group assigned to all installed files

  OWNER	    owner of everything that's installed

  BINDIR    dpost and picpack go here. All other programs go in POSTBIN.
	    BINDIR must already exist - it will not be created during an
	    install.

  HOSTDIR   hostresident font directory for PostScript printers. Only
	    used in the font download program.

  FONTDIR   width table directory - for troff and most postprocessors

  MAN1DIR   command manpages. A command and its manpage are installed
	    together - there's no easy way to avoid it. Setting MAN1DIR
	    to an existing temporary directory (e.g. /tmp) means an
	    install will work but manpages won't go anywhere permanent.
	    MAN1DIR must already exist - it will not be created during
	    an install.

  POSTBIN   where most PostScript support programs go. dpost and picpack
	    the exceptions.

  POSTLIB   prologues and miscellaneous PostScript files. Primarily for
	    the programs that live in POSTBIN.

  CFLGS	    common compiler options - used to build CFLAGS in the low
	    level makefiles. CLFGS and LDFLGS are best set on the make
	    command line.

  LDFLGS    common link editor options - used to build LDFLAGS in the
	    low level makefiles. LDFLGS and CFLGS are best set on the
	    make command line.

  DKHOST    set it to TRUE to compile the DKHOST Datakit support code
	    in postio. Temporarily resets SYSTEM to SYSV if DKHOST is
	    TRUE and SYSTEM is BSD4_2. Ignored if SYSTEM is not SYSV
	    or BSD4_2.

  DKSTREAMS enables streams based DKHOST support in postio when DKHOST
	    is TRUE and SYSTEM is SYSV or BSD4_2. Choices are TRUE,
	    FALSE, or a stream module name (e.g. dknetty or dkty). TRUE
	    selects dknetty. Newer systems may expect dkty.

  ROUNDPAGE must only be set to TRUE or FALSE. TRUE means PostScript
	    translators include code that maps clipping path dimensions
	    into known paper sizes.

  TARGETS   the default list of what's built by make. Each target must
	    be the name of a source directory. A target that names a
	    non-existent source directory is ignored. Setting TARGETS
	    on the make command line overrides the default list.

-------------------
Updating The Source
-------------------

Whenever file postscript.mk changes you should update source files,
man pages, and low level makefiles by typing,

	make -f postscript.mk changes

------------------------
More System Dependencies
------------------------

The package has been compiled and tested on System V and Ninth Edition
Unix Systems and on Sun workstations. Most differences are handled via
the SYSTEM definition in postscript.mk. Problems that remain are:

  SYSV - System V
    Use the native compiler if you're on an internal System V UTS
    machine.

  V9 - Ninth or Tenth Edition
    chown is in /etc and chgrp no longer exists - it's been folded into
    the chown command. You may be forced to build a simple chgrp shell
    script (put it in your bin) that calls chown. If you're not superuser
    set OWNER to your login name and GROUP to your group id.

  BSD4_2 - Sun Workstations
    Use the Bourne shell. chown is should be in /usr/etc. Add /usr/etc
    to your PATH and export PATH. If you're not superuser set OWNER to
    your login name and GROUP to your group id.

----------------------
Installing The Package
----------------------

To build (but not install) the default package (i.e. everything named by
TARGETS in postscript.mk) type,

	make -f postscript.mk all

To build and install the package type,

	make -f postscript.mk all install

After the package is installed use,

	make -f postscript.mk clobber

to delete binary files and compiled programs from the source directories.

To select part of the package define TARGETS on the command line. For
example,

	make -f postscript.mk TARGETS="dpost devpost" all install

builds and installs dpost and the PostScript font tables. Quotes hide
white space from the shell.

0707070014231031451006440057030057030000010307400522627504200002100000044463post.src/VERSION------------------------
Version 3.3.2   7/7/92
------------------------

 1: Added UTF support for Plan 9. Only signigficant source code changes were
    in dpost.utf (font.h, font.c, dpost.c). Added common/rune.[hc] so code
    can be compiled elsewere. Remove RUNELIB in commmon/rune.h if fullrune(),
    chartorune(), and runetochar() are available on your system. Original
    DWB 3.3 dpost source is in directory dpost. You should select dpost or
    dpost.utf in postscript.mk. Both compile and install a program called
    dpost so don't pick both!

 2: dpost can read old or UTF troff output. Default is whatever is assigned
    to READING (file common/gen.h). You get one or the other, unless troff
    tells dpost what encoding to use (currently x E UTF).

 3: Most other translators passed bytes through and so only needed slightly
    modified proglogues and a new encoding scheme (psencoding/UTF.enc). It
    works for Latin1, but still needs a bit more attention. Prologue changes
    were easy and only involved adding lines like,

	/show {show} bind def
	/stringwidth {stringwidth} bind def

    Guarantees text procedures used in prologues aren't operators and can be
    successfully redefined in UTF.enc. Unbinding means a small but probably
    not noticeable speed penalty. You may not want to include those changes
    on other system.

 4: Operator redefinitions means dpost should work in it's own dictionary
    (rather than userdict). Not implemented yet, but should be easy. Only
    potential problem is with picture inclusion when dpost reads UTF.enc.

------------------------
Version 3.3.2   5/15/92
------------------------

 1: postio now outputs all unrecognized status reports - primarly for spooler
    accounting purposes.

 2: The makefiles also enable the selection of alternate stream module names
    for streams based DKHOST support in postio.

 3: dpost now assumes the optional fifth token in a font mounting command
    (e.g. x font 2 R /usr/me/font/R) is the full pathname of the font. troff
    outputs the pathname when a .fp request contains a third argument that
    begins with a / as in .fp 1 R /usr/me/font/R.

 4: By request Latin1's - character has been changed from minus to the smaller
    hyphen character. Added \(dq and \(bs (for " and \ characters) to devpost
    and devLatin1 tables. Also added \(!! and \(?? to devpost tables.

 5: Helvetica-Light and Helvetica-LightOblique tables are included as HL and
    HK in devpost and devLatin1, even though fonts aren't generally available.
    Also copy H to HM during an install of devpost and devLatin1 tables.

 6: LH and LV are horizontal and vertical AT&T logos from Matthijs Melchior
    with slight adjustments to the scaling of "AT&T". Also adjusted LV so globe
    sits on the baseline.

 7: Included L1 and LA outlines in devpost and devLatin1. Adjusted LA scaling
    so size of "AT&T" matches what's in LH and LV. Original PostScript came
    from Matthijs Melchior.

 8: Included the "symmetric clippath" version of roundpage.ps as Nroundpage.ps
    in directory postscript/psfiles. Move it to roundpage.ps if you want it to
    be the default.

 9: Added a few lines of code to dpost for handling current implementation of
    the portrait/landscape mode macros.

10: The man page for download now documents the -r option and notes that -p
    is for Unix 4.0 lp.

------------------------
Version 3.3.1   4/30/91
------------------------

 1: buildtables stuff has been cleaned up and is now a user level command.
    Uses shell.lib files that are installed with font tables. The devpost
    tables were built on a version 47.0 PS-810. The devLatin1 tables were
    built on a version 51.7 PS-820.

 2: The devLatin1 tables provide support for the ISO Latin1 alphabet on
    PostScript printers.

 3: All translators support different text font encoding schemes using the
    -E option and *.enc files installed in POSTLIB. The ISO Latin 1 alphabet
    is supported with file /usr/lib/postscript/Latin1.enc.

 4: printfont prints a table of the available (encoded) characters in one
    or more PostScript fonts. It also understands the -E option.

 5: grabit and hardcopy are two new programs that may be of interest to the
    more serious PostScript programmer. grabit resembles ==, but produces
    output that's usally easier to read. hardcopy redirects output from
    PostScript file output operators (or procedures) to paper. It's useful
    if you don't have direct access to a printer.

 6: Prologues and programs are stored together. Other common PostScript files
    are now in the psfiles directory.

------------------------
Verions 3.3	4/16/90
------------------------

 1: The package is now included in DWB. Version numbers are a bit misleading.
    The one in postscript.mk refers to the DWB package.

 2: dpost (and troff) now read ASCII font tables. makedev and the old binary
    format are gone.

 3: The devpost directory came directly from the DWB package. The font tables
    originally distributed with this package are in directory devopost. They
    are not installed. If possible we recommend you use the devpost tables.
    The old tables can be installed by adding devopost to the TARGETS list in
    file postscript.mk.

 4: dpost recognizes two new fields in font tables. Entries for the full
    PostScript font look like,

		fontname Times-Roman

    The fontname field is helps manage host resident fonts, the DocumentFonts
    comment, and is used to define font name abbreviations like the ones in
    dpost.ps. A font table entry that looks like,

		named in prologue

    disables the runtime abbreviation for the font - dpost assumes it's already
    in the prologue.

 5: Extra font tables included in DWB 3.0's devpost font collection are in
    directory devpost.add. They included here, but should probably not be
    used.

 6: Bracket building has been fixed and tested on a wide range of PostScript
    printers. It will likely still not work on many clones. Real problem
    appears to be with Adobe's braceleftbt character.

 7: Most of the special tuning code for device emulation has been removed.
    Emulation still works, but there may be cases where it's not as good as
    earlier versions.

 8: Several problems with color and reverse video printing have been fixed.

 9: buildtables directory has been cleanup up. The template files in directory
    buildtables/devpost.data were used to build the devpost tables.

10: postplot and download are two new programs. postplot is for the System V
    plot package only. Both were written for the Unix 4.0 lp package.

11: postgif is also relatively new - it came from Chi Choy.

12: The translators now rotate clockwise when printing in landscape mode. If
    you want the old behavior set ROTATION to -1 in postscript.mk.

13: forms.ps has been cleaned up some. Better behavior when you print 2
    landscape pages on one sheet.

14: Handling of Datakit code for System V has been changed some. Makefiles
    now expect to find libdk.a and dk.h in standard places (e.g /usr/lib and
    /usr/include). Set DKHOST to TRUE in postscript.mk to get Datakit support
    on System V.

    If you're stuck and need to have things behave as they did in the past
    take a look at file postio/postio.mk. Define DKHOSTDIR and uncomment
    three lines and the behavior should be close to what it was.

15: Picture inclusion and color macros are gone. They're included in the DWB
    package, and not here.

------------------------
Version 3.2	11/27/89
------------------------

 1: Implemented height and slant requests in dpost.

 2: Modified the behavior of all translators so save objects are no longer left
    on the stack. The original implementation was a mistake and occasionally
    (e.g. picture inclusion with forms.ps) resulted in invalid restores.

 3: Fixed the mistake in the external declaration of mesg in postio/slowsend.c.

 4: The malloc() call in postdmd (routine dimensions()) is only made if patterns
    is positive.

 5: Changed definition of De in draw.ps so savematrix is loaded with the CTM
    whenever De is executed. Original implementation didn't work with forms.ps
    because the CTM is changed with each page image. (4/29/89)

 6: Flush stdout when postio is invoked with the -t option - just convenient
    not necessary. (4/30/89)

 7: Included a man page for the picture inclusion macros - file man/mpictures.5.
    (5/6/89)

 8: Added BoundingBox code to dpost - still needs to go in other translators.
    Most of the work is done in common/bbox.c. (5/7/89)

 9: Fiddled with the bracket building stuff in dpost.ps so things finally look
    decent. Was particularly bad on the typesetter.

10: dpost now generates a PageBoundingBox comment and ps_include.c accepts
    the comment. Added -B option to enable/disable the BoundingBox calculations.
    -Bon to enable and -Boff to disable. On by default now, but that may change.
    Add similar code to the rest of the translators (6/20/89).

11: Fixed ps_include.c so it properly handles %%BeginGlobal and %%EndGlobal.
    Added braces and compare page.start to page.end instead of 0.

12: Added xymove(hpos, vpos) for \X'PS ...' request - near the end of devcntrl().
    Must output position info for following PostScript.

13: Added a call to endtext() immediately before the oput() call for \N'...'
    requests. Without it spacing often messed up with -e2 but not -e0.

------------------------
Version 3.1	11/15/88
------------------------

 1: postio can run as one or two processes (-R option) and can establish an
    interactive connection with a postscript printer (-i option). Parsing of
    status reports has been improved. The status query mechanism can be disabled
    using the -q option. An exit status of 1 implies a system error (eg. can't
    open the line) while 2 usually means there was an error in the PostScript
    file. By default postio runs as a single process. The -B, -R, and -q options
    can be used to speed things up some. A version of the program (previously
    supplied in postio.tmp) that can help if you seem to be having flow control
    problems can be obtained using the -S option. It's not generally recommended
    and should only be used as a last resort!

 2: Several widthshow encoding schemes have been added to dpost and can reduce
    print time by 20% or more. The method used to encode lines of text can be
    changed on the command line using the -e option. Level 0 produces output
    essentially identical to previous versions of dpost. The default can be
    changed by modifying the definition of ENCODING in ./Makefile. At present
    only level 0 is thoroughly tested, although level 2 (ie. -e2) may be the
    default and is undoubtedly worth a try.

 3: dpost now supports color selection and reverse video. Access in troff is via
    the stand-alone macro package ./macros/color. Examples are,

	.so /usr/lib/macros/color
	.CL red "this prints in red"
	.CL "white on black" "and this prints white text on a black background"

    The postscript procedures that handle color and reverse video can be found
    in ./postscript/color.ps. Additional colors can be added to the colordict
    dictionary defined in ./postscript/color.ps.

 4: The dpost drawing routines have been improved and have been moved from the
    prologue (ie. ./postscript/dpost.ps) to ./postscript/draw.ps. That file is
    only included if needed. Drawing routines now support the ability to group
    a series of drawing commands together as a single path. May be useful for
    future versions of pic that wish to fill regions with colors or gray levels.
    Access is via the new "x X BeginPath" and "x X DrawPath" device control
    commands. In addition there's some complicated PostScript code in file
    ./postscript/baseline.ps, that can be used to set text along an arbitrary
    curve. It's terribly confusing and I doubt anyone will have the patience to
    bother to figure it out.

 5: A simple picture packing troff preprocessor (picpack) has been included and
    the code needed to recover pictures and text has been added to dpost. The
    program is designed to supplement to the original picture inclusion mechanism,
    and should ONLY be used when absolutely necessary. Using dpost to pull picture
    files into a document is strongly recommended and will always be the more
    efficient and portable approach. picpack simply provides a way to combine
    pictures and text in a single file before dpost is executed. It may help in
    a distributed printing environment where the user runs everything through
    troff while a spooling daemon (eg. lp) handles the postprocessing. There
    are serious disadvantages to this approach, with perhaps the most important
    being that troff output files (when picpack is used) will likely result in
    files that can no longer be reliably passed through other important post-
    processors like proof.

 6: Code to handle host resident PostScript fonts in dpost has been tested and
    finally works. The -H option points dpost to a host resident font directory,
    which by default is NULL. Host resident font files stored in that directory
    must be assigned a name that corresponds to the one or two character troff
    font name. Width tables must also be built (see buildtables/README), the new
    binary font files must be installed in /usr/lib/font/devpost, and a mapping
    definition from troff's name to the PostScript font name must be added to
    ./postscript/dpost.ps.

 7: The default pattern length in postdmd has been reduced to from 10 to 6 bytes.
    Printers with fast processors (eg. PS-810s) often benefit from a further
    reduction, while optimal performance on slower printers (eg PS-800s) may
    require larger pattern sizes. The pattern length can be set using the -b
    option. Increasing the pattern size usually increases the size of the output
    file.

 8: Line drawing in posttek and postbgi includes code that automatically ties
    lines to device space coordinates when you select a non-zero width. Helps
    eliminate the variation in line thickness that many observed. The default
    line width in posttek and postbgi is still 0 (which gets 1 pixel). If you
    want a different default change the definition of variable linewidth in files
    ./postscript/posttek.ps and ./postscript/postbgi.ps.

 9: Defocused lines in posttek have been fixed.

10: postbgi now supports color and can be used to translate most PRISM (color
    BGI) jobs. Special device specific tuning needed for many PRISM jobs can be
    enabled by using the -P"/prism true" option. Missing pieces (eg. subroutines)
    needed for translating PRISM jobs, have also been implemented.

11: postreverse can reverse the pages in documents that conform to Adobe's 1.0
    or 2.0 file structuring conventions, and it works with all the translators in
    this package. The new version is backwards compatible, but files produced by
    the new translators should not be passed through old versions of postreverse.
    The likely result will be no output at all. If you choose to do a partial
    installation put the new postreverse up first!

12: All translators attempt to conform to Adobe's Version 2.0 file structuring
    conventions. dpost output falls short, but only in the interest of efficiency.
    Passing dpost output through postreverse (perhaps with the -r option) produces
    a minimally conforming PostScript file.

13: All the translators now support three options that pass arbitrary PostScript
    through to the output file. The -P and -C options add a string and the
    contents of a file respectively immediately after the prologue. It's assumed
    whatever is added is legitimate PostScript - there is no checking. In each
    case the added PostScript code becomes part of the job's global environment.

    The -R option can be used to request special action (eg. manualfeed) on a
    global or page basis.  The argument should be "request", "request:page", or
    "request:page:file". If page is given as 0 or omitted the request applies
    globally. If file is omitted the lookup is in /usr/lib/postscript/ps.requests.
    The collection of recognized requests can be modified or extended by changing
    /usr/lib/postscript/ps.requests.

14: PostScript code (from Johnathan Shopiro) that produces bolder versions of the
    Courier fonts has been included in file postscript/fatcourier.ps. The file
    can  be added to individual prologue files (eg. dpost.ps) or pulled in as
    needed using the -C option.

15: postmd is a new program that can be used to display a large matrix as a gray
    scale image. May help if you're looking for patterns in a large matrix. A very
    optimistic estimate suggests you can display up to a 600x600 matrix (with five
    different shades of gray) on 300dpi printer using 8.5x11 inch paper.

16: What's available in buildtables has been cleaned up and works well with the
    new version of postio. It can be used to have PostScript printers build troff
    width tables for both printer and host resident fonts.

17: The PostScript bind operator has been applied to all procedures that are
    expected to be executed more than once. Redefined save and restore procedures
    are no longer needed and saverestore.ps is not included in this package.

18: The bizarre PostScript code used to get to the upper left corner of a page
    in old versions of dpost.ps and postprint.ps has been replaced by something
    that's at least slightly more comprehensible. All prologues have also been
    changed so picture inclusion (eg. including a pic picture that's been run
    through troff and dpost) should work better than previous versions. Still
    missing (from most translators) is the %%BoundingBox comment and even when
    it's put out (by postdmd) only the dimensions are correct - sorry!

19: The careless mistake in the DKHOST section of postio that some noticed belongs
    to me (not Allan Buckwalter) and has now been fixed.

20: By default all prologues still use the current clipping path to determine page
    dimensions, but that behavior can be disabled by setting boolean useclippath
    (in each prologue) to false. In that case the page dimensions will be taken
    from array pagebbox, which by default is initialized to 8x11 inch paper. The
    -P options (in each translator) can change useclippth and pagebbox.

21: New in the misc directory is sample lp support from Maryann Csaszar and a
    simple program that converts host resident font files obtained from a Macintosh
    to a format that works on Unix.

0707070014231311010407550057030057030000021030470522633074100002300000000000post.src/dpost.utf0707070014231311021006440057030057030000011031200522627504400003200000002742post.src/dpost.utf/READMEThis is the UTF version.

Troff to PostScript translator. The big change is in the font table
routines. The old binary format and makedev are gone. Troff and dpost
now both read ASCII tables. Translating the ASCII font tables in dpost
(and troff) means some startup overhead. Both programs run a bit slower,
but it's a small price to pay for the added flexibility.

Long PostScript font names can now be included in the font tables.
They should follow the fontname keyword as in,

	fontname Times-Roman

The fontname field helps with the DocumentFonts comment, font name
abbreviations (formally required to be in the prologue), and is used
to manage host resident fonts.

dpost can also now calculate a reasonably tight BoundingBox, which
helps picture inclusion. By default the calculations are disabled.
Use the -B option when you BoundingBox and PageBoundingBox comments.
If you're stubborn and always want the comment set dobbox (in file
dpost.c) to TRUE. You'll still need -B to get the the best fit.

Most other changes are bug fixes. Color support has been improved,
and now works with the drawing routines. The different text encoding
schemes are all still in. Level 2 is well tested and is now the default.
For a different default change DFLTENCODING (file dpost.h). Don't make
level 3 the default unless you can live with ragged right margins.

A typical command line would be,

    pic file | tbl | eqn | troff -mm | dpost >file.ps

file.ps is PostScript and can be sent directly to a printer.

0707070014231307571006400057030057030000011011450522633074100004000000005355post.src/dpost.utf/dpost.utf.mkMAKE=/bin/make
MAKEFILE=dpost.utf.mk

SYSTEM=V9
VERSION=3.3.2

GROUP=bin
OWNER=bin

FONTDIR=/usr/lib/font
MAN1DIR=/tmp
POSTBIN=/usr/bin/postscript
POSTLIB=/usr/lib/postscript

COMMONDIR=../common

CFLGS=-O
LDFLGS=-s

CFLAGS=$(CFLGS) -I$(COMMONDIR)
LDFLAGS=$(LDFLGS)

HFILES=dpost.h\
       font.h\
       motion.h\
       ps_include.h\
       $(COMMONDIR)/comments.h\
       $(COMMONDIR)/ext.h\
       $(COMMONDIR)/gen.h\
       $(COMMONDIR)/path.h\
       $(COMMONDIR)/rune.h

OFILES=dpost.o\
       draw.o\
       color.o\
       font.o\
       pictures.o\
       ps_include.o\
       $(COMMONDIR)/bbox.o\
       $(COMMONDIR)/glob.o\
       $(COMMONDIR)/misc.o\
       $(COMMONDIR)/request.o\
       $(COMMONDIR)/rune.o\
       $(COMMONDIR)/tempnam.o

all : dpost

install : all
	@if [ ! -d "$(POSTBIN)" ]; then \
	    mkdir $(POSTBIN); \
	    chmod 755 $(POSTBIN); \
	    chgrp $(GROUP) $(POSTBIN); \
	    chown $(OWNER) $(POSTBIN); \
	fi
	@if [ ! -d "$(POSTLIB)" ]; then \
	    mkdir $(POSTLIB); \
	    chmod 755 $(POSTLIB); \
	    chgrp $(GROUP) $(POSTLIB); \
	    chown $(OWNER) $(POSTLIB); \
	fi
	cp dpost $(POSTBIN)/dpost
	@chmod 755 $(POSTBIN)/dpost
	@chgrp $(GROUP) $(POSTBIN)/dpost
	@chown $(OWNER) $(POSTBIN)/dpost
	cp dpost.ps $(POSTLIB)/dpost.ps
	@chmod 644 $(POSTLIB)/dpost.ps
	@chgrp $(GROUP) $(POSTLIB)/dpost.ps
	@chown $(OWNER) $(POSTLIB)/dpost.ps
	cp draw.ps $(POSTLIB)/draw.ps
	@chmod 644 $(POSTLIB)/draw.ps
	@chgrp $(GROUP) $(POSTLIB)/draw.ps
	@chown $(OWNER) $(POSTLIB)/draw.ps
	cp dpost.1 $(MAN1DIR)/dpost.1
	@chmod 644 $(MAN1DIR)/dpost.1
	@chgrp $(GROUP) $(MAN1DIR)/dpost.1
	@chown $(OWNER) $(MAN1DIR)/dpost.1

clean :
	rm -f *.o

clobber : clean
	rm -f dpost

dpost : $(OFILES)
	$(CC) $(CFLAGS) $(LDFLAGS) -o dpost $(OFILES) -lm

dpost.o : $(HFILES)
color.o : $(COMMONDIR)/ext.h $(COMMONDIR)/gen.h
draw.o : motion.h $(COMMONDIR)/ext.h $(COMMONDIR)/gen.h
font.o : font.h $(COMMONDIR)/gen.h $(COMMONDIR)/rune.h
pictures.o : $(COMMONDIR)/comments.h $(COMMONDIR)/gen.h
ps_include.o : ps_include.h

$(COMMONDIR)/bbox.o\
$(COMMONDIR)/glob.o\
$(COMMONDIR)/misc.o\
$(COMMONDIR)/request.o\
$(COMMONDIR)/rune.o\
$(COMMONDIR)/tempnam.o :
	@cd $(COMMONDIR); $(MAKE) -f common.mk SYSTEM=$(SYSTEM) `basename $@`

changes :
	@trap "" 1 2 3 15; \
	sed \
	    -e "s'^SYSTEM=.*'SYSTEM=$(SYSTEM)'" \
	    -e "s'^VERSION=.*'VERSION=$(VERSION)'" \
	    -e "s'^GROUP=.*'GROUP=$(GROUP)'" \
	    -e "s'^OWNER=.*'OWNER=$(OWNER)'" \
	    -e "s'^FONTDIR=.*'FONTDIR=$(FONTDIR)'" \
	    -e "s'^MAN1DIR=.*'MAN1DIR=$(MAN1DIR)'" \
	    -e "s'^POSTBIN=.*'POSTBIN=$(POSTBIN)'" \
	    -e "s'^POSTLIB=.*'POSTLIB=$(POSTLIB)'" \
	$(MAKEFILE) >XXX.mk; \
	mv XXX.mk $(MAKEFILE); \
	sed \
	    -e "s'^.ds dF.*'.ds dF $(FONTDIR)'" \
	    -e "s'^.ds dQ.*'.ds dQ $(POSTLIB)'" \
	dpost.1 >XXX.1; \
	mv XXX.1 dpost.1

0707070014231311041006440057030057030000011031400522627504500003300000015654post.src/dpost.utf/color.c/*
 *
 * Routines that handle color requests passed through as device control commands
 * in the form "x X SetColor:red". The following PostScript procedures are needed:
 *
 *	setcolor
 *
 *	  mark /color setcolor mark
 *	  mark /color1 /color2 setcolor mark
 *
 *	    Called whenever we want to change PostScript's current color graphics
 *	    state parameter. One or two color arguments can be given. In each case
 *	    the colors are looked up in the PostScript colordict dictionary that's
 *	    defined in *colorfile. Two named colors implies reverse video printing
 *	    with the background given in /color2 and the text printed in /color1.
 *	    Unknown colors are mapped into defaults - black for a single color and
 *	    white on black for reverse video.
 *
 *	drawrvbox
 *
 *	  leftx rightx drawrvbox -
 *
 *	    Fills a box that extends from leftx to rightx with the background color
 *	    that was requested when setcolor set things up for reverse video mode.
 *	    The vertical extent of the box is determined using FontBBox just before
 *	    the first string is printed, and the height remains in effect until
 *	    there's an explicit color change. In otherwords font or size changes
 *	    won't always produce correct result in reverse video mode.
 *
 *	setdecoding
 *
 *	  num setdecoding -
 *
 *	    Selects the text decoding procedure (ie. what's assigned to PostScript
 *	    procedure t) from the decodingdefs array defined in the prologue. num
 *	    should be the value assigned to variable encoding (in dpost) and will
 *	    remain constant throughout a job, unless special features, like reverse
 *	    video printing, are requested. The text encoding scheme can be set on
 *	    the command line using the -e option. Print time and the size of the
 *	    output file will usually decrease as the value assigned to encoding
 *	    increases.
 *
 *
 * The recognized collection of "x X SetColor:" commands are:
 *
 *	x X SetColor:				selects black
 *	x X SetColor:color			selects color
 *	x X SetColor:color1 on color2		reverse video
 *	x X SetColor:color1 color2		reverse video again
 *	x X SetColor:num1 num2 num3 rgb		explicit rgb color request
 *	x X SetColor:num1 num2 num3 hsb		explicit hsb color request
 *
 * In the last three examples num1, num2, and num3 should be numbers between 0 and
 * 1 inclusive and are passed on as aguments to the approrpriate PostScript color
 * command (eg. setrgbcolor). Unknown color names (ie. the ones that setcolor
 * doesn't find in colordict) are mapped into defaults. For one color the default
 * is black, while for reverse video it's white text on a black background.
 *
 * dpost makes sure the current color is maintained across page boundaries, which
 * may not be what you want if you're using a macro package like mm that puts out
 * page footers and headers. Adding a color request to troff and keeping track of
 * the color in each environment may be the best solution.
 *
 * To get reverse video printing follow the "x X SetColor:" command with two or
 * three arguments. "x X SetColor:white on black" or "x X SetColor:white black"
 * both produce white text on a black background. Any two colors named in colordict
 * (in file *colorfile) can be chosen so "x X SetColor:yellow on blue" also works.
 * Each reverse video mode request selects the vertical extent of the background
 * box based on the font and size in use just before the first string is printed.
 * Font and/or size changes aren't guaranteed to work properly in reverse video
 * printing.
 *
 */

#include <stdio.h>
#include <ctype.h>

#include "gen.h"			/* general purpose definitions */
#include "ext.h"			/* external variable definitions */

#define DEFAULTCOLOR	"black"

char	color[50] = DEFAULTCOLOR;	/* current color */
int	gotcolor = FALSE;		/* TRUE after *colorfile is downloaded */
int	wantcolor = FALSE;		/* TRUE if we really ask for a color */

/*
 *
 * All these should be defined in dpost.c.
 *
 */

extern int	lastend;
extern int	encoding;
extern int	maxencoding;
extern int	realencoding;

extern char	*colorfile;
extern FILE	*tf;

/*****************************************************************************/

getcolor()

{

/*
 *
 * Responsible for making sure the PostScript color procedures are downloaded from
 * *colorfile. Done at most once per job, and only if the job really uses color.
 * For now I've decided not to quit if we can't read the color file.
 *
 */

    if ( gotcolor == FALSE )
	exportfile(colorfile);

    if ( tf == stdout )
	gotcolor = TRUE;

}   /* End of getcolor */

/*****************************************************************************/

newcolor(name)

    char	*name;			/* of the color */

{

    char	*p;			/* next character in *name */
    int		i;			/* goes in color[i] */

/*
 *
 * Converts *name to lower case and saves the result in color[] for use as the
 * current color. The first time something other than DEFAULTCOLOR is requested
 * sets wantcolor to TRUE. Characters are converted to lower case as they're put
 * in color[] and we quit when we find a newline or get to the end of *name. The
 * isupper() test is for Berkley systems.
 *
 */

    for ( p = name; *p && (*p == ' ' || *p == ':'); p++ ) ;

    for ( i = 0; i < sizeof(color) - 1 && *p != '\n' && *p; i++, p++ )
	if ( isupper(*p) )
	    color[i] = tolower(*p);
	else color[i] = *p;

    if ( i == 0 )
	strcpy(color, DEFAULTCOLOR);
    else color[i] = '\0';

    if ( strcmp(color, DEFAULTCOLOR) != 0 )
	wantcolor = TRUE;

}   /* End of newcolor */

/*****************************************************************************/

setcolor()

{

    int		newencoding;		/* text encoding scheme that's needed */
    char	*p;			/* for converting what's in color[] */

/*
 *
 * Sets the color being used by the printer to whatever's stored as the current
 * color (ie. the string in color[]). wantcolor is only set to TRUE if we've been
 * through newcolor() and asked for something other than DEFAULTCOLOR (probably
 * black). While in reverse video mode encoding gets set to maxencoding + 1 in
 * dpost and 0 on the printer. Didn't see much point in trying to extend reverse
 * video to all the different encoding schemes. realencoding is restored when we
 * leave reverse video mode.
 *
 */

    if ( wantcolor == TRUE ) {
	flushtext();
	getcolor();

	lastend = -1;
	newencoding = realencoding;

	if ( islower(color[0]) == 0 )		/* explicit rgb or hsb request */
	    fprintf(tf, "%s\n", color);
	else {
	    putc('/', tf);
	    for ( p = color; *p && *p != ' '; p++ )
		putc(*p, tf);
	    for ( ; *p && *p == ' '; p++ ) ;
	    if ( strncmp(p, "on ", 3) == 0 ) p += 3;
	    if ( *p != '\0' ) {
		fprintf(tf, " /%s", p);
		newencoding = maxencoding + 1;
	    }	/* End if */
	    fprintf(tf, " setcolor\n");
	}   /* End else */

	if ( newencoding != encoding ) {
	    encoding = newencoding;
	    fprintf(tf, "%d setdecoding\n", encoding);
	    resetpos();
	}   /* End if */
    }	/* End if */

}   /* End of setcolor */

/*****************************************************************************/

0707070014231307611006400057030057030000011006420522633074100003300000012240post.src/dpost.utf/dpost.1.ds dF /usr/lib/font
.ds dQ /usr/lib/postscript
.TH DPOST 1 "DWB 3.2"
.SH NAME
.B dpost
\-
.B troff
postprocessor for PostScript printers
.SH SYNOPSIS
\*(mBdpost\f1
.OP "" options []
.OP "" files []
.SH DESCRIPTION
.B dpost
translates
.I files
created by
.BR troff (1)
into PostScript and writes the results on the
standard output.
If no
.I files
are specified, or if
.OP \-
is one of the input
.IR files ,
the standard input is read.
The following
.I options
are understood:
.TP 0.75i
.OP \-c num
Print
.I num
copies of each page.
By default only one copy is printed.
.TP
.OP \-m num
Magnify each logical page by the factor
.IR num
(default is 1.0).
Pages are scaled uniformly about the origin,
which is located near the upper left corner of
each page.
.TP
.OP \-n num
Print
.I num
logical pages on each piece of paper,
where
.I num
can be any positive integer.
By default,
.I num
is set to 1.
.TP
.OP \-o list
Print pages whose numbers are given in the comma-separated
.IR list .
The list contains single numbers
.I N
and ranges
.IR N1\-\|N2 .
A missing
.I N1
means the lowest numbered page, a missing
.I N2
means the highest.
.TP
.OP \-p mode
Print
.I files
in either \*(mBportrait\fP or \*(mBlandscape\fP mode.
Only the first character of
.I mode
is significant.
The default
.I mode
is \*(mBportrait\fP.
.TP
.OP \-w num
Set the line width used to implement
.B troff
graphics commands to
.I num
points, where a point is approximately 1/72
of an inch.
By default
.I num
is set to 0.3 points.
.TP
.OP \-x num
Translate the origin
.I num
inches along the positive x axis.
The default
coordinate system has the origin fixed near the
upper left corner of the page, with positive
x to the right and positive y down the page.
Positive
.I num
moves everything right.
The default offset is 0 inches.
.TP
.OP \-y num
Translate the origin
.I num
inches along the positive y axis.
Positive
.I num
moves text down the page.
The default offset is 0.
.TP
.OP \-B
Include
.MW %%BoundingBox
comments in the output file.
Should only be used when the comments are needed
for picture inclusion.
Output is forced onto an 8.5\(mu11-inch page.
.TP
.OP \-E name
Set the character encoding for text fonts to
.IR name .
Requesting
.I name
means include file
.MI \*(dQ/ name .enc \f1.
A nonexistent encoding file is silently ignored.
There is no default.
.TP
.OP \-F dir
Use
.I dir
as the font directory.
The default
.I dir
is
.MR \*(dF ,
and
.B dpost
reads
.SM ASCII
font files from directory
.MR \*(dF/devpost .
.TP
.OP \-H dir
Use
.I dir
as the host-resident font directory.
A file in
.I dir
that matches the name of the
.B troff
font is assumed to be a host resident font program
and is included in
.B dpost
output.
There is no default.
.TP
.OP \-L \^file
Use
.I file
as the PostScript prologue.
The default is
.MR \*(dQ/dpost.ps .
.TP
.OP \-T name
Use font files for device
.I name
as the best description of available PostScript fonts.
By default,
.I name
is
\*(mBpost\fP
and
.B dpost
reads
.SM ASCII
files from
.MR \*(dF/devpost .
.br
.ne 1i
.PP
Three options allow insertion of arbitrary PostScript
at controlled points in the translation process:
.TP 0.75i
.OP \-C \^file
Copy
.I file
to the output file;
.I file
must contain legitimate PostScript.
.TP
.OP \-P string
Include
.I string
in the output file;
.I string
must be legitimate PostScript.
.TP
.OP \-R action
Requests special
.I action
(e.g.,
.MR manualfeed )
on a per page or global basis.
The
.I action
string can be given as
.IR request \|,
.IM request : page\f1\|,
or
.IM request : page : file\f1\|.
If
.I page
is omitted or given as 0 the request
applies to all pages.
If
.I file
is omitted the request
lookup is done in
.MR \*(dQ/ps.requests .
.PP
All
.I files
should be prepared by
.B troff
for the same device.
Device tables that describe real PostScript fonts that can be
used by
.B dpost
should include
.EX
PDL PostScript
.EE
in their
.SM DESC
file.
Tables that depend on a non-standard character set encoding indicate
that fact by an
.MW Encoding
entry in their
.SM DESC
file.
For example,
.EX
Encoding Latin1
.EE
means include file
.MR \*(dQ/Latin1.enc .
The
.OP \-E
option overrides the
.SM DESC
setting.
.SH EXAMPLES
.PP
A typical command line might be:
.EX
pic  \f2files\fP | tbl | eqn | troff -mm | dpost
.EE
.SH DIAGNOSTICS
A 0 exit status is returned if
.I files
were successfully translated,
while 2 often indicates a syntax error in the input
.IR files .
.SH WARNINGS
.PP
.B dpost
output does not usually conform to Adobe's file-structuring conventions.
Send the output through
.B postreverse
to produce a minimally conforming PostScript file.
.PP
Emulation is expensive and does not always produce satisfactory results.
No attempt has been made to implement the character sets or fonts available
on all devices supported by
.BR troff .
Missing characters are replaced by white space, and unrecognized
fonts default to one of the Times fonts (e.g.,
.MR R ,
.MR I ,
.MR B ,
or
.MR BI ).
.SH FILES
.MW \*(dF/devpost/*
.br
.MW \*(dF/devpost/charlib/*
.br
.MW \*(dQ/dpost.ps
.br
.MW \*(dQ/color.ps
.br
.MW \*(dQ/draw.ps
.br
.MW \*(dQ/forms.ps
.br
.MW \*(dQ/ps.requests
.SH SEE ALSO
.BR buildtables (1),
.BR postio (1),
.BR postprint (1),
.BR postreverse (1),
.BR psencoding (1),
.BR troff (1),
.BR font (5),
.BR troff (5)
0707070014231311061006440057030057030000011032000522627504600003300000134046post.src/dpost.utf/dpost.c/*
 *
 * dpost - troff post-processor for PostScript printers.
 *
 * A program that translates output generated by the device independent troff
 * into PostScript. Much was borrowed from dimpress and dps (formally dlzw),
 * and even though the code has changed, credit has to be given to Richard
 * Flood for his early work on the PostScript driver.
 *
 * The big change is in the font table routines. The old binary format and
 * makedev are gone. dpost and troff now read ASCII tables, and both skip
 * unrecognized entries in the ASCII tables. That means problems, like where
 * to put the real name of the PostScript font, have disappeared. The added
 * flexibility means some overhead translating the ASCII tables, but the
 * overhead isn't too bad.
 *
 * dpost can also now calculate a reasonably tight BoundingBox, which helps
 * picture inclusion. The calculations, by default, are disabled. Couldn't
 * justify the overhead for a comment, particularly one that's only needed
 * occasionally. Use the -B option to get the comment.
 *
 * Output produced by dpost is still nonconforming. Definitions made in pages
 * and exported to the job's global environment are the primary problem. It's
 * an efficient approach, but means pages are not independent. Violations are
 * bracketed by %%BeginGlobal and %%EndGlobal comments and can be pulled into
 * the prologue by utility programs (like postreverse) that recognize the new
 * comments.
 *
 * The program handles files formatted for any device, although the best and
 * most efficient output is generated when the font and description files
 * match PostScript's resident fonts. Emulation is relatively expensive, and
 * can produce output files that are more than twice the size of the input
 * files.
 *
 * Several different methods can be used to encode lines of text. What's done
 * depends on the value assigned to encoding. Print time should decrease as
 * encoding increases (up to MAXENCODING). Setting encoding to 3 (or higher)
 * is not normally recommended. It's fast and produces very compact output,
 * but rounding errors in troff's width tables can accumulate and lead to a
 * ragged right margin. encoding can be changed on the command line using the
 * -e option.
 *
 * PostScript fonts don't support all of troff's characters. Some are built
 * by special PostScript procedures in directory *fontdir/devpost/charlib.
 * The charlib approach is not meant to replace user defined fonts. It was
 * a quick implementation designed to handle characters that aren't used
 * often - charlib should not be overused! The charlib lookup is triggered
 * when a character in a font table is assigned a code less than 32.
 *
 * Most defaults are set in the prologue, but can be changed by options. The
 * -P option passes arbitrary PostScript into the setup section of the output
 * file. It can be used to set (or change) values that can't be accessed by
 * other options. For example,
 *
 *	dpost -P'/useclippath false def' file > file.ps
 *
 * defines useclippath to be false. Everything passed through using the -P
 * (-C to copy a file) options become part of the job's global environment.
 * Definitions override defaults in the prologue.
 *
 * dpost expects to find the following procedures in the prologue:
 *
 *	setup
 *
 *	  mark ... setup -
 *
 *	    Initialization procedure mainly responsible for setting up an
 *	    appropriate coordinate system.
 *
 *	pagesetup
 *
 *	  page pagesetup -
 *
 *	    Called at the start of each page, immediately after the page
 *	    level save. Argument is the current page number.
 *
 *	setdecoding
 *
 *	  num setdecoding -
 *
 *	    Select the decoding procedure used to print text strings encoded
 *	    by dpost. num is whatever has been assigned to encoding.
 *
 *	f
 *
 *	  size font f -
 *
 *	    Set the font and size used for character imaging. The font name
 *	    argument is (normally) the name troff used. Mapping to the real
 *	    PostScript font name is made using the fontname field in the
 *	    ASCII width tables.
 *
 *	m
 *
 *	  x y m -
 *
 *	    Move to point (x, y). Not used for positioning words in text
 *	    strings.
 *
 *	t
 *
 *	  mark text t mark
 *
 *	    Everything on the stack (up to the mark) is treated as a line
 *	    of text to be decoded and printed. What's on the stack depends
 *	    on encoding.
 *
 *	w
 *
 *	  string x y w -
 *
 *	    Print a single word starting at position (x, y). Only used in
 *	    the more complicated encoding schemes, like the ones based on
 *	    widthshow.
 *
 *	done
 *
 *	    Make sure the last page prints. Always called, but only needed
 *	    when printing more than one page on each sheet of paper.
 *
 * output language from troff:
 * all numbers are character strings
 * 
 * sn	size in points
 * fn	font as number from 1-n
 * cx	ascii character x
 * Cxyz	funny char xyz. terminated by white space
 * Hn	go to absolute horizontal position n
 * Vn	go to absolute vertical position n (down is positive)
 * hn	go n units horizontally (relative)
 * vn	ditto vertically
 * nnc	move right nn, then print c (exactly 2 digits!)
 * 		(this wart is an optimization that shrinks output file size
 * 		 about 35% and run-time about 15% while preserving ascii-ness)
 * Dt ...\n	draw operation 't':
 * 	Dl x y		line from here by x,y
 * 	Dc d		circle of diameter d with left side here
 * 	De x y		ellipse of axes x,y with left side here
 *	Da x1 y1 x2 y2	arc counter-clockwise from current point (x, y) to
 *			(x + x1 + x2, y + y1 + y2)
 * 	D~ x y x y ...	wiggly line by x,y then x,y ...
 * nb a	end of line (information only -- no action needed)
 * 	b = space before line, a = after
 * p	new page begins -- set v to 0
 * #...\n	comment
 * x ...\n	device control functions:
 * 	x i	init
 * 	x T s	name of device is s
 * 	x r n h v	resolution is n/inch
 * 		h = min horizontal motion, v = min vert
 * 	x p	pause (can restart)
 * 	x s	stop -- done forever
 * 	x t	generate trailer
 * 	x f n s	font position n contains font s
 * 	x H n	set character height to n
 * 	x S n	set slant to N
 * 
 * 	Subcommands like "i" are often spelled out like "init".
 *
 */

#include	<stdio.h>
#include	<fcntl.h>
#include	<signal.h>
#include	<math.h>
#include	<ctype.h>
#include	<time.h>

#include	"comments.h"		/* structuring comments */
#include	"gen.h"			/* general purpose definitions */
#include	"rune.h"		/* Plan 9 character encoding */
#include	"path.h"		/* prologue and a few other files */
#include	"ext.h"			/* external variable declarations */
#include	"font.h"		/* font table definitions */
#include	"dpost.h"		/* a few definitions just used here */
#include	"motion.h"		/* positioning macros */

char	*prologue = DPOST;		/* the PostScript prologue */
char	*colorfile = COLOR;		/* color support */
char	*drawfile = DRAW;		/* drawing routines */
char	*formfile = FORMFILE;		/* multiple pages on each sheet */
char	*baselinefile = BASELINE;	/* for text along curved baseline */

char	*fontdir = FONTDIR;		/* font table directories */
char	*hostfontdir = NULL;		/* host resident font directory */

char	*realdev = DEVNAME;		/* use these width tables */
char	devname[20] = "";		/* job formatted for this device */
Fontmap	fontmap[] = FONTMAP;		/* font translation table - emulation */
char	*useencoding = NULL;		/* text font encoding - from -E option */

int	copies = 1;			/* copies of each sheet */
int	printed = 0;			/* pages processed and printed */
int	formsperpage = 1;		/* pages on each sheet of paper */
int	picflag = ON;			/* enable/disable picture inclusion */

int	encoding = DFLTENCODING;	/* how text is translated to PostScript */
int	realencoding = DFLTENCODING;	/* where we started */
int	maxencoding = MAXENCODING;	/* max that users can select */

int	landscape = FALSE;		/* for BoundingBox calculations only */
double	magnification = 1.0;
double	xoffset = 0.0;
double	yoffset = 0.0;

int	smnt;				/* special fonts start here */
int	devres;				/* device resolution */
int	unitwidth;			/* and unitwidth - from DESC file */

char	downloaded[128+SPECIALCHARS];	/* charlib characters - ASCII+SPECIAL only */

int	nfonts = 0;			/* number of font positions */
int	size = 10;			/* current point size */
int	font = 0;			/* and font position */
int	hpos = 0;			/* where troff wants to be */
int	vpos = 0;
float	lastw = 0;			/* width of the last input character */
int	lastc = 0;			/* its name (or index) - for charlib() */

int	fontheight = 0;			/* points from x H ... */
int	fontslant = 0;			/* angle from x S ... */

int	res;				/* resolution assumed in input file */
float	widthfac = 1.0;			/* for emulation = res/devres */

int	lastsize = -1;			/* for tracking printer's current size */
int	lastfont = -1;			/* current font */
float	lastx = -1;			/* and current position */
int	lasty = -1;
int	lastend;			/* where last character on this line was */

int	seenpage = FALSE;		/* expect fonts are now all mounted */
int	gotspecial = FALSE;		/* append special fonts - emulation */

float	pointslop = SLOP;		/* horizontal error in points */
int	slop;				/* and machine units */
int	rvslop;				/* to extend box in reverse video mode */

int	textcount = 0;			/* strings accumulated so far */
int	stringstart = 0;		/* where the next one starts */
int	spacecount = 0;			/* spaces in current string */

Line	line[MAXSTACK+3];		/* data about words accumulated so far */
char	strings[STRINGSPACE];		/* strings temporarily saved here */
char	*strptr;			/* next free slot in strings[] */

FILE	*tf = NULL;			/* most output goes here */
FILE	*fp_acct = NULL;		/* accounting file */

char	*optnames = "a:c:e:m:n:o:p:tw:x:y:A:BC:E:J:F:H:L:OP:R:S:T:DI";

extern int	gotcolor;		/* read *colorfile when TRUE */
extern Font	fonts[];		/* data about every font we see */
extern Font	*mount[];		/* troff mounts fonts here */

/*****************************************************************************/

main(agc, agv)

    int		agc;
    char	*agv[];

{

/*
 *
 * Translates output from troff into PostScript. Input files must be formatted
 * for the same device. Each input file begins on a new page.
 *
 */

    argc = agc;				/* global so everyone can use them */
    argv = agv;

    prog_name = argv[0];		/* for error messages */

    init_signals();			/* interrupt handling */
    header();				/* structuring comments */
    options();				/* command line options */
    arguments();			/* translate the input files */
    done();				/* add trailing comments etc. */
    account();				/* job accounting data */

    exit(x_stat);

}   /* End of main */

/*****************************************************************************/

init_signals()

{

/*
 *
 * Make sure we handle interrupts.
 *
 */

    if ( signal(SIGINT, interrupt) == SIG_IGN ) {
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
    } else {
	signal(SIGHUP, interrupt);
	signal(SIGQUIT, interrupt);
    }   /* End else */

    signal(SIGTERM, interrupt);

}   /* End of init_signals */

/*****************************************************************************/

header()

{

    int		ch;
    int		old_optind = optind;

/*
 *
 * Scan the option list for things needed now (e.g. prologue file), but could
 * be changed from defaults. An attempt to follow to Adobe's 2.0 structuring
 * conventions.
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF )
	if ( ch == 'L' )
	    setpaths(optarg);
	else if ( ch == 'B' )
	    dobbox = TRUE;
	else if ( ch == '?' )
	    error(FATAL, "");

    optind = old_optind;		/* restored for options() */

    fprintf(stdout, "%s", NONCONFORMING);
    fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
    fprintf(stdout, "%s %s\n", DOCUMENTFONTS, ATEND);
    fprintf(stdout, "%s %s\n", PAGES, ATEND);
    if ( dobbox == TRUE )
	fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND);
    fprintf(stdout, "%s", ENDCOMMENTS);

    if ( cat(prologue) == FALSE )
	error(FATAL, "can't read %s", prologue);

    if ( DOROUND )
	cat(ROUNDPAGE);

    fprintf(stdout, "%s", ENDPROLOG);
    fprintf(stdout, "%s", BEGINSETUP);
    fprintf(stdout, "mark\n");

}   /* End of header */

/*****************************************************************************/

options()

{

    int		ch;

    extern char	*optarg;
    extern int	optind;

/*
 *
 * Command line options - there are too many!
 *
 */

    while ( (ch = getopt(argc, argv, optnames)) != EOF ) {
	switch ( ch ) {
	    case 'a':			/* aspect ratio */
		    fprintf(stdout, "/aspectratio %s def\n", optarg);
		    break;

	    case 'c':			/* number of copies */
		    copies = atoi(optarg);
		    fprintf(stdout, "/#copies %s store\n", optarg);
		    break;

	    case 'e':			/* select the encoding scheme */
		    if ( (encoding = atoi(optarg)) < 0 || encoding > MAXENCODING )
			encoding = DFLTENCODING;
		    realencoding = encoding;
		    break;

	    case 'm':			/* magnification */
		    magnification = atof(optarg);
		    fprintf(stdout, "/magnification %s def\n", optarg);
		    break;

	    case 'n':			/* forms per page */
		    formsperpage = atoi(optarg);
		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
		    fprintf(stdout, "/formsperpage %s def\n", optarg);
		    break;

	    case 'o':			/* output page list */
		    out_list(optarg);
		    break;

	    case 'p':			/* landscape or portrait mode */
		    landscape = (*optarg == 'l') ? TRUE : FALSE;
		    if ( landscape == TRUE )
			fprintf(stdout, "/landscape true def\n");
		    else fprintf(stdout, "/landscape false def\n");
		    break;

	    case 't':			/* compatibility */
		    break;

	    case 'w':			/* line width - for drawing */
		    fprintf(stdout, "/linewidth %s def\n", optarg);
		    break;

	    case 'x':			/* shift horizontally */
		    xoffset = atof(optarg);
		    fprintf(stdout, "/xoffset %s def\n", optarg);
		    break;

	    case 'y':			/* shift vertically */
		    yoffset = atof(optarg);
		    fprintf(stdout, "/yoffset %s def\n", optarg);
		    break;

	    case 'A':			/* job accounting */
	    case 'J':
		    if ( (fp_acct = fopen(optarg, "a")) == NULL )
			error(FATAL, "can't open accounting file %s", optarg);
		    break;

	    case 'B':			/* enable BoundingBox calculations */
		    dobbox = TRUE;
		    fprintf(stdout, "/rotation 1 def\n");
		    fprintf(stdout, "/gotpagebbox true def\n");
		    break;

	    case 'C':			/* copy file to output */
		    if ( cat(optarg) == FALSE )
			error(FATAL, "can't read %s", optarg);
		    break;

	    case 'E':			/* text font encoding - override DESC */
		    useencoding = optarg;
		    break;

	    case 'F':			/* font table directory */
		    fontdir = optarg;
		    break;

	    case 'H':			/* host resident font directory */
		    hostfontdir = optarg;
		    break;

	    case 'L':			/* prologue file */
		    setpaths(optarg);	/* already been done in header() */
		    break;

	    case 'O':			/* disable picture inclusion */
		    picflag = OFF;
		    break;

	    case 'P':			/* copy string to output */
		    fprintf(stdout, "%s\n", optarg);
		    break;

	    case 'R':			/* global or page level request */
		    saverequest(optarg);
		    break;

	    case 'S':			/* horizontal position error */
		    if ( (pointslop = atof(optarg)) < 0 )
			pointslop = 0;
		    break;

	    case 'T':			/* target printer */
		    realdev = optarg;
		    break;

	    case 'D':			/* debug flag */
		    debug = ON;
		    tf = stdout;
		    break;

	    case 'I':			/* ignore FATAL errors */
		    ignore = ON;
		    break;

	    case '?':			/* don't know the option */
		    error(FATAL, "");
		    break;

	    default:
		    error(FATAL, "missing case for option %c", ch);
		    break;
	}   /* End switch */
    }	/* End while */

    argc -= optind;
    argv += optind;

}   /* End of options */

/*****************************************************************************/

setpaths(name)

    char	*name;

{

    char	*path;

/*
 *
 * Extends the -L option to permit modification of more than just the prologue
 * file pathname. Syntax is -Lpath or -Lname:path. For debugging and development
 * only!
 *
 */

    for ( path = name; *path; path++ )
	if ( *path == ':' || *path == ' ' ) {
	    while ( *path == ':' || *path == ' ' ) path++;
	    break;
	}   /* End if */

    if ( *path == '\0' )		/* didn't find "name:" prefix */
	path = name;

    if ( path == name || strncmp(name, "prologue", strlen("prologue")) == 0 )
	prologue = path;
    else if ( strncmp(name, "draw", strlen("draw")) == 0 )
	drawfile = path;
    else if ( strncmp(name, "color", strlen("color")) == 0 )
	colorfile = path;
    else if ( strncmp(name, "form", strlen("form")) == 0 )
	formfile = path;
    else if ( strncmp(name, "baseline", strlen("baseline")) == 0 )
	baselinefile = path;

}   /* End of setpaths */

/*****************************************************************************/

setup()

{

    double	t;

/*
 *
 * Job and BoundingBox initialization. Called once from t_init() - must know
 * the resolution before generating the PostScript call to setup. dpost only
 * includes an encoding file if it's set in the DESC file or requested with
 * the -E option.
 *
 */

    writerequest(0, stdout);		/* global requests e.g. manual feed */
    fprintf(stdout, "/resolution %d def\n", res);
    if ( useencoding != NULL || fontencoding != NULL )
	setencoding((useencoding != NULL) ? useencoding : fontencoding);
    fprintf(stdout, "setup\n");
    fprintf(stdout, "%d setdecoding\n", realencoding);

    if ( formsperpage > 1 ) {		/* multiple pages */
	if ( cat(formfile) == FALSE )
	    error(FATAL, "can't read %s", formfile);
	fprintf(stdout, "%d setupforms\n", formsperpage);
    }	/* End if */

    fprintf(stdout, "%s", ENDSETUP);

    if ( dobbox == TRUE ) {		/* ctm[] - must agree with prologue */
	translate(pagewidth/2.0, pageheight/2.0);
	if ( landscape == TRUE ) {
	    rotate(90.0);
	    t = pagewidth;
	    pagewidth = pageheight;
	    pageheight = t;
	}   /* End if */
	translate(-pagewidth/2.0, pageheight/2.0);
	translate(72.0 * xoffset, -72.0 * yoffset);
	scale(magnification, magnification);
	scale(72.0/devres, 72.0/devres);
    }	/* End if */

}   /* End of setup */

/*****************************************************************************/

arguments()

{

    FILE	*fp;

/*
 *
 * Everything else is an input file. No arguments or '-' means stdin.
 *
 */

    if ( argc < 1 )
	conv(stdin);
    else
	while ( argc > 0 ) {
	    if ( strcmp(*argv, "-") == 0 )
		fp = stdin;
	    else if ( (fp = fopen(*argv, "r")) == NULL )
		error(FATAL, "can't open %s", *argv);
	    conv(fp);
	    if ( fp != stdin )
		fclose(fp);
	    argc--;
	    argv++;
	}   /* End while */

}   /* End of arguments */

/*****************************************************************************/

done()

{

    int		i;
    int		n;

/*
 *
 * Force out the last page and add trailing comments.
 *
 */

    fprintf(stdout, "%s", TRAILER);
    fprintf(stdout, "done\n");
    fprintf(stdout, "%s %d\n", PAGES, printed);

    for ( i = 0, n = 0; i < MAXFONTS+1; i++ )
	if ( (fonts[i].flags & USED) && fonts[i].fontname != NULL ) {
	    if ( n++ == 0 )
		fprintf(stdout, "%s", DOCUMENTFONTS);
	    else if ( (n - 1) % 8 == 0 )
		fprintf(stdout, "\n%s", CONTINUECOMMENT);
	    fprintf(stdout, " %s", fonts[i].fontname);
	}   /* End if */
    if ( n > 0 )
	putc('\n', stdout);

    if ( dobbox == TRUE )
	writebbox(stdout, BOUNDINGBOX, 10);

}   /* End of done */

/*****************************************************************************/

account()

{

/*
 *
 * Accounting record to fp_acct - provided it's not NULL.
 *
 */

    if ( fp_acct != NULL )
	fprintf(fp_acct, " print %d\n copies %d\n", printed, copies);

}   /* End of account */

/*****************************************************************************/

conv(fp)

    register FILE	*fp;

{

    register int	c;
    int			m, n, n1, m1;
    char		str[50];

/*
 *
 * Read troff output from file fp and translate it into PostScript. The final
 * t_page() call means input files start on a new page.
 *
 */

    redirect(-1);			/* do output only after a page command */
    lineno = 1;

    while ((c = getc(fp)) != EOF) {
	switch (c) {
	    case '\n':			/* just count this line */
		    lineno++;
		    break;

	    case ' ':			/* when input is text */
	    case 0:			/* occasional noise creeps in */
		    break;

	    case '0': case '1': case '2': case '3': case '4':
	    case '5': case '6': case '7': case '8': case '9':
		    /* two motion digits plus a character */
		    hmot((c-'0')*10 + getc(fp)-'0');
		    put1(getcode(fp));
		    break;

	    case 'c':			/* single ascii character */
		    put1(getcode(fp));
		    break;

	    case 'C':			/* special character */
		    fscanf(fp, "%s", str);
		    put1(chindex(str));
		    break;

	    case 'N':			/* character at position n */
		    fscanf(fp, "%d", &m);
		    flushtext();
		    oput(m);
		    break;

	    case 'D':			/* drawing functions */
		    flushtext();
		    getdraw();
		    if ( size != lastsize )
			t_sf();
		    switch ((c=getc(fp))) {
			case 'p':	/* draw a path */
			    while (fscanf(fp, "%d %d", &n, &m) == 2)
				drawline(n, m);
			    lineno++;
			    break;

			case 'l':	/* draw a line */
			    fscanf(fp, "%d %d %c", &n, &m, &n1);
			    drawline(n, m);
			    break;

			case 'c':	/* circle */
			    fscanf(fp, "%d", &n);
			    drawcirc(n);
			    break;

			case 'e':	/* ellipse */
			    fscanf(fp, "%d %d", &m, &n);
			    drawellip(m, n);
			    break;

			case 'a':	/* counter-clockwise arc */
			case 'A':	/* clockwise arc */
			    fscanf(fp, "%d %d %d %d", &n, &m, &n1, &m1);
			    drawarc(n, m, n1, m1, c);
			    break;

			case 'q':	/* spline without end points */
			    drawspline(fp, 1);
			    lineno++;
			    break;

			case '~':	/* wiggly line */
			    drawspline(fp, 2);
			    lineno++;
			    break;

			default:
			    error(FATAL, "unknown drawing function %c", c);
			    break;
		    }	/* End switch */
		    break;

	    case 's':			/* use this point size */
		    fscanf(fp, "%d", &size);	/* ignore fractional sizes */
		    break;

	    case 'f':			/* use font mounted here */
		    fscanf(fp, "%s", str);
		    setfont(t_font(str));
		    break;

	    case 'H':			/* absolute horizontal motion */
		    fscanf(fp, "%d", &n);
		    hgoto(n);
		    break;

	    case 'h':			/* relative horizontal motion */
		    fscanf(fp, "%d", &n);
		    hmot(n);
		    break;

	    case 'w':			/* word space */
		    break;

	    case 'V':			/* absolute vertical position */
		    fscanf(fp, "%d", &n);
		    vgoto(n);
		    break;

	    case 'v':			/* relative vertical motion */
		    fscanf(fp, "%d", &n);
		    vmot(n);
		    break;

	    case 'p':			/* new page */
		    fscanf(fp, "%d", &n);
		    t_page(n);
		    break;

	    case 'n':			/* end of line */
		    while ( (c = getc(fp)) != '\n' && c != EOF ) ;
		    hgoto(0);
		    lineno++;
		    break;

	    case '#':			/* comment */
		    while ( (c = getc(fp)) != '\n' && c != EOF ) ;
		    lineno++;
		    break;

	    case 'x':			/* device control function */
		    devcntrl(fp);
		    lineno++;
		    break;

	    default:
		    error(FATAL, "unknown input character %o %c", c, c);
		    done();
	}   /* End switch */
    }	/* End while */

    t_page(-1);				/* print the last page */
    flushtext();

}   /* End of conv */

/*****************************************************************************/

devcntrl(fp)

    FILE	*fp;

{

    char	str[50], buf[256], str1[100];
    int		c, n;

/*
 *
 * Interpret device control commands, ignoring any we don't recognize. The
 * "x X ..." commands are a device dependent collection generated by troff's
 * \X'...' request.
 *
 */

    fscanf(fp, "%s", str);

    switch ( str[0] ) {
	case 'f':			/* load font in a position */
		fscanf(fp, "%d %s", &n, str);
		fgets(buf, sizeof buf, fp);	/* in case there's a filename */
		ungetc('\n', fp);	/* fgets() goes too far */
		str1[0] = '\0';		/* in case there's nothing to come in */
		sscanf(buf, "%s", str1);
		loadfont(n, str, str1);
		break;

	case 'i':			/* initialize */
		t_init();
		break;

	case 'p':			/* pause */
		break;

	case 'r':			/* resolution assumed when prepared */
		fscanf(fp, "%d", &res);
		break;

	case 's':			/* stop */
	case 't':			/* trailer */
		flushtext();
		break;

	case 'H':			/* char height */
		fscanf(fp, "%d", &n);
		t_charht(n);
		break;

	case 'S':			/* slant */
		fscanf(fp, "%d", &n);
		t_slant(n);
		break;

	case 'T':			/* device name */
		fscanf(fp, "%s", devname);
		break;

	case 'E':			/* input encoding - not in troff yet */
		fscanf(fp, "%s", str);
		if ( strcmp(str, "UTF") == 0 )
		    reading = UTFENCODING;
		else reading = ONEBYTE;
		break;

	case 'X':			/* copy through - from troff */
		fscanf(fp, " %[^: \n]:", str);
		fgets(buf, sizeof(buf), fp);
		ungetc('\n', fp);
		if ( strcmp(str, "PI") == 0 || strcmp(str, "PictureInclusion") == 0 )
		    picture(buf);
		else if ( strcmp(str, "InlinePicture") == 0 )
		    inlinepic(fp, buf);
		else if ( strcmp(str, "BeginPath") == 0 )
		    beginpath(buf, FALSE);
		else if ( strcmp(str, "DrawPath") == 0 )
		    drawpath(buf, FALSE);
		else if ( strcmp(str, "BeginObject") == 0 )
		    beginpath(buf, TRUE);
		else if ( strcmp(str, "EndObject") == 0 )
		    drawpath(buf, TRUE);
		else if ( strcmp(str, "NewBaseline") == 0 )
		    newbaseline(buf);
		else if ( strcmp(str, "DrawText") == 0 )
		    drawtext(buf);
		else if ( strcmp(str, "SetText") == 0 )
		    settext(buf);
		else if ( strcmp(str, "SetColor") == 0 ) {
		    newcolor(buf);
		    setcolor();
		} else if ( strcmp(str, "INFO") == 0 ) {
		    flushtext();
		    fprintf(tf, "%%INFO%s", buf);
		} else if ( strcmp(str, "PS") == 0 || strcmp(str, "PostScript") == 0 ) {
		    flushtext();
		    fprintf(tf, "%s", buf);
		} else if ( strcmp(str, "ExportPS") == 0 ) {	/* dangerous!! */
		    if ( tf == stdout ) {
			restore();
			fprintf(tf, "%s", buf);
			save();
		    }	/* End if */
		}   /* End else */
		break;
    }	/* End switch */

    while ( (c = getc(fp)) != '\n' && c != EOF ) ;

}   /* End of devcntrl */

/*****************************************************************************/

loadfont(m, f, name)

    int		m;
    char	*f;
    char	*name;

{

    char	path[150];

/*
 *
 * Load position m with font f. Font file pathname is *fontdir/dev*realdev/*f
 * or name, if name isn't empty. Use mapfont() to replace the missing font
 * if we're emulating another device, name is empty, and the first mount
 * fails.
 *
 */

    if ( name[0] == '\0' )
	sprintf(path, "%s/dev%s/%s", fontdir, realdev, f);
    else sprintf(path, "%s", name);

    if ( mountfont(path, m) == -1 ) {
	if ( name[0] == '\0' ) {
	    sprintf(path, "%s/dev%s/%s", fontdir, realdev, mapfont(f));
	    if ( mountfont(path, m) == -1 ) {
		sprintf(path, "%s/dev%s/%s", fontdir, realdev, f);
		error(FATAL, "can't load %s at %d", path, m);
	    }	/* End if */
	} else error(FATAL, "can't load %s at %d", path, m);
    }	/* End if */

    if ( smnt == 0 && mount[m]->specfont )
	smnt = m;

    if ( m == lastfont )		/* force a call to t_sf() */
	lastfont = -1;

    if ( m > nfonts ) {			/* got more positions */
	nfonts = m;
	gotspecial = FALSE;
    }	/* End if */

}   /* End of loadfont */

/*****************************************************************************/

char *mapfont(name)

    char	*name;

{

    int		i;

/*
 *
 * Map a missing font name into one that should be available. Only used when
 * we're emulating another device and the first mount fails. Consider deleting
 * this routine.
 *
 */

    for ( i = 0; fontmap[i].name != NULL; i++ )
	if ( strcmp(name, fontmap[i].name) == 0 )
	    return(fontmap[i].use);

    switch ( *++name ) {
	case 'I': return("I");
	case 'B': return("B");
	case 'X': return("BI");
	default:  return("R");
    }	/* End switch */

}   /* End of mapfont */

/*****************************************************************************/

loadspecial()

{

/*
 *
 * Fix - later.
 *
 */

    gotspecial = TRUE;

}   /* End of loadspecial */

/*****************************************************************************/

t_init()

{

    char	path[150];
    static int	initialized = FALSE;

/*
 *
 * Finish initialization - just read an "x init" command. Assumes we already
 * know the input file resolution.
 *
 */

    flushtext();			/* moved - for cat'ed troff files */

    if ( initialized == FALSE ) {
	if ( strcmp(devname, realdev) ) {
	    sprintf(path, "%s/dev%s/DESC", fontdir, devname);
	    if ( checkdesc(path) )
		realdev = devname;
	}   /* End if */

	sprintf(path, "%s/dev%s/DESC", fontdir, realdev);
	if ( getdesc(path) == -1 )
	    error(FATAL, "can't open %s", path);
	nfonts = 0;
	gotspecial = FALSE;
	widthfac = (float) res /devres;
	slop = pointslop * res / POINTS + .5;
	rvslop = res * .025;
	setup();
	initialized = TRUE;
    }	/* End if */

    hpos = vpos = 0;
    size = 10;
    reset();

}   /* End of t_init */

/*****************************************************************************/

t_page(pg)

    int		pg;

{

    static int	lastpg = 0;

/*
 *
 * Finish the previous page and get ready for the next one. End page output
 * goes to /dev/null at the start of each input file. Start page output goes
 * to /dev/null at the end of each input file.
 *
 * Consider doing showpage after page level restore (as Adobe recommends). If
 * the order is changed use restore() and save(). forms.ps will likely also
 * need fixing.
 *
 */

    if ( tf == stdout )
	printed++;

    flushtext();			/* just in case */

    fprintf(tf, "cleartomark\n");
    fprintf(tf, "showpage\n");
    fprintf(tf, "saveobj restore\n");
    if ( dobbox == TRUE )
	writebbox(tf, PAGEBOUNDINGBOX, 10);
    fprintf(tf, "%s %d %d\n", ENDPAGE, lastpg, printed);

    redirect(pg);

    fprintf(tf, "%s %d %d\n", PAGE, pg, printed+1);
    if ( dobbox == TRUE )
	fprintf(tf, "%s %s\n", PAGEBOUNDINGBOX, ATEND);
    fprintf(tf, "/saveobj save def\n");
    fprintf(tf, "mark\n");
    writerequest(printed+1, tf);
    fprintf(tf, "%d pagesetup\n", printed+1);

    if ( encoding != realencoding )
	fprintf(tf, "%d setdecoding\n", encoding);

    if ( gotcolor == TRUE )
	setcolor();

    lastpg = pg;			/* for the next ENDPAGE comment */
    hpos = vpos = 0;			/* get ready for the next page */
    reset();				/* force position and font stuff - later */

    seenpage = TRUE;

}   /* End of t_page */

/*****************************************************************************/

t_font(s)

    char	*s;

{

    int		n;

/*
 *
 * Converts the string *s into an integer and checks to make sure it's a legal
 * font position. Also arranges to mount all the special fonts after the last
 * legitimate font (by calling loadspecial()), provided it hasn't already been
 * done.
 *
 */

    n = atoi(s);

    if ( seenpage == TRUE ) {
	if ( n < 0 || n > nfonts )
	    error(FATAL, "illegal font position %d", n);

	if ( gotspecial == FALSE )
	    loadspecial();
    }	/* End if */

    return(n);

}   /* End of t_font */

/*****************************************************************************/

setfont(m)

    int		m;

{

/*
 *
 * Use the font mounted at position m. Bounds checks are probably unnecessary.
 * Changing the font and size used by the printer is handled in t_sf().
 *
 */

    if ( m < 0 || m > MAXFONTS )
	error(FATAL, "illegal font %d", m);
    font = m;

}   /* End of setfont */

/*****************************************************************************/

t_sf()

{

    Font	*fpos;
    char	temp[150];

/*
 *
 * Force a new font or size. Generates name definitions for fonts that haven't
 * been named, grabs host resident font files and keeps track of the fonts used
 * by this job. When necessary also adjusts the font's height and slant. Should
 * only be called immediately before printing a character.
 *
 */

    if ( tf == stdout && mounted(font) ) {
	flushtext();

	fpos = mount[font];
	if ( (fpos->flags & USED) == 0 ) {
	    if ( (fpos->flags & NAMED) == 0 && fpos->fontname != NULL ) {
		sprintf(temp, "/%s /%s def\n", fpos->name, fpos->fontname);
		exportstring(temp);
		fpos->flags |= NAMED;		/* unnecessary */
	    }	/* End if */

	    if ( hostfontdir != NULL ) {
		sprintf(temp, "%s/%s", hostfontdir, fpos->name);
		exportfile(temp);
	    }	/* End if */
	}   /* End if */

	fprintf(tf, "%d %s f\n", size, fpos->name);
	if ( fontheight != 0 || fontslant != 0 )
	    fprintf(tf, "%d %d changefont\n", fontslant, (fontheight != 0) ? fontheight : size);

	lastfont = font;
	lastsize = size;
	fpos->flags |= USED;
    }	/* End if */

}   /* End of t_sf */

/*****************************************************************************/

t_charht(n)

    int		n;

{

/*
 *
 * Set character height to n points. Disabled if n is 0 or the current size.
 *
 */

    fontheight = (n == size) ? 0 : n;
    lastfont = -1;

}   /* End of t_charht */

/*****************************************************************************/

t_slant(n)

    int		n;

{

/*
 *
 * Set slant to n degrees. Disable slanting if n is 0.
 *
 */

    fontslant = n;
    lastfont = -1;

}   /* End of t_slant */

/*****************************************************************************/

xymove(x, y)

    int		x, y;

{

/*
 *
 * Make the the printer and post-processor agree about the current position.
 *
 */

    flushtext();

    hgoto(x);
    vgoto(y);

    fprintf(tf, "%d %d m\n", hpos, vpos);

    lastx = hpos;
    lasty = vpos;

}   /* End of xymove */

/*****************************************************************************/

getcode(fp)

    FILE	*fp;

{

    int		n;
    int		c;
    Rune	r;
    char	str[10];

    switch ( reading ) {
	case UTFENCODING:
	    for ( n = 0; n < UTFmax; ) {
		if ( (c = getc(fp)) != EOF ) {
		    str[n++] = c;
		    if ( fullrune(str, n) ) {
			chartorune(&r, str);
			return(r);
		    }	/* End if */
		} else return(c);
	    }	/* End for */
	    return(Runeerror);

	default:		/* ASCII input */
	    return(getc(fp));
    }	/* End switch */

}   /* End of getcode */

/*****************************************************************************/

put1(c)

    int		c;

{

    int		i;
    int		j;
    int		k;
    int		code;
    int		ofont;

/*
 *
 * Print character c. Search current font, then in others starting at the
 * first special font. Save c in lastc so it's available when oput() runs.
 * Restore original font before leaving.
 *
 */

    if ( !ValidChar(c) )
	return;

    lastc = c;
    k = ofont = font;

    if ( (i = onfont(lastc, k)) == -1 && smnt > 0 )
	for ( k = smnt, j = 0; j < nfonts; j++, k = k % nfonts + 1 ) {
	    if ( (i = onfont(lastc, k)) != -1 ) {
		setfont(k);
		break;
	    }	/* End if */
	}   /* End for */

    if ( i != -1 && (code = mount[k]->wp[i].code) != 0 ) {
	lastw = widthfac * (((int)mount[k]->wp[i].wid * size + unitwidth/2) / unitwidth);
	oput(code);
    }	/* End if */

    if ( font != ofont )
	setfont(ofont);

}   /* End of put1 */

/*****************************************************************************/

oput(c)

    int		c;

{

    double	llx, lly, urx, ury;	/* boundingbox corners */

/*
 *
 * Arranges to print the character whose code is c in the current font. All the
 * actual positioning is done here, in charlib(), or in the drawing routines.
 *
 */

    if ( textcount > MAXSTACK )		/* don't put too much on the stack? */
	flushtext();

    if ( font != lastfont || size != lastsize )
	t_sf();

    if ( vpos != lasty )
	endline();

    starttext();

    if ( ABS(hpos - lastx) > slop )
	endstring();

    if ( c >= 040 )
	oputcode(c);
    else charlib(c);

    if ( dobbox == TRUE ) {
	llx = lastx;
	lly = -(vpos + 0.5 * (devres * size / 72.0));
	urx = lastx + lastw;
	ury = -(vpos - (devres * size / 72.0));
	cover(llx, lly);
	cover(urx, ury);
    }	/* End if */

    lastx += lastw;

}   /* End of oput */

/*****************************************************************************/

oputcode(c)

    int		c;

{

    int			n;
    int			bytes;
    Rune		r;
    unsigned char	buf[10];
    unsigned char	*str;

/*
 *
 * Output the bytes corresponding to character code c according to the
 * current writing mode. How a multi-byte sequence is interpreted when
 * it gets to a PostScript printer is not clear. Composite fonts belong
 * to Level 2. Using more than 256 characters from a Level 1 font is not
 * trivial. Font tables with character codes that exceed 255 should be
 * avoided (for now).
 *
 */

    r = c;

    switch ( writing ) {
	case UTFENCODING:
	    bytes = runetochar(buf, &r);
	    break;

	default:			/* one or two bytes? */
	    if ( r <= 0xFF ) {
		buf[0] = r;
		bytes = 1;
	    } else {
		buf[0] = (r >> 8);
		buf[1] = r;
		bytes = 2;
	    }	/* End else */
	    break;
    }	/* End switch */

    for ( n = 0; n < bytes; n++ ) {
	str = &buf[n];
	if ( isascii(*str) && isprint(*str) ) {
	    switch ( *str ) {
		case '(':
		case ')':
		case '\\':
		    addbyte('\\');

		default:
		    addbyte(*str);
	    }	/* End switch */
	} else addoctal(*str);
    }	/* End for */

}   /* End of oputcode */

/*****************************************************************************/

starttext()

{

/*
 * Called whenever we want to be sure we're ready to start collecting characters
 * for the next call to PostScript procedure t (ie. the one that prints them). If
 * textcount is positive we've already started, so there's nothing to do. The more
 * complicated encoding schemes save text strings in the strings[] array and need
 * detailed information about the strings when they're written to the output file
 * in flushtext().
 *
 */

    if ( textcount < 1 ) {
	switch ( encoding ) {
	    case 0:
	    case 1:
		putc('(', tf);
		break;

	    case 2:
	    case 3:
		strptr = strings;
		spacecount = 0;
		line[1].str = strptr;
		line[1].dx = 0;
		line[1].spaces = 0;
		line[1].start = hpos;
		line[1].width = 0;
		break;

	    case MAXENCODING+1:			/* reverse video */
		if ( lastend == -1 )
		    lastend = hpos;
		putc('(', tf);
		break;

	    case MAXENCODING+2:			/* follow a funny baseline */
		putc('(', tf);
		break;
	}   /* End switch */

	textcount = 1;
	lastx = stringstart = hpos;
    }	/* End if */

}   /* End of starttext */

/*****************************************************************************/

flushtext()

{

    int		i;

/*
 *
 * Generates a call to the PostScript procedure that processes all the text we've
 * accumulated - provided textcount is positive.
 *
 */

    if ( textcount > 0 ) {
	switch ( encoding ) {
	    case 0:
		fprintf(tf, ")%d t\n", stringstart);
		break;

	    case 1:
		fprintf(tf, ")%d %d t\n", stringstart, lasty);
		break;

	    case 2:
		*strptr = '\0';
		line[textcount].width = lastx - line[textcount].start;
		if ( spacecount != 0 || textcount != 1 ) {
		    for ( i = textcount; i > 0; i-- )
			fprintf(tf, "(%s)%d %d", line[i].str, line[i].spaces, line[i].width);
		    fprintf(tf, " %d %d %d t\n", textcount, stringstart, lasty);
		} else fprintf(tf, "(%s)%d %d w\n", line[1].str, stringstart, lasty);
		break;

	    case 3:
		*strptr = '\0';
		if ( spacecount != 0 || textcount != 1 ) {
		    for ( i = textcount; i > 0; i-- )
			fprintf(tf, "(%s)%d", line[i].str, line[i].dx);
		    fprintf(tf, " %d %d %d t\n", textcount, stringstart, lasty);
		} else fprintf(tf, "(%s)%d %d w\n", line[1].str, stringstart, lasty);
		break;

	    case MAXENCODING+1:
		fprintf(tf, ")%d ", stringstart);
		fprintf(tf, "%d %d drawrvbox ", lastend - rvslop, (int)(lastx + .5) + rvslop);
		fprintf(tf, "t\n", stringstart);
		lastend = (lastx + .5) + 2 * rvslop;
		break;

	    case MAXENCODING+2:
		fprintf(tf, ")%d %d t\n", stringstart, lasty);
		break;
	}   /* End switch */
    }	/* End if */

    textcount = 0;

}   /* End of flushtext */

/*****************************************************************************/

endstring()

{

    int		dx;

/*
 *
 * Horizontal positions are out of sync. End the last open string, adjust the
 * printer's position, and start a new string. Assumes we've already started
 * accumulating text.
 *
 */

    switch ( encoding ) {
	case 0:
	case 1:
	    fprintf(tf, ")%d(", stringstart);
	    textcount++;
	    lastx = stringstart = hpos;
	    break;

	case 2:
	case 3:
	    dx = hpos - lastx;
	    if ( spacecount++ == 0 )
		line[textcount].dx = dx;
	    if ( line[textcount].dx != dx ) {
		*strptr++ = '\0';
		line[textcount].width = lastx - line[textcount].start;
		line[++textcount].str = strptr;
		*strptr++ = ' ';
		line[textcount].dx = dx;
		line[textcount].start = lastx;
		line[textcount].width = 0;
		line[textcount].spaces = 1;
	    } else {
		*strptr++ = ' ';
		line[textcount].spaces++;
	    }	/* End else */
	    lastx += dx;
	    break;

	case MAXENCODING+1:
	    fprintf(tf, ")%d(", stringstart);
	    textcount++;
	    lastx = stringstart = hpos;
	    break;

	case MAXENCODING+2:
	    flushtext();
	    starttext();
	    break;
    }	/* End switch */

}   /* End of endstring */

/*****************************************************************************/

endline()

{

/*
 *
 * The vertical position has changed. Dump any accumulated text, then adjust
 * the printer's vertical position.
 *
 */

    flushtext();

    if ( encoding == 0 || encoding == MAXENCODING+1 )
	fprintf(tf, "%d %d m\n", hpos, vpos);

    lastx = stringstart = lastend = hpos;
    lasty = vpos;

}   /* End of endline */

/*****************************************************************************/

addbyte(c)

    int		c;

{

/*
 *
 * Add byte c to the current string.
 *
 */

    switch ( encoding ) {
	case 0:
	case 1:
	    putc(c, tf);
	    break;

	case 2:
	case 3:
	    *strptr++ = c;
	    break;

	case MAXENCODING+1:
	case MAXENCODING+2:
	    putc(c, tf);
	    break;
    }	/* End switch */

}   /* End of addbyte */

/*****************************************************************************/

addoctal(c)

    int		c;

{

/*
 *
 * Add c to the current string as an octal escape.
 *
 */

    switch ( encoding ) {
	case 0:
	case 1:
	    fprintf(tf, "\\%o", c);
	    break;

	case 2:
	case 3:
	    sprintf(strptr, "\\%o", c);
	    strptr += strlen(strptr);
	    break;

	case MAXENCODING+1:
	case MAXENCODING+2:
	    fprintf(tf, "\\%o", c);
	    break;
    }	/* End switch */

}   /* End of addoctal */

/*****************************************************************************/

charlib(code)

    int		code;			/* either 1 or 2 */

{

    int		pos;			/* of lastc in downloaded[] */
    char	*name;			/* name of the character */
    char	tname[10];		/* in case it's a single ASCII character */
    char	temp[150];

/*
 *
 * Called from oput() for characters having codes less than 040. Special files
 * that define PostScript procedures for certain characters can be found in
 * directory *fontdir/devpost/charlib. If there's a file that has the same name as
 * the character we're trying to print it's copied to the output file, otherwise
 * nothing, except some positioning, is done.
 *
 * All character definitions are only made once. Subsequent requests to print the
 * character generate a call to a procedure that begins with the prefix build_ and
 * ends with the character's name. Special characters that are assigned codes
 * other than 1 are assumed to have additional data files that should be copied
 * to the output file immediately after the build_ call. Those data files should
 * end in the suffix .map, and usually will be a hex representation of a bitmap.
 *
 */

    flushtext();

    if ( lastc < 128 ) {		/* ASCII character */
	sprintf(tname, "%.3o", lastc);
	name = tname;
	pos = lastc;
    } else {
	name = chname(lastc);
	pos = lastc - FIRSTSPECIAL + 128;
    }	/* End else */

    if ( downloaded[pos] == 0 ) {
	sprintf(temp, "%s/dev%s/charlib/%s", fontdir, realdev, name);
	if ( exportfile(temp) == TRUE ) {
	    downloaded[pos] = 1;
	    t_sf();
	}   /* End if */
    }	/* End if */

    if ( downloaded[pos] == 1 ) {
	xymove(hpos, vpos);
	fprintf(tf, "%d build_%s\n", (int) lastw, name);
	if ( code != 1 ) {		/* get the bitmap or whatever */
	    sprintf(temp, "%s/dev%s/charlib/%s.map", fontdir, realdev, name);
	    if ( access(temp, 04) == 0 && tf == stdout )
		cat(temp);
	}   /* End if */
	fprintf(tf, "%d %d m\n", stringstart = hpos + lastw, vpos);
    }	/* End if */

}   /* End of charlib */

/*****************************************************************************/

reset()

{

/*
 *
 * Reset variables that keep track of the printer's current position, size and
 * font. Eventually forces things back in sync before oput() prints the next
 * character.
 *
 */

    lastx = -(slop + 1);
    lasty = -1;
    lastfont = lastsize = -1;

}   /* End of reset */

/*****************************************************************************/

resetpos()

{

/*
 *
 * Reset the position tracking variables. Forces oput() to get positions back
 * in sync before printing the next character.
 *
 */

    lastx = -(slop + 1);
    lasty = -1;

}   /* End of resetpos */

/*****************************************************************************/

save()

{

/*
 *
 * Save the current PostScript environment. Initialize things that may have
 * disappeared after the preceeding restore.
 *
 */

    fprintf(tf, "/saveobj save def\n");
    fprintf(tf, "mark\n");

    if ( encoding != realencoding )
	fprintf(tf, "%d setdecoding\n", encoding);

    if ( gotcolor == TRUE )		/* prevent getcolor() recursion */
	setcolor();

}   /* End of save */

/*****************************************************************************/

restore()

{

/*
 *
 * Restore the previous PostScript environment.
 *
 */

    flushtext();
    fprintf(tf, "cleartomark\n");
    fprintf(tf, "saveobj restore\n");
    reset();

}   /* End of restore */

/*****************************************************************************/

exportfile(path)

    char	*path;

{

    int		val = FALSE;

/*
 *
 * Exports the contents of file path to the global environment. Returns TRUE
 * if we're doing output (i.e. tf == stdout) and the copy worked.
 *
 */

    if ( tf == stdout && access(path, 04) == 0 ) {
	restore();
	fprintf(tf, "%s", BEGINGLOBAL);
	val = cat(path);
	fprintf(tf, "%s", ENDGLOBAL);
	save();
    }	/* End if */

    return(val);

}   /* End of exportfile */

/*****************************************************************************/

exportstring(str)

    char	*str;

{

/*
 *
 * Exports string str to the global environment. No return value needed yet.
 *
 */

    if ( tf == stdout && str != NULL && *str != '\0' ) {
	restore();
	fprintf(tf, "%s", BEGINGLOBAL);
	fprintf(tf, "%s", str);
	fprintf(tf, "%s", ENDGLOBAL);
	save();
    }	/* End if */

}   /* End of exportstring */

/*****************************************************************************/

redirect(pg)

    int		pg;

{

    static FILE	*fp_null = NULL;

/*
 *
 * If we're not supposed to print page pg, tf will be directed to /dev/null,
 * otherwise output goes to stdout.
 *
 */

    if ( pg >= 0 && in_olist(pg) == ON )
	tf = stdout;
    else if ( (tf = fp_null) == NULL )
	tf = fp_null = fopen("/dev/null", "w");

}   /* End of redirect */

/*****************************************************************************/

0707070014231311071006440057030057030000011033400522627504600003300000010457post.src/dpost.utf/dpost.h/*
 *
 * DEVNAME should be the name of a device whose font files accurately describe
 * what's available on the target printer. It's a string that's combined with
 * "/usr/lib/font/dev" to locate the final font directory. It can be changed
 * using the -T option, but you may end up getting garbage - the character code
 * field must agree with PostScript's character encoding scheme for each font and
 * troff's one or two character font names must be mapped into the appropriate
 * PostScript font names (typically in the prologue)
 *
 *
 */

#define	DEVNAME		"post"		/* name of the target printer */

/*
 *
 * SLOP controls how much horizontal positioning error we'll accept and primarily
 * helps when we're emulating another device. It's used when we output characters
 * in oput() to check if troff and the printer have gotten too far out of sync.
 * Given in units of points and can be changed using the -S option. Converted to
 * machine units in t_init() after the resolution is known.
 *
 */

#define SLOP		.2		/* horizontal error - in points */

/*
 *
 * Several different text line encoding schemes are supported. Print time should
 * decrease as the value assigned to encoding (in dpost.c) increases, although the
 * only encoding that's well tested is the lowest level one, which produces output
 * essentially identical to the original version of dpost. Setting DFLTENCODING to
 * 0 will give you the most stable (but slowest) encoding. The encoding scheme can
 * also be set on the command line using the -e option. Faster methods are based
 * on widthshow and may not place words exactly where troff wanted, but errors will
 * usually not be noticeable.
 *
 */

#define MAXENCODING	3

#ifndef DFLTENCODING
#define DFLTENCODING	2
#endif

/*
 *
 * The encoding scheme controls how lines of text are output. In the lower level
 * schemes words and horizontal positions are put on the stack as they're read and
 * when they're printed it's done in reverse order - the first string printed is
 * the one on top of the stack and it's the last one on the line. Faster methods
 * may be forced to reverse the order of strings on the stack, making the top one
 * the first string on the line. STRINGSPACE sets the size of a character array
 * that's used to save the strings that make up  a line of text so they can be
 * output in reverse order or perhaps combined in groups for widthshow.
 *
 * MAXSTACK controls how far we let PostScript's operand stack grow and determines
 * the number of strings we'll save before printing all or part of a line of text.
 * The internal limit in PostScript printers built by Adobe is 500, so MAXSTACK
 * should never be bigger than about 240!
 *
 * Line is a structure used to keep track of the words (or rather strings) on the
 * current line that have been read but not printed. dx is the width troff wants
 * to use for a space in the current string. start is where the string began, width
 * is the total width of the string, and spaces is the number of space characters
 * in the current string. *str points to the start of the string in the strings[]
 * array. The Line structure is only used in the higher level encoding schemes.
 * 
 */

#define	MAXSTACK	50		/* most strings we'll save at once */
#define	STRINGSPACE	2000		/* bytes available for string storage */

typedef struct {
	char	*str;			/* where the string is stored */
	int	dx;			/* width of a space */
	int	spaces;			/* number of space characters */
	int	start;			/* horizontal starting position */
	int	width;			/* and its total width */
} Line;

/*
 *
 * Simple stuff used to map unrecognized font names into something reasonable. The
 * mapping array is initialized using FONTMAP and used in loadfont() whenever the
 * job tries to use a font that we don't recognize. Normally only needed when we're
 * emulating another device.
 *
 */

typedef struct {
	char	*name;			/* font name we're looking for */
	char	*use;			/* and this is what we should use */
} Fontmap;

#define	FONTMAP								\
									\
	{								\
	    "G", "H",							\
	    "LO", "S",							\
	    "S2", "S",							\
	    "GI", "HI",							\
	    "HM", "H",							\
	    "HK", "H",							\
	    "HL", "H",							\
	    "PA", "R",							\
	    "PI", "I",							\
	    "PB", "B",							\
	    "PX", "BI",							\
	    NULL, NULL,							\
	}

/*
 *
 * Non-integer valued functions.
 *
 */

extern char	*mapfont();

0707070014231311101006440057030057030000011033600522627504700003400000011211post.src/dpost.utf/dpost.ps%
% Version 3.3.2 prologue for troff files.
%

/#copies 1 store
/aspectratio 1 def
/formsperpage 1 def
/landscape false def
/linewidth .3 def
/magnification 1 def
/margin 0 def
/orientation 0 def
/resolution 720 def
/rotation 1 def
/xoffset 0 def
/yoffset 0 def

/roundpage true def
/useclippath true def
/pagebbox [0 0 612 792] def

/R  /Times-Roman def
/I  /Times-Italic def
/B  /Times-Bold def
/BI /Times-BoldItalic def
/H  /Helvetica def
/HI /Helvetica-Oblique def
/HB /Helvetica-Bold def
/HX /Helvetica-BoldOblique def
/CW /Courier def
/CO /Courier def
/CI /Courier-Oblique def
/CB /Courier-Bold def
/CX /Courier-BoldOblique def
/PA /Palatino-Roman def
/PI /Palatino-Italic def
/PB /Palatino-Bold def
/PX /Palatino-BoldItalic def
/Hr /Helvetica-Narrow def
/Hi /Helvetica-Narrow-Oblique def
/Hb /Helvetica-Narrow-Bold def
/Hx /Helvetica-Narrow-BoldOblique def
/KR /Bookman-Light def
/KI /Bookman-LightItalic def
/KB /Bookman-Demi def
/KX /Bookman-DemiItalic def
/AR /AvantGarde-Book def
/AI /AvantGarde-BookOblique def
/AB /AvantGarde-Demi def
/AX /AvantGarde-DemiOblique def
/NR /NewCenturySchlbk-Roman def
/NI /NewCenturySchlbk-Italic def
/NB /NewCenturySchlbk-Bold def
/NX /NewCenturySchlbk-BoldItalic def
/ZD /ZapfDingbats def
/ZI /ZapfChancery-MediumItalic def
/S  /S def
/S1 /S1 def
/GR /Symbol def

/inch {72 mul} bind def
/min {2 copy gt {exch} if pop} bind def

/show {show} bind def		% so later references don't bind
/widthshow {widthshow} bind def
/stringwidth {stringwidth} bind def

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if
	/scaling 72 resolution div def
	linewidth setlinewidth
	1 setlinecap

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	width 2 div neg height 2 div translate
	xoffset inch yoffset inch neg translate
	margin 2 div dup neg translate
	magnification dup aspectratio mul scale
	scaling scaling scale

	addmetrics
	0 0 moveto
} def

/pagedimensions {
	useclippath userdict /gotpagebbox known not and {
		/pagebbox [clippath pathbbox newpath] def
		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/addmetrics {
	/Symbol /S null Sdefs cf
	/Times-Roman /S1 StandardEncoding dup length array copy S1defs cf
} def

/pagesetup {
	/page exch def
	currentdict /pagedict known currentdict page known and {
		page load pagedict exch get cvx exec
	} if
} def

/decodingdefs [
	{counttomark 2 idiv {y moveto show} repeat}
	{neg /y exch def counttomark 2 idiv {y moveto show} repeat}
	{neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat}
	{neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat}
	{counttomark 2 idiv {y moveto show} repeat}
	{neg setfunnytext}
] def

/setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def

/w {neg moveto show} bind def
/m {neg dup /y exch def moveto} bind def
/done {/lastpage where {pop lastpage} if} def

/f {
	dup /font exch def findfont exch
	dup /ptsize exch def scaling div dup /size exch def scalefont setfont
	linewidth ptsize mul scaling 10 mul div setlinewidth
	/spacewidth ( ) stringwidth pop def
} bind def

/changefont {
	/fontheight exch def
	/fontslant exch def
	currentfont [
		1 0
		fontheight ptsize div fontslant sin mul fontslant cos div
		fontheight ptsize div
		0 0
	] makefont setfont
} bind def

/sf {f} bind def

/cf {
	dup length 2 idiv
	/entries exch def
	/chtab exch def
	/newencoding exch def
	/newfont exch def

	findfont dup length 1 add dict
	/newdict exch def
	{1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall

	newencoding type /arraytype eq {newdict /Encoding newencoding put} if

	newdict /Metrics entries dict put
	newdict /Metrics get
	begin
		chtab aload pop
		1 1 entries {pop def} for
		newfont newdict definefont pop
	end
} bind def

%
% A few arrays used to adjust reference points and character widths in some
% of the printer resident fonts. If square roots are too high try changing
% the lines describing /radical and /radicalex to,
%
%	/radical	[0 -75 550 0]
%	/radicalex	[-50 -75 500 0]
%
% Move braceleftbt a bit - default PostScript character is off a bit.
%

/Sdefs [
	/bracketlefttp		[201 500]
	/bracketleftbt		[201 500]
	/bracketrighttp		[-81 380]
	/bracketrightbt		[-83 380]
	/braceleftbt		[203 490]
	/bracketrightex		[220 -125 500 0]
	/radical		[0 0 550 0]
	/radicalex		[-50 0 500 0]
	/parenleftex		[-20 -170 0 0]
	/integral		[100 -50 500 0]
	/infinity		[10 -75 730 0]
] def

/S1defs [
	/underscore		[0 80 500 0]
	/endash			[7 90 650 0]
] def
0707070014231311111006440057030057030000011034000522627504700003200000061605post.src/dpost.utf/draw.c/*
 *
 * Drawing routines used by dpost. Almost no real work is done here. Instead
 * the required calculations are done in special Postscript procedures that
 * include:
 *
 *
 *	Dl
 *
 *	  x1 y1 x y Dl -
 *
 *	    Starts a new path and then draws a line from the current point
 *	    (x, y) to (x1, y1).
 *
 *	De
 *
 *	  x y a b De -
 *
 *	    Starts a new path and then draws an ellipse that has its left side
 *	    at the current point (x, y) and horizontal and vertical axes lengths
 *	    given by a and b respectively.
 *
 *	Da
 *
 *	  x y dx1 dy1 dx2 dy2 Da -
 *
 *	    Starts a new segment and then draws a circular arc from the current
 *	    point (x, y) to (x + dx1 + dx2, y + dy1 + dy2). The center of the
 *	    circle is at (x + dx1, y + dy1). Arcs always go counter-clockwise
 *	    from the starting point to the end point.
 *
 *	DA
 *
 *	  x y dx1 dy1 dx2 dy2 DA -
 *
 *	    Draws a clockwise arc from (x, y) to (x + dx1 + dx2, y + dy1 + dy2)
 *	    with center at (x + dx1, y + dy1). Only needed when we're building
 *	    large paths that use arcs and want to control the current point. The
 *	    arguments passed to drawarc() will be whatever they would have been
 *	    for a counter-clockwise arc, so we need to map them into appropriate
 *	    arguments for PostScript's arcn operator. The mapping is,
 *
 *			x = hpos + dx1' + dx2'
 *			y = vpos + dy1' + dy2'
 *			dx1 = -dx2'
 *			dy1 = -dy2'
 *			dx2 = -dx1'
 *			dy2 = -dy1'
 *
 *	   where primed values represent the drawarc() arguments and (hpos, vpos)
 *	   is our current position.
 *
 *	Ds
 *
 *	  x0 y0 x1 y1 x2 y2 Ds -
 *
 *	    Starts a new segment and then draws a quadratic spline connecting
 *	    point ((x0 + x1)/2, (y0 + y1)/2) to ((x1 + x2)/2, (y1 + y2)/2).
 *	    The points used in Postscript's curveto procedure are given by,
 *
 *		x0' = (x0 + 5 * x1) / 6
 *		x1' = (x2 + 5 * x1) / 6
 *		x2' = (x1 + x2) / 2
 *
 *	    with similar equations for the y coordinates.
 *
 * By default all the PostScript drawing procedures begin with a newpath (just to
 * be safe) and end with a stroke, which essentially isolates the path elements
 * built by the drawing procedures. In order to accommodate big paths built from
 * smaller pieces each of the PostScript drawing procedures can forced to retain
 * the path that's being built. That's what happens in beginpath() when an "x X
 * BeginPath" command is read. beginpath() sets the PostScript variable inpath to
 * true, and that essentially eliminates the newpath/stroke pair that bracket the
 * individual pieces. In that case the path is terminated and drawn when dpost
 * reads an "x X DrawPath" command.
 *
 * Early versions of dpost included the PostScript drawing procedures as part of
 * the prologue, and as a result they were included with every job, even if they
 * were never used. This version has separated the drawing procedures from the
 * default prologue (they're now in *drawfile) and only includes them if they're
 * really needed, which is yet another convenient violation of page independence.
 * Routine getdraw() is responsible for adding *drawfile to the output file, and
 * if it can't read *drawfile it continues on as if nothing happened. That means
 * everything should still work if you append *drawfile to *prologue and then
 * delete *drawfile.
 *
 */

#include <stdio.h>
#include <math.h>

#include "gen.h"			/* general purpose definitions */
#include "ext.h"			/* external variable definitions */
#include "motion.h"			/* positioning macros */

int	gotdraw = FALSE;		/* TRUE when *drawfile has been added */
int	gotbaseline = FALSE;		/* TRUE after *baselinefile is added */
int	inpath = FALSE;			/* TRUE if we're putting pieces together */

/*
 *
 * All these should be defined in file dpost.c.
 *
 */

extern int		hpos;
extern int		vpos;
extern int		encoding;
extern int		maxencoding;
extern int		realencoding;

extern char		*drawfile;
extern char		*baselinefile;
extern FILE		*tf;

/*****************************************************************************/

getdraw()

{

/*
 *
 * Responsible for making sure the PostScript drawing procedures are downloaded
 * from *drawfile. Stuff is done at most once per job, and only if the job needs
 * them. For now I've decided not to quit if we can't read the drawing file. That
 * pretty much assumes an old version of prologue is being used that includes all
 * the drawing procedures.
 *
 */

    if ( gotdraw == FALSE )
	exportfile(drawfile);

    if ( tf == stdout )
	gotdraw = TRUE;

}   /* End of getdraw */

/*****************************************************************************/

drawline(dx, dy)

    int		dx, dy;			/* endpoint is (hpos+dx, vpos+dy) */

{

/*
 *
 * Draws a line from (hpos, vpos) to (hpos+dx, vpos+dy), and leaves the current
 * position at the endpoint.
 *
 */

    if ( dx == 0 && dy == 0 )
	drawcirc(1);
    else fprintf(tf, "%d %d %d %d Dl\n", hpos + dx, vpos + dy, hpos, vpos);

    if ( dobbox == TRUE ) {
	cover((double)hpos, (double)-vpos);
	cover((double)(hpos + dx), (double)-(vpos + dy));
    }	/* End if */

    hgoto(hpos+dx);			/* where troff expects to be */
    vgoto(vpos+dy);

    resetpos();				/* not sure where the printer is */

}   /* End of drawline */

/*****************************************************************************/

drawcirc(d)

    int		d;			/* diameter of the circle */

{

/*
 *
 * Draws a circle of diameter d with the left 'side' of the circle at the
 * current point. After we're finished drawing we move the current position
 * to the right side.
 *
 */

    drawellip(d, d);

}   /* End of drawcirc */

/*****************************************************************************/

drawellip(a, b)

    int		a, b;			/* axes lengths for the ellipse */

{

/*
 *
 * Draws an ellipse having axes lengths horizontally and vertically of a and
 * b. The left side of the ellipse is at the current point. After we're done
 * drawing the path we move the current position to the right side.
 *
 */

    if ( a == 0 && b == 0 )
	return;

    fprintf(tf, "%d %d %d %d De\n", hpos, vpos, a, b);

    if ( dobbox == TRUE ) {
	cover((double)hpos, (double)-(vpos + b/2));
	cover((double)(hpos+a), (double)-(vpos - b/2));
    }	/* End if */

    hgoto(hpos + a);			/* where troff expects to be */
    vgoto(vpos);

    resetpos();				/* not sure where the printer is */

}   /* End of drawellip */

/*****************************************************************************/

drawarc(dx1, dy1, dx2, dy2, c)

    int		dx1, dy1;		/* vector from current pos to center */
    int		dx2, dy2;		/* from center to end of the arc */
    int		c;			/* clockwise if c is A */

{

/*
 *
 * If c isn't set to 'A' a counter-clockwise arc is drawn from the current point
 * (hpos, vpos) to (hpos+dx1+dx2, vpos+dy1+dy2). The center of the circle is the
 * point (hpos+dx1, vpos+dy1). If c is 'A' the arc goes clockwise from the point
 * (hpos+dx1+dx2, vpos+dy1+dy2) to (hpos, vpos). Clockwise arcs are only needed
 * if we're building a larger path out of pieces that include arcs, and want to
 * have PostScript manage the path for us. Arguments (for a clockwise arc) are
 * what would have been supplied if the arc was drawn in a counter-clockwise
 * direction, and are converted to values suitable for use with PostScript's arcn
 * operator.
 *
 */

    if ( (dx1 != 0 || dy1 != 0) && (dx2 != 0 || dy2 != 0) ) {
	if ( c != 'A' )
	    fprintf(tf, "%d %d %d %d %d %d Da\n", hpos, vpos, dx1, dy1, dx2, dy2);
	else fprintf(tf, "%d %d %d %d %d %d DA\n", hpos+dx1+dx2, vpos+dy1+dy2,
						-dx2, -dy2, -dx1, -dy1);

	if ( dobbox == TRUE )
	    arc_extreme(dx1, dy1, dx2, dy2);
    }	/* End if */

    hgoto(hpos + dx1 + dx2);		/* where troff expects to be */
    vgoto(vpos + dy1 + dy2);

    resetpos();				/* not sure where the printer is */

}   /* End of drawarc */

/*****************************************************************************/

drawspline(fp, flag)

    FILE	*fp;			/* input for point list */
    int		flag;			/* flag!=1 connect end points */

{

    int		x[100], y[100];
    int		i, N;

/*
 *
 * Spline drawing routine for Postscript printers. The complicated stuff is
 * handled by procedure Ds, which should be defined in the library file. I've
 * seen wrong implementations of troff's spline drawing, so fo the record I'll
 * write down the parametric equations and the necessary conversions to Bezier
 * cubic splines (as used in Postscript).
 *
 *
 * Parametric equation (x coordinate only):
 *
 *
 *	    (x2 - 2 * x1 + x0)    2                    (x0 + x1)
 *	x = ------------------ * t   + (x1 - x0) * t + ---------
 *		    2					   2
 *
 *
 * The coefficients in the Bezier cubic are,
 *
 *
 *	A = 0
 *	B = (x2 - 2 * x1 + x0) / 2
 *	C = x1 - x0
 *
 *
 * while the current point is,
 *
 *	current-point = (x0 + x1) / 2
 *
 * Using the relationships given in the Postscript manual (page 121) it's easy to
 * see that the control points are given by,
 *
 *
 *	x0' = (x0 + 5 * x1) / 6
 *	x1' = (x2 + 5 * x1) / 6
 *	x2' = (x1 + x2) / 2
 *
 *
 * where the primed variables are the ones used by curveto. The calculations
 * shown above are done in procedure Ds using the coordinates set up in both
 * the x[] and y[] arrays.
 *
 * A simple test of whether your spline drawing is correct would be to use cip
 * to draw a spline and some tangent lines at appropriate points and then print
 * the file.
 *
 */

    for ( N = 2; N < sizeof(x)/sizeof(x[0]); N++ )
	if (fscanf(fp, "%d %d", &x[N], &y[N]) != 2)
		break;

    x[0] = x[1] = hpos;
    y[0] = y[1] = vpos;

    for (i = 1; i < N; i++) {
	x[i+1] += x[i];
	y[i+1] += y[i];
    }	/* End for */

    x[N] = x[N-1];
    y[N] = y[N-1];

    for (i = ((flag!=1)?0:1); i < ((flag!=1)?N-1:N-2); i++) {
	fprintf(tf, "%d %d %d %d %d %d Ds\n", x[i], y[i], x[i+1], y[i+1], x[i+2], y[i+2]);
	if ( dobbox == TRUE ) {		/* could be better */
	    cover((double)(x[i] + x[i+1])/2,(double)-(y[i] + y[i+1])/2);
	    cover((double)x[i+1], (double)-y[i+1]);
	    cover((double)(x[i+1] + x[i+2])/2, (double)-(y[i+1] + y[i+2])/2);
	}   /* End if */
    }	/* End for */

    hgoto(x[N]);			/* where troff expects to be */
    vgoto(y[N]);

    resetpos();				/* not sure where the printer is */

}   /* End of drawspline */

/*****************************************************************************/

arc_extreme(dx1, dy1, dx2, dy2)

    int		dx1, dy1, dx2, dy2;

{

    double	x0, y0, x1, y1, xc, yc;  /* start, end, center */
    double	r, xmin, ymin, xmax, ymax;
    int		j, k;

/*
 *
 * bounding box of a circular arc             Eric Grosse  24 May 84
 *
 * Conceptually, this routine generates a list consisting of the start,
 * end, and whichever north, east, south, and west points lie on the arc.
 * The bounding box is then the range of this list.
 *     list = {start,end}
 *     j = quadrant(start)
 *     k = quadrant(end)
 *     if( j==k && long way 'round )  append north,west,south,east
 *     else
 *       while( j != k )
 *          append center+radius*[j-th of north,west,south,east unit vectors]
 *          j += 1  (mod 4)
 *     return( bounding box of list )
 * The following code implements this, with simple optimizations.
 *
 */

    x0 = hpos;
    y0 = -vpos;
    x1 = hpos + dx1 + dx2;
    y1 = -(vpos + dy1 + dy2);
    xc = hpos + dx1;
    yc = -(vpos + dy1);

    x0 -= xc; y0 -= yc;			/* move to center */
    x1 -= xc; y1 -= yc;
    xmin = (x0<x1)?x0:x1; ymin = (y0<y1)?y0:y1;
    xmax = (x0>x1)?x0:x1; ymax = (y0>y1)?y0:y1;
    r = sqrt(x0*x0 + y0*y0);
    if (r > 0.0) {
	j = quadrant(x0,y0);
	k = quadrant(x1,y1);
	if (j == k && y1*x0 < x1*y0) {
	    /* viewed as complex numbers, if Im(z1/z0)<0, arc is big */
	    if( xmin > -r) xmin = -r; if( ymin > -r) ymin = -r;
	    if( xmax <  r) xmax =  r; if( ymax <  r) ymax =  r;
	} else {
	    while (j != k) {
		switch (j) {
		    case 1: if( ymax <  r) ymax =  r; break; /* north */
		    case 2: if( xmin > -r) xmin = -r; break; /* west */
		    case 3: if( ymin > -r) ymin = -r; break; /* south */
		    case 4: if( xmax <  r) xmax =  r; break; /* east */
		}   /* End switch */
		j = j%4 + 1;
	    }	/* End while */
	}   /* End else */
    }	/* End if */

    xmin += xc; ymin += yc;
    xmax += xc; ymax += yc;
    cover(xmin, ymin);
    cover(xmax, ymax);

}   /* End of arc_extreme */

/*****************************************************************************/

quadrant(x,y)

	double x, y;

{

    if (     x>=0.0 && y> 0.0) return(1);
    else if( x< 0.0 && y>=0.0) return(2);
    else if( x<=0.0 && y< 0.0) return(3);
    else if( x> 0.0 && y<=0.0) return(4);
    else		       return 0;	/* shut up lint */

}   /* End of quadrant */

/*****************************************************************************/

beginpath(buf, copy)

    char	*buf;			/* whatever followed "x X BeginPath" */
    int		copy;			/* ignore *buf if FALSE */

{

/*
 *
 * Called from devcntrl() whenever an "x X BeginPath" command is read. It's used
 * to mark the start of a sequence of drawing commands that should be grouped
 * together and treated as a single path. By default the drawing procedures in
 * *drawfile treat each drawing command as a separate object, and usually start
 * with a newpath (just as a precaution) and end with a stroke. The newpath and
 * stroke isolate individual drawing commands and make it impossible to deal with
 * composite objects. "x X BeginPath" can be used to mark the start of drawing
 * commands that should be grouped together and treated as a single object, and
 * part of what's done here ensures that the PostScript drawing commands defined
 * in *drawfile skip the newpath and stroke, until after the next "x X DrawPath"
 * command. At that point the path that's been built up can be manipulated in
 * various ways (eg. filled and/or stroked with a different line width).
 *
 * String *buf is unnecessary and is only included for compatibility with an early
 * verion of that's still in use. In that version "x X BeginObject" marked the
 * start of a graphical object, and whatever followed it was passed along in *buf
 * and copied to the output file. Color selection is one of the options that's
 * available in parsebuf(), so if we get here we add *colorfile to the output
 * file before doing anything important.
 *
 */

    if ( inpath == FALSE ) {
	flushtext();
	getdraw();
	getcolor();
	fprintf(tf, "gsave\n");
	fprintf(tf, "newpath\n");
	fprintf(tf, "%d %d m\n", hpos, vpos);
	fprintf(tf, "/inpath true def\n");
	if ( copy == TRUE )
	    fprintf(tf, "%s", buf);
	inpath = TRUE;
    }	/* End if */

}   /* End of beginpath */

/*****************************************************************************/

drawpath(buf, copy)

    char	*buf;
    int		copy;

{

/*
 *
 * Called from devcntrl() whenever an "x X DrawPath" command is read. It marks the
 * end of the path started by the last "x X BeginPath" command and uses whatever
 * has been passed along in *buf to manipulate the path (eg. fill and/or stroke
 * the path). Once that's been done the drawing procedures are restored to their
 * default behavior in which each drawing command is treated as an isolated path.
 * The new version (called after "x X DrawPath") has copy set to FALSE, and calls
 * parsebuf() to figure out what goes in the output file. It's a feeble attempt
 * to free users and preprocessors (like pic) from having to know PostScript. The
 * comments in parsebuf() describe what's handled.
 *
 * In the early version a path was started with "x X BeginObject" and ended with
 * "x X EndObject". In both cases *buf was just copied to the output file, and
 * was expected to be legitimate PostScript that manipulated the current path.
 * The old escape sequence will be supported for a while (for Ravi), and always
 * call this routine with copy set to TRUE.
 * 
 *
 */

    if ( inpath == TRUE ) {
	if ( copy == TRUE )
	    fprintf(tf, "%s", buf);
	else parsebuf(buf);
	fprintf(tf, "grestore\n");
	fprintf(tf, "/inpath false def\n");
	reset();
	inpath = FALSE;
    }	/* End if */

}   /* End of drawpath */

/*****************************************************************************/

parsebuf(buf)

    char	*buf;			/* whatever followed "x X DrawPath" */

{

    char	*p;			/* usually the next token */
    char	*p1;			/* for grabbing arguments */
    char	*pend;			/* end of the original string (ie. *buf) */
    int		gsavelevel = 0;		/* non-zero if we've done a gsave */

/*
 *
 * Simple minded attempt at parsing the string that followed an "x X DrawPath"
 * command. Everything not recognized here is simply ignored - there's absolutely
 * no error checking and what was originally in buf is clobbered by strtok().
 * A typical *buf might look like,
 *
 *	gray .9 fill stroke
 *
 * to fill the current path with a gray level of .9 and follow that by stroking the
 * outline of the path. Since unrecognized tokens are ignored the last example
 * could also be written as,
 *
 *	with gray .9 fill then stroke
 *
 * The "with" and "then" strings aren't recognized tokens and are simply discarded.
 * The "stroke", "fill", and "wfill" force out appropriate PostScript code and are
 * followed by a grestore. In otherwords changes to the grahics state (eg. a gray
 * level or color) are reset to default values immediately after the stroke, fill,
 * or wfill tokens. For now "fill" gets invokes PostScript's eofill operator and
 * "wfill" calls fill (ie. the operator that uses the non-zero winding rule).
 *
 * The tokens that cause temporary changes to the graphics state are "gray" (for
 * setting the gray level), "color" (for selecting a known color from the colordict
 * dictionary defined in *colorfile), and "line" (for setting the line width). All
 * three tokens can be extended since strncmp() makes the comparison. For example
 * the strings "line" and "linewidth" accomplish the same thing. Colors are named
 * (eg. "red"), but must be appropriately defined in *colorfile. For now all three
 * tokens must be followed immediately by their single argument. The gray level
 * (ie. the argument that follows "gray") should be a number between 0 and 1, with
 * 0 for black and 1 for white.
 *
 * To pass straight PostScript through enclose the appropriate commands in double
 * quotes. Straight PostScript is only bracketed by the outermost gsave/grestore
 * pair (ie. the one from the initial "x X BeginPath") although that's probably
 * a mistake. Suspect I may have to change the double quote delimiters.
 *
 */

    pend = buf + strlen(buf);
    p = strtok(buf, " \n");

    while ( p != NULL ) {
	if ( gsavelevel == 0 ) {
	    fprintf(tf, "gsave\n");
	    gsavelevel++;
	}   /* End if */
	if ( strcmp(p, "stroke") == 0 ) {
	    fprintf(tf, "closepath stroke\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "openstroke") == 0 ) {
	    fprintf(tf, "stroke\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "fill") == 0 ) {
	    fprintf(tf, "eofill\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "wfill") == 0 ) {
	    fprintf(tf, "fill\ngrestore\n");
	    gsavelevel--;
	} else if ( strcmp(p, "sfill") == 0 ) {
	    fprintf(tf, "eofill\ngrestore\ngsave\nstroke\ngrestore\n");
	    gsavelevel--;
	} else if ( strncmp(p, "gray", strlen("gray")) == 0 ) {
	    p1 = strtok(NULL, " \n");
	    fprintf(tf, "%s setgray\n", p1);
	} else if ( strncmp(p, "color", strlen("color")) == 0 ) {
	    p1 = strtok(NULL, " \n");
	    fprintf(tf, "/%s setcolor\n", p1);
	} else if ( strncmp(p, "line", strlen("line")) == 0 ) {
	    p1 = strtok(NULL, " \n");
	    fprintf(tf, "%s resolution mul 2 div setlinewidth\n", p1);
	} else if ( strncmp(p, "reverse", strlen("reverse")) == 0 )
	    fprintf(tf, "reversepath\n");
	else if ( *p == '"' ) {
	    for ( ; gsavelevel > 0; gsavelevel-- )
		fprintf(tf, "grestore\n");
	    if ( (p1 = p + strlen(p)) < pend )
		*p1 = ' ';
	    p = strtok(p, "\"\n");
	    fprintf(tf, "%s\n", p);
	}   /* End else */
	p = strtok(NULL, " \n");
    }	/* End while */

    for ( ; gsavelevel > 0; gsavelevel-- )
	fprintf(tf, "grestore\n");

}   /* End of parsebuf */

/*****************************************************************************/

getbaseline()

{

/*
 *
 * Responsible for making sure the PostScript procedures needed for printing text
 * along an arbitrary baseline are downloaded from *baselinefile. Done at most
 * once per job, and only if the the stuff is really used.
 *
 */

    if ( gotbaseline == FALSE )
	exportfile(baselinefile);

    if ( tf == stdout )
	gotbaseline = TRUE;

}   /* End of getbaseline */

/*****************************************************************************/

newbaseline(buf)

    char	*buf;			/* whatever followed "x X NewBaseline" */

{

    char	*p;			/* for eliminating white space etc. */

/*
 *
 * Called from devcntrl() whenever an "x X NewBaseline" command is recognized. We
 * assume whatever is in *buf is a set of parametric equations that describe the
 * new baseline. Equations for x(t), y(t), dx/dt, and dy/dt must be written in
 * PostScript, bracketed by { and } characters, and supplied in exactly that order.
 * In particular the equation for x must come first in *buf and it ends up as the
 * last one on the stack, while the equation for dy/dt comes last (in *buf) and
 * ends up on the top of the PostScript stack. For example if *buf is given by,
 *
 *	{} {180 mul 3.1416 div cos} {pop 1} {180 mul 3.1416 div sin neg}
 *
 * text will be printed along the curve y = cos(x).
 *
 * Angles given in radians must be converted to degrees for the PostScript trig
 * functions, and things are scaled so that 1 unit maps into 1 inch. In the last
 * example the cosine curve that describes the baseline has an amplitude of 1 inch.
 * As another example of this rather confusing syntax if *buf is,
 *
 *	{} {} {pop 1} {pop 1}
 *
 * the baseline will be the 45 degree line y = x.
 *
 * When any of the four functions is used they're called with a single number on
 * the stack that's equal to the current value of the parameter t. The coordinate
 * system axes run parallel to the PostScript coordinate system that's currently
 * being used.
 *
 */

    for ( p = buf; *p; p++ )		/* eliminate trailing '\n' */
	if ( *p == '\n' ) {
	    *p = '\0';
	    break;
	}   /* End if */

    for ( p = buf; *p && (*p == ' ' || *p == ':'); p++ ) ;

    if ( *p != '\0' ) {			/* something's there */
	flushtext();
	getbaseline();
	fprintf(tf, "mark resolution %s newbaseline\n", p);
	reset();
    }	/* End if */

}   /* End of newbaseline */

/*****************************************************************************/

drawtext(buf)

    char	*buf;			/* whatever followed "x X DrawText */

{

    char	*p;			/* for eliminating white space etc. */

/*
 *
 * Called from devcntrl() whenever an "x X DrawText command is recognized. *buf
 * should contain three arguments in the following order. First comes the text we
 * want to print along the current baseline. Right now the string should be given
 * as a PostScript string using characters '(' and ')' as the delimiters. Next in
 * *buf comes a justification mode that can be the words left, right, or center.
 * Last comes a number that represents the starting value of the parameter t that's
 * given as the argument to the parametric equations that describe the current
 * baseline. For example if *buf is given by,
 *
 *	(hello world) left .5
 *
 * hello world will be printed along the path described by the current baseline
 * and left justified at whatever (x(.5), y(.5)) happens to be. Usually will be
 * preceeded by an "x X NewBaseline" call that defines the current baseline. The
 * origin of the coordinate system used by the parametric equations will be the
 * current point.
 *
 */

    for ( p = buf; *p; p++ )		/* eliminate trailing '\n' */
	if ( *p == '\n' ) {
	    *p = '\0';
	    break;
	}   /* End if */

    for ( p = buf; *p && (*p == ' ' || *p == ':'); p++ ) ;

    if ( *p != '\0' ) {			/* something's there */
	flushtext();
	getbaseline();
	xymove(hpos, vpos);
	fprintf(tf, "mark %s drawfunnytext\n", p);
	resetpos();
    }	/* End if */

}   /* End of drawtext */

/*****************************************************************************/

settext(buf)

    char	*buf;

{

    char	*p;

/*
 *
 * Does whatever is needed to ensure any text that follows will be set along the
 * curve described by the PostScript procedures listed in *buf. If *buf doesn't
 * contain anything useful (eg. just a newline) things are restored to whatever
 * they originally were. Doesn't work well if we try to start in the middle of a
 * line of text.
 *
 * The parametric equations needed are,
 *
 *	x = f(t)
 *	y = g(t)
 *	dx/dt = f'(t)
 *	dy/dt = g'(t)
 *
 * and must be given as proper PostScript procedures. The equation for x must come
 * first (ie. it ends up on the bottom of the stack) and the equation for dy/dt
 * must be given last (ie. it ends up on top of the stack). For example if *buf
 * is given by,
 *
 *	{} {180 mul 3.1416 div cos} {pop 1} {180 mul 3.1416 div sin neg}
 *
 * text will be set along the curve y=cos(x).
 *
 */

    flushtext();
    getbaseline();

    for ( p = buf; *p && *p == ' '; p++ ) ;

    if ( *p && *p != '\n' ) {
	encoding = maxencoding + 2;
	fprintf(tf, "mark resolution %s newbaseline\n", buf);
    } else encoding = realencoding;

    fprintf(tf, "%d setdecoding\n", encoding);
    resetpos();

}   /* End of settext */

/*****************************************************************************/

0707070014231311121006440057030057030000011031660522627504700003300000002363post.src/dpost.utf/draw.ps%
% Version 3.3.2 drawing procedures for dpost. Automatically pulled in when
% needed.
%

/inpath false def
/savematrix matrix def

/Dl {
	inpath
		{pop pop neg lineto}
		{newpath neg moveto neg lineto stroke}
	ifelse
} bind def

/De {
	/y1 exch 2 div def
	/x1 exch 2 div def
	/savematrix savematrix currentmatrix def
	neg exch x1 add exch translate
	x1 y1 scale
	0 0 1 0 360
	inpath
		{1 0 moveto arc savematrix setmatrix}
		{newpath arc savematrix setmatrix stroke}
	ifelse
} bind def

/Da {
	/dy2 exch def
	/dx2 exch def
	/dy1 exch def
	/dx1 exch def
	dy1 add neg exch dx1 add exch
	dx1 dx1 mul dy1 dy1 mul add sqrt
	dy1 dx1 neg atan
	dy2 neg dx2 atan
	inpath
		{arc}
		{newpath arc stroke}
	ifelse
} bind def

/DA {
	/dy2 exch def
	/dx2 exch def
	/dy1 exch def
	/dx1 exch def
	dy1 add neg exch dx1 add exch
	dx1 dx1 mul dy1 dy1 mul add sqrt
	dy1 dx1 neg atan
	dy2 neg dx2 atan
	inpath
		{arcn}
		{newpath arcn stroke}
	ifelse
} bind def

/Ds {
	/y2 exch def
	/x2 exch def
	/y1 exch def
	/x1 exch def
	/y0 exch def
	/x0 exch def
	x0 5 x1 mul add 6 div
	y0 5 y1 mul add -6 div
	x2 5 x1 mul add 6 div
	y2 5 y1 mul add -6 div
	x1 x2 add 2 div
	y1 y2 add -2 div
	inpath
		{curveto}
		{newpath x0 x1 add 2 div y0 y1 add -2 div moveto curveto stroke}
	ifelse
} bind def
0707070014231311131006440057030057030000011034600522627504700003200000027177post.src/dpost.utf/font.c/*
 *
 * Typesetter font tables routines - for postprocessors.
 *
 */

#include <stdio.h>
#include <ctype.h>

#include "gen.h"
#include "rune.h"
#include "ext.h"
#include "font.h"

Font	*mount[MAXFONTS+1];		/* mount table - pointers into fonts[] */
Font	fonts[MAXFONTS+2];		/* font data - guarantee one empty slot */

int	fcount;				/* entries in fonts[] */
int	mcount;				/* fonts currently in memory */
int	mlimit = MAXFONTS+1;		/* and the most we'll allow */

char	*chnames[SPECIALCHARS];		/* special character hash table */
int	nchnames;			/* number of entries in chnames[] */

extern int	devres;
extern int	unitwidth;
extern int	nfonts;

/*****************************************************************************/

checkdesc(path)

    char	*path;

{

    char	buf[150];
    FILE	*fp;
    int		val = 0;

/*
 *
 * Return non-zero if the typesetter description file path includes,
 *
 *	PDL PostScript
 *
 * before the charset table.
 *
 */

    if ( (fp = fopen(path, "r")) != NULL ) {
	while ( fscanf(fp, "%s", buf) != EOF ) {
	    if ( strcmp(buf, "PDL") == 0 ) {
		fscanf(fp, "%s", buf);
		val = strcmp(buf, "PostScript") == 0;
		break;
	    } else if ( strcmp(buf, "charset") == 0 )
		break;
	    skipline(fp);
	}   /* End while */
	fclose(fp);
    }	/* End if */

    return(val);

}   /* End of checkdesc */

/*****************************************************************************/

getdesc(path)

    char	*path;

{

    char	buf[150];
    FILE	*fp;
    int		n;

    if ( (fp = fopen(path, "r")) == NULL )
	return(-1);

    while ( fscanf(fp, "%s", buf) != EOF ) {
	if ( strcmp(buf, "res") == 0 )
	    fscanf(fp, "%d", &devres);
	else if ( strcmp(buf, "unitwidth") == 0 )
	    fscanf(fp, "%d", &unitwidth);
	else if ( strcmp(buf, "sizes") == 0 )
	    while ( fscanf(fp, "%d", &n) != EOF && n != 0 ) ;
	else if ( strcmp(buf, "inmemory") == 0 )
	    fscanf(fp, "%d", &mlimit);
	else if ( strcmp(buf, "Encoding") == 0 ) {
	    fscanf(fp, "%s", buf);
	    fontencoding = strsave(buf);
	} else if ( strcmp(buf, "fonts") == 0 ) {
	    fscanf(fp, "%d", &nfonts);
	    for ( n = 0; n < nfonts; n++ )
		fscanf(fp, "%s", buf);
	} else if ( strcmp(buf, "charset") == 0 ) {
	    while ( fscanf(fp, "%s", buf) != EOF )
		chadd(buf);
	    break;
	}   /* End if */
	skipline(fp);
    }	/* End while */

    fclose(fp);
    return(1);

}   /* End of getdesc */

/*****************************************************************************/

getfont(path, fpos)

    char	*path;
    Font	*fpos;

{

    FILE	*fin;
    Chwid	chtemp[LARGESTFONT];
    int		next;
    int		i, n, num, wid, code;
    char	buf[300], ch[100], s1[100], s2[100], s3[100], cmd[100];


/*
 *
 * Read a font width table. Skip unnamed characters, spacewidth, ligatures,
 * ascender/descender entries, and anything else not recognized. Charset
 * entries for a new font are first stacked in chtemp[] and later copied
 * to correct slots in a newly allocated wp array. All calls should come
 * through mountfont().
 *
 */

    if ( fpos->state == INMEMORY )
	return(1);

    if ( (fin = fopen(path, "r")) == NULL )
	return(-1);

    if ( fpos->state == NEWFONT ) {
	if ( ++fcount > MAXFONTS+1 )
	    return(-1);
	fpos->path = strsave(path);
    }	/* End if */

    if ( ++mcount > mlimit && mcount > nfonts+1 )
	freefonts();

    while ( fscanf(fin, "%s", cmd) != EOF ) {
	if ( strcmp(cmd, "name") == 0 ) {
	    release(fpos->name);
	    fscanf(fin, "%s", buf);
	    fpos->name = strsave(buf);
	} else if ( strcmp(cmd, "fontname") == 0 ) {
	    release(fpos->fontname);
	    fscanf(fin, "%s", buf);
	    fpos->fontname = strsave(buf);
	} else if ( strcmp(cmd, "special") == 0 )
	    fpos->specfont = 1;
	else if ( strcmp(cmd, "named") == 0 )	/* in prologue or somewhere else */
	    fpos->flags |= NAMED;
	else if ( strcmp(cmd, "charset") == 0 ) {
	    skipline(fin);
	    next = 0;
	    fpos->nchars = 0;		/* special characters */
	    fpos->first = LASTCODE;
	    fpos->last = FIRSTCODE;
	    while ( fgets(buf, sizeof(buf), fin) != NULL ) {
		num = -1;
		sscanf(buf, "%s %s %s %s", ch, s1, s2, s3);
		if ( s1[0] != '"' ) {		/* not a synonym */
		    sscanf(s1, "%d", &wid);
		    code = strtol(s3, 0, 0);	/* dec/oct/hex */
		}   /* End if */
		if ( strlen(ch) == 1 )		/* it's ascii */
		    num = ch[0];
		else if ( ch[0] == '\\' && ch[1] == '0' )
		    num = strtol(ch+1, 0, 0);
		/*
		 * Eventually consider something like,
		 *
		 * else if ( strlen(ch) == chartorune(&r, ch) )
		 *	num = r;
		 */
		else if ( strcmp(ch, "---") != 0 ) {	/* ignore unnamed chars */
		    if ( (num = chindex(ch)) == INVALIDCODE )
			num = chadd(ch);
		}   /* End else */
		if ( ValidChar(num) ) {
		    if ( next < LARGESTFONT ) {
			chtemp[next].num = num;
                	chtemp[next].wid = wid;
                	chtemp[next++].code = code;
			if ( ValidCode(num) ) {
			    fpos->first = (num < fpos->first) ? num : fpos->first;
			    fpos->last = (num > fpos->last) ? num : fpos->last;
			} else fpos->nchars++;
		    } else error(FATAL, "font %s too large", path);
		} else if ( num != -1 )
		    error(FATAL, "invalid character in font %s\n", path);
	    }	/* End while */
	    break;
	}   /* End else */
	skipline(fin);
    }	/* End while */

    fclose(fin);

    if ( fpos->first > fpos->last )
	fpos->last = fpos->first - 1;
    fpos->nchars += fpos->last - fpos->first + 1;
    fpos->wp = (Chwid *)allocate(fpos->nchars * sizeof(Chwid));

    for ( i = 0; i < fpos->nchars; i++ )
	fpos->wp[i].num = INVALIDCODE;

    for ( i = 0, n = 1; i < next; i++ ) {
	if ( chtemp[i].num <= fpos->last )
	    fpos->wp[chtemp[i].num - fpos->first] = chtemp[i];
	else fpos->wp[fpos->last - fpos->first + n++] = chtemp[i];
    }	/* End for */

    fpos->state = INMEMORY;
    return(1);

}   /* End of getfont */

/*****************************************************************************/

mountfont(path, m)

    char	*path;
    int		m;

{

    Font	*fpos;

    if ( m < 0 || m > MAXFONTS )
	return(-1);

    if ( mount[m] != NULL ) {
	if ( mount[m]->path != NULL && strcmp(path, mount[m]->path) == 0 ) {
	    if ( mount[m]->state == INMEMORY )
		return(1);
	} else {
	    mount[m]->mounted--;
	    mount[m] = NULL;
	}   /* End else */
    }	/* End if */

    mount[m] = fpos = &fonts[findfont(path)];
    mount[m]->mounted++;
    return(getfont(path, fpos));

}   /* End of mountfont */

/*****************************************************************************/

freefonts()

{

    int		n;

/*
 *
 * Don't release the path without resetting state to NEWFONT - findfont()
 * assumes path is available.
 *
 */

    for ( n = 0; n < MAXFONTS+2; n++ )
	if ( fonts[n].state == INMEMORY && fonts[n].mounted == 0 ) {
	    release(fonts[n].wp);
	    fonts[n].wp = NULL;
	    fonts[n].state = RELEASED;
	    mcount--;
	}   /* End if */

}   /* End of freefonts */

/*****************************************************************************/

findfont(path)

    char	*path;

{

    register	n;

    for ( n = hash(path, MAXFONTS+2); fonts[n].state != NEWFONT; n = (n+1) % (MAXFONTS+2) )
	if ( strcmp(path, fonts[n].path) == 0 )
	    break;
    return(n);

}   /* End of findfont */

/*****************************************************************************/

mounted(m)

    int		m;

{

    return(m >= 0 && m <= MAXFONTS && mount[m] != NULL);

}   /* End of mounted */

/*****************************************************************************/

onfont(c, m)

    int		c;
    int		m;

{

    Font	*fp;
    Chwid	*cp, *ep;

/*
 *
 * Returns the position of character c in the font mounted at m, or -1 if the
 * character is not found.
 *
 */

    if ( mounted(m) ) {
	fp = mount[m];
	if ( c >= fp->first && c <= fp->last ) {
	    if ( fp->wp[c-fp->first].num == c )
		return(c - fp->first);
	    else return(-1);
	}   /* End if */

	if ( ValidSpecial(c) ) {
	    cp = &fp->wp[fp->last - fp->first + 1];
	    ep = &fp->wp[fp->nchars];
	    for ( ; cp < ep; cp++ )			/* search others */
    		if ( cp->num == c )
		    return(cp - &fp->wp[0]);
	}   /* End if */
    }	/* End if */

    return(-1);

}   /* End of onfont */

/*****************************************************************************/

chindex(s)

    char	*s;

{

    register	i;

/*
 *
 * Return the code assigned to special character s or INVALIDCODE if s
 * is not currently defined.
 *
 */

    for ( i = hash(s, SPECIALCHARS); chnames[i] != NULL; i = (i+1) % SPECIALCHARS )
	if ( strcmp(s, chnames[i]) == 0 )
	    return(i+FIRSTSPECIAL);
    return(INVALIDCODE);

}   /* End of chindex */

/*****************************************************************************/

chadd(s)

    char	*s;

{

    register	i;

    if ( nchnames >= SPECIALCHARS - 1 )		/* guarantee one empty slot */
	error(FATAL, "out of table space adding character %s", s);

    for ( i = hash(s, SPECIALCHARS); chnames[i] != NULL; i = (i+1) % SPECIALCHARS ) ;

    nchnames++;
    chnames[i] = strsave(s);
    return(i+FIRSTSPECIAL);

}   /* End of chadd */

/*****************************************************************************/

char *chname(n)

    int		n;

{

    return(chnames[n-FIRSTSPECIAL]);

}   /* End of chname */

/*****************************************************************************/

hash(s, l)

    char	*s;
    int		l;

{

    unsigned	i;

    for ( i = 0; *s; s++ )
	i = i*10 + *s;
    return(i % l);

}   /* End of hash */

/*****************************************************************************/

char *strsave(s)

    char	*s;

{

    char	*ptr = NULL;

    if ( s != NULL ) {
	ptr = (char *)allocate(strlen(s)+1);
	strcpy(ptr, s);
    }	/* End if */
    return(ptr);

}   /* End of strsave */

/*****************************************************************************/

char *allocate(count)

    int		count;

{

    char	*ptr;

    if ( (ptr = (char *)malloc(count)) == NULL ) {
	freefonts();
	if ( (ptr = (char *)malloc(count)) == NULL )
	    error(FATAL, "no memory");
    }	/* End if */
    return(ptr);

}   /* End of allocate */

/*****************************************************************************/

release(ptr)

    char	*ptr;

{

    if ( ptr != NULL )
	free(ptr);

}   /* End of release */

/*****************************************************************************/

dumpmount(m)

    int		m;

{

    if ( mount[m] != NULL )
	dumpfont((mount[m] - &fonts[0]));
    else fprintf(stderr, "no font mounted at %d\n", m);

}   /* End of dumpmount */

/*****************************************************************************/

dumpfont(n)

    int		n;

{

    int		i;
    Font	*fpos;
    char	*str;

    fpos = &fonts[n];

    if ( fpos->state ) {
	fprintf(stderr, "path %s\n", fpos->path);
	fprintf(stderr, "state %d\n", fpos->state);
	fprintf(stderr, "flags %d\n", fpos->flags);
	fprintf(stderr, "mounted %d\n", fpos->mounted);
	fprintf(stderr, "first %d\n", fpos->first);
	fprintf(stderr, "last %d\n", fpos->last);
	fprintf(stderr, "nchars %d\n", fpos->nchars);
	fprintf(stderr, "special %d\n", fpos->specfont);
	fprintf(stderr, "name %s\n", fpos->name);
	fprintf(stderr, "fontname %s\n", fpos->fontname);
	if ( fpos->state == INMEMORY ) {
	    fprintf(stderr, "charset\n");
	    for ( i = 0; i < fpos->nchars; i++ ) {
		if ( fpos->wp[i].num > 0 ) {
		    if ( fpos->wp[i].num <= fpos->last )
			fprintf(stderr, "%c\t%d\t%d\n", fpos->wp[i].num,
				fpos->wp[i].wid, fpos->wp[i].code);
		    else {
			str = chname(fpos->wp[i].num);
			if ( *str == '#' && isdigit(*(str+1)) && isdigit(*(str+2)) )
			    str = "---";
			fprintf(stderr, "%s\t%d\t%d\n", str, fpos->wp[i].wid,
				fpos->wp[i].code);
		    }	/* End else */
		}   /* End if */
	    }	/* End for */
	} else fprintf(stderr, "charset: not in memory\n");
    } else fprintf(stderr, "empty font: %d\n", n);

    putc('\n', stderr);

}   /* End of dumpfont */

/*****************************************************************************/

0707070014231311141006440057030057030000011031250522627505000003200000005021post.src/dpost.utf/font.h/*
 *
 * Characteristics of a font - for postprocessors. Most changes are for
 * Unicode and Plan 9 UTF encoding. Also tried to anticipate larger and
 * more general Unicode fonts.
 * 
 */

#define FIRSTCODE	0x0020
#define LASTCODE	0x8BFF
#define FIRSTSPECIAL	0xE800
#define LASTSPECIAL	0xFDFF

#define INVALIDCODE	0x0000
#define LARGESTFONT	0x1000
#define MAXFONTS	99
#define	SPECIALCHARS	(LASTSPECIAL-FIRSTSPECIAL+1)

#define ValidCode(c)	((c) >= FIRSTCODE && (c) <= LASTCODE)
#define ValidSpecial(c)	((c) >= FIRSTSPECIAL && (c) <= LASTSPECIAL)
#define ValidChar(c)	(ValidCode(c) || ValidSpecial(c))

/*
 *
 * State of a table entry in fonts[].
 *
 */

#define NEWFONT		0
#define RELEASED	1
#define INMEMORY	2

/*
 *
 * Flags - for setting bits in a font's flag field.
 *
 */

#define USED		1
#define NAMED		2

#define skipline(f)	while ( getc(f) != '\n' )

/*
 *
 * Data about each character on a font. Omitted the ascender/descender field.
 * Need 16 bits for num field to support Unicode character set. Use the same
 * for code field which may be translated to Plan 9's UTF represenation on
 * output. A string for code field might be worth a try? Needs considerable
 * thought!!
 *
 */

typedef struct {
	unsigned short	num;		/* INVALIDCODE means not on this font */
	unsigned char	wid;		/* width */
	unsigned short	code;		/* code for actual device. */
} Chwid;

/*
 *
 * Font header - one for each available position. first and last fields
 * are an attempt to anticipate support for Unicode fonts. Characters
 * from first through last are described by the initial last-first+1
 * entries in wp. Entries in wp having num == INVALIDCODE are unassigned
 * in the font. The remaining nchars-(last-first+1) wp entries support
 * troff's traditional two character escapes. Special characters are
 * hashed and assigned codes from Unicode's Private Use Area.
 *
 */

typedef struct {
	char		*path;		/* where it came from */
	char		*name;		/* as known to troff */
	char		*fontname;	/* real name (e.g. Times-Roman) */
	char		state;		/* NEWFONT, RELEASED, or INMEMORY */
	char		flags;		/* for now just USED and NAMED */
	char		mounted;	/* mounted on this many positions */
	char		specfont;	/* 1 == special font */
	unsigned short	first;		/* first wp entry is for this character */
	unsigned short	last;		/* last code for this font */
	unsigned short	nchars;		/* size of width table for this font */
	Chwid		*wp;		/* widths, etc., of the real characters */
} Font;

/*
 *
 * Non-integer functions.
 *
 */

extern char	*chname();
extern char	*strsave();
extern char	*allocate();

0707070014231311151006440057030057030000011033270522627505000003400000000272post.src/dpost.utf/motion.h/*
 *
 * Position adjusting macros.
 *
 */

#define hgoto(n)	hpos = n
#define hmot(n)		hpos += n
#define vgoto(n)	vpos = n
#define vmot(n)		vpos += n

extern int	hpos;
extern int	vpos;

0707070014231311161006440057030057030000011035200522627505100003600000023077post.src/dpost.utf/pictures.c/*
 *
 * PostScript picture inclusion routines. Support for managing in-line pictures
 * has been added, and works in combination with the simple picpack pre-processor
 * that's supplied with this package. An in-line picture begins with a special
 * device control command that looks like,
 *
 *		x X InlinPicture name size
 *
 * where name is the pathname of the original picture file and size is the number
 * of bytes in the picture, which begins immediately on the next line. When dpost
 * encounters the InlinePicture device control command inlinepic() is called and
 * that routine appends the string name and the integer size to a temporary file
 * (fp_pic) and then adds the next size bytes read from the current input file to
 * file fp_pic. All in-line pictures are saved in fp_pic and located later using
 * the name string and picture file size that separate pictures saved in fp_pic.
 *
 * When a picture request (ie. an "x X PI" command) is encountered picopen() is
 * called and it first looks for the picture file in fp_pic. If it's found there
 * the entire picture (ie. size bytes) is copied from fp_pic to a new temp file
 * and that temp file is used as the picture file. If there's nothing in fp_pic
 * or if the lookup failed the original route is taken.
 *
 * Support for in-line pictures is an attempt to address requirements, expressed
 * by several organizations, of being able to store a document as a single file
 * (usually troff input) that can then be sent through dpost and ultimately to
 * a PostScript printer. The mechanism may help some users, but the are obvious
 * disadvantages to this approach, and the original mechanism is the recommended
 * approach! Perhaps the most important problem is that troff output, with in-line
 * pictures included, doesn't fit the device independent language accepted by
 * important post-processors (like proff) and that means you won't be able to
 * reliably preview a packed file on your 5620 (or whatever).
 *
 */

#include <stdio.h>

#include "comments.h"			/* PostScript file structuring comments */
#include "gen.h"			/* general purpose definitions */
#include "path.h"			/* just for TEMPDIR definition */
#include "ext.h"			/* external variable declarations */

FILE	*fp_pic = NULL;			/* in-line pictures go here */
FILE	*picopen();

extern int	res, hpos, vpos;
extern int	picflag;
extern FILE	*tf;

/*****************************************************************************/

picture(buf)

    char	*buf;		/* stuff following 'x X PI' command */

{

    int		poffset;	/* page offset */
    int		indent;		/* indent */
    int		length;		/* line length  */
    int		totrap;		/* distance to next trap */
    char	name[100];	/* picture file and page string */
    char	hwo[40], *p;	/* height, width and offset strings */
    char	flags[20];	/* miscellaneous stuff */
    int		page = 1;	/* page number pulled from name[] */
    double	frame[4];	/* height, width, y, and x offsets from hwo[] */
    char	units;		/* scale indicator for frame dimensions */
    int		whiteout = 0;	/* white out the box? */
    int		outline = 0;	/* draw a box around the picture? */
    int		scaleboth = 0;	/* scale both dimensions? */
    double	adjx = 0.5;	/* left-right adjustment */
    double	adjy = 0.5;	/* top-bottom adjustment */
    double	rot = 0;	/* rotation in clockwise degrees */
    FILE	*fp_in;		/* for *name */
    int		i;		/* loop index */

    char	*strchr();

/*
 *
 * Called from devcntrl() after an 'x X PI' command is found. The syntax of that
 * command is:
 *
 *	x X PI:args
 *
 * with args separated by colons and given by:
 *
 *	poffset
 *	indent
 *	length
 *	totrap
 *	file[(page)]
 *	height[,width[,yoffset[,xoffset]]]
 *	[flags]
 *
 * poffset, indent, length, and totrap are given in machine units. height, width,
 * and offset refer to the picture frame in inches, unless they're followed by
 * the u scale indicator. flags is a string that provides a little bit of control
 * over the placement of the picture in the frame. Rotation of the picture, in
 * clockwise degrees, is set by the a flag. If it's not followed by an angle
 * the current rotation angle is incremented by 90 degrees, otherwise the angle
 * is set by the number that immediately follows the a.
 *
 */

    if ( picflag == OFF )		/* skip it */
	return;

    flushtext();

    flags[0] = '\0';			/* just to be safe */
    if ( sscanf(buf, "%d:%d:%d:%d:%[^:]:%[^:]:%[^:]", &poffset, &indent,
		&length, &totrap, name, hwo, flags) < 6 ) {
	    error(NON_FATAL, "too few arguments to specify picture");
	    return;
    }	/* End if */

    if ( sscanf(name, "%*[^(](%d", &page) == 1 )	/* grab the page number */
	strtok(name, "(");			/* and separate it from the name */

    if ( (fp_in = picopen(name)) == NULL ) {
	error(NON_FATAL, "can't open picture file %s", name);
	return;
    }	/* End if */

    frame[0] = frame[1] = -1;		/* default frame height, width */
    frame[2] = frame[3] = 0;		/* and y and x offsets */

    for ( i = 0, p = hwo-1; i < 4 && p != NULL; i++, p = strchr(p, ',') )
	if ( sscanf(++p, "%lf%c", &frame[i], &units) == 2 )
	    if ( units == 'i' || units == ',' || units == '\0' )
		frame[i] *= res;

    if ( frame[0] <= 0 )		/* check what we got for height */
	frame[0] = totrap;

    if ( frame[1] <= 0 )		/* and width - check too big?? */
	frame[1] = length - indent;

    frame[3] += poffset + indent;	/* real x offset */

    for ( i = 0; flags[i]; i++ )
	switch ( flags[i] ) {
	    case 'c': adjx = adjy = 0.5; break;	/* move to the center */
	    case 'l': adjx = 0; break;		/* left */
	    case 'r': adjx = 1; break;		/* right */
	    case 't': adjy = 1; break;		/* top */
	    case 'b': adjy = 0; break;		/* or bottom justify */
	    case 'o': outline = 1; break;	/* outline the picture */
	    case 'w': whiteout = 1; break;	/* white out the box */
	    case 's': scaleboth = 1; break;	/* scale both dimensions */
	    case 'a': if ( sscanf(&flags[i+1], "%lf", &rot) != 1 )
			  rot += 90;
	}   /* End switch */

    restore();
    ps_include(fp_in, tf, page, whiteout, outline, scaleboth,
		frame[3]+frame[1]/2, -vpos-frame[2]-frame[0]/2, frame[1], frame[0], adjx, adjy, -rot);
    save();
    fclose(fp_in);

}   /* End of picture */

/*****************************************************************************/

FILE *picopen(path)

    char	*path;			/* picture file pathname */

{

    char	name[100];		/* pathnames */
    long	pos;			/* current position */
    long	total;			/* and sizes - from *fp_pic */
    char	*tname;			/* pathname */
    FILE	*fp;			/* and pointer for the new temp file */

/*
 *
 * Responsible for finding and opening the next picture file. If we've accumulated
 * any in-line pictures fp_pic won't be NULL and we'll look there first. If *path
 * is found in *fp_pic we create another temp file, open it for update, unlink it,
 * copy in the picture, seek back to the start of the new temp file, and return
 * the file pointer to the caller. If fp_pic is NULL or the lookup fails we just
 * open file *path and return the resulting file pointer to the caller.
 *
 */

    if ( fp_pic != NULL ) {
	fseek(fp_pic, 0L, 0);
	while ( fscanf(fp_pic, "%s %ld\n", name, &total) != EOF ) {
	    pos = ftell(fp_pic);
	    if ( strcmp(path, name) == 0 ) {
		if ( (tname = tempnam(TEMPDIR, "dpost")) == NULL )
		    error(FATAL, "can't generate temp file name");
		if ( (fp = fopen(tname, "w+r")) == NULL )
		    error(FATAL, "can't open %s", tname);
		unlink(tname);
		free(tname);
		piccopy(fp_pic, fp, total);
		fseek(fp, 0L, 0);
		return(fp);
	    }   /* End if */
	    fseek(fp_pic, total+pos, 0);
	}   /* End while */
    }	/* End if */

    return(fopen(path, "r"));

}   /* End of picopen */

/*****************************************************************************/

inlinepic(fp, buf)

    FILE	*fp;			/* current input file */
    char	*buf;			/* whatever followed "x X InlinePicture" */

{

    char	*tname;			/* temp file pathname - for *fp_pic */
    char	name[100];		/* picture file pathname */
    long	total;			/* and size - both from *buf */

/*
 *
 * Adds an in-line picture file to the end of temporary file *fp_pic. All pictures
 * grabbed from the input file are saved in the same temp file. Each is preceeded
 * by a one line header that includes the original picture file pathname and the
 * size of the picture in bytes. The in-line picture file is opened for update,
 * left open, and unlinked so it disappears when we do.
 *
 */

    if ( fp_pic == NULL ) {
	if ( (tname = tempnam(TEMPDIR, "dpost")) == NULL )
	    error(FATAL, "can't generate in-line picture file name");
	if ( (fp_pic = fopen(tname, "w+r")) == NULL )
	    error(FATAL, "can't open in-line picture file %s", tname);
	unlink(tname);
    }	/* End if */

    if ( sscanf(buf, "%s %ld", name, &total) != 2 )
	error(FATAL, "in-line picture error");

    fseek(fp_pic, 0L, 2);
    fprintf(fp_pic, "%s %ld\n", name, total);
    getc(fp);
    fflush(fp_pic);
    piccopy(fp, fp_pic, total);
    ungetc('\n', fp);

}   /* End of inlinepic */

/*****************************************************************************/

piccopy(fp_in, fp_out, total)

    FILE	*fp_in;			/* input */
    FILE	*fp_out;		/* and output file pointers */
    long	total;			/* number of bytes to be copied */

{

    long	i;			/* loop index */

/*
 *
 * Copies total bytes from file fp_in to fp_out. Used to append picture files to
 * *fp_pic and then copy them to yet another temporary file immediately before
 * they're used (in picture()).
 *
 */

    for ( i = 0; i < total; i++ )
	if ( putc(getc(fp_in), fp_out) == EOF )
	    error(FATAL, "error copying in-line picture file");
    fflush(fp_out);

}   /* End of piccopy */

/*****************************************************************************/

0707070014231311171006440057030057030000011033470522627505200004200000000262post.src/dpost.utf/ps_include.awk/^->/ {
	if(ndef)
		printf("\t0\n};\n\n")
	printf("static char *%s[] = {\n", $2)
	ndef++
	next
}
/^#/ {next}
$0 != "" {printf("\t\"%s\",\n", $0); next}
END {printf("\t0\n};\n")}
0707070014231311201006440057030057030000011035400522627505300004000000012407post.src/dpost.utf/ps_include.c
#include <stdio.h>
#include "ps_include.h"

#define has(word)	(strncmp(buf, word, strlen(word)) == 0)
#define grab(n)		((Section *)(nglobal \
			? realloc((char *)global, n*sizeof(Section)) \
			: calloc(n, sizeof(Section))))

char	buf[512];
typedef struct {long start, end;} Section;

extern char	*calloc(), *realloc();


ps_include(fin, fout, page_no, whiteout, outline, scaleboth, cx, cy, sx, sy, ax, ay, rot)


    FILE	*fin, *fout;		/* input and output files */
    int		page_no;		/* physical page number from *fin */
    int		whiteout;		/* erase picture area */
    int		outline;		/* draw a box around it and */
    int		scaleboth;		/* scale both dimensions - if not zero */
    double	cx, cy;			/* center of the picture and */
    double	sx, sy;			/* its size - in current coordinates */
    double	ax, ay;			/* left-right, up-down adjustment */
    double	rot;			/* rotation - in clockwise degrees */


{


    int		foundpage = 0;		/* found the page when non zero */
    int		foundpbox = 0;		/* found the page bounding box */
    int		nglobal = 0;		/* number of global defs so far */
    int		maxglobal = 0;		/* and the number we've got room for */
    Section	prolog, page, trailer;	/* prologue, page, and trailer offsets */
    Section	*global;		/* offsets for all global definitions */
    double	llx, lly;		/* lower left and */
    double	urx, ury;		/* upper right corners - default coords */
    double	w = whiteout != 0;	/* mostly for the var() macro */
    double	o = outline != 0;
    double	s = scaleboth != 0;
    int		i;			/* loop index */


/*
 *
 * Reads a PostScript file (*fin), and uses structuring comments to locate the
 * prologue, trailer, global definitions, and the requested page. After the whole
 * file is scanned, the  special ps_include PostScript definitions are copied to
 * *fout, followed by the prologue, global definitions, the requested page, and
 * the trailer. Before returning the initial environment (saved in PS_head) is
 * restored.
 *
 * By default we assume the picture is 8.5 by 11 inches, but the BoundingBox
 * comment, if found, takes precedence.
 *
 */


	llx = lly = 0;			/* default BoundingBox - 8.5x11 inches */
	urx = 72 * 8.5;
	ury = 72 * 11.0;

	/* section boundaries and bounding box */

	prolog.start = prolog.end = 0;
	page.start = page.end = 0;
	trailer.start = 0;
	fseek(fin, 0L, 0);

	while ( fgets(buf, sizeof(buf), fin) != NULL )
		if (!has("%%"))
			continue;
		else if (has("%%Page: ")) {
			if (!foundpage)
				page.start = ftell(fin);
			sscanf(buf, "%*s %*s %d", &i);
			if (i == page_no)
				foundpage = 1;
			else if (foundpage && page.end <= page.start)
				page.end = ftell(fin);
		} else if (has("%%EndPage: ")) {
			sscanf(buf, "%*s %*s %d", &i);
			if (i == page_no) {
				foundpage = 1;
				page.end = ftell(fin);
			}
			if (!foundpage)
				page.start = ftell(fin);
		} else if (has("%%PageBoundingBox: ")) {
			if (i == page_no) {
				foundpbox = 1;
				sscanf(buf, "%*s %lf %lf %lf %lf",
						&llx, &lly, &urx, &ury);
			}
		} else if (has("%%BoundingBox: ")) {
			if (!foundpbox)
				sscanf(buf,"%*s %lf %lf %lf %lf",
						&llx, &lly, &urx, &ury);
		} else if (has("%%EndProlog") || has("%%EndSetup") || has("%%EndDocumentSetup"))
			prolog.end = page.start = ftell(fin);
		else if (has("%%Trailer"))
			trailer.start = ftell(fin);
		else if (has("%%BeginGlobal")) {
			if (page.end <= page.start) {
				if (nglobal >= maxglobal) {
					maxglobal += 20;
					global = grab(maxglobal);
				}
				global[nglobal].start = ftell(fin);
			}
		} else if (has("%%EndGlobal"))
			if (page.end <= page.start)
				global[nglobal++].end = ftell(fin);

	fseek(fin, 0L, 2);
	if (trailer.start == 0)
		trailer.start = ftell(fin);
	trailer.end = ftell(fin);

	if (page.end <= page.start)
		page.end = trailer.start;

/*
fprintf(stderr, "prolog=(%d,%d)\n", prolog.start, prolog.end);
fprintf(stderr, "page=(%d,%d)\n", page.start, page.end);
for(i = 0; i < nglobal; i++)
	fprintf(stderr, "global[%d]=(%d,%d)\n", i, global[i].start, global[i].end);
fprintf(stderr, "trailer=(%d,%d)\n", trailer.start, trailer.end);
*/

	/* all output here */
	print(fout, PS_head);
/*
 * Unix 4.0 didn't like the var macro.
 *
	var(llx); var(lly); var(urx); var(ury); var(w); var(o); var(s);
	var(cx); var(cy); var(sx); var(sy); var(ax); var(ay); var(rot);
 *
 */

	fprintf(fout, "/llx %g def\n", llx);
	fprintf(fout, "/lly %g def\n", lly);
	fprintf(fout, "/urx %g def\n", urx);
	fprintf(fout, "/ury %g def\n", ury);
	fprintf(fout, "/w %g def\n", w);
	fprintf(fout, "/o %g def\n", o);
	fprintf(fout, "/s %g def\n", s);
	fprintf(fout, "/cx %g def\n", cx);
	fprintf(fout, "/cy %g def\n", cy);
	fprintf(fout, "/sx %g def\n", sx);
	fprintf(fout, "/sy %g def\n", sy);
	fprintf(fout, "/ax %g def\n", ax);
	fprintf(fout, "/ay %g def\n", ay);
	fprintf(fout, "/rot %g def\n", rot);

	print(fout, PS_setup);
	copy(fin, fout, &prolog);
	for(i = 0; i < nglobal; i++)
		copy(fin, fout, &global[i]);
	copy(fin, fout, &page);
	copy(fin, fout, &trailer);
	print(fout, PS_tail);

	if(nglobal)
		free(global);

}

static
print(fout, s)
FILE *fout;
char **s;
{
	while (*s)
		fprintf(fout, "%s\n", *s++);
}

static
copy(fin, fout, s)
FILE *fin, *fout;
Section *s;
{
	if (s->end <= s->start)
		return;
	fseek(fin, s->start, 0);
	while (ftell(fin) < s->end && fgets(buf, sizeof(buf), fin) != NULL)
		if (buf[0] != '%')
			fprintf(fout, "%s", buf);
}

0707070014231311211006440057030057030000011035460522627505300004000000003752post.src/dpost.utf/ps_include.hstatic char *PS_head[] = {
	"%ps_include: begin",
	"save",
	"/ed {exch def} def",
	"{} /showpage ed",
	"{} /copypage ed",
	"{} /erasepage ed",
	"{} /letter ed",
	"currentdict /findfont known systemdict /findfont known and {",
	"	/findfont systemdict /findfont get def",
	"} if",
	"36 dict dup /PS-include-dict-dw ed begin",
	"/context ed",
	"count array astore /o-stack ed",
	"%ps_include: variables begin",
	0
};

static char *PS_setup[] = {
	"%ps_include: variables end",
	"{llx lly urx ury} /bbox ed",
	"{newpath 2 index exch 2 index exch dup 6 index exch",
	" moveto 3 {lineto} repeat closepath} /boxpath ed",
	"{dup mul exch dup mul add sqrt} /len ed",
	"{2 copy gt {exch} if pop} /min ed",
	"{2 copy lt {exch} if pop} /max ed",
	"{transform round exch round exch A itransform} /nice ed",
	"{6 array} /n ed",
	"n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed",
	"urx llx sub 0 A dtransform len /Sx ed",
	"0 ury lly sub A dtransform len /Sy ed",
	"llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed",
	"rot dup sin abs /S ed cos abs /C ed",
	"Sx S mul Sy C mul add /H ed",
	"Sx C mul Sy S mul add /W ed",
	"sy H div /Scaley ed",
	"sx W div /Scalex ed",
	"s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if",
	"sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed",
	"sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed",
	"urx llx sub 0 A dtransform exch atan rot exch sub /rot ed",
	"n currentmatrix initgraphics setmatrix",
	"cx cy translate",
	"Scalex Scaley scale",
	"rot rotate",
	"Cx neg Cy neg translate",
	"A concat",
	"bbox boxpath clip newpath",
	"w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if",
	"end",
	"gsave",
	"%ps_include: inclusion begin",
	0
};

static char *PS_tail[] = {
	"%ps_include: inclusion end",
	"grestore",
	"PS-include-dict-dw begin",
	"o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice",
	"	initgraphics 0.1 setlinewidth boxpath stroke grestore} if",
	"clear o-stack aload pop",
	"context end restore",
	"%ps_include: end",
	0
};
0707070014231311221006440057030057030000011035040522627505300004100000007004post.src/dpost.utf/ps_include.ps-> PS_head

%ps_include: begin
save
/ed {exch def} def

# redefine dangerous operators
{} /showpage ed
{} /copypage ed
{} /erasepage ed
{} /letter ed

# restore findfont from systemdict if it looks like it's be redefined
currentdict /findfont known systemdict /findfont known and {
	/findfont systemdict /findfont get def
} if

# computations are done in the context of a new dictionary
36 dict dup /PS-include-dict-dw ed begin

# context holds the save object created earlier
/context ed

# save and clear the operand stack
count array astore /o-stack ed

# the following variables are now expected:
#	llx,lly,urx,ury	bounding box of picture to be included
#	w		nonzero if space should be painted white to start
#	o		nonzero if space should be outlined
#	s		nonzero if both dimensions should be scaled
#	cx,cy		center of page space in current coordinates
#	sx,sy		size of page space in current coordinates
#	ax,ay		left-right, up-down adjustment of picture in page space
#	rot		rotation of picture in page space
%ps_include: variables begin



-> PS_setup

%ps_include: variables end

# some routines:
# - BBOX llx lly urx ury	put bounding box on stack
# llx lly urx ury BOXPATH -	make a path with given box corners
# dx dy LEN length		compute length of positionless vector
# a b MIN min			compute minimum of two numbers
# a b MAX max			compute maximum of two numbers
# x y NICE x y			move to pixel boundaries in default coords
{llx lly urx ury} /bbox ed
{newpath 2 index exch 2 index exch dup 6 index exch
 moveto 3 {lineto} repeat closepath} /boxpath ed
{dup mul exch dup mul add sqrt} /len ed
{2 copy gt {exch} if pop} /min ed
{2 copy lt {exch} if pop} /max ed
{transform round exch round exch A itransform} /nice ed

# A is the transformation from default to current coordinates
{6 array} /n ed
n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed

# Sx,Sy and Cx,Cy are dimensions and size of bounding box in current coordinates
urx llx sub 0 A dtransform len /Sx ed
0 ury lly sub A dtransform len /Sy ed
llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed

# H and W are height and width of rotated box in current coordinates
rot dup sin abs /S ed cos abs /C ed
Sx S mul Sy C mul add /H ed
Sx C mul Sy S mul add /W ed

# Scalex and Scaley are the required horizontal and vertical scaling factors
sy H div /Scaley ed
sx W div /Scalex ed

# Preserve aspect ratio if we're not scaling both dimensions (ie. s is 0)
s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if

# add to cx,cy the shift needed within the page space
sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed
sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed

# the actual rotation needed is rot less the current rotation
urx llx sub 0 A dtransform exch atan rot exch sub /rot ed

# set up the coordinate system
n currentmatrix initgraphics setmatrix
cx cy translate
Scalex Scaley scale
rot rotate
Cx neg Cy neg translate
A concat

# set the clipping region, and conditionally whiteout and outline
bbox boxpath clip newpath
w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if

# pop local dictionary from the dict stack
end

# now begins the actual material extracted from the file
gsave
%ps_include: inclusion begin



-> PS_tail

%ps_include: inclusion end
grestore

# within the context of the local dictionary ...
PS-include-dict-dw begin

o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice
	initgraphics 0.1 setlinewidth boxpath stroke grestore} if

# ... restore the operand stack and the save context
clear o-stack aload pop
context end restore
%ps_include: end
0707070014231311221006440057030057030000011035040522627505300001300000000000TRAILER!!!f

# ... restore the operand stack and the save context
clear o-stack aload pop
context end restore
%ps_include: end
0707070014231311221006440057030057030000011035040522627505300001300000000000TRAILER!!!f

# ... restore the operand stack and the save context
clear o-stack aload pop
context end restore
%ps_