/usr/akumar/alt/devel/gs/ 755 0 0 0 11242411647 143105ustar00akumarakumar/usr/akumar/alt/devel/gs/ijs/ 755 0 0 0 11242412040 150615ustar00akumarakumar/usr/akumar/alt/devel/gs/ijs/.cvsignore 644 0 0 135 11241503077 17052ustar00akumarakumarconfig.log config.status configure Makefile ijs-config ijs_client_example ijs_server_example /usr/akumar/alt/devel/gs/ijs/Makefile.in 644 0 0 4570 11241503077 17146ustar00akumarakumar# Unix CC=@CC@ CFLAGS=-g -Wall -ansi -pedantic -Wmissing-prototypes LDLIBS= OBJ=.o # todo: this needs to be .dylib on OS X - write a test SHARED_OBJ=.so SHARED_OBJ=.dylib EXE= FE=-o IJS_EXEC_SERVER=ijs_exec_unix$(OBJ) RM=rm -f AR=ar ARFLAGS=qc RANLIB=@RANLIB@ # Installation paths prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ libdir=@libdir@ includedir=@includedir@ pkgincludedir=$(includedir)/ijs INSTALL = @INSTALL@ IJS_COMMON_OBJ=ijs$(OBJ) all: libijs.a libijs$(SHARED_OBJ) ijs_client_example$(EXE) ijs_server_example$(EXE) LIB_OBJS=ijs$(OBJ) ijs_client$(OBJ) ijs_server$(OBJ) $(IJS_EXEC_SERVER) libijs.a: $(LIB_OBJS) rm -f $@ $(AR) $(ARFLAGS) $@ $^ $(RANLIB) $@ # Note: this builds both the server and client into a single library. Logically, it # makes sense to separate them, but they're small enough to make this probably # not worthwhile. libijs$(SHARED_OBJ): $(LIB_OBJS) #$(CC) -shared $^ -o $@ $(CC) -dynamic $^ -o $@ ijs_client_example$(EXE): ijs_client_example$(OBJ) ijs_client$(OBJ) $(IJS_COMMON_OBJ) $(IJS_EXEC_SERVER) $(CC) $(CFLAGS) $(FE)ijs_client_example$(EXE) ijs_client_example$(OBJ) ijs_client$(OBJ) $(IJS_COMMON_OBJ) $(IJS_EXEC_SERVER) $(LDLIBS) ijs_server_example$(EXE): ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_OBJ) $(CC) $(CFLAGS) $(FE)ijs_server_example$(EXE) ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_OBJ) $(LDLIBS) common_clean: $(RM) *$(OBJ) ijs_client_example$(EXE) ijs_server_example$(EXE) clean: common_clean $(RM) *~ gmon.out core ijs_spec.log ijs_spec.tex ijs_spec.aux libijs.a libijs$(SHARED_OBJ) config.cache config.log config.status ijs-config install: all $(INSTALL) ijs_client_example$(EXE) $(bindir)/ijs_client_example$(EXE) $(INSTALL) ijs-config $(bindir)/ijs-config $(INSTALL) libijs.a $(libdir)/libijs.a $(INSTALL) libijs$(SHARED_OBJ) $(libdir)/libijs$(SHARED_OBJ) mkdir $(pkgincludedir) $(INSTALL) ijs.h $(pkgincludedir)/ijs.h $(INSTALL) ijs_client.h $(pkgincludedir)/ijs_client.h $(INSTALL) ijs_server.h $(pkgincludedir)/ijs_server.h uninstall: $(RM) $(bindir)/ijs_client_example$(EXE) $(bindir)/ijs-config $(libdir)/libijs.a $(libdir)/libijs$(SHARED_OBJ) $(RM) $(pkgincludedir)/ijs_client.h $(pkgincludedir)/ijs_server.h $(pkgincludedir)/ijs.h ijs_spec.ps: ijs_spec.sgml # We don't use db2pdf because it can't handle embedded .eps db2ps ijs_spec.sgml ijs_spec.pdf: ijs_spec.ps ps2pdf ijs_spec.ps /usr/akumar/alt/devel/gs/ijs/README 644 0 0 15060 11241503077 15775ustar00akumarakumarIJS 0.33 22 Jan 2002 News as of 0.33: The buffer size has been increased to 4096. It should probably be dynamically allocated, though. Minor clarification in BitsPerSample language in spec (thanks to Jackie Chang for pointing out the ambiguity). News as of 0.32: The xres and yres fields of ph are now floats. The example server now supports margins. A few small bugs have been cleaned up as well. News as of 0.31: A number of small cleanups in the code. The example client and server support more querying and enumeration, but not yet margins. There is a new API for the client to query the negotiated version number. The ijs_exec_unix module now sets the SIGPIPE signal to ignore. This way, if the client abnormally exits, it allows the error to propagate through the read() or write() call to the pipe, rather than immediately killing the client. News as of 0.30: It now builds as a library. Also, there is basic autoconf support (but not automake or libtool). It's probably best to link the static library for now. I'm open to suggestions - I'm open to drinking the entire pitcher of auto* Kool-Aid, but we probably won't use libtool in Ghostscript builds. This release fixes a number of bugs and improves portability. In particular, server errors should now bubble up to the client, and the termination logic has been patched according to David Suffield, who discovered a race condition there. Thanks to David and Russell for patches. The spec is now in a reasonable draft. See ijs_spec.sgml and ijs_spec.pdf. Comments and suggestions are welcome. The example client and server have _not_ yet been updated to use the newer features of the ijs spec. Patches are welcome. News as of 0.29: I've added a number of things discussed on the mailing list, including listing and enumerating parameters, as well as a job abstraction. The client interface has changed a bit - job id's are now present in most callbacks, colorspace is now presented only as a string, and there are quite a few more callbacks. I've started a skeleton of a protocol spec in DocBook. Note, there's a potential race condition in EXIT noted by David Suffield. The fix hasn't yet been merged in from his work. News as of 0.2: This version integrates set_param and get_param, and has moved the "page header" processing to use set_param. Also, there are both Windows (MS VC++) and Unix makefiles. Use "make -f unix.mak" to build on Unix. Thanks to Russell Lang for Windows portability work. Introduction This is an early snapshot of IJS. I expect the protocols and API's to evolve somewhat, and things like error handling are still far from perfect. However, I'm pretty happy that this is going in the right direction. I am doing this prerelease so that authors of various packages related to raster-based printing can start thinking about how to integrate it. Ideally, all producers of printable raster data should be able to function as an ijs client, and all consumers should be able to function as an ijs server. This release is about as functional as piping pnm's, which is primitive, but the way a lot of drivers still work. What is IJS? IJS is, first and foremost, a protocol for transmission of raster page images. This snapshot provides a reference implementation of the protocol, the design of which is still in flux. When the protocol specification is published, it will be authoritative. Applications should feel free to link against the library provided in this package, adapt that code for their own needs, or roll a completely new implementation. The protocol is a fairly traditional client-server design. In general, the client sends one or more page images to the server, along with various metadata. Communication is through simple "commands", which are essentially size-prefixed packets. The client sends a command to the server, then waits for a response command, either ACK or NAK. The server "speaks" IJS through stdin and stdout. One consequence of this design decision is that the server can be invoked remotely, for example through ssh. It's not clear yet how useful this will be, but at least people can experiment with it. Currently, all data goes through the stdin and stdout pipes. It is envisioned that a shared memory transport will also be provided, transparently. IJS will fall back to pipes if shared memory is not available for any reason. I'm not yet convinced that the performance win for shared memory is significant. I would like to benchmark domain sockets as well, as they are likely to provide better performance than pipes, and are also highly desirable for cases where the server runs as a persistent daemon. This tarball provides an "IJS library" in the form of ijs, ijs_client, and ijs_server. It also provides an example client (capable of reading pnmraw files) and an example server (capable of generating PostScript). I imagine that the example programs will be useful for development and testing, but that end-users probably won't find a need for them. To try IJS, compile and run "./ijs_client_example -s ./ijs_server_example -pOutputFile=/tmp/tmp.ps foo.ppm". This will invoke ./ijs_server_example, which will in turn generate a /tmp/tmp.ps file. The ijs_client_example takes a -p command line argument for setting parameters, and a -r argument for setting resolution. Here is a typical command line: ./ijs_client_example -s ./ijs_server_example -pOutputFile=/tmp/tmp.ps \ -r300 in.ppm The syntax of -p is a sequence of key=value pairs, separated by commas. A backslash in the value escapes the next character (allowing embedded commas in the value). Thus, '-pfoo=bar, quux=a\,b' sets the key "foo" to the value "bar, and the key "quux" to the value "a,b". FAQ What does IJS stand for? It stands for "raster printer driver architecture." It's spelled U+30EA U+13DA, to avoid confusion, and to save space in UTF-16 encodings. Actually, the name derives from HPIJS, which presumably stands for HP InkJet Server. The name pays homage to HPIJS for the inspiration, while communicating that it's not specific to HP printers. Licensing MIT. I want everybody to be able to use this. More stuff to write: Actual specification for the protocol (in draft). Client spawns server, invoker invokes client and server, and persistent server daemon modes. Negotation of extensions (goal is interoperability between versions). (Actually, the PING/PONG protocol as it exists negotiates version numbers). TODO: Shared memory transport. Should have an alternate mode in which the client is passed the pipe information, rather than having to spawn the server. wait() cleanup of invoked server. Package library up as libijs.a, .so (partially done) 644 0 0 4570 11241503077 17146ustar00akumarakumar/usr/akumar/alt/devel/gs/ijs/common.mak 644 0 0 1140 11241503077 17051ustar00akumarakumarIJS_COMMON_OBJ=ijs$(OBJ) all: ijs_client_example$(EXE) ijs_server_example$(EXE) ijs_client_example$(EXE): ijs_client_example$(OBJ) ijs_client$(OBJ) $(IJS_COMMON_OBJ) $(IJS_EXEC_SERVER) $(CC) $(CFLAGS) $(FE)ijs_client_example$(EXE) ijs_client_example$(OBJ) ijs_client$(OBJ) $(IJS_COMMON_OBJ) $(IJS_EXEC_SERVER) $(LDLIBS) ijs_server_example$(EXE): ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_OBJ) $(CC) $(CFLAGS) $(FE)ijs_server_example$(EXE) ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_OBJ) $(LDLIBS) common_clean: $(RM) *$(OBJ) ijs_client_example$(EXE) ijs_server_example$(EXE) t_example$(OBJ) ijs_client$(OBJ) $(IJS_COMMON_OBJ) $(IJS_EXEC_SERVER) $(LDLIBS) ijs_server_example$(EXE): ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_OBJ) $(CC) $(CFLAGS) $(FE)ijs_server_example$(EXE) ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_OBJ) $(LDLIBS) common_clean: $(RM) *$(OBJ) ijs_client_example$(EXE) ijs_server_example$(EXE) clean: common_clean $(RM) *~ gmon.out core ijs_spe/usr/akumar/alt/devel/gs/ijs/configure.in 644 0 0 303 11241503077 17360ustar00akumarakumarAC_INIT(ijs.c) IJS_VERSION=0.33 AC_SUBST(IJS_VERSION) AC_PROG_CC AC_PROG_RANLIB AC_PROG_INSTALL AC_OUTPUT(Makefile ijs-config, [case "$CONFIG_FILES" in *ijs-config*) chmod +x ijs-config;; esac]) /usr/akumar/alt/devel/gs/ijs/ijs-config.in 644 0 0 1670 11241503077 17457ustar00akumarakumar#!/bin/sh prefix=@prefix@ exec_prefix=@exec_prefix@ exec_prefix_set=no usage="\ Usage: ijs-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--libs] [--cflags]" if test $# -eq 0; then echo "${usage}" 1>&2 exit 1 fi while test $# -gt 0; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case $1 in --prefix=*) prefix=$optarg if test $exec_prefix_set = no ; then exec_prefix=$optarg fi ;; --prefix) echo $prefix ;; --exec-prefix=*) exec_prefix=$optarg exec_prefix_set=yes ;; --exec-prefix) echo $exec_prefix ;; --version) echo @IJS_VERSION@ ;; --cflags) includes=-I@includedir@/ijs echo $includes ;; --libs) libdirs=-L@libdir@ echo $libdirs -lijs ;; *) echo "${usage}" 1>&2 exit 1 ;; esac shift done automake or libtool). It's probably best to link the static library for/usr/akumar/alt/devel/gs/ijs/ijs.c 644 0 0 6637 11241503077 16040ustar00akumarakumar#include #include "unistd_.h" #include "ijs.h" static void ijs_put_int (char *p, int val) { p[0] = (val >> 24) & 0xff; p[1] = (val >> 16) & 0xff; p[2] = (val >> 8) & 0xff; p[3] = val & 0xff; } void ijs_send_init (IjsSendChan *ch, int fd) { ch->fd = fd; ch->buf_size = 0; } int ijs_send_int (IjsSendChan *ch, int val) { if ((ch->buf_size + 4) > (int)sizeof(ch->buf)) return IJS_ERANGE; ijs_put_int (ch->buf + ch->buf_size, val); ch->buf_size += 4; return 0; } int ijs_send_begin (IjsSendChan *ch, IjsCommand cmd) { if (ch->buf_size != 0) return IJS_EINTERNAL; ijs_send_int (ch, cmd); ch->buf_size += 4; /* leave room for size field */ return 0; } int ijs_send_block (IjsSendChan *ch, const char *buf, int len) { if ((ch->buf_size + len) > (int)sizeof(ch->buf)) return IJS_ERANGE; memcpy (ch->buf + ch->buf_size, buf, len); ch->buf_size += len; return 0; } int ijs_send_buf (IjsSendChan *ch) { int status; ijs_put_int (ch->buf + 4, ch->buf_size); status = write (ch->fd, ch->buf, ch->buf_size); status = (status == ch->buf_size) ? 0 : IJS_EIO; ch->buf_size = 0; return status; } void ijs_recv_init (IjsRecvChan *ch, int fd) { ch->fd = fd; ch->buf_size = 0; } int ijs_get_int (const char *p) { const unsigned char *up = (const unsigned char *)p; return (up[0] << 24) | (up[1] << 16) | (up[2] << 8) | up[3]; } /* This is a drop-in replacement for read(), but handles partial reads. */ int ijs_recv_read (IjsRecvChan *ch, char *buf, int size) { int ix = 0; int nbytes; do { nbytes = read (ch->fd, buf + ix, size - ix); if (nbytes < 0) return nbytes; else if (nbytes == 0) return ix; else ix += nbytes; } while (ix < size); return ix; } int ijs_recv_buf (IjsRecvChan *ch) { int nbytes; int data_size; nbytes = ijs_recv_read (ch, ch->buf, 8); if (nbytes != 8) return IJS_EIO; ch->buf_size = ijs_get_int (ch->buf + 4); if (ch->buf_size < 8 || ch->buf_size > (int)sizeof(ch->buf)) return IJS_ERANGE; data_size = ch->buf_size - 8; if (data_size > 0) { nbytes = ijs_recv_read (ch, ch->buf + 8, data_size); if (nbytes != data_size) return IJS_EIO; } ch->buf_idx = 8; return 0; } /** * ijs_recv_ack: Receive an acknowledgement. * @ch: Channel. * * Receives an acknowledgement code (generally from server to client). * Note that the distinction between local error and error generated * by the remote peer is lost in this routine. If it is important to * preserve this distinction, use ijs_recv_buf directly instead. * * Return value: 0 on success, negative on error. **/ int ijs_recv_ack (IjsRecvChan *ch) { int status; status = ijs_recv_buf (ch); if (status == 0) { int cmd = ijs_get_int (ch->buf); if (cmd == IJS_CMD_NAK) { if (ch->buf_size != 12) status = IJS_EPROTO; else status = ijs_get_int (ch->buf + 8); } } return status; } int ijs_recv_int (IjsRecvChan *ch, int *val) { if (ch->buf_idx + 4 > ch->buf_size) return IJS_EPROTO; *val = ijs_get_int (ch->buf + ch->buf_idx); ch->buf_idx += 4; return 0; } /** * Return value: data block size if nonnegative, or error code if * negative. **/ int ijs_recv_block (IjsRecvChan *ch, char *buf, int buf_size) { int size = ch->buf_size - ch->buf_idx; if (size > buf_size) return IJS_ERANGE; memcpy (buf, ch->buf + ch->buf_idx, size); ch->buf_idx = ch->buf_size; return size; } /usr/akumar/alt/devel/gs/ijs/ijs.h 644 0 0 4012 11241503077 16026ustar00akumarakumar/* This file contains common data types for IJS */ /* IJS_VERSION is decimal version number times 100 */ #define IJS_VERSION 33 typedef int ijs_bool; #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif typedef enum { IJS_CMD_ACK, IJS_CMD_NAK, IJS_CMD_PING, IJS_CMD_PONG, IJS_CMD_OPEN, IJS_CMD_CLOSE, IJS_CMD_BEGIN_JOB, IJS_CMD_END_JOB, IJS_CMD_CANCEL_JOB, IJS_CMD_QUERY_STATUS, IJS_CMD_LIST_PARAMS, IJS_CMD_ENUM_PARAM, IJS_CMD_SET_PARAM, IJS_CMD_GET_PARAM, IJS_CMD_BEGIN_PAGE, IJS_CMD_SEND_DATA_BLOCK, IJS_CMD_END_PAGE, IJS_CMD_EXIT } IjsCommand; typedef int IjsJobId; #define IJS_EIO -2 /* I/O error */ #define IJS_EPROTO -3 /* protocol error */ #define IJS_ERANGE -4 /* out of range */ #define IJS_EINTERNAL -5 /* internal error */ #define IJS_ENYI -6 /* not yet implemented */ #define IJS_ESYNTAX -7 /* syntax error */ #define IJS_ECOLORSPACE -8 /* unknown color space */ #define IJS_EUNKPARAM -9 /* unknown parameter */ #define IJS_EJOBID -10 /* job id doesn't match */ #define IJS_ETOOMANYJOBS -11 /* reached limit of server's #jobs */ #define IJS_EBUF -12 /* buffer isn't big enough */ #define IJS_HELO_STR "IJS\n\252v1\n" #define IJS_RESP_STR "IJS\n\253v1\n" typedef struct { int fd; char buf[4096]; int buf_size; } IjsSendChan; typedef struct { int fd; char buf[4096]; int buf_size; int buf_idx; } IjsRecvChan; void ijs_send_init (IjsSendChan *ch, int fd); int ijs_send_int (IjsSendChan *ch, int val); int ijs_send_begin (IjsSendChan *ch, IjsCommand cmd); int ijs_send_block (IjsSendChan *ch, const char *buf, int len); int ijs_send_buf (IjsSendChan *ch); int ijs_get_int (const char *p); void ijs_recv_init (IjsRecvChan *ch, int fd); int ijs_recv_read (IjsRecvChan *ch, char *buf, int size); int ijs_recv_buf (IjsRecvChan *ch); int ijs_recv_ack (IjsRecvChan *ch); int ijs_recv_int (IjsRecvChan *ch, int *val); int ijs_recv_block (IjsRecvChan *ch, char *buf, int buf_size); _OBJ=ijs$(OBJ) all: ijs_client_example$(EXE) ijs_server_example$(EXE) ijs_client_example$(EXE): ijs_client_example$(OBJ) ijs_client$(OBJ) $(IJS_COMMON_OBJ) $(IJS_EXEC_SERVER) $(CC) $(CFLAGS) $(FE)ijs_client_example$(EXE) ijs_client_example$(OBJ) ijs_client$(OBJ) $(IJS_COMMON_OBJ) $(IJS_EXEC_SERVER) $(LDLIBS) ijs_server_example$(EXE): ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_OBJ) $(CC) $(CFLAGS) $(FE)ijs_server_example$(EXE) ijs_server_example$(OBJ) ijs_server$(OBJ) $(IJS_COMMON_/usr/akumar/alt/devel/gs/ijs/ijs_client.c 644 0 0 15032 11241503077 17403ustar00akumarakumar#include "unistd_.h" #include #include #include #include "ijs.h" #include "ijs_client.h" struct _IjsClientCtx { int fd_from; int child_pid; IjsSendChan send_chan; IjsRecvChan recv_chan; int version; }; IjsClientCtx * ijs_invoke_server (const char *server_cmd) { IjsClientCtx *ctx; int fds_to[2], fds_from[2]; int child_pid; char helo_buf[8] = IJS_HELO_STR; char resp_buf[8]; const char exp_resp_buf[8] = IJS_RESP_STR; ijs_bool ok = TRUE; int nbytes; int version; if (ijs_exec_server(server_cmd, &fds_to[1], &fds_from[0], &child_pid) < 0) return NULL; ctx = (IjsClientCtx *)malloc (sizeof(IjsClientCtx)); ctx->fd_from = fds_from[0]; ctx->child_pid = child_pid; ijs_send_init (&ctx->send_chan, fds_to[1]); ijs_recv_init (&ctx->recv_chan, fds_from[0]); nbytes = write (ctx->send_chan.fd, helo_buf, sizeof(helo_buf)); if (nbytes != sizeof(helo_buf)) ok = FALSE; if (ok) { nbytes = read (ctx->recv_chan.fd, resp_buf, sizeof(resp_buf)); if (nbytes != sizeof(resp_buf) || memcmp (resp_buf, exp_resp_buf, sizeof(resp_buf))) ok = FALSE; } /* exchange version information with server */ if (ok) ok = ijs_client_begin_cmd (ctx, IJS_CMD_PING) >= 0; if (ok) ok = ijs_send_int (&ctx->send_chan, IJS_VERSION) >= 0; if (ok) ok = ijs_client_send_cmd_wait (ctx) >= 0; if (ok) ok = ijs_recv_int (&ctx->recv_chan, &version) >= 0; if (ok) { if (version > IJS_VERSION) version = IJS_VERSION; ctx->version = version; } if (!ok) { close (ctx->send_chan.fd); close (ctx->recv_chan.fd); free (ctx); ctx = NULL; } return ctx; } int ijs_client_begin_cmd (IjsClientCtx *ctx, IjsCommand cmd) { return ijs_send_begin (&ctx->send_chan, cmd); } int ijs_client_send_int (IjsClientCtx *ctx, int val) { return ijs_send_int (&ctx->send_chan, val); } int ijs_client_send_cmd (IjsClientCtx *ctx) { return ijs_send_buf (&ctx->send_chan); } /** * ijs_client_send_cmd_wait: Send command and wait for ack. * @ctx: IJS client context. * * Sends the command in the client context's buffer, and waits for ack. * * Return value: 0 on successful ack, otherwise negative. **/ int ijs_client_send_cmd_wait (IjsClientCtx *ctx) { int status; status = ijs_client_send_cmd (ctx); if (status >= 0) { status = ijs_recv_ack (&ctx->recv_chan); } return status; } /* This is the blocking version; it's not likely to be efficient */ int ijs_client_send_data_wait (IjsClientCtx *ctx, IjsJobId job_id, const char *buf, int size) { int status; ijs_client_begin_cmd (ctx, IJS_CMD_SEND_DATA_BLOCK); ijs_send_int (&ctx->send_chan, job_id); ijs_send_int (&ctx->send_chan, size); status = ijs_client_send_cmd (ctx); if (status) return status; status = write (ctx->send_chan.fd, buf, size); if (status != size) return IJS_EIO; status = ijs_recv_ack (&ctx->recv_chan); return status; } int ijs_client_open (IjsClientCtx *ctx) { ijs_client_begin_cmd (ctx, IJS_CMD_OPEN); return ijs_client_send_cmd_wait (ctx); } int ijs_client_close (IjsClientCtx *ctx) { ijs_client_begin_cmd (ctx, IJS_CMD_CLOSE); return ijs_client_send_cmd_wait (ctx); } int ijs_client_begin_job (IjsClientCtx *ctx, IjsJobId job_id) { ijs_client_begin_cmd (ctx, IJS_CMD_BEGIN_JOB); ijs_send_int (&ctx->send_chan, job_id); return ijs_client_send_cmd_wait (ctx); } int ijs_client_end_job (IjsClientCtx *ctx, IjsJobId job_id) { ijs_client_begin_cmd (ctx, IJS_CMD_END_JOB); ijs_send_int (&ctx->send_chan, job_id); return ijs_client_send_cmd_wait (ctx); } /** * Return value: data block size if nonnegative, or error code if * negative. **/ int ijs_client_list_params (IjsClientCtx *ctx, IjsJobId job_id, char *value, int value_size) { int status; ijs_client_begin_cmd (ctx, IJS_CMD_LIST_PARAMS); ijs_send_int (&ctx->send_chan, job_id); status = ijs_client_send_cmd (ctx); if (status) return status; status = ijs_recv_ack (&ctx->recv_chan); if (status) return status; status = ijs_recv_block (&ctx->recv_chan, value, value_size); return status; } /** * Return value: data block size if nonnegative, or error code if * negative. **/ int ijs_client_enum_param (IjsClientCtx *ctx, IjsJobId job_id, const char *key, char *value, int value_size) { int key_size = strlen (key); int status; ijs_client_begin_cmd (ctx, IJS_CMD_ENUM_PARAM); ijs_send_int (&ctx->send_chan, job_id); status = ijs_send_block (&ctx->send_chan, key, key_size + 1); if (status < 0) return IJS_EIO; status = ijs_client_send_cmd (ctx); if (status) return status; status = ijs_recv_ack (&ctx->recv_chan); if (status) return status; status = ijs_recv_block (&ctx->recv_chan, value, value_size); return status; } int ijs_client_set_param (IjsClientCtx *ctx, IjsJobId job_id, const char *key, const char *value, int value_size) { int key_size = strlen (key); int status; ijs_client_begin_cmd (ctx, IJS_CMD_SET_PARAM); ijs_send_int (&ctx->send_chan, job_id); ijs_send_int (&ctx->send_chan, key_size + 1 + value_size); status = ijs_send_block (&ctx->send_chan, key, key_size+1); if (status) return status; status = ijs_send_block (&ctx->send_chan, value, value_size); if (status) return status; status = ijs_client_send_cmd (ctx); if (status) return status; status = ijs_recv_ack (&ctx->recv_chan); return status; } /** * Return value: data block size if nonnegative, or error code if * negative. **/ int ijs_client_get_param (IjsClientCtx *ctx, IjsJobId job_id, const char *key, char *value, int value_size) { int key_size = strlen (key); int status; ijs_client_begin_cmd (ctx, IJS_CMD_GET_PARAM); ijs_send_int (&ctx->send_chan, job_id); status = ijs_send_block (&ctx->send_chan, key, key_size + 1); if (status < 0) return IJS_EIO; status = ijs_client_send_cmd (ctx); if (status) return status; status = ijs_recv_ack (&ctx->recv_chan); if (status) return status; status = ijs_recv_block (&ctx->recv_chan, value, value_size); return status; } int ijs_client_begin_page (IjsClientCtx *ctx, IjsJobId job_id) { ijs_client_begin_cmd (ctx, IJS_CMD_BEGIN_PAGE); ijs_send_int (&ctx->send_chan, job_id); return ijs_client_send_cmd_wait (ctx); } int ijs_client_end_page (IjsClientCtx *ctx, IjsJobId job_id) { ijs_client_begin_cmd (ctx, IJS_CMD_END_PAGE); ijs_send_int (&ctx->send_chan, job_id); return ijs_client_send_cmd_wait (ctx); } int ijs_client_get_version (IjsClientCtx *ctx) { return ctx->version; } js/ijs.h 644 0 0 4012 11241503077 16026ustar00akumarakumar/usr/akumar/alt/devel/gs/ijs/ijs_client.h 644 0 0 2672 11241503077 17376ustar00akumarakumar#ifdef __cplusplus extern "C" { #endif typedef struct _IjsClientCtx IjsClientCtx; IjsClientCtx * ijs_invoke_server (const char *server_cmd); int ijs_exec_server (const char *server_cmd, int *pfd_to, int *pfd_from, int *pchild_pid); int ijs_client_begin_cmd (IjsClientCtx *ctx, IjsCommand cmd); int ijs_client_send_int (IjsClientCtx *ctx, int val); int ijs_client_send_cmd (IjsClientCtx *ctx); int ijs_client_send_cmd_wait (IjsClientCtx *ctx); int ijs_client_send_data_wait (IjsClientCtx *ctx, IjsJobId job_id, const char *buf, int size); int ijs_client_open (IjsClientCtx *ctx); int ijs_client_close (IjsClientCtx *ctx); int ijs_client_begin_job (IjsClientCtx *ctx, IjsJobId job_id); int ijs_client_end_job (IjsClientCtx *ctx, IjsJobId job_id); int ijs_client_list_params (IjsClientCtx *ctx, IjsJobId job_id, char *value, int value_size); int ijs_client_enum_param (IjsClientCtx *ctx, IjsJobId job_id, const char *key, char *value, int value_size); int ijs_client_set_param (IjsClientCtx *ctx, IjsJobId job_id, const char *key, const char *value, int value_size); int ijs_client_get_param (IjsClientCtx *ctx, IjsJobId job_id, const char *key, char *value, int value_size); int ijs_client_begin_page (IjsClientCtx *ctx, IjsJobId job_id); int ijs_client_end_page (IjsClientCtx *ctx, IjsJobId job_id); int ijs_client_get_version (IjsClientCtx *ctx); #ifdef __cplusplus } #endif *ch, int *val); int ijs_recv_block (IjsRecvChan *ch, char *buf, int b/usr/akumar/alt/devel/gs/ijs/ijs_client_example.c 644 0 0 16510 11241503077 21120ustar00akumarakumar#include #include #include #include "ijs.h" #include "ijs_client.h" static int example_list_params (IjsClientCtx *ctx) { int status = 0; char buf[4096]; char ebuf[4096]; char *p; status = ijs_client_list_params (ctx, 0, buf, sizeof(buf) - 1); if (status >= 0) { buf[status] = 0; fprintf (stderr, "settable params: %s\n", buf); p = strtok(buf, ","); while (p) { status = ijs_client_enum_param (ctx, 0, p, ebuf, sizeof(ebuf) - 1); if (status >= 0) { ebuf[status] = 0; fprintf (stderr, " %s: %s\n", p, ebuf); } else { fprintf (stderr, "Error %d getting param %s\n", status, p); } p = strtok(NULL, ","); } } else { fprintf (stderr, "Error %d listing params\n", status); } return status; } static int send_pnm_file (IjsClientCtx *ctx, FILE *f, int xres, int yres) { int width, height; char *lp, type; int total_bytes, bytes_left; int n_chan, bps; char buf[4096]; int status = 0; lp = fgets (buf, sizeof(buf), f); if (lp == NULL) { fprintf (stderr, "error reading file\n"); return 1; } if (lp[0] != 'P' || lp[1] < '4' || lp[1] > '6') { fprintf (stderr, "need pnmraw file\n"); return 1; } type = lp[1]; do { lp = fgets (buf, sizeof(buf), f); } while (lp != NULL && lp[0] == '#'); if (sscanf (lp, "%d %d", &width, &height) != 2) { fprintf (stderr, "format error\n"); return 1; } if (type >= '5') { /* skip depth */ do { lp = fgets (buf, sizeof(buf), f); } while (lp != NULL && lp[0] == '#'); } n_chan = (type == '6') ? 3 : 1; bps = (type == '4') ? 1 : 8; /* Set required parameters. Note: we should be checking the return values. */ sprintf (buf, "%d", n_chan); ijs_client_set_param (ctx, 0, "NumChan", buf, strlen (buf)); sprintf (buf, "%d", bps); ijs_client_set_param (ctx, 0, "BitsPerSample", buf, strlen (buf)); strcpy (buf, (n_chan == 3) ? "DeviceRGB" : "DeviceGray"); ijs_client_set_param (ctx, 0, "ColorSpace", buf, strlen (buf)); sprintf (buf, "%d", width); ijs_client_set_param (ctx, 0, "Width", buf, strlen (buf)); sprintf (buf, "%d", height); ijs_client_set_param (ctx, 0, "Height", buf, strlen (buf)); sprintf (buf, "%dx%d", xres, yres); ijs_client_set_param (ctx, 0, "Dpi", buf, strlen (buf)); ijs_client_begin_page (ctx, 0); total_bytes = ((n_chan * bps * width + 7) >> 3) * height; bytes_left = total_bytes; while (bytes_left) { int n_bytes = bytes_left; if (n_bytes > sizeof(buf)) n_bytes = sizeof(buf); fread (buf, 1, n_bytes, f); /* todo: check error */ if (type == '4') { /* invert pbm so black is 0, as per DeviceGray color space */ int i; for (i = 0; i < n_bytes; i++) buf[i] ^= 0xff; } status = ijs_client_send_data_wait (ctx, 0, buf, n_bytes); if (status) break; bytes_left -= n_bytes; } ijs_client_end_page (ctx, 0); return status; } static void verify_context (IjsClientCtx *ctx) { if (ctx == NULL) { fprintf (stderr, "Must specify valid server with -s flag\n"); exit (1); } } static void param_usage (void) { fprintf (stderr, "parameter list must be in key=value, key=value format\n"); } static void example_set_params (IjsClientCtx *ctx, const char *arg) { int code; int i, inext; char key[256]; char buf[4096]; int buf_ix; for (i = 0; arg[i] != 0; i = inext) { int ibeg, ieq, iend; int key_size; for (ibeg = i; arg[ibeg] == ' '; ibeg++); for (ieq = ibeg; arg[ieq] != 0; ieq++) { if (arg[ieq] == '=') break; } if (arg[ieq] == 0) { param_usage (); return; } for (iend = ieq; iend >= ibeg; iend--) if (arg[iend - 1] != ' ') break; if (iend == ibeg) { param_usage (); return; } key_size = iend - ibeg; if (key_size + 1 > sizeof(key)) { fprintf (stderr, "Key exceeds %d bytes\n", sizeof(key)); return; } memcpy (key, arg + ibeg, key_size); key[key_size] = 0; buf_ix = 0; for (i = ieq + 1; arg[i] == ' '; i++); for (; arg[i] != 0; i++) { if (arg[i] == ',') break; if (buf_ix == sizeof(buf)) { fprintf (stderr, "Value for %s exceeds %d bytes\n", key, sizeof(buf)); return; } if (arg[i] == '\\' && arg[i + 1] != 0) buf[buf_ix++] = arg[++i]; else buf[buf_ix++] = arg[i]; } if (arg[i] == ',') inext = i + 1; else inext = i; code = ijs_client_set_param (ctx, 0, key, buf, buf_ix); if (code < 0) fprintf (stderr, "Warning: error %d setting parameter %s\n", code, key); } } static void example_get_param (IjsClientCtx *ctx, const char *arg) { char buf[4096]; int status; status = ijs_client_get_param (ctx, 0, arg, buf, sizeof(buf) - 1); if (status >= 0) { buf[status] = 0; fprintf (stderr, "value of param %s = %s\n", arg, buf); } else { fprintf (stderr, "Error %d getting param %s\n", status, arg); } } static void example_enum_param (IjsClientCtx *ctx, const char *arg) { char buf[4096]; int status; status = ijs_client_enum_param (ctx, 0, arg, buf, sizeof(buf) - 1); if (status >= 0) { buf[status] = 0; fprintf (stderr, "enumeration of param %s: %s\n", arg, buf); } else { fprintf (stderr, "Error %d getting param %s\n", status, arg); } } static const char * get_arg (int argc, char **argv, int *pi, const char *arg) { if (arg[0] != 0) return arg; else { (*pi)++; if (*pi == argc) return NULL; else return argv[*pi]; } } int main (int argc, char **argv) { IjsClientCtx *ctx; int i; int xres = 300, yres = 300; ctx = NULL; for (i = 1; i < argc; i++) { const char *arg = argv[i]; if (arg[0] == '-') { switch (arg[1]) { case 'r': { char *tail; arg = get_arg (argc, argv, &i, arg + 2); xres = strtol (arg, &tail, 10); if (tail[0] == 0) yres = xres; else if (tail[0] == 'x') yres = strtol (tail + 1, &tail, 10); } break; case 's': arg = get_arg (argc, argv, &i, arg + 2); ctx = ijs_invoke_server (arg); ijs_client_open (ctx); ijs_client_begin_job (ctx, 0); break; case 'p': arg = get_arg (argc, argv, &i, arg + 2); verify_context (ctx); example_set_params (ctx, arg); break; case 'g': arg = get_arg (argc, argv, &i, arg + 2); verify_context (ctx); example_get_param (ctx, arg); break; case 'e': arg = get_arg (argc, argv, &i, arg + 2); verify_context (ctx); example_enum_param (ctx, arg); break; case 'l': verify_context (ctx); example_list_params (ctx); break; case 0: verify_context (ctx); send_pnm_file (ctx, stdin, xres, yres); break; } } else { FILE *f = fopen (arg, "rb"); if (f == NULL) { fprintf (stderr, "error opening %s\n", arg); return 1; } verify_context (ctx); send_pnm_file (ctx, f, xres, yres); fclose (f); } } verify_context (ctx); ijs_client_end_job (ctx, 0); ijs_client_close (ctx); /* todo - suffield race, proceduralize */ ijs_client_begin_cmd (ctx, IJS_CMD_EXIT); ijs_client_send_cmd_wait (ctx); return 0; } /usr/akumar/alt/devel/gs/ijs/ijs_exec_unix.c 644 0 0 3177 11241503077 20103ustar00akumarakumar#include "unistd_.h" #include #include #include #include "ijs.h" #include "ijs_client.h" int ijs_exec_server(const char *server_cmd, int *pfd_to, int *pfd_from, int *pchild_pid) { int fds_to[2], fds_from[2]; int child_pid; if (pipe (fds_to) < 0) return -1; if (pipe (fds_from) < 0) { close (fds_to[0]); close (fds_to[1]); return -1; } child_pid = fork (); if (child_pid < 0) { close (fds_to[0]); close (fds_to[1]); close (fds_from[0]); close (fds_from[1]); return -1; } if (child_pid == 0) { int status; char *argv[8]; int i = 0; close (fds_to[1]); close (fds_from[0]); dup2 (fds_to[0], STDIN_FILENO); dup2 (fds_from[1], STDOUT_FILENO); #define noGDB #ifdef GDB argv[i++] = "gdb"; #endif argv[i++] = "ape/sh"; argv[i++] = "-c"; argv[i++] = (char *)server_cmd; argv[i++] = NULL; status = execvp (argv[0], argv); if (status < 0) exit (1); } /* Ignore SIGPIPE signals. This is the behaviour you'll want most of the time, as the attempt to read or write to the pipe will fail and the client will find out then. If the client needs to preserve the SIGPIPE signal, it can either install its own signal handler after this call, or hack the code. */ signal (SIGPIPE, SIG_IGN); #ifdef VERBOSE fprintf (stderr, "child_pid = %d; %d %d\n", child_pid, fds_to[0], fds_from[1]); #endif close (fds_to[0]); close (fds_from[1]); *pfd_to = fds_to[1]; *pfd_from = fds_from[0]; *pchild_pid = child_pid; return 0; } 16510 11241503077 21120ustar00akumarakumar/usr/akumar/alt/devel/gs/ijs/ijs_exec_win.c 644 0 0 10121 11241503077 17720ustar00akumarakumar#define STRICT #include #include #include #include "ijs.h" #include "ijs_client.h" /* Start child program with redirected standard input and output */ int ijs_exec_server(const char *server_cmd, int *pfd_to, int *pfd_from, int *pchild_pid) { SECURITY_ATTRIBUTES saAttr; STARTUPINFO siStartInfo; LPVOID env; HANDLE hPipeTemp; HANDLE hChildStdinRd = INVALID_HANDLE_VALUE; HANDLE hChildStdinWr = INVALID_HANDLE_VALUE; HANDLE hChildStdoutRd = INVALID_HANDLE_VALUE; HANDLE hChildStdoutWr = INVALID_HANDLE_VALUE; PROCESS_INFORMATION piProcInfo; BOOL flag; int fd_stdin_wr = -1; int fd_stdout_rd = -1; /* Set the bInheritHandle flag so pipe handles are inherited. */ saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; /* Create anonymous inheritable pipes for STDIN and STDOUT * for child. For each pipe, create a noninheritable duplicate handle * of our end of the pipe, then close the inheritable handle. * Do not redirect STDERR. */ flag = CreatePipe(&hChildStdinRd, &hPipeTemp, &saAttr, 0); if (flag) { flag = DuplicateHandle(GetCurrentProcess(), hPipeTemp, GetCurrentProcess(), &hChildStdinWr, 0, FALSE, /* not inherited */ DUPLICATE_SAME_ACCESS); CloseHandle(hPipeTemp); } if (flag) flag = CreatePipe(&hPipeTemp, &hChildStdoutWr, &saAttr, 0); if (flag) { flag = DuplicateHandle(GetCurrentProcess(), hPipeTemp, GetCurrentProcess(), &hChildStdoutRd, 0, FALSE, /* not inherited */ DUPLICATE_SAME_ACCESS); CloseHandle(hPipeTemp); } if (flag) flag = (fd_stdin_wr = _open_osfhandle((LONG)hChildStdinWr, 0)) != -1; if (flag) flag = (fd_stdout_rd = _open_osfhandle((LONG)hChildStdoutRd, 0)) != -1; /* Now create the child process. */ if (flag) { /* Set up members of STARTUPINFO structure. */ siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.lpReserved = NULL; siStartInfo.lpDesktop = NULL; siStartInfo.lpTitle = NULL; /* use executable name as title */ siStartInfo.dwX = siStartInfo.dwY = CW_USEDEFAULT; /* ignored */ siStartInfo.dwXSize = siStartInfo.dwYSize = CW_USEDEFAULT;/* ignored */ siStartInfo.dwXCountChars = 80; siStartInfo.dwYCountChars = 25; siStartInfo.dwFillAttribute = 0; /* ignored */ siStartInfo.dwFlags = STARTF_USESTDHANDLES; #ifdef VERBOSE siStartInfo.wShowWindow = SW_SHOWNORMAL; siStartInfo.dwFlags |= STARTF_USESHOWWINDOW; #else siStartInfo.wShowWindow = SW_HIDE; #endif siStartInfo.cbReserved2 = 0; siStartInfo.lpReserved2 = NULL; siStartInfo.hStdInput = hChildStdinRd; siStartInfo.hStdOutput = hChildStdoutWr; siStartInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); env = NULL; /* Create the child process. */ flag = CreateProcess(server_cmd, NULL, /* command line */ NULL, /* process security attributes */ NULL, /* primary thread security attributes */ TRUE, /* handles are inherited */ 0, /* creation flags */ env, /* environment */ NULL, /* use parent's current directory */ &siStartInfo, /* STARTUPINFO pointer */ &piProcInfo); /* receives PROCESS_INFORMATION */ if (flag) { CloseHandle(piProcInfo.hProcess); CloseHandle(piProcInfo.hThread); } } if (hChildStdinRd != INVALID_HANDLE_VALUE) CloseHandle(hChildStdinRd); if (hChildStdoutWr != INVALID_HANDLE_VALUE) CloseHandle(hChildStdoutWr); if (flag) { *pfd_to = fd_stdin_wr; *pfd_from = fd_stdout_rd; *pchild_pid = (int)piProcInfo.dwProcessId; } else { if (fd_stdin_wr != -1) close(fd_stdin_wr); else if (hChildStdinWr != INVALID_HANDLE_VALUE) CloseHandle(hChildStdinWr); if (fd_stdout_rd != -1) close(fd_stdout_rd); else if (hChildStdoutRd != INVALID_HANDLE_VALUE) CloseHandle(hChildStdoutRd); return -1; } return flag ? 0 : -1; } rr, "Warning: error %d setting parameter %s\n", code, key); } } static void example_get_param (IjsClientCtx *ctx, const char *arg) { char buf[4096]; int status; status = ijs_client_get_param (ctx, 0, arg, buf, sizeof(buf) - 1); if (status >= 0) { buf[status] = 0; fprintf (stderr, "value of param %s = %s\n", arg, buf); } else { fprintf (stderr, "Error %d getting param %s\n", statu/usr/akumar/alt/devel/gs/ijs/ijs_server.c 644 0 0 45032 11241503077 17436ustar00akumarakumar#include #include #include "unistd_.h" #include #include "ijs.h" #include "ijs_server.h" #define noVERBOSE typedef enum { IJS_N_CHAN_SET = 1, IJS_BPS_SET = 2, IJS_CS_SET = 4, IJS_WIDTH_SET = 8, IJS_HEIGHT_SET = 16, IJS_DPI_SET = 32 } IjsFieldsSet; #define IJS_FIELDS_REQUIRED (IJS_N_CHAN_SET | IJS_BPS_SET | IJS_CS_SET | \ IJS_WIDTH_SET | IJS_HEIGHT_SET | IJS_DPI_SET) struct _IjsServerCtx { int fd_from; int child_pid; IjsSendChan send_chan; IjsRecvChan recv_chan; int version; /* callbacks */ IjsBeginJobCb *begin_cb; void *begin_cb_data; IjsEndJobCb *end_cb; void *end_cb_data; IjsQueryStatusCb *status_cb; void *status_cb_data; IjsListParamsCb *list_cb; void *list_cb_data; IjsEnumParamCb *enum_cb; void *enum_cb_data; IjsSetParamCb *set_cb; void *set_cb_data; IjsGetParamCb *get_cb; void *get_cb_data; ijs_bool in_job; IjsJobId job_id; IjsPageHeader *ph; /* This should be IjsFieldsSet, but David Suffield reports that this causes problems when compiling with g++. */ int fields_set; ijs_bool in_page; char *buf; int buf_size; int buf_ix; char *overflow_buf; int overflow_buf_size; int overflow_buf_ix; }; static int ijs_server_dummy_begin_cb (void *begin_cb_data, IjsServerCtx *ctx, IjsJobId job_id) { return 0; } static int ijs_server_dummy_end_cb (void *end_cb_data, IjsServerCtx *ctx, IjsJobId job_id) { return 0; } IjsServerCtx * ijs_server_init (void) { ijs_bool ok = TRUE; char helo_buf[8]; char resp_buf[8]; int nbytes; IjsServerCtx *ctx = (IjsServerCtx *)malloc (sizeof(IjsServerCtx)); int fd_from, fd_to; memcpy (resp_buf, IJS_RESP_STR, sizeof(resp_buf)); fd_from = 0; fd_to = 1; #ifdef _MSC_VER _setmode(fd_from, _O_BINARY); _setmode(fd_to, _O_BINARY); #endif #ifdef VERBOSE fprintf (stderr, "fd_from = %d, fd_to = %d\n", fd_from, fd_to); #endif ijs_recv_init (&ctx->recv_chan, fd_from); ijs_send_init (&ctx->send_chan, fd_to); nbytes = read (ctx->recv_chan.fd, helo_buf, sizeof(helo_buf)); if (nbytes != sizeof(helo_buf)) ok = FALSE; if (ok) nbytes = write (ctx->send_chan.fd, resp_buf, sizeof(resp_buf)); if (nbytes != sizeof(resp_buf)) ok = FALSE; ctx->in_job = FALSE; ctx->job_id = -1; ctx->ph = NULL; ctx->in_page = FALSE; ctx->buf = NULL; ctx->overflow_buf = NULL; ctx->begin_cb = ijs_server_dummy_begin_cb; ctx->end_cb = ijs_server_dummy_end_cb; if (ok) return ctx; else { ijs_server_done (ctx); return NULL; } } int ijs_server_install_begin_cb (IjsServerCtx *ctx, IjsBeginJobCb *begin_cb, void *begin_cb_data) { ctx->begin_cb = begin_cb; ctx->begin_cb_data = begin_cb_data; return 0; } int ijs_server_install_end_cb (IjsServerCtx *ctx, IjsEndJobCb *end_cb, void *end_cb_data) { ctx->end_cb = end_cb; ctx->end_cb_data = end_cb_data; return 0; } int ijs_server_install_status_cb (IjsServerCtx *ctx, IjsQueryStatusCb *status_cb, void *status_cb_data) { ctx->status_cb = status_cb; ctx->status_cb_data = status_cb_data; return 0; } int ijs_server_install_list_cb (IjsServerCtx *ctx, IjsListParamsCb *list_cb, void *list_cb_data) { ctx->list_cb = list_cb; ctx->list_cb_data = list_cb_data; return 0; } int ijs_server_install_enum_cb (IjsServerCtx *ctx, IjsEnumParamCb *enum_cb, void *enum_cb_data) { ctx->enum_cb = enum_cb; ctx->enum_cb_data = enum_cb_data; return 0; } int ijs_server_install_set_cb (IjsServerCtx *ctx, IjsSetParamCb *set_cb, void *set_cb_data) { ctx->set_cb = set_cb; ctx->set_cb_data = set_cb_data; return 0; } int ijs_server_install_get_cb (IjsServerCtx *ctx, IjsGetParamCb *get_cb, void *get_cb_data) { ctx->get_cb = get_cb; ctx->get_cb_data = get_cb_data; return 0; } static int ijs_server_ack (IjsServerCtx *ctx) { int status; status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } void ijs_server_done (IjsServerCtx *ctx) { /* todo: close channels */ ijs_server_ack (ctx); free (ctx); } static int ijs_server_nak (IjsServerCtx *ctx, int errorcode) { int status; status = ijs_send_begin (&ctx->send_chan, IJS_CMD_NAK); if (status < 0) return status; status = ijs_send_int (&ctx->send_chan, errorcode); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } /* The return code is: 0 if ok, positive on normal exit, negative on error */ typedef int (*ijs_server_proc) (IjsServerCtx *ctx); static int ijs_server_proc_ack (IjsServerCtx *ctx) { /* servers should not get ack commands */ return IJS_EPROTO; } static int ijs_server_proc_nak (IjsServerCtx *ctx) { /* servers should not get nak commands */ return IJS_EPROTO; } static int ijs_server_proc_ping (IjsServerCtx *ctx) { int status; int version; status = ijs_recv_int (&ctx->recv_chan, &version); if (status < 0) return status; if (version > IJS_VERSION) version = IJS_VERSION; ctx->version = version; #ifdef VERBOSE fprintf (stderr, "ping version=%d\n", version); #endif status = ijs_send_begin (&ctx->send_chan, IJS_CMD_PONG); if (status < 0) return status; status = ijs_send_int (&ctx->send_chan, IJS_VERSION); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } static int ijs_server_proc_pong (IjsServerCtx *ctx) { /* servers should not get pong commands */ return IJS_EPROTO; } static int ijs_server_proc_open (IjsServerCtx *ctx) { /* A server might allocate tables here. */ return ijs_server_ack (ctx); } static int ijs_server_proc_close (IjsServerCtx *ctx) { /* A server might deallocate memory here. */ return ijs_server_ack (ctx); } static int ijs_server_proc_begin_job (IjsServerCtx *ctx) { int code; IjsJobId job_id; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (ctx->in_job) return ijs_server_nak (ctx, IJS_ETOOMANYJOBS); ctx->in_job = TRUE; ctx->job_id = job_id; return ijs_server_ack (ctx); } static int ijs_server_proc_end_job (IjsServerCtx *ctx) { int code; IjsJobId job_id; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in_job || job_id != ctx->job_id) return ijs_server_nak (ctx, IJS_EJOBID); ctx->in_job = FALSE; return ijs_server_ack (ctx); } static int ijs_server_proc_cancel_job (IjsServerCtx *ctx) { int code; IjsJobId job_id; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in_job || job_id != ctx->job_id) return ijs_server_nak (ctx, IJS_EJOBID); /* todo: call cancel callback here */ ctx->in_job = FALSE; return ijs_server_ack (ctx); } static int ijs_server_proc_query_status (IjsServerCtx *ctx) { int code; IjsJobId job_id; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in_job || ctx->job_id != job_id) return ijs_server_nak (ctx, IJS_EJOBID); code = ctx->status_cb (ctx->list_cb_data, ctx, job_id); if (code < 0) return ijs_server_nak (ctx, code); else { int status; status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK); if (status < 0) return status; status = ijs_send_int (&ctx->send_chan, code); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } } static int ijs_server_proc_list_params (IjsServerCtx *ctx) { int code; char buf[4096]; IjsJobId job_id; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in_job || ctx->job_id != job_id) return ijs_server_nak (ctx, IJS_EJOBID); code = ctx->list_cb (ctx->list_cb_data, ctx, job_id, buf, sizeof(buf)); if (code < 0) return ijs_server_nak (ctx, code); else { int status; status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK); if (status < 0) return status; status = ijs_send_block (&ctx->send_chan, buf, code); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } } static int ijs_server_proc_enum_param (IjsServerCtx *ctx) { const char *key; int key_size; int code; char buf[4096]; IjsJobId job_id; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in_job || ctx->job_id != job_id) return ijs_server_nak (ctx, IJS_EJOBID); key = ctx->recv_chan.buf + ctx->recv_chan.buf_idx; key_size = ctx->recv_chan.buf_size - ctx->recv_chan.buf_idx; if (key_size == 0 || key[key_size - 1]) return IJS_ESYNTAX; #ifdef VERBOSE fprintf (stderr, "ijs_server_proc_enum_param, key_size = %d\n", key_size); #endif code = ctx->enum_cb (ctx->enum_cb_data, ctx, job_id, key, buf, sizeof(buf)); if (code < 0) return ijs_server_nak (ctx, code); else { int status; status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK); if (status < 0) return status; status = ijs_send_block (&ctx->send_chan, buf, code); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } } static int ijs_strnlen (const char *s, int size) { int i; for (i = 0; i < size; i++) if (s[i] == 0) return i; return size; } static int ijs_server_parse_int (const char *value, int size, int *result) { int num = 0; int i; int sign = 1; i = 0; if (i == size) return IJS_ESYNTAX; if (value[i] == '-') { sign = -1; i++; } if (i == size) return IJS_ESYNTAX; for (; i < size; i++) { char c = value[i]; if (c < '0' || c > '9') return IJS_ESYNTAX; num = (num * 10) + (c - '0'); } *result = num; return 0; } static int ijs_server_parse_float (const char *value, int size, double *result) { char buf[256]; char *tail; if (size + 1 > sizeof(buf)) return IJS_EBUF; memcpy (buf, value, size); buf[size] = 0; *result = strtod (buf, &tail); if (tail == buf) return IJS_ESYNTAX; return 0; } static int ijs_server_set_param (IjsServerCtx *ctx, IjsJobId job_id, const char *key, const char *value, int value_size) { int code; #ifdef VERBOSE fprintf (stderr, "set_param %s = ", key); fwrite (value, 1, value_size, stderr); fputs ("\n", stderr); #endif if (!strcmp (key, "NumChan")) { code = ijs_server_parse_int (value, value_size, &ctx->ph->n_chan); if (code == 0) ctx->fields_set |= IJS_N_CHAN_SET; return code; } else if (!strcmp (key, "BitsPerSample")) { code = ijs_server_parse_int (value, value_size, &ctx->ph->bps); if (code == 0) ctx->fields_set |= IJS_BPS_SET; return code; } else if (!strcmp (key, "ColorSpace")) { int size = value_size; if (size < (int)sizeof(ctx->ph->cs) - 1) size = sizeof(ctx->ph->cs) - 1; memcpy (ctx->ph->cs, value, size); ctx->ph->cs[size] = 0; ctx->fields_set |= IJS_CS_SET; return 0; } else if (!strcmp (key, "Width")) { code = ijs_server_parse_int (value, value_size, &ctx->ph->width); if (code == 0) ctx->fields_set |= IJS_WIDTH_SET; return code; } else if (!strcmp (key, "Height")) { code = ijs_server_parse_int (value, value_size, &ctx->ph->height); if (code == 0) ctx->fields_set |= IJS_HEIGHT_SET; return code; } else if (!strcmp (key, "Dpi")) { int x_ix; for (x_ix = 0; x_ix < value_size; x_ix++) if (value[x_ix] == 'x') break; if (x_ix == value_size) return IJS_ESYNTAX; code = ijs_server_parse_float (value, x_ix, &ctx->ph->xres); if (code < 0) return code; code = ijs_server_parse_float (value + x_ix + 1, value_size - (x_ix + 1), &ctx->ph->yres); if (code < 0) return code; ctx->fields_set |= IJS_DPI_SET; return 0; } else { return ctx->set_cb (ctx->set_cb_data, ctx, job_id, key, value, value_size); } } static int ijs_server_proc_set_param (IjsServerCtx *ctx) { const char *key, *value; int key_size, value_size; IjsJobId job_id; int param_size; int code; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in_job || ctx->job_id != job_id) return ijs_server_nak (ctx, IJS_EJOBID); code = ijs_recv_int (&ctx->recv_chan, ¶m_size); if (code < 0) return code; if (param_size != ctx->recv_chan.buf_size - ctx->recv_chan.buf_idx) return IJS_EPROTO; key = ctx->recv_chan.buf + ctx->recv_chan.buf_idx; key_size = ijs_strnlen (key, ctx->recv_chan.buf_size); if (key_size == param_size) return IJS_EPROTO; value = key + key_size + 1; value_size = param_size - (key_size + 1); code = ijs_server_set_param (ctx, job_id, key, value, value_size); if (code) return ijs_server_nak (ctx, code); else return ijs_server_ack (ctx); } static int ijs_server_get_param (IjsServerCtx *ctx, IjsJobId job_id, const char *key, char *value, int value_size) { #ifdef VERBOSE fprintf (stderr, "ijs_server_get_param %s\n", key); #endif return ctx->get_cb (ctx->get_cb_data, ctx, job_id, key, value, value_size); } static int ijs_server_proc_get_param (IjsServerCtx *ctx) { const char *key; int key_size; int code; char buf[4096]; IjsJobId job_id; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in_job || ctx->job_id != job_id) return ijs_server_nak (ctx, IJS_EJOBID); key = ctx->recv_chan.buf + ctx->recv_chan.buf_idx; key_size = ctx->recv_chan.buf_size - ctx->recv_chan.buf_idx; if (key_size == 0 || key[key_size - 1]) return IJS_ESYNTAX; #ifdef VERBOSE fprintf (stderr, "ijs_server_proc_get_param, key_size = %d\n", key_size); #endif code = ijs_server_get_param (ctx, job_id, key, buf, sizeof(buf)); if (code < 0) return ijs_server_nak (ctx, code); else { int status; status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK); if (status < 0) return status; status = ijs_send_block (&ctx->send_chan, buf, code); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } } static int ijs_server_proc_begin_page (IjsServerCtx *ctx) { IjsPageHeader *ph = ctx->ph; int status = 0; if (ph == NULL) status = IJS_EPROTO; if ((ctx->fields_set & IJS_FIELDS_REQUIRED) != IJS_FIELDS_REQUIRED) status = IJS_EPROTO; #ifdef VERBOSE fprintf (stderr, "begin page %d %d %d %d %d\n", ph->n_chan, ph->bps, ph->cs, ph->width, ph->height); #endif if (!status) { ctx->in_page = TRUE; return ijs_server_ack (ctx); } else return ijs_server_nak (ctx, status); } static int ijs_server_read_data (IjsServerCtx *ctx, char *buf, int size) { int status; status = ijs_recv_read (&ctx->recv_chan, buf, size); return (status == size) ? 0 : IJS_EIO; } static int ijs_server_proc_send_data_block (IjsServerCtx *ctx) { int size; int status = 0; IjsJobId job_id; status = ijs_recv_int (&ctx->recv_chan, &job_id); if (status < 0) return status; if (!ctx->in_job || job_id != ctx->job_id) status = IJS_EJOBID; else if (ctx->buf == NULL) status = IJS_EPROTO; if (!status) status = ijs_recv_int (&ctx->recv_chan, &size); #ifdef VERBOSE fprintf (stderr, "status=%d, send data block id=%d, size=%d\n", status, job_id, size); #endif if (status) return ijs_server_nak (ctx, status); if (size <= ctx->buf_size - ctx->buf_ix) { status = ijs_server_read_data (ctx, ctx->buf + ctx->buf_ix, size); ctx->buf_ix += size; } else { ctx->overflow_buf_size = size - (ctx->buf_size - ctx->buf_ix); ctx->overflow_buf = (char *)malloc (ctx->overflow_buf_size); ctx->overflow_buf_ix = 0; status = ijs_server_read_data (ctx, ctx->buf + ctx->buf_ix, ctx->buf_size - ctx->buf_ix); ctx->buf_ix = ctx->buf_size; if (!status) { status = ijs_server_read_data (ctx, ctx->overflow_buf, ctx->overflow_buf_size); } } return ijs_server_ack (ctx); } static int ijs_server_proc_end_page (IjsServerCtx *ctx) { #ifdef VERBOSE fprintf (stderr, "end page\n"); #endif return ijs_server_ack (ctx); } static int ijs_server_proc_exit (IjsServerCtx *ctx) { return 1; } ijs_server_proc ijs_server_procs[] = { ijs_server_proc_ack, ijs_server_proc_nak, ijs_server_proc_ping, ijs_server_proc_pong, ijs_server_proc_open, ijs_server_proc_close, ijs_server_proc_begin_job, ijs_server_proc_end_job, ijs_server_proc_cancel_job, ijs_server_proc_query_status, ijs_server_proc_list_params, ijs_server_proc_enum_param, ijs_server_proc_set_param, ijs_server_proc_get_param, ijs_server_proc_begin_page, ijs_server_proc_send_data_block, ijs_server_proc_end_page, ijs_server_proc_exit }; int ijs_server_iter (IjsServerCtx *ctx) { int cmd_num; int status; status = ijs_recv_buf (&ctx->recv_chan); if (status < 0) return status; cmd_num = ijs_get_int (ctx->recv_chan.buf); #ifdef VERBOSE fprintf (stderr, "command %d, %d bytes\n", cmd_num, ctx->recv_chan.buf_size); #endif if (cmd_num < 0 || cmd_num >= (int)sizeof(ijs_server_procs) / sizeof(ijs_server_procs[0])) return -1; return ijs_server_procs[cmd_num] (ctx); } /** * ijs_server_get_page_header: Get the page header. * @ctx: The server context. * @ph: Where to store the page header. * * Return value: 0 on success, 1 on normal exit, negative on error. **/ int ijs_server_get_page_header (IjsServerCtx *ctx, IjsPageHeader *ph) { int status; ctx->ph = ph; ctx->in_page = FALSE; do { status = ijs_server_iter (ctx); } while (status == 0 && !ctx->in_page); ctx->ph = NULL; return status; } /** * ijs_server_get_data: Get data from client. * @ctx: The server context. * @buf: Buffer for data being read. * @size: Size of buf. * * Gets data from client. Data is stored in @buf or the * overflow_buf. * * Return value: Number of bytes read, -1 on end of page, or < 0 on * error. **/ int ijs_server_get_data (IjsServerCtx *ctx, char *buf, int size) { int buf_ix = 0; int status = 0; #ifdef VERBOSE fprintf (stderr, "ijs_server_get_data %d\n", size); #endif if (ctx->overflow_buf != NULL) { int n_bytes = ctx->overflow_buf_size - ctx->overflow_buf_ix; if (n_bytes > size) n_bytes = size; memcpy (buf, ctx->overflow_buf + ctx->overflow_buf_ix, n_bytes); ctx->overflow_buf_ix += n_bytes; buf_ix = n_bytes; if (ctx->overflow_buf_ix == ctx->overflow_buf_size) { free (ctx->overflow_buf); ctx->overflow_buf = NULL; ctx->overflow_buf_size = 0; ctx->overflow_buf_ix = 0; } } ctx->buf = buf; ctx->buf_size = size; ctx->buf_ix = buf_ix; while (!status && ctx->buf_ix < size) { status = ijs_server_iter (ctx); } ctx->buf = NULL; return status; } um_param, key_size = %d\n", key_size); #endif code = ctx->enum_cb (ctx->enum_cb_data, ctx, job_id, key, buf, sizeof(buf)); if (code < 0) return ijs_server_nak (ctx, code); else { int status; status = ijs_send_begin (&ctx->send_chan, IJS_CMD_ACK); if (status < 0) return status; status = ijs_send_block (&ctx->send_chan, buf, code); if (status < 0) return status; return ijs_send_buf (&ctx->send_chan); } } static int ijs_strnle/usr/akumar/alt/devel/gs/ijs/ijs_server.h 644 0 0 4526 11241503077 17426ustar00akumarakumar#ifdef __cplusplus extern "C" { #endif typedef struct _IjsServerCtx IjsServerCtx; typedef struct { int n_chan; /* number of channels */ int bps; /* bits per sample, one of 1, 2, 4, 8, 16 */ char cs[256]; /* color space, as string */ int width; /* in pixels */ int height; double xres; /* in dpi */ double yres; } IjsPageHeader; /* callbacks, lots of callbacks */ typedef int IjsBeginJobCb (void *begin_cb_data, IjsServerCtx *ctx, IjsJobId job_id); typedef int IjsEndJobCb (void *end_cb_data, IjsServerCtx *ctx, IjsJobId job_id); typedef int IjsQueryStatusCb (void *status_cb_data, IjsServerCtx *ctx, IjsJobId job_id); typedef int IjsListParamsCb (void *list_cb_data, IjsServerCtx *ctx, IjsJobId job_id, char *val_buf, int val_size); typedef int IjsEnumParamCb (void *enum_cb_data, IjsServerCtx *ctx, IjsJobId job_id, const char *key, char *val_buf, int val_size); typedef int IjsSetParamCb (void *set_cb_data, IjsServerCtx *ctx, IjsJobId job_id, const char *key, const char *value, int value_size); typedef int IjsGetParamCb (void *get_cb_data, IjsServerCtx *ctx, IjsJobId job_id, const char *key, char *val_buf, int val_size); IjsServerCtx * ijs_server_init (void); int ijs_server_install_begin_cb (IjsServerCtx *ctx, IjsBeginJobCb *begin_cb, void *begin_cb_data); int ijs_server_install_end_cb (IjsServerCtx *ctx, IjsEndJobCb *end_cb, void *end_cb_data); int ijs_server_install_status_cb (IjsServerCtx *ctx, IjsQueryStatusCb *status_cb, void *status_cb_data); int ijs_server_install_list_cb (IjsServerCtx *ctx, IjsListParamsCb *list_cb, void *list_cb_data); int ijs_server_install_enum_cb (IjsServerCtx *ctx, IjsEnumParamCb *enum_cb, void *enum_cb_data); int ijs_server_install_set_cb (IjsServerCtx *ctx, IjsSetParamCb *set_cb, void *set_cb_data); int ijs_server_install_get_cb (IjsServerCtx *ctx, IjsGetParamCb *get_cb, void *get_cb_data); void ijs_server_done (IjsServerCtx *ctx); int ijs_server_iter (IjsServerCtx *ctx); int ijs_server_get_page_header (IjsServerCtx *ctx, IjsPageHeader *ph); int ijs_server_get_data (IjsServerCtx *ctx, char *buf, int size); #ifdef __cplusplus } #endif key_size, value_size; IjsJobId job_id; int param_size; int code; code = ijs_recv_int (&ctx->recv_chan, &job_id); if (code < 0) return code; if (!ctx->in/usr/akumar/alt/devel/gs/ijs/ijs_server_example.c 644 0 0 24652 11241503077 21156ustar00akumarakumar#include #include #include #include #include "ijs.h" #include "ijs_server.h" #define BUF_SIZE 4096 typedef struct _ExampleParamList ExampleParamList; struct _ExampleParamList { ExampleParamList *next; char *key; char *value; int value_size; }; static int example_status_cb (void *status_cb_data, IjsServerCtx *ctx, IjsJobId job_id) { return 0; } static int example_list_cb (void *list_cb_data, IjsServerCtx *ctx, IjsJobId job_id, char *val_buf, int val_size) { const char *param_list = "OutputFile,DeviceManufacturer,DeviceModel,PageImageFormat,Dpi,Width,Height,BitsPerSample,ColorSpace,NumChan,PaperSize,PrintableArea,PrintableTopLeft,TopLeft"; int size = strlen (param_list); fprintf (stderr, "example_list_cb\n"); if (size > val_size) return IJS_EBUF; memcpy (val_buf, param_list, size); return size; } static int example_enum_cb (void *enum_cb_data, IjsServerCtx *ctx, IjsJobId job_id, const char *key, char *val_buf, int val_size) { const char *val = NULL; if (!strcmp (key, "ColorSpace")) val = "DeviceRGB,DeviceGray,DeviceCMYK"; else if (!strcmp (key, "DeviceManufacturer")) val = "IJS Distribution"; else if (!strcmp (key, "DeviceModel")) val = "ijs_server_example"; else if (!strcmp (key, "PageImageFormat")) val = "Raster"; if (val == NULL) return IJS_EUNKPARAM; else { int size = strlen (val); if (size > val_size) return IJS_EBUF; memcpy (val_buf, val, size); return size; } } /* A C implementation of /^(\d\.+\-eE)+x(\d\.+\-eE)+$/ */ static int example_parse_wxh (const char *val, int size, double *pw, double *ph) { char buf[256]; char *tail; int i; for (i = 0; i < size; i++) if (val[i] == 'x') break; if (i + 1 >= size) return IJS_ESYNTAX; if (i >= sizeof(buf)) return IJS_EBUF; memcpy (buf, val, i); buf[i] = 0; *pw = strtod (buf, &tail); if (tail == buf) return IJS_ESYNTAX; if (size - i > sizeof(buf)) return IJS_EBUF; memcpy (buf, val + i + 1, size - i - 1); buf[size - i - 1] = 0; *ph = strtod (buf, &tail); if (tail == buf) return IJS_ESYNTAX; return 0; } /** * example_find_key: Search parameter list for key. * * @key: key to look up * * Return value: ExampleParamList entry matching @key, or NULL. **/ static ExampleParamList * example_find_key (ExampleParamList *pl, const char *key) { ExampleParamList *curs; for (curs = pl; curs != NULL; curs = curs->next) { if (!strcmp (curs->key, key)) return curs; } return NULL; } /** * @printable: An array in which to store the printable area. * * On return, @printable = PrintableArea[0:1] + TopLeft[0:1] **/ static int example_compute_printable (ExampleParamList *pl, double printable[4]) { ExampleParamList *curs; double width, height; int code; double margin = 0.5; curs = example_find_key (pl, "PaperSize"); if (curs == NULL) return -1; code = example_parse_wxh (curs->value, curs->value_size, &width, &height); if (code == 0) { printable[0] = width - 2 * margin; printable[1] = height - 2 * margin; printable[2] = margin; printable[3] = margin; } return code; } static int example_compute_offset (ExampleParamList *pl, IjsPageHeader *ph, double *px0, double *py0) { ExampleParamList *curs; double width, height; double top, left; int code; *px0 = 0; *py0 = 0; curs = example_find_key (pl, "PaperSize"); if (curs == NULL) return -1; code = example_parse_wxh (curs->value, curs->value_size, &width, &height); if (code == 0) { curs = example_find_key (pl, "TopLeft"); if (curs != NULL) { code = example_parse_wxh (curs->value, curs->value_size, &top, &left); } else { double printable[4]; code = example_compute_printable (pl, printable); if (code == 0) { top = printable[2]; left = printable[3]; } } } if (code == 0) { *px0 = left; *py0 = height - ph->height / ph->yres - top; } return code; } static int example_get_cb (void *get_cb_data, IjsServerCtx *ctx, IjsJobId job_id, const char *key, char *val_buf, int val_size) { ExampleParamList *pl = *(ExampleParamList **)get_cb_data; ExampleParamList *curs; const char *val; char buf[256]; int code; fprintf (stderr, "example_get_cb: %s\n", key); curs = example_find_key (pl, key); if (curs != NULL) { if (curs->value_size > val_size) return IJS_EBUF; memcpy (val_buf, curs->value, curs->value_size); return curs->value_size; } if (!strcmp (key, "PrintableArea") || !strcmp (key, "PrintableTopLeft")) { double printable[4]; int off = !strcmp (key, "PrintableArea") ? 0 : 2; code = example_compute_printable (pl, printable); if (code == 0) { sprintf (buf, "%gx%g", printable[off + 0], printable[off + 1]); val = buf; } } if (!strcmp (key, "DeviceManufacturer")) val = "IJS Distribution"; else if (!strcmp (key, "DeviceModel")) val = "ijs_server_example"; else if (!strcmp (key, "PageImageFormat")) val = "Raster"; if (val == NULL) return IJS_EUNKPARAM; else { int size = strlen (val); if (size > val_size) return IJS_EBUF; memcpy (val_buf, val, size); return size; } } static int example_set_cb (void *set_cb_data, IjsServerCtx *ctx, IjsJobId job_id, const char *key, const char *value, int value_size) { ExampleParamList **ppl = (ExampleParamList **)set_cb_data; ExampleParamList *pl; int key_len = strlen (key); int code; fprintf (stderr, "example_set_cb: %s=", key); if (!strcmp (key, "PaperSize")) { double width, height; code = example_parse_wxh (value, value_size, &width, &height); if (code < 0) return code; } fwrite (value, 1, value_size, stderr); fputs ("\n", stderr); pl = example_find_key (*ppl, key); if (pl == NULL) { pl = (ExampleParamList *)malloc (sizeof (ExampleParamList)); pl->next = *ppl; pl->key = malloc (key_len + 1); memcpy (pl->key, key, key_len + 1); *ppl = pl; } else { free (pl->value); } pl->value = malloc (value_size); memcpy (pl->value, value, value_size); pl->value_size = value_size; return 0; } /** * Finds a parameter in the param list, and allocates a null terminated * string with the value. **/ static char * find_param (ExampleParamList *pl, const char *key) { ExampleParamList *curs; char *result; curs = example_find_key (pl, key); if (curs == NULL) return NULL; result = malloc (curs->value_size + 1); memcpy (result, curs->value, curs->value_size); result[curs->value_size] = 0; return result; } static void free_param_list (ExampleParamList *pl) { ExampleParamList *next; for (; pl != NULL; pl = next) { next = pl->next; free (pl->key); free (pl->value); free (pl); } } int main (int argc, char **argv) { IjsServerCtx *ctx; IjsPageHeader ph; int status; char buf[BUF_SIZE]; char hexbuf[BUF_SIZE * 3]; char *fn; FILE *f = NULL; double xscale, yscale; double x0, y0; ExampleParamList *pl = NULL; ctx = ijs_server_init (); if (ctx == NULL) return (1); ijs_server_install_status_cb (ctx, example_status_cb, &pl); ijs_server_install_list_cb (ctx, example_list_cb, &pl); ijs_server_install_enum_cb (ctx, example_enum_cb, &pl); ijs_server_install_set_cb (ctx, example_set_cb, &pl); ijs_server_install_get_cb (ctx, example_get_cb, &pl); do { int total_bytes, bytes_left; ExampleParamList *curs; status = ijs_server_get_page_header (ctx, &ph); if (status) break; fprintf (stderr, "got page header, %d x %d\n", ph.width, ph.height); if (f == NULL) { fn = find_param (pl, "OutputFile"); /* todo: check error! */ if (fn == NULL) { fn = find_param (pl, "OutputFD"); if (fn != NULL) { f = fdopen (atoi (fn), "w"); } } else { f = fopen (fn, "w"); } if (f == NULL) { fprintf (stderr, "can't open output file %s\n", fn); fclose (stdin); fclose (stdout); break; } if (fn != NULL) free (fn); } fprintf (f, "%%!PS-Adobe-2.0\n"); example_compute_offset (pl, &ph, &x0, &y0); xscale = 72.0 / ph.xres; yscale = 72.0 / ph.yres; fprintf (f, "%%%%BoundingBox: %d %d %d %d\n", (int)(x0 * 72), (int)(y0 * 72), (int)(x0 * 72 + xscale * ph.width + 0.999), (int)(y0 * 72 + yscale * ph.height + 0.999)); fprintf (f, "/rhex { currentfile exch readhexstring pop } bind def\n"); fprintf (f, "/picstr %d string def\n", ph.width); for (curs = pl; curs != NULL; curs = curs->next) { fprintf (f, "%% IJS parameter: %s = ", curs->key); fwrite (curs->value, 1, curs->value_size, f); fputs ("\n", f); } fprintf (f, "gsave\n" "%f %f translate\n" "%f %f scale\n" "%d %d %d\n" "[ %d 0 0 %d 0 %d ]\n", x0 * 72, y0 * 72, xscale * ph.width, yscale * ph.height, ph.width, ph.height, ph.bps, ph.width, -ph.height, ph.height); if (ph.n_chan == 1) fprintf (f, "{ picstr rhex } image\n"); else { fprintf (f, "{ picstr rhex }\n" "false %d colorimage\n", ph.n_chan); } total_bytes = ((ph.n_chan * ph.bps * ph.width + 7) >> 3) * ph.height; bytes_left = total_bytes; while (bytes_left) { int n_bytes = bytes_left; int i, j; if (n_bytes > sizeof(buf)) n_bytes = sizeof(buf); #ifdef VERBOSE fprintf (stderr, "%d bytes left, reading %d\n", bytes_left, n_bytes); #endif status = ijs_server_get_data (ctx, buf, n_bytes); if (status) { fprintf (stderr, "page aborted!\n"); break; } j = 0; for (i = 0; i < n_bytes; i++) { const char hex[16] = "0123456789AbCdEf"; unsigned char c = ((unsigned char *)buf)[i]; hexbuf[j++] = hex[c >> 4]; hexbuf[j++] = hex[c & 0xf]; if ((i & 31) == 31) hexbuf[j++] = '\n'; } if ((n_bytes & 31) != 0) hexbuf[j++] = '\n'; fwrite (hexbuf, 1, j, f); bytes_left -= n_bytes; } fprintf (f, "grestore\nshowpage\n"); } while (status == 0); if (status > 0) status = 0; /* normal exit */ if (f) fclose (f); ijs_server_done (ctx); free_param_list (pl); #ifdef VERBOSE fprintf (stderr, "server exiting with status %d\n", status); #endif return status; } mple_list_cb (void *list_cb_data, IjsServerCtx *ctx, IjsJobId job_id, char *v/usr/akumar/alt/devel/gs/ijs/ijs_spec.pdf 644 0 0 240464 11241503077 17437ustar00akumarakumar%PDF-1.2 %Çì¢ 8 0 obj <> stream xœÝ]K“ܶ®òqÅ”.‘SŠ ‚<:©TEvÊN¤uN¾¬V]ëý–ò7âªüÝ€ä` ¿3Z¯dû * 4~wï«M]©M=þ¿û÷üÙÉ«“Ûw»Íã7'¯6júÉÿsþló—S÷£R›¦­ìP«Í飓ù;µQ¶«êvcvK>;GOœÜ¼óíé¯']Õ+ÛØÝÐ÷÷Æ1m+]ëyÈOþçøƒê*c†~7ôz*¥´µñäÓdSÕƒmvCoÇ¡¾jìÐ÷t–Ú OcM_õ½ƒx{:MÓ•µ~1¿Í= ÓKºóÃóËéPm¥{íç}CçŸM0jSõmç7¿\p4ð‡{>9ô7›¦®:Ó›ýÛƪJ·f³m›Jw!àÿž–h*«†!>ÒÃéU™º‹Ðl«Îv*Aó:ùr†®¯tÓªºqÈøïkú}¥§1[5­íf³Rm—ð¿é¶ºJ¶Qti»,“LþžN>£Cì1:78™åÛì®MoÆ+ÓNצ¬£µ¶Ýlµ{/M¸ÑÝݵ-äq6?Ó÷{lÍX;¢Ôþ.vÓèäQýƒÎ}8¯¨Û„0ÞÓ.gbqtmýì=%šÍP ]ÓÍGr—YõÝL‰}.{:Ó·R¶¶!´Ž¼µ{Øá+päj†® iÏݼ1] èúù‹eÈ#î|j«Vkí÷}G?|6“¾chž¾füÌFgŽ?|;Ï”ÃA Ø€Ç-ãàŒ®`*³ÖõygóƒÙ¯½u]õÚøÍ”/üB €üf^˨aO‰àCpà·t­`y€b¢Å åþ‹úh>ª6¶møï_ÏCÖØU¤€¦Mˆ*ÇÙÝY’Wy‡îÿý‚ýPöônÅ¡I¸¸–×¢¸Á¬åZ2“žÒ¥nÍßu¶N‰îÃÅŽ¯5Í<@"€.æ;luz…àó€a4«“ŸÓûØ ¨Ýð>`î>þðÁBŽ 9Gä<»6ñä€cÑGãá~⹓ªÚYˆ²eq½<3jT)ÑŽgôÀCá÷ +Ï®)ÀSB²;yIg„½¤ ›*Áæ§ñ—më([7Nø¹‡H ž¥¢ˆ²Q =* E/ïdk› jK7¾OqË@aQüÆ-—°&EéÀ“Fð¬ÚrÌä2°$a“;Xœ\ê’—ö~¹öäÁòW®¼È`“ Ç!Ÿ-R$ïÃ嬱 ¦éþ̉ßÂÚaóhÓÕ‚cÌ€küÄJf i±blöÜË r¤÷teÀŽ‚Sò}káÊ@´üw€¥Q¶¹¬ÆÔ)– 6 WøÚ1 &€3p¬Ç3:Ô@.øçç‹*Ø_óãq|=Àa$çWÄI4 HzAÕ8BÌ<§¸UÝÐo¶ÆYU‘™§æ‡kú!\`pfŸéÕéÎŒ/S-,z'–I6x^{Õ§M½*³µ€èÐ;:tžÂ¶½|A€Ãæa§ªz4!·Ú™‡}t>*UØsš@Nxg8Æ"ì–¿ÅÚ$ßf /¯8=éFÝ:ïÂíÁ¢à%oúÝŸ3NâYÀpæ-XK¦ðê=oS~1–Êl©kÓŸË §ËÓC怦8%øP¤xÌEbY† $àÇy}oØÀ¾Y ¨X@¾RI_°É *O«µI Ühë.«´æ}†ÜrT«˜—’Ù‡¾Ãq„(ÚUO¶|Ê°f“Ú<»çÜhËrdà@j6öTû”Â5|º·N¢÷“Á{;OfæU-ðDÀQ:Š{ ²‹ÝÒ+J@^…l&cÈL=`ÁV—·Äü‡å–œ©:mÓ7ÄW«Ö<ÀKÀ!€gÉ/¿ãŽÙ¤ü¸2uúÈØØŸñÎDGGP{'9Ö™*³n²®§U ÍTÊG¿ŒÁ’€Žvü®Ñ©n%3?y V¤ÐPÙ–×<©ÔIvÏŠdðJ²%@‡èÞ"ï÷r "]wÑ‚Ég¤jAözÚ“0¹è󦛆:ƒwš¬B/Žs•²l-¼‹m[÷Î<î€×4tl/RâÔ b£Tò2uleü“à!“„€F—_bÕå™SÊt…|Ü ¬y _þë|3ÞÊ2À{|—¥  ïd"Bù“f¼ÁÜTEá%™¹p®‹=Ü©ó@¦|ÐKŒQžgý—ÞJ>^D?y„á2Võot-Yà2ã­ Žš\Q»ÀÇóQ`ˆñ˜f¤V$/$„²åü3ÊÈV`'ñ¦Sçä«Õ€ëËH÷?ôúÆC@á@ˆfb]ÔCøQ iQ¨l=V4xFKt7|2‘¤¼åïðôúGRÏïçÃs×Ãÿ T༩Py:Ö+¶Òw#åFúš{¸¡ p==áý%}˜‡j«kD«ÙP\ܯ«ZKtǼŸ:ÄÈä¶@*/ôÎ#BK{IvÏëý|ä,0Y³žw)‚§¼'à|–%ñ„”´ÕC_ÙÖ'wŒyÏY”9íº“¥6ø¡ïöÏ. ôuý‡qh‘[¯ûóÁf?²›}÷Ã$0¶©†‘àh\ï‘šù¤ÒÉÉ÷[žWGÎíCmœQÉʶvõûOô{ ylêÚ„ïä©*¼˜Tضì.À%œ>èò øy‰«È”9ë8Ý8’0ùÿüצ~W³Óy †À'×÷gÊø⣥ÅuáÁ´Í20g‹rÿ1°ät=6Ú»–ɺR¼ÚB@& ¸T“ÙßÅÛ]_¼Ì©2÷3‹|P\Z”U¿R·s¹q<)AÆ/MO“Œeó•,×*0h?ùY$ƒ„7½Ž­hÙA¦iýÀGÑó82±ø¯¯G[¸}WÙ°€mM{à9¯_.ª‡›âbM²œ/"6½›Ù¹ ˜ŠÍPÙvÌ’l+qã?óÇ$É*h£ÑÞZ£ÑmëEúÍ?ÍCnÓÖ:o¼fÚ‰zî¯|¿§/Ž‡¢€çødƒÊ´ƒ¹U åEÔÏ:£縉@ù‰~–䡼ȞÒM)c¿©¾M^Ñ;:yGÕCǃôhÁEǯµ´¥€¿¥ßƒ³\ÒYü˜†Þ(ú}K/±‹¡ìì&ߧ =ô§U GÛ×>“÷=¯êS- àŒ¿l@YüdpN±‚ûçwyÉ"(Ü$øƒxôé´©Ïœå¹ì}ªðó×ø‘®,;åkŠ8@¿Ïfw§S\U"³›èy2O29Æ!/A.¼ä"ÈÈŸ–Ž§í´LÕö rê¼õl¿AVEQ6 ÐÊ*Ž©¸ç£.| )ð€Èzh7ѵ&Ÿg¢éEÉç¿Ü¤jU6À¹øJ @[É»ødÆ‚fÒPz¶åÈ®[àÁÆ¿|˾ ÑÁw±rà!*²ž€+³ó‘ñŒvΧàdi(õ^ìcR›#»eªnùö ÷=h„rÀóXŒwXT|xN¾<¿–©ÊFÎÑøªÑôõ}Qºë|äÛ¶vïuhÎKÈzkRîslðDVZ ëÒ¸‹º8×¹×@tA¾ü*ܼ·HVÇVô=H¸A¶áŸf æÁo4éãÅwlþpcÙ¶Ÿž_s,êPF¥¨CÆÁr®Õ¬V A[Ù¾Y·gú4‹ÒM@2y0ÉŽo“œèÚ´4Ûø*£qýnßmêÐÂ@Ôˆ‹ógR‡Ö˜çÅYÖ±˜‰„"ˆhp’—&O¬ùÞ–Ì™´©%:^7 Ráž«%çÑ|ˆ²PÐÈf’¾§ßƒèirr¿®êAV¾—ï$k بÖOÎX`ÐÂΑ¼,ûy"ñð¦N8Yhµe½i(+êIÞ£¹( ¡yl® ¬ã’¬T6-+Wê]”Z!+Vusä]E`ôµ/ÈwrÌTAððÖ,k²äýèªP;ä‚fR26À »°èžpÇD=µ¹„Øu:¯qfÒ˜\Dd>+ª(¥Ù[ÉIœÞ•¦®•´9yºY]Õ6¨ä\Ö”ƒóªÅ¼Xöèeí*Y¿*è%,KÊ›P€ð “EEîE¥Çí"g @´±š©Å÷H3~ô*ü²"3¶Ö0A³ÉY)€Û̾Ê("Îç‘óê0Ðê³CŽ´;Æ!¢Ë:äȺç/²!Gɤn¤Qïe…(OØGU”³ô~ €­DWðN“S·ªŠ›|ê¨ã×X¢O´(™ %Ûå-ÅŽ¨[ßj Ü×ôýV÷mÿÊ@ž´i<3ý#KWà^ RHy‡0vÅ9}­-c#IYhqyE‚4㺻:A*KYÅdέlä1=ʯÌQâQÄwyìPõJ“9õŽÍx“)A2çp¹é ùý«ŸÁ¡…ÙÁµYéLôŠN(”3ÌØZTÝMë°²Ý;39éÇÝ9NÓH>àè“ÕÀ€ %à²aücumÞõ¼.þdé.ïÛYw€ñR€ô%)Ûù°²_’óˆìãøù\ÿ‹îRíê)˦>c+zÙ_y¼—ß©ƒOÔ&XÖ,`ß¥ˆ,;>/F×%d¾yYNç …¶ã‘I,²ÖÊ@Z2½È€FKæWʳ…=†÷Àaù@JÅбÇÄR“rÒ"»ül„ª®:}»â¿»V£“¦ñ]q½0Ï2Ž­ P‚Çœ¯?m’‹â*×$§¥a UÀñ–Ózÿº|µåº˜òâP9—·&3†ïå?²†øsüTÞZ,q_ËzÊqÒ5McQM]5ÝÚ»$Eqúk;Ýüëdüÿÿ‡l3Óendstream endobj 9 0 obj 4055 endobj 24 0 obj <> stream xœí][oݸ.úè_q°O G/ž9—mE²iÖm^,;Ù¤ç¶ÎfÓ¿ÑþàR¢¤Cq¾‘(ùÈvE€ )^†3ß\IØä™Øäõ¿öçÉÙÁ‡ƒÑ´u?NÎ6·n=–ùÆf¶”¥Þ¿<ðˆV:ÓS™qíguëñéÁ·G7Žÿu 2U-Û¦ûu“ë­”*Ú¦ë&ãš„ð-Ýçê_”™&×mÓÇnÄ¢”ÃÎïêßYîFé>¯›df ÛuF½NèŠ@¯7]“-‹áÄ?ÒÎïwMmË‹~ÍOûz·^Ó6ý9i½Ï’ö†}[7Ýz,ÔF˜LŠ¢9è­.E¦l±ÙJ“ n_ÖýmVT¶mÈ|ƒ.‹ªRêIýáÔÚn¯›"ÓÖÚVBgª2É*ò¬(”ù¡tü sÄÃÎç~·ÆÍUò½Nâ >oZ"¡4l#XU™ÍVɬªÂžìÇèY98!M¸D™pƒnÍ…éšòðÐËÌ*þÍóÝ©ªXnŒ”J~þ—~¬RU gß¿¥ƒ^`ã ×3º–7´×k:Ö¿é‡`¬`†ëÝÐ[­^Ѿ`^@¢S*„¿úãªTs‰Ãÿ⛬è{åüÙÞôM¥É‹HRlj¯Ã¦"“¦oš~¿¥8«ReÄZ'tzpgþ$ŒÍ+Òbºï>1Çr)Àç46¼<²ø–r#¯È¿Ð¶ˆ}ÈYµN-Šˆè`+¯RFë+ù™¨ÄWC‡…Ó.5ïrìæìŽþ¬9á0’žt·ŽSòå¯Ë=£F\ùu8ö*"ázàY¹2¥t‰@ª‡Iì´ôˆ9ó’UÌ^‘}R„®§é³uº4+sµÙ é(’‹ dºå…ç²Jõ“åtNI6†’ç,ؼ¤óƒ%qâ”rnr^JJP5¹K iÊkœzH À6@ˆßy¤) ‚4iìR-9KŠ¿ÍQRý"ɨ#X¸¹ÇÈ$Þý¦'Y÷›O,c¥3 Á."Fk}ú-Õ•GdÈû”Ô­ßQ+;Kõ'ºº;~â²c;Vw›/¸KÙ/âÿ‡‡mˆ.Å]ÚÈfH×ùÍ ½-ý=’`ÑvÞ¢{:ç·B|³@äŠ5€ºÄ0T%[¥K×M·`ÉD¤£J"H5 w‰díðû§7šÃtŽ¿ŽìªaHãKÊ_IÆH‡òÂY…_+þAŒÇzêœÌÚjíRÎRh#¦ïŒSŽÕ[[)œÁS àR?ñüo­¶£¤¹œ¯vj‘§Õ"åßnY ŸØït˜€°–'ÙûQ’Ø< €ÌÛÙÃÕÙáMÎuШ¨®WnÝ`èøTu¶:Ëy²'Õ¾À$8*Ðô‘’?íCpìiáɾÀ,€+©ÿðžó}‡M”–™dus€’Í 2ô!… î )½A”aà{B—ñÄ8däm|¢" •Ž+KÀr‘²u‰&|Lhæ¦ì¬0EU>÷š’UÖuŽ®[½ÀvÜ>C­ wVT÷Z‘YÑu“uMÒFLÄ)iãW§PƬeoˆ¢ÌJ‹büÇþÛ:[˜ ‘„üaâé`¬’爅ñtKIÔ±Í%ÆÓ½ò,ÙƒŒ¢® m æÜuN@u@Q.R4&Œ‘|n „ƒÆ.ƒ×…>­ ±–ï¨H0èá‘s“÷¢¦Ûex40\¹Ø5>¥M-«H'pVpmÁiÆ(ØÊÏ;¡&þÆ“"7Ú“>I3tó>}º[ËHF ìÖQ_˦ JÚôùNŒO8²®o:}¢#M‰"†Ÿ_{-\«ßìNkP^³•Âõ— Xf„Æ|UYdQ)üòa_pFÁ^,%ØHU%° €ÄRîÌtŠjDZÄñ‘§gbÅ>q–0rÅÇØGH¢²`xüŠ;ÄÔiÀïÓi9FÄ}±=èÎèܦåYùl%˜dxêÍÆË $=—i<Ùç¹ð2(,«Y‘;E'áƒmO‹~Èç´0sŸk8ïøç’ž4] ò§’\SfS^ãém…;ÀS)¡ÿàÉ&Š#Aôä³_cnT=ìõ‘že iª++i1ÊåK†:/ ðT†iøái/‹ð^ı­"ñá´L¨´K‹ÈU¶'\4Ãr}P&Ó¢û“BÀƯÆÄm,—8üGLŽü¥nºõX˜Ám ©ò̹ÙJ]™:î„®ˆ/><£ n<̯ð¦@?A‡ä“9O¼ÙT)YNÏw–CÔ™Á{þ7ajö-Ý`¿žÒy {µ"X—~±0(AìˆB×}ú=É县W6ˆìžùÞÒTý µ i`½n·Ë¾b§áÝ{Ç›¿×÷;µ6Y=o¾Ùê¬ÚaÝÕ¦pÇ™¹µžœÜ>:¸uô`sþñÓ‹ƒ[O6âàÖßêÿn?ºã~ÝÝüéàÞÑÞǪ¿o…Ìt0”´Y9sYy3Rt…uxÑ£»Â*d¾)òé0!Ó ƒm›;¤W6#|n(µ¶ðéªÈÄàö8-rJT§Ì/±eÀ ãù…r6ˆÄpfî¸T¯NãFª  óÿ¥Hõ¢ãà$±’²óªÆ⤺fUŽ+«¬ÜèÒfÅ€ßýÿÜI®'ïå; \g_3HÌžЉ#yY–³9aÉ+‡{z£‹:†Ò<ó;/D8d›&ˆ±d/¢Ø›¶[2ÖÊ ÇÆr£E•‰*¤ìEƒ|HT*seâ1H™µÄÝ^á†ØS»ü#{—|̵ ¥]²HË·Ž”ž¦Š]ù{[«©lï%N…a iVhpñ…`ñ`]¤1o?‚XÊþd•¹]L“ rÞüû³3Å,i)e ¡ìtŠ«Üð>] Ò ŸDØ1}œNºÕÇ?õ†®l:íQ(šÃ·b° Ýóº3lõœ8oÙ)i§½#T–ÃdÈx¸dä¾ïŒÊšÔj·ë­£1$…Cõ™Ï)p~Ú5(iõ¸üuAP¸BÙ)¿þÅ…Ìü…k­ux3+Ó“ R<b<õNÀ¬j›‹¾<0z™òZèßñ׆øgQ–ÜMzÍiû¹u;Ýš)Se5Òï Íü½G[“ñë!aAQš»3+÷¬ m_LîT¨vùg–ÃGÞK <ä BÎœþ…žÑøýŠêpµ¾&bÜ«Jƒƒâ!µé‹ G@=°×"F›UŒ¼1ýß³3Hw¬ôÙאּ$ÞÔzDÛH «ÌÒ1×èøÓ*m9'î|Ü3zÝ›$qð¼óÀhbÐ ;¨4㞯3Ö)#£ù7#‡ß¤~â‡Jº½œÐ2§v&… :YelS"5aòË*‘tH¾Ôin®æW *ÞïN×]Òu£Wƒ§jRþ;ôÒù@Ñõ©IéBïÒq ˆq;ÒÈúç¬DÄ>ÇÂI GÐj?I G&;¬¤Šj¸SêŒÂ{ïh§SÚô‚|wêÛ?ñÓ­`VÆÄe¡_È(çŒÍÈ×éÄyi.…ènžÌ:ç†þ;J-îšÑ$ZT»¸‰›¼øÚ­7XëºÑú-ØÝ+„:OlîÃVx¿E}IM/Û/+ä2/÷KÆbCæóóásru5`äU–Ž3§h{ ¸ü|gòº`ß“a_™`°;V¦D/€[Ëfž@„•©Q#Ae @uß(ú¡y¤H8)+íȃM‡ýËE²ÌJÑýÕ4ë=Š?W¥éÚº3xäOª(HÍêáãf‰*3UÕíäðA¨-82ˆòBÌ®kÛçX ¨åzÝÒjÒʨ®ãZ€(1/@me‚5 æ47%•Y™áñÊÂ(EÞݯ, ¶Ï«,ìñreB{¼,¡Ë)ÀbÁz9—•]´×±0X¸¡ÄÚµÒ8wZ_;°àúŽƒÅÚëÁ‚ \1Ðsn»Lœµ·Ûˆ¬32—Ï%‹ceÊ(»7ù\2V·EYÉp bué¬ÿ ÖW! qDM®^6W&W/›„d+(òYÅ m•Vz)-%0«’%­ô©@LÐ#ÖÊLÐ –”€ XþìñjÁÒXŒ©K««+‹±'t‘Ï ÎÌF,åø®š¸8¢YÄ23P¨¤}m‚°2Ò¢}‡ÔÕ^L¿6½6D&Ìʧá½NƒMeN˜5 ÌŠ¶´ÕÞ`bÉX LÈùÌl˜Nü >ƒèD ЙE ®ïJ¬Lƒ%::ø> stream xœÕ]éoÜÆ’_ìÇù+æÛ:‹ Ý÷±ßdYð“Ÿ#;ù@Á‘8ÆÎåÍûó·ª/’}H.¹žE€,5«««~u4»ÈùuK:º%ø_ø÷ö°ùuóë–:Züçö°}r½yüš‘­í¬bJl¯ØøèVpщ­6²Ó@?lzýnóèò«ëŸ7¼ãR HÏ‘£9ç2öHÒ@¢ÔSâí¯ðª£TH¿EŽR±ñàOøÙàÿ$ÖiiãàÚ¨ÛR¢Ê¨»H²JŽ'Þ—ƒéIò>M"ÚÓþÔË«éß'ÉûvÒÚ+ì+ ýˆ¤Ç¯©z'(ïÌ·c0³.ÿÚ³€?23VÌ@*Hß{’¤–Ó¡b½Tb¨,ÕYɹ³ä%ËΫÃR"3Ã\}Æ?QàMY}@’é˜6V¦‰³y”Iå©Òº½ä¦­Š¤¿ùõ1Î Pew¥Õ>'-2Û^Äï~–û]%Îòƒ'i©s•6<±ñ><¾?ø°‘ÔøþóOÁ Œ¥ P±Â€ÄKeŒÀ9^ù»Rnå×Ûo!Œ1chÇ\œÚ‰Îl)µÀÒlµ$¼ÄB´{r¹y|ùÍöß>¿ß<þû–nÿÿ÷äÕ9üsùtûo›‹ËÅyáýŽ• bgb%¬íÔq¬‘ZÕ"5…&Îât°ÄUJèØ F+ÍJÛµ?4‘Úzh¢`lÝÃ(”µ× ótÂêÊÚÿæW`­Œ"åÚî VŸËõ¾o¯WÍpsÖÛ„uø¥xµ Ì_Ƥàþ-(3ÖÑVÉö¼Œ`û¶7eL;÷–•6e¶Gß”ðô¦ŒogþNSøÏùþ:Á;VV¥óE+ê$ ‡Wà ,½:†5Úàÿ†_NAìÚóQ×T´ÆFìáš(ÓL.†Ø¼ZˆÕŒ¬ŽXi;szˆ}ùª|ØrQn®&€xe%¦°[(RLñ ášÀ“j±=à^-K¥ðßUA,DÇÍɸ²;{Qbøå¾õp½²^ã&®Ô­œ€ëÂ5±è9^-\ JVÇ53>=\?)q]‰ÍÏœ¬ $)ÓyËU…[Eþ—O&àeý;üóŠ ÔøÏ­ Y&Û]ÎáÕ‚?“buøƒ³ÒÓƒ­ ãl'¨®;²›ì•5ëm*ÚÕ=C¸&)YnÏ9ƒW ÙÄÚc_ŽE¶´ºÓ'ìJ½rvåˆP¥ZCï)Ä+uME´¹¡~e‹8`²´Š™à3dkXZ±Ø–v¯†C«£Ï#vÃ:zrñ-’tG4'Ù™÷›‹òˆóuóèïŸÞ¥è¡õJM¢œgÑ­x,¡ÈpðØáÞìv¥µmé]‰–ö´»ÒÙšð×–-•§æðj¹’6zuW‚­—<9Wª$ˆŠ\ §x0±¸§Ev6; ={üT“œœÈ6¨ÊêáĸÎʶ‹uYa?Z®wÂ9êq› øbÛù9¼ZÞ¤øÑG²G{‚ÿ©¹SmòÆÝË †ªÄn0i܃Ïð•ce3øœb*¦¨xÆ„óÚ9ò6Ñ,Ìb;ý9¼Zž!ôÑG¿G{†3ËÉyFɾâ+Gg•¬•x¶«¬lç* üÒ6W™p,÷Q1Ž%Pš÷ÏÿJ9RâÆ¥SHs÷pÛC¼fòžÚÞm¤–µë0þnóaó÷íÇfjåt+¡ ±tT¡@AA4Ü°Ž» åÑåóýÍ‹ËýõÍ«³×gß„ï3ƒñ¸~áÿü훋×ÿôÿê?|Ýöw@‘ ‚ä3"…áVÅaõCLg 4ª­ aÐ~2@ƒûÙ`K‹È ®‚µLx„@EK`˽{¢¿¾…,G•DŠÄ×5ÑAµ!(nÍ9ì n7‰ Œë¶H ”иð4E¸Æ)`[b†#˜tB)%5\R÷’¬•£¢Ö„F®×CUõ™u–‡C…4AÂáÎâÒ¹³#àRkPjËÄ1H%2å(Æ@¾ lS¡ lböþDùu0‰KÅ·!Ñù„- Š„ “n/˜v߉×`9Ò™(¬ |Ç·»9ĺ^-ûPUM¦½Å¼ZC(Áð†Ÿƒ…ƒ21Kçz Žx£1 §UŽwôÈzš9 >Å1T!›!‚ÑE-FKŒ`N$n¹qNGuþ_¤‚qÑI•®Átf‚ОFàë&`"àF§[M Ò@6Ç–«z]¶êCU3¹ös;f¸·”›b³ÀÄòP´*GqÜÜE€<.+IðˆË±Ò%pE ¾‡éSmÙŽYÀ Ñ>Õ*ô;N§h<Æ0çPí’[ø `Î XƦkH¦`<R㩵!++_wHáÜá±²×e‹>T“+o)y˜Áš í最Lè§vEÅPP,¤@Òñе+…ðü: hÝÕ0(¥jšB% ×)Å* Ÿ:‡Í†M^é=Há³Æ-“Pâ`ò ×·¦„û@B¡•u5r0ÊåT?Ǻ™._ö¡ªšL{‹ÙÂT.©Bõg1\2 ª¡Ì\Îå¶̳ԥ}¤¬]r‡žy‹H˜É´M‡Õ©‹ú.Íá—ÙÜ:%”¤ t¬H9pÈ]‚Ù˜›/^ƒÙ w=a,ÅbQB‘ 7:d` ‹õ ·ëZm¼àCU'¹Þ³š®Á#γcåæj=Ž;hœÝBmÑŽÄ9RÀë­öYÜ)†ºj%4¢™ä”2é]ñ@Ý.JbdKHÈh€%n1Ïsp84L¸†@Ia73ÅÓ  @4é7~†U-—-úPUL®¼ÅL‡ä1!Vg:ùÔÅ3*ð5S˜@Ñt¨.¿d¾€¢Öú ¡aøº–é(˜ÂÕ…®>Á¬@÷•¢S³¥".Þm@Ø–*¤ót}»¡˜|]Ú #kŒ& œñ×~Ž5—/ûPQM©¾åüBµ+¢a„w;Ü<#n!TYæêÅŠE‚r‚ÛÁ~ͺPAp»2pD mº?ÇÙ '¹]'çq»3Nˆu6…Ú”»?ûK,N,þB”T0+Ô=.zZˆºÔ¸`ŒÙq]Ÿ¯øPÕJ®¹=ÀW+——5BÍ( RÜ÷¹mœ)ÃWúk€/d ŸÂ ë7ñ:Ìq»é)P B™”8`>†àšæ×·›$E‘ä²uÜ‚–ö>‡ PÓê%ÈÉXøÇ7^vFÀT VÑCz}Äá Sä¯ÓÌ=ÅË–8ÙÓiuIŠ8"É8dëð«srØpu‰d¥ø*1ÈeAþýê óP·ñ#S®Dˆâuš¹§xÙ‡ {š#­.IG$¹‡lcÛ1¬ô¥ØjGú‹ZGë¤ÖpÙ[.ýÝ›%ݯýá­ÎÔÁpHw¦† ×ÃÅIèÀ![DXšµþiCËH‰ ²’y3ÐYÂ|í“`‰}r0ÂíAz§K×=,%€*rˆ ‹sô°ŒR¤QîÀ![‡_p‡ V—(A6ÏNL/»0ܵùö«KˆÁÛ‰^?é:ÍÜS¼l‰C=Í‘V—¤ˆ#’ÜC¶¿º¥ŠãC¡4)”øz-Pî|PçÒn„x u»–Ä& ©o ú˜æžÏœ¨ôWÌLcµeä+Ýw’ dL¸gÜËåÞÿë'N¦ñ­Þb&WØæ‡ÇUo~yû£;AÚQÜq±Ý)|F› ×kó|sþÍÓ›ó³«ó‹7Ïýûó;jð4¶Q loŒ¼øÇ¥kzÙ1ÜîRO§~n Æ|—F½zyõ컯ü™“ó>½`fÄëÕ¥ÿnœRˆ€vÝP:òòÕ…û*u­g ¤'à&Ÿó/÷þåP«ÆÁ§Ã¤¡äW0ã™oEÃWóñ`&íxÆ=Ž{zv}vóäÅËs×¾¹³O@Bl”Úu4þÉų˫Äxgp;ëÝ1p5!eelÐ2úf;^¨ƒÅ†Â&k`5) Pdˆ—ööîÓïï]sÅNc d¯" ïAAA]T¦v‡_Þû£ÇAòó§ïG‡„MP2´#Ç” P©©T’÷Õ1¬Ñ…F :ßR`¥•±÷ƒ6Fü9™^–÷?ïï}i5j:"œŠø¹vÿ*/…À›ÎZŸ¦Q²d5j3ÆV!a³n€Ê$RyÒŸ °ÔÎ9ó:ëT·¢}˜ÔU38Ù Ué'î—MÚ´IÓúÞõýÍùÅžÖ€S™=ôоiàžž ²ë¥ÒÑ»Œ¨%_¬KÖBó¬ñ¢ÒòÉë¾ü“ÊØ°Fý¾—"¬£Ê'è+-GY ›"‹­ž£Ú"+ U­Ÿ£ðV ”i-RÓZí‚ 5-TØ6—„äšõm³gè~‡vÔ5ðçÑ„4mU1ðçLß÷{T¥ñîAªt}(no÷Sõº‰€ôž_Ÿ©ôÝTQîëèÉD>¸¦oVúX,ú])Oå¾ÖOò”íYcø²‘»Ç,v»£îÔúþHW骫@³Bºß%Y›4€m q×'ÚBÇ‘©°ÒU9ÀÕ=?ßÓîÜ›Òd;&…ŸRšä­¡ÓŠ†i ¨í P GÝ_YRÓ#ÚsáYÎxì%ßVÃç(‘˜*M„îcMzt+ЩL\Af%ï…Ÿàþ Ìm3._T$êË·¼ÑóËd©©óÿ3CPü‘éâÏ÷áOÜä¥È1mŸ¿yeY«ó ¾î¥ÊjÞû›Ö‡Œ«ÍÈeòkdÞ±z+-µß“ßÜ{ÏÈCïwʵ•uØçr’JBsÐÜáwR¥­åª ^Ú8=‰þo¿¦0þ|•rSÝ_üù¡µ*®þ¡i¦Uè¿N éÓêˆ?âÅ~°ý6Bptl°•{ÜUp\öë8Kñ{+Äãµ–TMõ÷J–›a$**©@¢Â«õ>Æ8¦ ö8ª¥žŠ’—ݽ”SõEO>¶ò¾ÂçbªJ´o¼ PÙè`¢³yâlmUî/â²û`»;|8»½õe;|Å!WFþ/ô¬kÌÞUùïÓ‚; ¼wÒâóÓÌýcð¿ÿ ‹endstream endobj 30 0 obj 4792 endobj 35 0 obj <> stream xœí]Y·ò¸¿bmÀC5›d–"(Ú$»{ŠÖR"K²ð¿ûà4›õ›ìÙ™±m=à²y«ê«‹œ›BÈMÑýÿÿòÝÅÇ‹Ù·¹ÿ½|·y|{ñ蛲ش¢­ÊJon_] ÈVZèMÝQÛöw]ëíÝÅÏ¿¼}s¡„2µ.ǦˮÉöVJ™±éÛ®©¶MR-îó›î•².ôØôÉhªrÞùÇî/Fv7ðO]S)jӺΨ×Kº"Ðë­kj+3Ÿø[ÚùÃÔ4¶|¿›DóÓþoZo=6ý%i½/’ö†}ß5=úF•©…Òök{Ð[]I¡Z³Ù–¶wão¿N¯•­t‰áZÓšj¡WÓQÔè9EŸÓï/§ï•O÷V˜¶®\Ów´×“®IBIÝŽMÿ웤hÛÿºëeèPnÁW¤Ó×tð¿ä³]<9ÙÖ…¨´)7[UŠfF¾Û‰ÇÝ¡üw:EÎQäóða' sêyüŽÙ±ß»au[Ô ßô‚Žõž®înøÐ’*àœe½Q;Éö„&6ûOC“œ8Ý ùŠªŸOS¥ò aU¶îLòI'ùeèd ä&)>7¢Rµjæ=¡ž-)OÐ×c,ãO_Ù ÙÿÙè-蔬S+ëÝX€i´ÿ=Úä'zÂ`zïÔ¨‚:_ñËæ µ$$äË)f}1„Y< Ži{éò\û“°gãH1Ési\¢ÈR‰âYè?Ê¥,m…=&ŸÇ%†'XÜWN’ cw2 gtKzO¶}GW¾ãìU€9À•~Þ¯m«‹J”²Úlei±-E‹ |!ù&€LŸÜRw½Ü,‚¥}Š¦­Ò“g^3-ÂY\hzËsqZtÞkܤ’äX_§S¢P#ùJUëŹ~NÑYàåÒ˜"<‰_{N°,[–h`ÏXÁøÜc„@±ï Äq®Í2lø³MØ»¹y©”vrgª—m;Ÿ7ͤ >šªm«€\`Ù¯†&«QT½'myˆ›h«9Ò‚“á5=@¨ÏNËG³JèÚ˜€æ¯édã÷Fr¦X®™ìî %4:Ôv1eËÎPh…¸Ë;_ ó*ì:"ê#-‹?'…™Ácš¬˜^çä#ßLj~¥WtÂgIC¿Ù }cj­ßÌÛ87;&Sóuú¦ÀU¿*Y‰6dèÓt²—Áè,¼ìóp])柷†ˆŠL;q]ˆ8(ycÒg$žÔY0†J Ÿà:µâP fOòµ¡(¨‚i=«¦›•wÌ@`:SSsdæ-¥¸—îæ l’Ã=rp©"Þøôìd¥“|t—Îa«'ÅÅïÏ¥‹@^¶Oçö=útU]„œ²àÓ¹NÖ§“tÿÓTÛs' æ €\tô »L‹Îh½å€¬nwÌáj0âÏÌVæz±ÐÔòtN ªãÞÊ S W©J ºü'ªE[ÀHb 현ŋßÎì >K?÷ŽÛÌÉm•XDc.yÚÃÙÌ°qH/BÜ%9ÚÞë9€Ó‰Y¹qw)\¦@jOÒ­j QÛ^·Pf46‹·C`àpyNR@fÀã¿qP¦û–lÄé 횬¥”HÉÇÜòüdpÄàX¾r—Ì|@>üxýôtñQýà_Åc–V½¢JÄuò d3"M3~r¶ä( ÐîØÃãÕ •—h|€Ø] œ¢Ù©«æA=0ÀÒŸð[c¼âÕåš.õÕ²Ð;¶k`öê…M[ÿ­±Ÿ&úolúOQô | ¶ƒï÷ oø?®7@ŽVñcdzëj}²¬„iɾεàƒc½0q½Ð´£¤gcŽ-»ÐtÝð¹–eG6k×WÏpæ£T­U£åê̇fzyæãzJjǘ´„ç=)ŠÚ.éyë•J-Š¶ ˜ôšæeiû¦9Š:Rú´Êê;ÙbDÓ=۔ΙV#´x”Õ2»>“¤¤Wù°0ó€½ ‚C\ÅãlôÑ4æî¦4,.[tÑj4j é/ñì*Õþ°iåRµ¸/»Œ›Yy‰$µ±oZ‚æâö…€{òKZ4ƒÇ˜Ìrñé¿*TóÊž†’È”‘û¤(µëœ¥^vI©T˜˜-4g™Ï‡Jî€ãGtí"ÉË~ÝÛÙÖ^6fwé성>í®i¾Iru©DNµ`ú•ÙsÓNo3Nr¿\ë¡ÖAÆ8j Â9E¬é§’†wKþ!G[ð ªñø2EªÌÆÏòL© >°¦œ$À½ù(yZÒˆOåî ä?8gm¾HЋÅáÕàÉ;áà´|Ïü7øü×añE]¶¬k`Ùà/9eÝ  òãYõi@úP'…öd®Ý‚Īxƒá÷Wp§ç–'Ƈ#‡¯³>3ò5‡i^çÎÌgISÒœ·3×I|L.-“šfðß?ð@öÕ¥€ºáöÆ:bÁMvmB\” TQÅ7y$ 14Ó’Ö é‹—q>˜l@5fx¡½F¢î`Ý òM5s¼t8RÙÄgÓN£VèðDêÂÀ-Ë­–Z˜Ú„L¬ËJ#‰‘$5ˆz zE*Ò~¡è·,]ÓkVö2®Ð?ÐYvöÞ²ØÅù’VÖ>=vá#-\Ç!÷!`Ö8¹¦ßXëeߢ¶3u‘³JR½f Çs›—âx¸¨A•FtEßk‹ Ó뜊hà ]ÂÓ©iW2P4¬j(ºƒ¨PÕp·€‰ƒÚo:ʾ€b=ůxϘS–ƒóN³<ÿ€/¼7Ë®_¾¨¯8æïiW89×¢VqZâ4%í.½ v¾_/ñl΃€U%'ÇÊgYïÇ¢WWìH¼Ÿ4gýìøµµˆïà%[Ü*JàÀD‰;]‘8X<õ©›ˆÏè>äÓV`y‰sîf]„*+y‹$f҈ϿWÆ+FPý˜¦k£µ& ´X],”%k-Š¦ê-øjÅ£¥Óëœ,ø'¤Ó?†-ÔF–»œõ8ødæƒu>hÚô­hJ+xÚô'kÓÃ<â“á/–[ËÊgŒù]÷|Ìü¦3. ½xb§gÓßÿK©Ç4éÓ.²[=%‹ˆüa-úH=nó潩}8“~eU4 ˆ–‚Š*®î fkâÑÒE.TûÑYq;µ6„¾û‹aa †ËÝ®ÎÝ'¹iB>K& Rg–㾧oñŠ.,͞ϺbøžÕhlcÚ[€_£÷”×h¤ÔËÁkoy€T0(LdxA}§Z$ðy›ùÛR6Bíy7nQly?ø8æ!`<`ùqõ?ƒ]»œƒ¼_ék~Ã's†+ãKâב#§Ì׫@F²îae4æúØÄïÇs˜>†&Á ÒëÇ´þqïõ’1é3kßpV ó; w²M‘ öPÓ”Ob¿¡T¡–"ˆeź‡{oª­EY Û÷ù¨Ñø#=þ-¾°“óq$«±„,äú§…k¦×9E²“NO鞃O‘¬èóÑé.i “=N+ˆ‰É² þ;¯˜ØcŠl §ýìùÈ>Þ ¥«ïF´+ËyI—~=ð°ÕaEsÌÛÙgœƒæ¯¦UÈó…®™øßàÉ°c»›½d‡ýéð2Íò‹V<œ¦¿v iµ6=žt®‘G=ŽËxbŠ¿Þ{ ¦æÆŸ÷»%,º×SáíÉtÊÚ ú,3$½fÅÅ«_¨Ê¹ íh¸$Ð.vf>Ä:Œ1Ýñ¯U@Û÷%ùã•f%¥³Àýñ†´²jž¼qO#‚Si/08àvNUÎA^Oäeä´£Ãw)+»ò)W Ë÷¿¿ G ~z&îèGR,Y ä% ÒÀ%u$ørh×ø×þ^@ZúißZ±¨ÍJy:!É [ð6]•I]­ý1ûgížÞnþuÑýû?âõØendstream endobj 36 0 obj 3146 endobj 39 0 obj <> stream xœí]YÜ6öq~E?&€[–(J”öÍN cìرg±ÀðõDZÇÿ~©ƒ-’õUìîñÌÄAŒp(ź¾ª"ûݦ,ªM9ü7ÿûäÍÉ»“w›jlsÿøÞ“Úõà+kÇ$PsÜ 9(° ÃútD ÐÀâÒî«ÉßèZä.ÏlÌ{(@¡²&}ÎBÈV—®×¢.ñ Gc» \VOúØpèm”0qµÝ`‰çÓ…p1Iêö„Àw\š0ØæaYÂ`é^œ8²ÿüºÑ;“#9‚qŠ­.MÑÙÅQ?æÐÈ%à9¬äÁÊÞÚû9«½_Ò]‚ïÓ…óéI €ÖŸU-Ï°\Ønĉ¬ñzR”|qk¾XY:ÆÀ^‘Ȭ$'ÀÛœïÂzfsK¾c¹LŸ†@è‚b ˜'ÑŒtT-á…¦c­Ä„N*W (vÏ5wjñ!%Žçó»œM½ú~vQ‚»ÿ7^ªUn•7N'WM¡+½ÃSBÂÂÆ]B•æôV({Ž7(:K%“-{YÀjyP#À*‡27f´R×ï×jSé!˜ªÆê–¶-Ú®ßXccÿõ§VËþ•?Bm°ß[Çôê—³Ñüïï,ß„ï-$4®cb…°×«Ò2§vÕñ¸«ÊòÂÎì¿ëÕС”ÏUÓ„Ž¢§ttÑPwhÓÝyU ·Ýœ"*3ª¬µWªû2!nY‚6«rÀ§l½˜PO`ÅKþx=È+CK¼¦å^ÓTU´ï¿Vjx%<.Ô8´‚é‚;Ÿˆ¡ŒwQÅZÀ;õä…Rí8´ùÊÁÃG¥…k鈋¨Üá•©>›ÌzWZ!üv¼ÂÇV˪|´+®|ä VèÁ2þ^€4êI‹kŸR"n¯$$3±Y`ì©ëŒ(3›H ^>ÆÈg‘d£/Sý¬“—>‚Òƒä*ÞVƒ„žêŽRÍC$>’Ò¬ˆ ¯o©Í EÂ^×Xå ŒK155‹L;Å îJ"bµf‡ÏËÝœþâg¦ü¼=b šf×vú®éÞ´¦f¨ž›nì¦.#mz{œÈB2]”ªíG§åº%a@“Lxìp­@Mz#×áH{ÚJlšNßF¹CUÇNA2Ôâ¨áz€ïåù­¢>+xÅD8_/ž”Ðg<ðb!Ñ‹(¯è‚€ç/‹ƒn)AŠü×VWMQÂwY(hzpoBf^,Ç)\Y‘tÚ¸ 7q‡ÆÈ^Wt¦5 C–¾é›]PMÁ#tp ãÓ8@UcHmK’¥a€%“Uj•.VZaQé•-z¯Ú’tD#àêõ‚YívV¢ \çYŒ—êý¦± A]ÿI–NKú'@æC×`ÀÿÊ¢ÌýTTî#âX:5 ¿ lÀj’‚ËuÁž‘ ‡ÐµË”6é3+¥iêšh¸ë—Œ½»k¼UÑ•(Ft Qp<…ˆƒ¾\vhYpizÿHÍêòxL Èš¾÷Ë«.Ö·†…‹¬²žó“½:ÁjÀ³pÙãÉ\€ ’/Í»2æHÄœ8ÞE™-YDP:ãUaa¥{SÉ€d´!6­ò+¾Ð%$ÒôÀ>x¯yí9®`ô:óMBä2Ø™†dëYšd³ÚOGKÙR*gú)Ç+–Ÿ¿I2z‚ÐǸ;³Ÿ¿¥ÃOyé¡h§B–óAP+½nú†cQì±$ªË÷6ì`-`FÙc`2}.{ l~Ô½ï‰6@üòÊ ©×çó€ †ùibŸÒÔåz<šó\Ã^>ûùÜã|”˘ø."ÜÔAžõ­,»šÀºøz4ðÖ>b;~c5­©¤òñü\ÙKÎ/²pÖ–l@×Ô¬«‘z$n%sAÀÜ€=Ëë@êPûC …ã=&C‚1÷[;k.‚ÌËAv×NjÕ¦®Y;é5]ÙÚIïîHEWjøeÑÁð÷=L ›Àý—û´éÙØ(S©í¼ê«»´ò×®Šü’båW‘`yÚžÀ÷¨×2ÒÛÖé,ÓJN†H²ªLÓUü‰Hè%sÝöMÄs•0ÐK:‰ÞÐà<7˜“%TÙ;ø!Ñ€|´›&ÊÓùRàGk¬{ò¤´(÷ÎÀ™Ðö ÉhK³mën¸¶Ž®©æa½„ œfcPò‘HŸÊ~¶üg÷ánÃn_ü‡\$æ³ö–Ý«NÐ5ýö3/lQ¬\Š—Ù)0dú¥×Ä^–|~$/Y¿`%Ci²`6ë\iu΃ެ'ºEeà{A`où2UâýÎ)~Xuø…h‘Yþ” Ô§Mg4Ë¡ÏYQ /©R—Äw&ê–uÁ›1¢Zå}*«»Áý_ðõü{F¥Åm%ú½#–©Ë  d0ûìÊ¡¿È%ñ`î6îûˇޯN‡gÆ0Û*°¢œ•ToùývD;äGÃ;«7ë÷]Ñ/:5C÷[g›O†ÿþ£š©Öendstream endobj 40 0 obj 3559 endobj 43 0 obj <> stream xœí]Ýs7¯ºGÿûHª²b4ÒŒFy3J…ä|œqÞR•ÌG @€#ùëO³3Ú‘Ô¿Öhv×>ûìòƒ Y#µZ­î_H|XUB®ªþgüýìíч£+¹ió¿ž½]Ý;;º{ZW++l[·zuöâhø@®´ÒB¯L×ãÚßõ­gçGw~üæìõ‘ª1º›öM®·Rª›÷MÆ5I9´øÏõh…”¦ÒcÓG?bÓÖqç÷ý_Q¹QüÀÿé›jaë;£^Ï(E ×¾É¶M<ñcÚùÏ©ily¾DóÓþ>ÑkƦÑû¤hí`x°Ðw}ÓÝSU¯¤J»¯ÝF¯u+…²Íj]»Þ]¸üzØ=+­ô‰a“lc›vl’´Wð¡ ?ì„tª˜É?Ò!Òï7[aEcMë›~£½¾ï›d%”Ôvlúç¦I k·<½¿íÕСüLú}=¡£ÿB†óÑyvlG÷ì8¦“œÒ¦c<ïÝS÷ï௥6¢¶fµVµè¢Í=›N ™W“È(*X~s> öç4¦<^ „ž‰of[™ŽozBÇzG©;>t|MÔËÚ÷3%å9d«„Œ–< ‚®¸Ã–p%8­šò¹ GlÝ!ØjÿýŸt)ïiÓ§îNm•'júÒò”чq¯‘<#·ŠÉ“÷×À c·l­ø-#fx8r·vBgâY^P;Øóqh2QPÙ:.‘•½dOC#‰¥ÙภõVón[7p*·`³?Ò5ƒ^Á©2<-xfz}ô½¶3zŠ…ßÿªIXR¦`ž³üç^+£g÷ V–#:ÜœÈÀ}:YK”à2à´[ÊÌ.ÌõŠ(‹Dš_gq@xäñKdÀˆQÅ6”õÜJ)ëηSUÝ® ]ëJö«µ¬e &!K·½£°(¬òÑÒEŸ×í€~`“òÇ=Z%{ÜŒf¼äã”ZýŸé,`¬w¬$^”Ì%Âü÷žB' žó<Ôòl˜D -Ã/rMÙÀØÅæ‹U%y9M”Seˆrû”[°ªpÞÆùC¶-V ­2ê’d*ö òý‡ßzBÎç—ÍúoÐÔ­¥\ö»új`©žf>i:/ZÒ‹­…çá`変7´wîYÈ8é=¼Sp?³ð.²‚мŽ¿¿º5žób°ŒÎlêxw·S§!ãŠ][•ñØX_¬ÌÑüº=•¿x¨…Qäätªü÷À Žó»}bt'sÐã-PàeÆœ©1`V›/& W’ç0‚Ü^C¨À¹T¬Àļ@e¼+@0XŽ€R¯wFPÕš*XeåÌ‚Hð®#ëq€<wÊàèÅÛ¯=ͳFÆSÛr{:„)·™Ï7p@ÏÍ öÄk‹ ïbå5hRø¡6û±V;¡vðÍ:͈®å!Ýoj§~£Gæ×ç“kq:45=š›ŽO~Øt¬hmëç eÓ‡Z¥†òd³XG}]ÇK?è0æUfKE@†\†žu™[É)¥ÁòÈ]†ä­ÿ!b»ÿGGqN8\f”ò|lÂYfm&þ%K§lè5±Mû‚!°u@ͼŸPP²¢¿²L2üºŸ{ÝÏr9î|8ZU±ñ¯9æt„ Pn”J+µ54 ĈÓÚÈ —÷ùÃ%“Å’€PsÙä(>ð7¸$½o9Ékú=@ŽSŠ8 *?Dö¿õMUZ¯±ˆ~ ”WÀ`þM0`ÀùâÂ)¯£Yâw‰APK —Ôzâ— îä5I4c„!Ç@î,-±Vƒ0é×;t}ÁFaN‡P¬Ð®…Úš}¥Öˆ‹äÌâê_¿™¨LP0P«‹¢+½Â¼N¹•>š„|á%%C ÏÕÅ yÍ«`Æ.§´í@}4#le€S’øû( ~Uù¿°0ƒF¾ò±¸$• Ã89\” ÿ Ê‡„7‘á’¸0À:» „朌î3ý0-J`€Ñ¦Iý†Ë÷¾”Ë­ëºEˆô6ÔÉÀm¨=úþ6¤qC×3ÔNãÚ:>ËCÆ;š©éÚÆ;î‘N ÞAƒ"Áj|xÚkyP¤ŸWÛ¥01ðRW%êêƽÔÅ•Ø;á§ÙxþI¦pÙÀ’ð ¾î—‡A‰ÿàö_Û”8°$êÁñúøaþðU‡àzvÂì[ -0û^ d,¯q‡Q'Ì…7`vpôÊ®’ó·ý½·ïÞp\–DâcVù¢n^²H“œîñµBy‰¿¸ü4ˆëCÆ#^üÅñµ²NStè2Ûa«({à d{Ë"å`, Ã_ÙÛ¡ÐÛâBÍÃìÞÍáqø”WàŒ0tÙqϾ=•V#ä•Ò2½Œ1­ìj7qwÈkh-E›×Ó–]C;!Cݧ$€ÑïC×)Q~Ç£,E°g[±«Á'씞ú{´×ÏÃ\} rlù×È­ %OVøÓ F)n¶•0ÕK –©nDˆŽ{G¾õl œ€‡oXµ¼°îZ`å ¸ñÌA³Ýõò¾á( ¥/øÇBzÌTÏ2ÈVÙ[O|íz™fmÞ£¡¯²ÛÇÔ2¸"ëem{PTÙó%¦‹{ý<é#þæÑßí„4=Ï òdE9.Ã/ßRœ V^ª.ºZ@KêA§¢g{7²è³N-\·Dx"/6›¢W-æ“vü÷à‘.5P˜ˆ/{1(0ï^wƒ¡J.‹î=IÍXçÎaŠ²ï(¡b2¸‰fº‚"ÀTÿO D<.횺çÇw“À²ì¸:"Ñ×›}Áýb*F Ÿ)\z½=0YnWÚÏnD«QµK…ƒ—‡#,5{Þ×héJý¼¯‘š(‘‚½àÛç2L„sßš™CvÕ’Ý9”'Xæ #š2›ÍJè>&:§à÷­x=à“íù«¤~t¾øá2½Z`G¤|J_7T–<¬WvWlŒh&ÿeZåœÕ®Ö²ÉÛÄ%œ­þ}ÔÿüÝŠkeendstream endobj 44 0 obj 2961 endobj 47 0 obj <> stream xœå]Io7rÔ¯xGg×nv³·cÓ“ñØ:Ì!@`K¶åX–íxIô“¬¯ØÅî÷dɃŒPl®Åújïwi¢viûßðïÙ›“÷'ïwªkÿ9{³ûáôäþã,Ý5ISf¥Þ¾8é?P;ëD諸H*Óþæ¤m==?¹÷󷧜äI^T:š~i›Lï<Ï‹¡éIÛT™&¥ú–ñóGíÊD©*ÕCÓŸãˆE™¹ß¶)’ÔŒ2ü±mÊ’ªhÆΨ×]èu965eáNü„v~77 -ϧI4?í«y½ÕÐôh½OE{Ã^µM÷›ÿ·.z¯Už”f¾}ff®ííÿÚ¡²$˦K¶&/í(“Ú¬:wÏt¾˜—•Û[ìw]ÙIV5¥7䇞Jê|¢áyUšÞÜÔë|k¼Í=ýðMOÖU“V5?–Õ+p)Öº†–ëþ<›B©Œ=Oòjæw6Eä;Úë-m3~œ_ÿtÇï_ôMUQË;?ë^5ÓáùD‡¹¤$ÿzâ6ií~.§:wȧ,m¿¢wñ¡ï 8˜ìJÀü`–3:èîR¶cîQT‰Êgã`⫾sA©×:KϾ $nP?èÈs`P•"î7kNy×K¹ú<ðt0ÖÒôDÀt5¨O© 3ÿ`ÀõYÌdž™P oDkG Â9›+2ë9݇E€ùeü‡ÉÈÒ»¥G}çB5YÃo÷²»Þ½NUR7ùno0®) È‘8-àíÊ^ä´u7À^dÓÆ/é..gdÕìÕ°ô]®™åÝùóïrŸ¾Áó«ä9•;Á !ËÉcxÊ.l`XY^éÅñ/é!ìçƼÿõa˜3™;+pú!!ª-ݱ;–%ª -³ v,A­JÒê+Ô¢Pâ=ŠÃîT“k0?Ïrû<x ^€–gtàÃçôÃmö¹.­›Ý>Ï’ÚÑŠNûciUWºSÂŽŒƒÞo +ÞåqßF±«rOÂÊ‹uŸš®Òà”ñLì ÈÕÄ®Ófñ!]Ћåy}ÿ€+Nš8êóFé=¼`,“â_Æÿo÷([gÂoí‡þ/E+h Mè“x؈Tj°f²ðüú{×ÖÙF¢zÔo§(šqž{ßOS§ÞÔ»‰”9D•zœÃFQ0L<Î ø›Å97Ph+J°À«é‚xNÆÈqZ  P§Ÿ,Éó2èw/ǦeÍD ?õÒ$ZU™ˆBJH!æ`& ¹÷Û·GשY˜FÂþ_3]X²ˆKì\€ñYÛpd‘™„Š7/M29c™U##yK×Ù<Ðd}™Ð×áõýÇæ])äÚ ØZ5Ui>lê¹ö¤tð;ë÷Ù˜fö¹!ÒfR{íUÍMÎÜu¢Ì‡«ú™ù ýþIÏ´Š¦!õÞï´×+Í•YÛ¿º&•4ÍôÖšzt¨qæ §GGG õhÜ{åëxß“èÆŸ‡Ã²•®ì›´ÊŠ¤}Àk¥¯àSóXÆ-ziÓq—Þ€¥ÃzÒÞ±d ±M£Ò›$JXºhayh‘ö|YHfT|”™$i¡å __+*/kðwBTn¯ø¢20Él•ñÙrïí›ÅÅ^Èëlû˜½IdE`Ì°n˜€ÌWØW ÍÔAsÔ¶àØ™¨ú‰lŽžþ9é“ Ò^–´NM"ìmUßy{µjª¶Ì›Èù‹Z&Gòü“ ¯Öx›üƒ~ðóÙôJ¤.Õ±ÊP)¯ÈsÓ”W8×¼ZÊ«¿N)ï¿t `ñ§P«U’¥Möÿ&\´ú’®Lö x§\[Á]ÆPX·IFo]+ZäÀÅ“þM¦y“yü$LA9¿{€àØÀða7€j¹¯ÑIY¥þËÇbY$êÃÞøþš~d.YÀ÷:‘ÙŽàš:ÌI¥˜PØÀtm³râ_óygÇ÷`wÁàéxÜ"Ã1è¶Â¦¾‘,VHy°™s× Ü¤@7`ökÂøwƒ X%Y n’€(ÁèF=€nÁë“tLÌ™õ–ð‹>•ÐYu&LŒ²h'½°¯V¦ñ0PýÃŽØåh™§[v² °Ù2±)TO†/¼åˆ ·©•PHXðs´[€¾û,ïÌGðýʤ۰l°Ž[Ã|`@ç$$oõ·¤ç ÄŘpéM€@ð˜C˜¿$ ²ŠˆÔìh9 ÉrÞ{ * ^)Å<+ñ [YQ´óíY‘QÅ›]mä’ÒìºUÅÍ0Iª[»–NT™*{ÕÿÂÚ'ö_ûᛦv®³Õýµªø¦óþ„*Uû^ëáÐ ÕŒ6Êþ„`ç˹³ÃpÚc©ÝÌ ·éõÚ·â¿¢C^Ñï?2÷«ôžæ„ÅuÃ=§yä3æüàbAg°Y°þsÚ6viõÒ¢ÇuT—U1¸ãT‘ä†Ûï ÃAìå=É™#³¿o]µ'=uîB¥ WˆIÛƒü9Þ‘Ns®O÷ÔÚeyµÝgày•nš’ë3Ì¥+íG”|ŽÂµ…F.¯3d ³ôóñ,³Å¸HËná1=À,d×;d ™› ÖD¹°’YÙ¸×ü—ÃDÁúyüŠ’[Wã/g-cCÜyß$ŸN!óaÉ"I9À]“B÷Îñ»þ»6J?àG XRê^»¢[¶)ïÃÖ†%ÏÌa“ƒbDʃ¹È—r_:5†,}ÎëHÃì¹Ê}IïoúàV¦c†Éžº?/s:ˆÞÛb½ ‰¢¥3+OøMpeÊÎèK­’Rk`"˜f”ÞË20æçÜ~¦ß… Ì3—h¹”Äg аhàÈ '¬ðò²áî«}¯Ç‡¾©iÈÓ¦*XÊõôlóvøiöåÅR4½àV«[$P€ GÉV&c¢ª…0-‹ È{H/Ï@0H”¥2‚^ °y¢nª!—Tå¦_ @’KÍ‚ x À+bÁg6øØno¢ ±³•rëéýaÛé˜F£Ýb¬ˆ,ÁؽHÿà*x'Æ*Œ© Nл¼ÀÚܵñ { œöžÌPrß"3çŒ-a 3¸g‘96&ÖUæv“寂›“¥EôF­4I+Ÿ‚ Ql%BpW)«Ivür¢~/(mk<*3 T%Q¨Ã32ˆk¸æ^û{º4I`+ЙAŽ<ËýnȉÊëÜ ³dt¬ƒ ˆd«k)€^³n%iX:@ªm>SwF>Ò $aßiûß"×VŸL?LØgbr‹0/§©ü w^¿Œk±Sý¬E™Á“C ®Þ&³j´tÈþ‘h–qÐ;jkZ£F¸ªñºúJi Ë{ï"Å…ÛBE¨õÔô–UÀsãWÒÑéÒDKë Jli¹Å <\w Û–¬(€¯;îØEÁàKaàç¶-2®ðRÀ€ÎØy Ì„ûb|=Ë7+ý2¶¾ìœ•å) Gׄr"îT °»€MPØ5»á­aюɃÆLJ5f÷먠ºqn¹ŽÁûñf‡/úGŠ‰[ÜçU‘h…œ{GâØ‹K4›t4{³…Ó2•Õã6Ñ «lSñ¶­/5lÑ^ Ùí¸/QT,OêΫW'P *¤G`¶ÀS'Ø™[mL€‘¼QFÎÕ‘À|Ø´L¤aJ¤.ŦÆÎ[¾ “׿¬’}‡¥Ú.P–ì%«Ve½ôe‹/f$ÁÁ…ؘ i;â Q³¤,‘ÒÈ1èÑñ"Žs bJØ¡ˆ(#æ–g(‹6 DE;§OÝ›ï@´ÀUû0"£& ò`DÙ}ÊB)¦Èb‘¢¢J£¸=¨;s:-4ÔÅQ³-ïƒlc<.¹FÙÿ*‚vd"­%q,.9ˬñ2ß)Ÿ{—VäòïBÏÊJHAò¿Þpä(÷ˆx>– XáÀM™7 -ÒFž¨ :’¥¯Ë2‚X.fÀa+çd‘•ÅÚBSØkH_µÈ£†­ÁQa±AíL¥ìœ.ðÙÏ¿¸0æÏ¡aèª5íÈ~V þˆ:,áºRðnùaº¿žsYEïÃ(à:¿¡ëä¯(£23“,l  X^L3ÈØ>!9ü3’,lÇ4œ¡»áëU>¡¤fpj™a Ž¦!cÊ¢ÈíØ"J º‹¯>(ÏëÙë4Mr3$¨µÜuP*é2*Ùwaý€ˆ· ®VäŸ×´³¬Þ[ìEad!!ïèºùYn´–0^Ü<ó’‰’Õ*• ã}Âÿ|;ÐxSûqÕùçµo+\¹Í‡¡U¤wZæo`ž¿¯þ™.ƒfÚĨÍÀŒh&&Ërc"‚ÈF X6ÐîbÀãV§®ìóªIÊé.2Q^fόЎ>'~ hGqÜ­¥x¯&0#FUœ–æd¥÷‘qfî÷F6Õ¶ê`«‡`/ü,²Z œ ¾$SDKñEì®ÅÙBŸ,ûRVeËaX Uº`q­¶ab«¦–,9Ü>¤@ñ=A—tÀî ^µ,ÞUä îVeÔŸ6ÜàÚáërGýx2 ñ9õò®x×¢2*À;çÁ+CŸèWõ–ÖelJŽÂ¡’ìW¥VÖà¿:Oà\”á#°€×- z<àl^˲ƒÌ"Ãaðk†àŠÃ΀Ñ'>íÐ~4 Ó€xtÂ>Äe—NL¼h+‰l©ZÄÌuºp›É £‰µBB,YaP¨ hO²ø.á˜?#Kˆ¼§g! •yÔ@“Œ9ðL3§»L3\ëxiþ¨2Á^is¨ ß¿»ëw?²ÀU>§õ,ÓøÞ¢[Oz½Õ±Õ=ƒǫ́LØpïmùv0¤ìG;¿f¹¤Šr ‚a°‚ÏWU {Ò›_ŠOæßXTº“tÿG¨Ìñ[ Š¼]Kzè_[¹9ê „^‰Üu–àw—LÇ­…1d â/ ˆ‰´³$žðå4V‰Û:ðKeRhd.b‚L|ÙŠŒ-‡Xv=.F¾H"šÝ!e˜'ÃOÙoSðEÖÀ@™ˆÂß#üªÒÁ‘Cú›#·)ép ~tª¢WFg¨«¥v1é,5Ò«Í}¥’©«ÝýÔðƒÓÝNÚÿþê–Ðendstream endobj 48 0 obj 4040 endobj 51 0 obj <> stream xœí]I·rœ_ñà“ èµ›[/‡äÈ6À¶,r‰ƒ`{ë¤G]«˜÷µ±‚•üâuù°­Ø Kû\L¨”:út}O×nÒ^}-âùt«ëDâvÊ„Gr+”² n6[%«® ûŸî“ßÿgûýWTJšp¢fîL©8£Tì]]ø}ý‚.4p^t¼YW¸`rkù{;[·Ù i#^‰W£„JUÅÓì‘«k(»æ…1Pýüˆ@¼G½0Xp9.•XðïG†ZH‰NgCY™ð²Ì¦µN’% QBeCf o*¬Çs+ºˆ9O~t+Ò Ž;`BÞÐ**óAºÝOŒ ˆIÀÀƒåh§Ì  áï+ªõVÀ2Ã<%`þ>ѱ¶t¬2R³ЕÄ|Vï¤f䃛xàgòN éªiëÔ'þ›“-3x¼¸Ù([8`õ¤%¤*ˆ•˜ÈwщóC'ŽW¡~%À”þ’ç÷ÌñÌØhΙ‚#òNÑgN@ŒÀÛø÷¤O"M‰ÏȈÔÿØÛ#“Xx |ïœYð×^âòÈÀgŸw¹6g=Ô’âÀ»œØVÞ)ó–¯Àü@]C Œ:k@ñž”Úà'\ŽÐS@ppjJbJ4•+_º®Ì J2½n*Hu×q!Ÿ”©:!ÍQà§%}9T:î éb?±Æ^*8ïœÇ OÕ`ÞñIàÍÍ yyã0¯ý0J xøïW"_»^ve²§››9€ãûX:WÜL &¥ˆ›œí|“ ·%›LØU°÷¯é‚9\/ ÞùN}ÊÕ¼—}™ÂšÙ¡½°*AwÛÏ+u‚ýPuC5ªëd¸ÄU`m²{Œ°gß$åˆåÛg®SÝêÖ¯çn¨ZIzJ =òþ£~æ\Ⱥ­÷Źµ9œ®Á–y¡£`ÑSú]>zÍàeÎY¥¿º¦¾7&qA9 Âõß<£b(»m½ò×ë¼y LÈc÷eïÎÞè lˆs.²ˆè>Ü”%D È;sá5Ë@ä¹#Åô$]piç–’(é2»¼Xh3k)“ZvõÖ÷Ú ïã»VK±ã›&òìËâÅô‚ñÍ\ˆÚº.ºùØV K¸åFŽÂˆxþsÚë1%é»qba•\œëøÒÞ¨ôf DSO¼ÂØGS`D@ˆßh·;œ]ÝÐUEIŒ4qË2¸³Óý™*pÍ©Tµ•…*@KNר2ã>.L“Î]†?qVõ­J0¨EÞ¡Ik@ðÊkŸž³—¼bÂô’{ÿý…z øX®,j¤Ž4ÝÉ2茲¹› ˆ†^Û½Yщ1 Å蟹‘hÈU„lóÞ`ÏøÎß9íߵͮéÎ÷Ç°JZµÔvž¦;»Qëù œ@×ûïÞ­ ªÚ®óÿŠv»Oóq’UsPûO·¨†Ïçúô,[$Ï¢sÄÆcýô9«ˆhœÀ '!i(kõ °1,Oô Ð0`Kƒ¦6lê=ž¦ƒ J¿¤M=ªšUmwOþ—êR]ñ ‚8`Óñdt<{+&²O6 ,]m[žrz$¸žI˜õ߬OUfå3:Ürÿ“®.àጠÍ6-–'ߤiÓ¿(¥.»FvV7 ×€+Þ2Œ?¹y?lÑ÷ù{´Èø» äÐ~bm"ˆ]<9˜–K©wó„YFÙbË’†%‘䆲pzu¦mÙ‘ÊœÍ]X”ð p——Ð¥9#eډ˥,½TR÷&ëÜ•:Ï ±€‰à—g#æô¾¼,üÈaËÒÛ®ç³[¿;™žâÉÛ A|Âl±ƒ‹ Ð ÜQ >¿Ÿ†ìg*n\ý¡óF]û Õ 'Çå—¨Öƒœ^ E õ Pq >Ë,Ââ8³ðr Dò 3p¼ºWŽî!£#Ññ]M¦®LJ'X,H‹, "ù«ÇCqR˘¯‹’Š…QU­QRñ·T¢‚šG^Î#]À{$ƒíãì„ÜÑ!]ì¤ñ¹«–Yf )ø²(Mó2ïefw-;—fžd›·*ËHÁðÀýâ½âÿÛsÏCt‡Ö[‘Rð ¸Düµ›¡¥8ÙÒÔcÈ×#†²@@’ÝM UYÁïμä@q1(Ô‡M(Ô¤0‰ äKB‡ mU×Z…¦€µŠîÿXdH³Œ‰ò24Žå‘¡L‰?œÄ~Òmo'j“¨›E¹ S¤fª¬bò)Ýäg;_r]œÅ«ÙoF‰–L±{È:ÿ¦dÞ_þcÜÿñ]ŽÝ)Ð9À°À<ʨÒÝ++•\2s‚ê ». ^µ}LN\+¤ŸíKÇ$ûyZ±{Ï Âûeº9Ÿ‚IY¸ð|EL¦B”RÐŒ<€·²œŠ‰XTM/c€Woûë´$(‚2ƒ[ö¤g0·zxùgŠÈ;]®øæýûµ•~2î¸ÂÉ.ñšh~²+ÊÓ¸¬$4P{yp|™ÒÍ[t^:gêÇOÚ_GJ&süø $Ù•áùáAÚm‚aðî·zqÓš$Å) T¤E ¢ÂF%ÔfiöôìÏSÊ«%Nž/+Ró¢?` ’’X‘ƒUçƒyþ» ¯5w¨ñòݳVUn@¸v‰°ÇÕpy‡zYu$åŸUàáæU)…eª’³ÐðX5 XÏÝsl6¦O†¼²šî¸|ß®ÒÈ({-bY€§ù;RpÙÙŠ­T6d¶Kþ»?vDÀ¶ô±®??¶èêbõƒ&`Åù—e>ó¯—,yBñP ˜sÅou¨äª°eÉÓÀÍ/%“eÀ?&‘ÕåznKüX>7ºÈ kæ ð1Ë^½@Õd¦Ãyµ|â‰+»4x™ t=WûŸZÉCø8Ôü\Ù=GÜ’¦A¶IY9[ðR9/q71Õ‰+ÑØŠáUËêq™åü”å\{÷EÚ%QŠ¼ºÍkðLMqYeÕeVº¦Ûκ]yÿûIƃÉ«áʲиºïñ½ê´î›¯é-s5¨…\ôr~þ~+êÀ#°$?ŸpeÅÁ‹Œ]ÂêR« ^ï ²-æß ;*È'REŸK$EǸÄ{ Î5#Ì0ÈÂÓ¸ún5ïPñ†»(ß°ŒÞé) 3CRTˆþígiõ¹ÑÖ6ÖPGp,'ûêtóãÉðó¢3Uendstream endobj 52 0 obj 3585 endobj 55 0 obj <> stream xœí]Y³µ®JÞå'¨òÒìã7È…6±Ê U)ãåÚxÁÆ6ÆüägÖ3’úëžÖ™»™¸xp¡«£¥%õ×û¼:¶ÆÛþ¿éßûÏ^½:vCÛüÏýçÇ_Ü=úìvf[ÓVYUß}t4þÀyaŠãº)Mݵ??ê[ï>8úä›Oïþ|”›¼¬‹ljú¶oêzçy^NMwú¦ºkrnl™þCÿ‡Ê8WÛbjúu±¬²°ó/ý_Jc»QæßôM™©ËvîŒzݧ+½žÍMmU†ß¡_.MSËÃý$?í“e½õÔôÕzï©ö†}Ñ7}v»ûï w…ËMÕͷ˺™û–!òp³®Íó&¤Õo´³·ªŠî°ö‡¬L“ï îØL쓾©5e›µÑü`²×ãÈý û¾ kõÈUøt.ëFŒnï/ô÷/èïù=,©0u»rþý»¡·+LÞÑÒ¼ËQøãÔ¦,ËV;?¦×ÆÛGþþõx@M¾²ÞkØð¯Ë1úw¥0ÝÆ\4"÷ó~‘{N3w63l=ܯ‡=;gÚ&þÑ»‡ÓŸò¦ŠÈzȲڶŽàúعªm|ï’èÝ–äÞ\½ËŽ%Ôñ÷mzÁñ|o]Âê¦4½ÀR¼çš±d›ZÞJ¼78´‘{¤+`É^SM÷1Ïú|œ£»ÂÍüCŠ0`¨‰µeo‹®þOtkï;€75O¿e¬ð&„½P½ û=×ëZg«5Ê¿ÞÖš²hw®{‘Õ †|K_Ñôe‡kSË¿)?þr‘Yæµß›Ê¶Ìæ«õùÍ¿sk,ùµ:¾ À“Ç£ŸóyvÜCDÑí²Çy—Õ&ëiTXS8_Œôn;‚gþyǃÚý›áz5½äTFœjÀigM½×[lc&ôÛ2r :„óߧ½Ò%}?3þ6ùšŽP.›Éù€6=¤Ã?ƒòR•›Ìv÷o—g¦ èx—^Çô¥*/éÏ=ŽÛò÷ðå…ÕÔ DñQº::÷”ͽ¡}¹<4Œ~ïñNúJrÿ¤¡ ëïÇS"ìr™HÛ&\6šÀ"±»Ub0ý't°oѶÈEœŽÁ'ó†D:UÝ™àÂy±éÝ@ÞŽ…t Ñ®Lƒ¶w²"±²ìE–Ì?òĦ®jÊEÀµàEGã Ëò˜;Ðñ€Æ+‹É%BHþ*¹-k–ͳ? ³Ó©(]À6x#@'xd-;¸'챎?Þ.o[Óñ6* ] ’6yÚ[Ā̶(¶ ;ËϺ¥ç³ö†W” @‹I+Éê¶ZWž§h^Ü3ÊN&nÙuŠù +°IÀ À±²V.¬4 X3h/ýçì¬Êà€*î)/£Ü¤ wº`fÊ>PvP똫^ù+™P$^¥I<EÑ@†ODÞ)T43Y¶¿ ’D§+«&‘K8ãTQ.h0ò`I 4`H¬·° Î,±#¸˜ùà-v…!¦*[¿Û¦h ìsò9—þ9CS8 ÎY˜Üéãý!ÐÌu¾ÀöÁ9¾ŸÇÚV†Z@@„ë3¿&ÑÍI÷P§L}Ô†K}XæÉFJ©‹|Í[ÛûµVwë-åü€?þêÝOà<7M*–ï‘>¹>Mél ½—°ÙKFe§XÓyI¦;`Xùè9Ã|;ÅsƇs†|iA6Iú ÙÁyÉdÀ¦ ~â;Mv-Ù°Œÿ%% ýÝ•ö¸ ¹S<ׇÁgn¨T+*¯âhÿÂUÆö…5e€ ºhÿ’é£ý‡lζ{â Ê{3r·1ýNgå\$ñƒHüoèŸOxR»Ðl´}²¯ÆÎ~r€—B£y³—ôøùT|3W”TÐv‹s ´ù˜T€X‹ÎÚø* ”ZǵP3¶rmµ¾ÿg£¸³>Œzøøè?`õÙºG]¸ Ê 1S(µu€œr¬l `CR¤Z% :=šS‡¡¢˜²Ö­¶T /cªœ?(èhÉ¡£üžÇŒ…Mò¨/‡*­\§•( "éîEˆ"•DL׃ˆÕI試²@:#å˺(þt'ø†Up패‡Ä¬ò:G’·h3:ƒÚRÂI@(<ÈKÑ‘U¥²€5˜y½ÄÚ}k˜%LÌJJöHy1g@™†g³PúGÃI€¨$¯Nˆ4’™ôÜ딽LJºu®9u`êiÃÑaëìš\Œ º`è‹,Lò‹}`m«Q“»Ï«Âû"ƒ‚D®cæ7AÉ…™l—7)z=‹`¸< éÜ ¯IH+¢0F²•t*ȶؚ¼Ê[L{ÿ*f~:·<ï'Ûª-ô^æuA^æBŠ.l€š\¸i=RO`%§üÆß²J–¦m˸†ÎO˜’kÈIP[ÿaœË÷p?«É:–|]øCçn |ˆìsŽO¾šømSgÑ˽ΊO’µ5û “DÍ­šu¦dY©xžà¯Q‚‡6 çR„;¡H ®5¯ílŠf±É‹ ¡'C€ ÀÌ@U%`by@(PR´%˜_6wB¦¥êÆóFª¦¿'-°çþ«ÿ{ÛQ¤hTRˆLRÚ¹œm1OæحǶó ÷Á6)ÝyÞ´©l‹6|ðœÝv*ËP’‰`IZq’s¨!4ö¿}«Á­±®SïÓšS£‘—ûó›C u–›¶ÓÀÉZƒ tàn9Ãê»wÇïÕ¸6áuVí_ñ\<h…ª*#@¿òB×Ã@ù|Œ!žÛKÔ6ZѦÒC h'Ùè<8¾ãüë£êDZ]Žd«•\@iÖD$."3yÔïNÖ×_O¹M*Å ø'ŸÚ’߆Šg4[¥üËÉ]kGA§Z¦E¦ sã“<„:3­(Ì«óö_r-/ ÈY´Bø?/ç¨\`HG7œ+Ê 0RDâ •Hʾœè."›ÑÕWYFÁPoF˜tÖX‡<{ºEN)a}âÔgsO½Šë<$-$lÀmáÕ9:,ˆˆ‹z맇I9Rœ3Ie›äïr¬³tñAºBW…ðxpä¡*xy¨Õɺ”?÷Àª-à å]_Hŧ«,h®A"¤"XÀÌthÜð}­O–­¸U×ú#ž[TŸºµd½.^÷À…O(¥ž7knw¥+(§çÙUVo6‡Zit'gn[¸ bÊ&Öènžý‡d‚Qzñú<ä‚ï÷¨\ÿ´J=è¤ Ùø³%ÈÝ`åÅ“á³òn 0ï ››L pÖ˜¶ÝÙÀèÁ}ÕaÏq¿Ñ’à=é¢Áb¼™£÷ôE"Îà. œ*Ž÷Üç¦,§çcC¨WOhn2v Æ0ÊY€{›¯nëìÙæMû Oô»€hö æŸäÄfMfëþVÅôÒ~ëåØÙO,}2.4̵¦)«¢É>fƒ^ö'¦Mà¾2»šM±5Dª ù¥ÚÜOT« |¢Y“âÓ“ÒXuë>4îŠ'á¶4Ò°—WórÝÍèy1¶ØåÎ){žX÷m…T"PÌ2ÎeÇ9ÀóücY¼àƒW}2Šîٜͫ«„”#ºM  M‰d^E7¾î•áìUC9[ Åñ¿.׉®AÈ’Ð9ºÅاØ*¥KtÕ½]à._Ò¬å%¥Ë“± 8ÍuE±Áyquª7”;cý`ÀR\Œ î2}ú›ä8é‘[€¹¯ºùum擱>0Hk Jªìq!i(™¥×iIŽm0ºÀCºì ¬Wš^  B?^ý„ý9€Š‰2?á¯/&éj8¨bÆ« VÐ^–ö°PÓ^™j,°ÔÑÖ8“WúVôÍ1Øw­"o|ש¶|I ´Õ‡–\G~¾î®gñºàÆ–$TPñPü¦ˆà>ÖÛ» l½^¶0Ç7 Ë…Šú05t¸•¤´äƒ½‰|0LÒ¹qˆƒÙµõ Á@&F=8b}Ý=÷¯9Ô=ˆWШ-¹á‚ð©:,IärÝÉ$iÍœìµ÷®°³v =¶âÍeº8Ä’Bò®–/ǃETÒ‡»9½½_1ÉÁÝŠ¬w~läJÇc@qåJXU“Ò’âx>0Ã6ÈGWý%% ˜ªèyÆj Uõuß—9/yÍÚˈ†Êá«’„ ‡àñé$)[€Sðwy›k‘Z º (vÈ·µD•ho4–ëFa¾¡–ëÕ’]‹ÈÍÚ¦mÕ£ý¢M±ÂçÎKÁƒª“øµÃøz_ãôøMâñ.<Ȥ€žõo-#4”‹N+”ÎE¡|^…ádjëý³ë÷I!V $¡¦Ä¤EŠ,íÔ¤šü.£ÀP`UShmfýˆÕ:7E‡øÇ»²0Ôö½¿¼{ü£þ¿ÿðWendstream endobj 56 0 obj 4458 endobj 59 0 obj <> stream xœí]Ër·­ò’_qË›ÈUºãÁ¼0XZ)çU—#2ñƽ•„¤D‰–Äïp>83óЧ{zîåeYÅ«†˜ÐhtŸ>ݯ6yf6yÿ3ü~vqrurµ1»gã¯g›Gg'ß>.òË\S4Õæìå‰Álª²ÊªmëÌvÏ/Nú§gÏOüù›³”YYÛªý¥Ôµ.˲öl÷Èÿd|ýÇþMfŒÍ«áÑ»ñ‹uSÄßô©³¼ûÊøáëþQ‘ÙÚQ«gtD ÕùøÈ5uÜñ)müv~4.‹©²²êÞîz[5&+]½Ù]ë6œ~åWÏgÆŽ2¿H®vu3<²L«¶—h]Åý©ÿ‹)³º¶ÑØãO>÷ïÛÚ&œt•YgšQ̯ýtºéz»5&3¥ÝlË"k£ÙœÍ*gÃ/x•T’ãhÞû{ÅŒ'ó–¾þd^A—êµ­ m5åÂKѺܶD±¦VÁÒW|«w~\µ±‰ô×Lâzá_wuY&ï?gÇC}F]„cyû81  ãK:<0°‰tózîGÜ5ÊÛx,wóë4¶.ǬôkΘ¾¡¯¿ôšÒ–-»®]ך®k¢C:üZ¼÷­ÚrÚÓ×tYyÕµµÝ­ˆZ´üH^©Öëáh^òº^ì÷Ò÷[×Æ$Š,PçO¾3gLº’`dçô}*Ül~øék?ÈÂN3ÿÕÛÝÖ6v4Ußù@Ó ÀãüÏ|³Ú4ÎÅxÊjR;û´œu¥üX?¾VÓÌñE>o[ÚnõWèÚ»†‘ºs€®Hæ"ë’`~‘RÖ}oUýÃ4âd©¾Gµi&oKLéòØÿ¡îMÊTDªss}«IµÇŽ3tLÝ©aÕ*ÏêH t@§]tþ´ÓÎ¼ó• §àߌCÜË+Š}^3pˆb—YÛí/àç ø¹—à‡â¢€iߺf…ÀC$5VA¤Þ±%†ø³†Hά€H«!UT¶ã£Œ>‘Lg—"õv$QÛà ÒK:±`ÄêÔE U"Yk^Ô€  Ã~ç™k³ªj0æú6Q@5Ø&˫Οí‹ÜÔðˆ¢†"tfb…±ÅÙºÞ姴"“´>8õï×Î6‘ƒçr1éþdaÞR¸rNåò"[d­Û/æ ‚¹Ÿ橨sÑB{ÿáö‘+PM^O£Ô3B6S(k8eÄ¥/jø µE§¶ÉXd—•X+0—cÁ‹ÝZ¦zùa²Ã&Ù©œzÇ’ùEÒeB÷áÉžD9E²'ÕÄÿ'²g ’|À] ™*/²*7÷ÉDX÷Á?F÷Yæ«tµ¡“ç=Éãç‰fì»1ÆÎĬH²¸€„Ͷ­Û¤œ oº}CßÐÆ[ªŽ–u8?? ­Å@o¥y¾-¦ ¾Wìu‚vYçèŠÛ‚ÓaíR‚ÆœïgÙAŸ•’W¢$+q¸múÊ(eÐï8ïÀA'Ü 5¿çôu`Éþf’.`4ðÛÒAìgÑÀ Å–²¤Ó1´§f6«IWÈ<%ÉÕvÜvá^f¹½€[ÀœË&¦¡b[Vl°»å5JçìYËQÆð~sVIÿ[úåÕ'È~³$ÚqÏ Žqd]ÀûƒÁi­-˜¾ FÉ…gyÄÝL».™Ñ¡d0ðW¦ÉùªþL?°x  ²Ü r˜)ÜT|:\*®.)úšÆ¨ sÜØ\ >öªoï/ ,*ˆ(‚Ð1ñµO@“ܱ.æ¢BÝH©2ßÀãÐpÕ@3)•†÷Àûƒœ½*¼¿MôàY'Ö’Eóê½¾|­|fñÉ>äŠ|Rð|X¯<¼IjÂ……±Ø#¿a8_ðÉÀŸ ùã¨X®¤Õ’×=_ä'¼_DÆO»™uü¤n&šòÃn=ãJðÉßÓ…nZ„“c£ßšÆd=Š¡\9¨@¹dDÇE\²¸é†iÀOéê?t,ÇÃQ0yjf®¨È‚=·D½Ç‚“Á«àìf”J\碔âyS9—!>Ó+ç2–“Õ ÕAG?XAÀ ÇÓÀäêô0à[`à€ƒûÎϸvEJ¥þJ;¸tLt –ÿx±€h|u5< ¢(ÖÃ*t@¤F©±È|6/`…~1ÞW”8t“äF¿8çÒœØ6o¸ ê\•Lóñ´µ¼Ík~º× ê¼N˜9X³$+×è4aãÅL-°Ô`¼¤ßZQ^Ù[µÜ&0AË2©~¯É€øéòƒƒ¨öyo ¢ÙãR︨ò`Æ€Þ»§ßWÕV]Nxq¿•àqQpºEYì Ay¼¹š#Z®´¦¸)Ê€ðˆ/f[Ep$rÔ=?Ç+Ú½DMëËô†æ¼胆a`ú€zàNÝuî2ï\­…¬A……¬è-Aá'³áHVX—öåêõýÈ–Ï$¨'!O`«Äpʵ5Žj„Àa§ÉG_À¤Ã¬Ä/T]tü'—ÈÕ&K@(BH-eÄË“ççA€ü›àçy2>`Ë íåàŒ?oî\‘kCÜšX:H5?E:Ç*«9ÿ©à¸AÜí×¾ÜVSiHô‚V|=:îüÏŽ¶'òY´~µvµæ†äÜbo+Suë]éH`ƒERGÀ’/Ç[‡UGkAg ¦å*sap¢s‰Ü”ø•Ôr7|Q®.´žÃÙÄlW´-(âáÃEÎ >±UÅkº¨yµbjÙTëÒ”<ŠQûÜ°ª*ÛZ°m…q3®W`FÇ×AÍÝC/‰ÚLÁÛƒBe’}®¥¨{Þ¤Z~xCí2Øá¼…Ñêsgt!èû³CGëŠ4ùü¤Žy'ÙÚ µˆœxXÊCHíƒÏ¿÷œ#•¦«â9+€gàçTl/^4O§ôE1t[©ØUþ1 } „†¤2/rëRj¾…F[ç@xzààóÀ„O{¼@sÎlÒšŸ½Žg¡@SE…qCè ¨#5~<‹-od`„ÂTq# U ±fŒ³ öqAWfao«¼Í,:œÉN†VRmMVÙZQÔ¢óƒ3Ÿœ|q¸¯\ÓÂUŸÂ¼Ë‘¼™Pö N!æÍ`©&JÀ¯¹uˆç?S}è :p÷ÉýéÞNû‹v9Ìä³æruNòe–7ÓE +r‡p¬òæÙ[X<ÀA€©ËñY^cØ©‚í¨š(‘fâäiÂQô²]@‡rº%¸ž@ÔGlKWuE‡žÓUÝó9ËïÎgÃ( p¾ärEñ€7'Ž]gŠw¦™K¦ÌS ƒÎŽè@#?õ޳ƽü›q@ … üq׺¿~¡MÑ—¶…ißU¹Ìl;ŠËŸ¾‰‡ ¨*P[P·‰wlÄ|ÆgùüDpÄŸ¯%Ú+õ!¿‚qæI cE(Gé d߀« Wgm׌2@?ykQÖ•+è*,€dÕå ýÂÞRœ¸tþv¶æV n+Ħ9ØJ‡î7Pß«K_"ehURpð‰Ûð÷¼p·?C²|¸šêt¤°\¯-PºÏ®œíå©VYp]f’« ÕS:}㓬|I+½UUDÜÙx¦ˆ+¹Y(úÁ·=•m¿Ú½o{2´U>?ŠÎo´»Š,d â  nèûÁP‘Í‹;.pªâVuiœøÉ‹#¹Ž©ì$^¶æn¼Þg|R)Iû–V™½M( ïØóo|Å*ØÕ²_OŒ.`–PùyÏ+àJ€M“X} ×(ª¯T[‚OŠ½¸¢.ö‚ŸäëvKÊè±ì.«`ïà&"Ô~¹Öô«;Õ<'ˆÒÄ3ÈeáR Ì0{à<2›¹(]‘õ·iÞ>»tèÝD²”Œ2(Q‚ àòrp‹…î €|E¸ìœxùzUÕ¸EQ­‚â 2D¦Àf²òº³, ªé6d,€w@²u-¦Ù]Ô Þ÷~YÂû6Á Á±ZÝU˜ºÃZrÚkùæöÒq+"©±jì}‘ècxà8?(3° ø-©£ü˜«±wÿô õ9‡Â°x:V!`ùUj^ÐGü{sm|*Á{ £VôÇ«ÚKTL«|ª;)º£áÒÂ5} ¶'–3ó«¯äÃ<{•²€PeHp&ÿÖÙôT›m[g®ûTw™ËïÏ6;éþ a¡.fendstream endobj 60 0 obj 3482 endobj 63 0 obj <> stream xœí][ݶú¸¿b @RøÈ¢DÝòRäÖØmš¸Îö’"/öÚŽ{×vÛqþFûƒ+ŠG$ç›ÑHZïn‚ÆhŠ‡sŸ9/óÌçßñïÓ³£—G/Í~ÌÿuzvüñÉÑÍ»E~Üe]]ÔöøäÑ‘ûÀÛÒfö¸i«¬éÇÏŽ†Ñ“Gïßþàäû£2+«ÆãП‡¡~vY–Õ8ôõ0ÔôCƸÿùáê̘&·ãÐ~Ū.âÉχ©²¼_Å/üÓ0TdMÕùÉhÖ)…Ìz懺ºŠ7þšN~1 #›X~Û'¼Í8ô;¼÷Tg˃ƒžC7ï–ű±Yiû¯û‹ÞÙÚdeWïŠ~vߺÛëLgüF™»¤®êªz2tV0T†¶™é?,c$2ü‹É³ÒØ.„½íc ^’Û¸¡³Bª²ºló&¼Â.«º¦¶áFßÝ£ðžÒ¡‡}=:ƒw²«º¬1m}¼+‹¬Ðw2Ѹ‡æñt)%½:Ñ݇ÃKˆQõ‚~~o"™.Ä‚{š†Îò œ¹6]Þ´„’³Z³ü¬ï•il ð’ÃÝsÿÐÓ‡_7?)³¶@_ÀØ –DÏðV$p¬*>VOÀyŸ Àò˜9WÝc½ÿ/þþ”žø9…ò™È“ÊðÖzáR5Š[—é¿áÁ Î’°xÒ#¤­ˆ$ àN÷N_!€Ìôü[’ï(rxL‚§, „WÃÏÊÜPOº “jÇOn_3I?ù¯ŽÑ·MÝxFø÷½<0=¦ð¨8qÓ*SwÉC¹Ï^îÀ¥-…^Õ FX‹æpþkðòÒLå[cäË”UQ-½‚{¿úÎæ=“ì¥÷®G_WÏ°y ^û B ÖÙ*ÓÖ[ó žP´å?âö;|ÿ]*R^»ï›î°dίüŒþŠ‚Ä!¬ÎŠ^ÈÎs :}F?|%b,a! ã=·KÞØÆOþt?Ûô i›>×¢œãýñÐçû;ëuΪʅ›}K1Àì/û†ª›<Õh®î€wÒ{–XxÊùüãýÎeÖ´mÉxƒ}XWwšOèikÿæ/{M›Ùú Ônø÷–§fÇtßà!Äï˜j†€ o]~ ~±Ìƒ’§xboEG0&¨Â¯ý½î#W|s”^ô`:ÐZFöù ©4‡®ÇóS°1Xòݨ’œvóöŸü¬.uSÂË{pJ@ù²vhfwGrnvÜë eO^ Ï)¼–•Ðÿ;°=ÀQ.ÜöØ Ðî„1`®« ÓÀDçu\Ý;÷C¯(!€C°üö>]‘'Zp-à{@"¼áôœƒõ=*`¨À= ¨m„Àl uÕ•e¢\‚QàÌÍy-=0©oMÀ“{O`dVmÓ”¬ºzWvMVä9×c'w>Pêü÷*†?xÎ:ƃ$³lKÑkùYW˲!O&Õ"*ë+`„2€¾Â?3pº‘ñ_!àœo9ηÕ=ÆQko#Ý6þ|òÀýä½¾y×tÇmÿôëžÀÿ~ÑY>ø÷ÍŠÈ¿ÿ‡a~Ï&Œi“moûç}0•õê»óEŒ­çßž¤ÂYçÓ,?ôÔ!²(mêKxãöﺶ21Ö‡Éë¶i»š‚[<ôŠ=›t÷áºÛôºÁ.÷èÐk^WY“Èé²"gc!›”XŽxÿ‡tÿû°ëìÁ·õê,g{”™¼'Õ"ƒ…Úëw€oÆ;ƒ[(³~ —ü„~xöp„Ïö’‰Rl½h±S–â.ü`ƒ„o;l†P¾PÝ=ààçbN`ÑSK‚#îH|8^uÏâºDwßuWµ©þ .`‰;ËàI#O@ö£×jÚNÉýâ+PCQØzؘxÜGo*›=uçê…¹åàþç /M;C"»Žçä’òìé>3 òå ‡€|^VŒ¬Çnɪk¡¶ ŸD@`@ƒ»3ú2£I|°³‘‹õ´™›Èðç= h[òd~Ÿ~ÿ„âÄY¶È…Nt0.Ž—@,Æùh’;ÉdC'×th|Õ£>rôSë CÄÞ²Ú ö>úžž ðòq–Þ› jÀ!ûã¨EÆY"¶ËÚ^Ÿ’D–†Ü‘2OðÏQl¯Ÿ—©Ù#ûÙ#Y CâC\&Á¿.t7Y©É6 Ì`Ü ~#ÞЀó^šª2&¡R`cÉHÉ› pð±Á_SrˆoyŒPó‡°ýJ568Kÿä6.»CxDpŒðGÁ( yo?«NFo`x<Àñùðb}xæ2®OíÞåqäé4’ðmÆ!!¤‰AíäÒ†EÝpµ¬×b¿vÏržƒlOO²\âtÜî¡ß•M/¸Š ( AÄЯ¿:;'"ØPlË¢³@¨ŒÛ"Ï›_.OáH0:Ÿ$]rõºô.âÆ…lùÃŽ¸““ÈEóÍÉ›Ÿ&c…Ȳ—¯E·ºËÌ(Û"«{Ë‚¦fðÖD˜3(Ð?²ÓÅŒ…§"éE¯Ü¥Í¥ÎŠ=½©U³ŽxM>¹HäKM¾œ™¼ti‘‚ÔÛšŽo:brɆ¥ èò®Áò Êfª«bÐ%Éñ ž—J¨è©X¡¿íŠ¦ËjÓ‚Òš,_› a\IŒ¿îe><}9r²¸OÓ‹7„¬¸ÀOR¬¹öE~ðvÁ÷`l¬«ËáŠéf9OP[ˆ¢{¿‰D6˜èðfOݽ6RSäX:$egçÙõÊ¨Ò À$ õ,ÉŠÐÉ#@aTÍ•­<êÐ8ÌN“1¤ÖuUÊÀ’Tá­4 ¦ã[’«ýøÕÙÛœF8CÔLÌ45øiö-Ò‘Ÿl¸ë®ìÚ¬ìàá¹N>ÕÏÜU…u¬K½  pƒ ‰_bIËÍ\—~µˆ)éÄ %j™ÿC‘È…U‚Û€OûúíDÍl$·‚*Bå?àmSæ ?¼áDŠ9þõÍ¿÷̳*÷![¡ç ú}¼ö‡;\}¯<ø >X¿d‘Ö>‚Ô[ÕÊ ª¾qåýQÁ ÈhŸpÄWU¬¨Ó¹X~Íšx€áQ²’«u«ŸŽ2£gC‡åþ‚ãòGuf‹4Kñª^`r"ò|çչ͠}Â9+ý–aüÛ÷éEŸx¥«É“GõÕ§_}¸?Dõz}r<ðð¾È9Ìj¼ƒá 4Ù,/Ò@“Î1¨g‘A¸±uiRAJB†îÂ{®¼ýL¯ö¶©U¼ R7Zåežî¯sä€|" ²‚¬øõ%ýž¿§MN/Ý% ¹ªLX~h›ò8¡Y±¡u˜ü”jºÖ|$Ú–nÂE>Ú3Ô8ï8°¿.*"óëšRE’>SžµÄI¢Ó¤ù.|îè—®6Š ƒ×¨K4‡¨Q’*´«;Ÿéz茭ÎÒ)ÚA#Œø¤ožL¤)ä÷=æ._Ö³V˜AQ°*P³<“ØÚÖT¾Èé6 ƒÂ8"k;I€˜¢nAÊfÜq…&„ü&Nâ”å¬(‰ÄWƒŠ0çÒreë ²g¤Æ i_ê¢g-Æù«Hf¬ö#–ÓмñŽ{EÆ4i£Ð.:è)e8ÄûËý©#µ+nuýËÈÔóÆ¢¼4ê|l³²èüSêM©9™ë*’×ÿOGeg;DáC©ïgëævC ß· òˆy·27­ÉËC;¡[·öBu¨xNà_PqiU{`p¼i·Äƒ¸ZV¯î^Ä«âz›‹JŒ®ºÑ9Hbѹlå‡É’* z{€(U×µ^¾’–kœ;--M'á­DU‹L%Áñ8E$°Q¬Z•š7ã÷Ù75 ê°ÊïXjØ,Íß`“ºÁŽ<'õj¦,7Ë0Êñ2ëè…ƒ‚°1Hµð³ØØ®6Œðî* .¯%ÿ)Å—O›z¿ÙÃoÊÁëÄG5WaFg4Yl'G]¬ Þ/t_>½ñ•0YÄÍ'‹«T>Y}u2 Øå©‚ò„˜/7þBÀÕÔëGÂñ™€Ý²ïc&‹œ1e‚3b…sè~n‰û–^Ü•YÕÔï vÍ ¯$± $A÷Ù¤TZöSµ2¤ìŒ €~#^7[Ë-lͼèµ?œFB’÷š„à?Ý*¯¶5·Ñu!+Òm·™+ïÒ¦ÆËMÅ…W6uù¼^'¹—-çí6°Y@ÌÀ†ãÚÈYþ—ïçtì¥X>ï2¥.¥ûeD° …åÃQ€5Y× "¥¥¡±Y2ëä¦íBrG¤‘#gÁÑÏH«b@öØÏÙɺôÑ¥«èx'žùö&Ú!´ªÛu‰פrdÑN¼µqNRé¢s¡ÊËS]¡ÜÚÜS•‘+“€`£,꺰 °†`u“¬¹ )‹~AÂÛZŒÛ#P[¦®R[Q |Ì²Ñ {IGù' æ‹Å6<}Ìâ2"‘¯’ššÀBû…ÜÛMÇæuf-JW‘BŠv5ûÙÆfUžzGWvÚ_e:‚ê ¹M¨j{Mîw%”}ña‡!j;/u•vêô_°‹®Ý`“òoÓÌ òEâr[Ó±kÙ¦WOKÛ­uóˆ/BLÔµláÖ•´Ë†¢ÿŸ¬*Dq”a¶¦ÅêLÖç(K‚î KŠ^¤-Ýq“AÚ¥Þyé,àWE‰—úåUþ™EñÚ‹¬_â;³Õ°ð“Ù`.©ãN:l½ò"ZP‰tŠ“ªã§¶ó‹ñeÝ´¨Fð&Îx÷¡V{9)Î ŸYçJk%b ‡›ž=6Ð5?©²‹ú§èÚWó);òkµáùµÅ*À·ÁUŸÇ¿˜±dÅÉÏšXVʪÿÃj:ÄélÊÕ¹Â:7Ê'ÆXÍbÿúÙ‘ãG¯¨¥ÜwЮ‡sÕÃÚj¼èg €äÝêïÒ…tm–䘫\J¢õJ‰ÈÔHXçdù;« ÌÛ _>§L•«Û˜ë5¡ë+b5«–”,ò°]dlXÈ[ä X”°± ‰‰®|6G hG[•¾•óƒZ4ô[À̵]зòKþm-2žtRPn²(ƒ  D'Xy#,ùn}(óD—V÷{Â!¹,Ìy|]ÍHÂà‚¬†=ÛGG„É]¨\ý\¾í®lólÐl˜_úšeé£2ÐCŸVÉ€ôUY»f5ž/¯:ðòÉd‰,²MªÄÉÉuBq#ÿËä@à…¡pð;ÓÛGtª MàpÓeæ/êµàW, —¨ã TCgtè=붾¨zËIwOº4M]“g]¬WS¡½ªhý⳩t:ùÖN5²kM°Œ øùpÑi  `¸¡œ¸ÄáiƒïU¥"—ЕïGOR𠘄êÇST]xÞ„˜­QÎêjYO'¹DüáXBZäadÙ˜¬î†E1eòÛ݆¢w?ôÙÉñߎ†?ÿûÐdWendstream endobj 64 0 obj 4644 endobj 67 0 obj <> stream xœí]Y·œ·ý¿X4í¾9ôÛ&r âH‹ä!ÖÚ±´’,É’ýëÓ§IÖWÕÅéíJ±õ`€Ëá]×WG¿ÜäY±ÉûÓÿ=;{yörS mîžmþxqöŽ2ßØ̶e[o.žœ?(6uUgõÆìšÌtíÏÎúÖ‹Çg·¾þüâ¿gUV5¦.§¦¿ôM]着š©é~ßdº¦¢[ÜÏ¿íÿÐfEaòzjúÙØ´eØùyÿ—&Ë»QÜÀ¯û¦23uQ¯GtE ×S×dÛ&œø>íübnšZ¾ßORóÓþ8¯×LMŸ¨Öû@µw0<ØèUßôŽªÜuVÕݯ»‹ÞÖm‘U¶ÙlË®÷Îß~=Þž-lá&ÊÆK²mÚ©© ½¼VþwYÑý°OÁf5må?…&k«]nü†_Cš¦( ÿhêÌØ¢ 0\ÞÃñ‡mµÿaî?…p–ïé^Îû¦"Ϫ¢¶üŠÁŒÐ]ˆGi[SuÇÒì6ÛªÌvÁ\ÌTâFýa¾ÖŠ^¾[ô«ñ‡=-…|Aþ`~tÁnFâ.h/·”gãÍ͎о—÷Zk¾×t~MaêpÁ)›}¯Æ56Ms Ž ²µØM6Óyë÷µÝŒµ-h“;Èwôlïfc7“W­ûåÝ»Ãói3›GëByês:¦w9ä"vüm{¸í¨%o"Æ~EWòxœ·k‰÷1í .ýÕ¸“]µçø>4t¿€Ý¹½<ÔÏØfe?p:¥5þˆm·àî¿EºÒ­«·ÃßØðS†ÔÚÌ{‰"\1X±w†C!ˆœ'c“iLU²'x=ð†=ð†îÈ5]2wöÊötÐF× ´œ×ã¥é„Ë~¢÷Ö±ªÆ„§eTÝÅ쿼£k>PéG v?Ð궲6Ûµ›mQv’‰¹§–Þ"†T|ªº!½»d`Oé€ØGðè¯^Ìú•›øí#;·MÙ 3?w­ü Ý&`‚ 8ߧôvøuäÑT¿dN^"8 p¼¯Ù}ÉFÅuÏ&M+7yD%k68vN- ùËØÉûEæ ?ï¹ßv côÃÑ{>¼ÈŽ ‹<þѯ¬¼ÕÉ{™µÎ5éÆ? 0ñsîênWItöTÉrñDe‚ 4¶Á)"ãí°µ¢ÈÍßc¾ÃÉä {Œfé'ò*«X{žwQÓC(ýMÀóù¥ërüÀ­‹NÅu¥m¦=IA:ÇDuÖš*ºÛ“¨3Y¹kY·«Á" K„rÙ_±t ,”ICÚÏ :Úúlæ1ˆÅÊG¤©¬À€lìÃÎòiªøj~™É†}ÈÝ1¼¡ïÀÓ}«Å!U‡u¤I´!¹ó2B‡ ðÊóéì_e΢-ô@ÙÓéŸWt‘ÜUÀGlØ_i˜E&…Ð /lUw¼Þ'Ûæ‚Mì+Ð ìÞžß)w7¦ÓôŠ<"@Édqå&묙22¸¨,ÒXU@M pÓI A¨þF†Ò°#€ øÇ:Xi&o€™”g™Ë/ƒqfÞô†350T‚wGÑ㶛mgíqðïfnúñ©é&FžšpI/hÓ7´ ÌòdÞKð¢ ~n»§ÚÑûïøùïøùÅG‚ŸMìä`ìX‡CŸ ,çpêp‘à6yÐ!éÀ©ÚÀa†õHI_P`—ŽVzô\L T  4½r ®÷RN|}X<Лtj €¨zô,`3)úX.ÕìU°¦‡9lä¨Ñ-©¡sš¡~xŠGOUÏ«þÁ;µ$AvIΑ{rÛÊt×È”nn´•©’¼»È¢óqéÎÆ¥àOãu5½°¥dUøM¶IÙì&‘) ^Ë‘'@S[+*tVð){—-é”Aƒ!uFà:ß}N—Œ±™²´Yé=6Ó”q06ÓÎMËØÌi‘ŽÒ¿ÁµÁHGÕ#UÝHÿ÷HÇàÝ‹Ýã“9Þš\lmöIªçÁŠ“Ž)êØm¤(Š\P´Bb ŒÓÏ’ÇAZ+Q…c¢8b¸LÉßÉ ä`@Ã8È|,àå¹Nži#Ä"r{Œæû=!"@Aá½X¢C·¨ß£Z㽂ë1!Pâ'œCn[EVµÈ=µ"ÐI#«Ýó«GOd­_]&x`=óWýü¹p·³ÈÆu‚ãrܽm±\`Äß趼 ˆÿné‘lÔy-?“iÜÏ*’|ªàT >˜¼ÌähïÚÐATœ¼\-ÛuOÓ³„.b)5I£‘ƒ[MæßòRpë!ÒgÒ`-Õ`Ux<»;ìÛ3¦¿ â<D˜DÏí†@u EY!ÿÎÀR»æ² Á-Ê~£­¤C"òÞè¶Ç ˆ0s“2 ¢¾¦E*\hN¿¢#{Aî„)Œ±xD¨ »fþë}SlŒMÁFç–>p·mc?Ðå8ÚÎEdš~?=Íîº3ñ/%qZ³ß`Ÿ†äíÓÐ*ç_ܧ?ŒwΖïõlšÌì±Z;©éeW|¯iÆÊîo6ÐZÐR–ÝQvÊ5Z<ßeìóLÕ=¤ûd(9û ÄÓo’ Ð_lî¶OÈê€)¦ØAkêy`d€WR­H—ô7ÇÆÄ8g’~©s­%ieüMp!è‹N;ð„xCN·%b ìL]˜³*í/>úF¥>_9ý…ès|èlÒ{yû£H„›‹oÖæù0Ê+¤3]‚'ïå\qc(¹.ùƒªš#X³"ý…«E˜i3·-‹ã?twà¤tš2ø¡çz‰ö BëS=>'ÚÖÝ&ZS€d—@’qÑ}»ãó0þLöý†ŽH T~6K’lô}D$p ÌP—ò®HƬ„h]NÞ«q,k â _ÐÁ©(: Êh¥{iÈ[â7ýÄ®²ëÖ_t”¨åð!…`qàµ`7 H6àV°Õ̇ôNuÞ®ZÂb–NœÜ:Ëž½0öÄ‘›~0jmñyäø„þ^è69&…Ö¹Íún ®SÖ㜔àõ8zVº2 h.Ôðtˆäà0A SçH惹AgÑàÐ2]´¬Ž'å“&…ûë\ײ'OERDgˆ$Å·²êùZÄU¾WÁ£ó}_«áLÃî÷3Ž7(´Û*ϳ"¯Æ"é<{Ê <(ý»Þv‹S-wض¬ ÎR.È ‚NkÏ2/²üö®% [§‹ƒK¸OÇ’Í@ž“ ŽüÎ_n$0âðt&#˜è{ LV’9SÑppk|µ¯ôÚ(ËWŠ“Wˆ°6PŸ óOÇËÉMmÜæÀ¶/éêÀX™[ ä¼Øœ¥ðŽN™ï˜]‹¼»×V:le´„‰d½;PH%Õe9A<¿Œ?Eœ0 ºÉ6m)Ð9’%ßI'¢xMøT•+YÓÚ's~p*9 Rôšt`&+ЀÉ^Ò%éÊ“ó²èJÀÒ<8f⧱IWªW—°îiCÑ ¨”Å£‚’¯h-§4Fú“G:‹á ®5—:ýûë¾Î°TŽ5¢Üƒ „0‰¨L¬;E§üÐêq€t:¥8m¨8KÂ3-U鶤´¿Á6]H0Z€„Lò¦5–ñ=÷—¹X x :Oe½¦ àzñI aŸ€Ó~å¤áì€Zò/²+ð,Á-{'kùÅÿ{?ú~ ³.Fçu¬Hg9ìç¹Þ¡ÑÏYXø!_X”â‹PùƒJIÛo þ×Ò§ ÛfugRÐ ŠÓÈwô=ÃyDNˆ²óT†ƒ¶”,­ß§‡è Pßú­û¡*ï•óº @ž u¤ƒÎ õ€‘!ú\“14*zå4(|¼zÇ1/¦f`ÅÀÚQÉïýE× ü\qäÕ.WíQbØW•×CeÍÎW}dIæ`ÖÑIŸ&³…Dsn¯Ì£¥@·HYLÞûâÃ2övÉŒö¢ÂUN§°ôò£Eúe@…||™5 ”)²f‰;‡7'Ý®Z1` ¨N\™°É/Ar7¶¦ªW ŒF,+Çñ¸& ­ê €éœIÀjHFÃ"ï{†‰ªáRîXåi”(§Ä6?A z%_HBŒðüu¶šªÞªÉɃޢ…¹RKšäº®Þý೪ÊZç³®·ŒØÕ „Éß\c(ÍûÍ=ÄC œN7RXô`O%htá„G4 óÅع4&¦>]¢)ÀPtP@ûHfŠLEìÝ¡¨Sѱ—Ú8ò×ájàúÁYé|eºL"¾p<Ý×uŠÅ{•e¢bÄ“ 9[y[u7nL  ;®ÊVµ‹ÝBë 6‡·Ù„Óöh°¦M¼JŠ¯¦³DøàE ÑÈ›4-Up‡]&.<–TàôA¸‘\\Ø Ï®Uå åÚ°‚´TJ|2)Ð9ò®ËN¸óf¦]¡Ü&lSQôè{¬+ÅÃÁ»œj[™¸è´Žu 9!ü*—`H•QÇP3W¨ÓÕ)|¢ íæ’0ƒX³[ç}Ìw_é»—¿×ÈÅtZw'¬²¸/àÞà=ñq@5–Ku`EÞƒp€oÖ#‡}ÉèA 8cÀý£À žè岿Žju!8:ÍOÌ=([O÷-9Ù9(üÝ)Z&ÐÙ䦞²¬þ€%}„^Áé ÷y:Iî²%ÏÀƒøOn/&È%³ ¹Ûø&’eŸ’Ø—¥§êAgCR Œ˜Ë¹?1š1Â5­¦ ø¶ñ—t÷³Î 6B–õŸïÛV¶»”ÈyÌÏà#‚†4ñd+3~¹êpjèêÁoŠî›<žK4z‹.Q «usrN­À•“v©C&tæÉþåÇt‚¯iÊ|Ù¼†ÊŽWš"B1XNMƒžý¤ì¤äòq_eY„yùëɯí¨ñ¹a/!b!Ï¥ËñB–?a«û¬¬&×HWO‡Pa”\A‰Pœø}[>²É ÞÖEƒ…éÚ"9@ɨúrloíæ«KH•3ô@5Ðf#Æä±O…“Ù'o¹~$ìSõq 1èŒ\ÞãrÓD2ü ×Ú¿÷¯|‰ÎL ®,O§õé-ëž‘ ¶q=€*ê¼Ø4¨+ᓲPUe8þÀY¦%[wäáp…¹ƒŸ¿àNœÏ–U¯ V­˜¥Ù^H¶|åˆxöË9KqØ‹9<ÉvÎA>°µÒÿDXë‘,7:òj5×æâ{e‰¤pƒB:´UÎpZrÝBùêÕ( @€SÛ~ŸŽ+ªMÝž.zÙ£ü‚&;oQؘ ^ØŒbÅ/,!+ç'úr¨ù|¾Œhço‡µÝÂò¯þò‡Âqy•5£¦tXËÇßkº˜?%15ác°]råxPÓÀ-RvËiY…ç<BÀJØ4hMC¬ç•1€kê ‰„mÀ;¸.™p{ü¡÷ýñcÒŸ:Z«ÛȈKúH8y•t‘ì<Áþ;uÇ;z!<š?@õîŒX\Ë ª;¨ªþñ( —nlúd™ûß¿kó,oûú©õ.+JЂZöM_]lþ~Öÿû!Rélendstream endobj 68 0 obj 4788 endobj 71 0 obj <> stream xœí][ݶú¸¿bÑ—¦AV%REà4)š µgƒ¼äÅ·ØNÖ^ßíýSù¥ŽÄ#’óÍhtÎY{û°€E‡Ã¹ÏèÅqY˜ãrø›þßzôâèűÙ< ÿî?=þêôèÚª<©{|úËÑø‚9¶µ-ìqÛ¹¢õÏŸ OO}öíßO=ª‹Úµ¶š}7<ò£ëºvÓ£†G­dÌø$¼~{ø¡)ŒiK;=zftM•>~qEég ¿UEëú0ºO!£Î£¾qéÂ?ÐÁÏçGÓ“‡ÛE,¿ì“Þvzô¼wU{Óƒ>]»cúãÎtSwÃAŸØÖ H?>©üÊ]¼ýχñž&\Wgˆ¹9NÞ÷]‚×ô®nR8é‹q5»56 ~L§¼;?J°a‹¦í]ÅNÙÐ)—Aú÷†H)ú®‹©¾òû¶m˜ò»‘l{gM“MS¸¾«³) ]¿§¬ÚÖ†÷ËùýlKOè–žn(Ò”Eoª@’gtØC æÓ‡Ó›¶jû˜D‚ÓɸcHG`Ïé‹ÏÆͶ¦«3ÿÂvt2ÝÂɤS~µ¶^Dö†~ÒUtHÓÿ2?š`ùì‚N^+>šñº¼/Þ«qaÎ^ ¡3 ñtFÎmorXÍ«‘‘x^ÔÛRÏ[:À¿:d}°ÿ} ºTÝþŠŽê×-ü¹Šlï«Hí÷À5Ú¦kÒSl)Á‘óøyB‰)"ì@¯é¨i3®·U¶þ£ñýÚleHIà‰á„ã[úþ] ,¸oè(ËK_¿¡ ÿ¹jåi/•ªŒfÞ«Uµ-»ô0s´Íšb®c ¼ä¨)U¼Ê0¨ë3β¹ '¶iŠ²ôšŒñGÕÄ¿¿#úŠÌd”ÄÆ{´~F§ŒŽ_à«Óêü%VKŶïâ8Püü%éÛã¢ÎØ w yê@ $ °‘mÝ“¤Éîç{V/ûÇðKçyfxf#bQU`D<ÓRȲU¾nkú”µ áÑéVfšìœÞÐ÷ŸÞÓk|›;Ï ´NŽ¥þ6®Ò:.n¢kCRœÉÄ@ ½ÚàrüüwJ»ü¡˜]ï€Qaxñï8BþUî%ÕYñ`|ò¯âa:).ªÇ{ „:(n‹’2º‚aÝI/èjBÍÕLçÙù­§óŽžœ’ÎUê‡É”^ý˜ON°î3-„¡óŽ‚‘apÒ"\WئZ„,Š³À°"jÏv±žÚù4ÊGÇáìмcÂáÍbfjoPÔEvÀ²—CgRÏv@.³Uv@bŽæ̲Q©S0t8.÷:¥ÿÀÒÌÌËìAéÏfƒ”~  »ô4UxÙ‘ñŠ=:QmE§éÜ`” œ U®ÈÚ1<,€>fU¥U¾T@Q·°VáåÓa (àô¸Ï£wµƒ…‚WQPÂü~º(mÓSS„tüdç”l€N1±í¦mmî?§l'¢.`+ñf2EŒÒ®‡šç}:ñ™ %ty€€ÝW£rP;ÏÁúI9(M ’Î9,3ŠŒ·.ŒŠ £"·/1µ¡p‚ìî·¾Ì=ú"„Ö:=à,»Hì lÈi¯„ë¼æâQü`„ί—C÷tü¥íËnáuö´ÃºwÅo·„s|¬:¡è´~wJºa@,`€î­¼ú<Éo+kûÔ!½yTñs}†.¬rgĽóü£áÑ)Y˜ë_tEMüwxÔy.Ý´õª9bJ_œì`î<§æ6…xFÛ6#1B[ Â[/'E¹ÒR`ÓrôXAJ"Ñäë\iŒG=¡€q‰‹é£ÑW_Û®¨*$ü"r¢h1-76g䧫ª-Ÿy°oòP48ªV*È‚ˆ„hj©’„HÔ›PÓ–®áH Š¿w1¦Ìž˜ªWaêëÍŽ‡ÄÔª DøìkzºûA1(´„ÁÁµT09KðñË€Á‘!ÖÅ ùÄq½µÐdèpÀ,‘"Ó.üKŠ±‡³Åx1™eR«¦¸|Dw ¨l²šº­3ÝÌÐ÷¯Q,µtTEýu\¸ô m¸Dcd-ÅO$¸« ‡h ¹9µ³øø'•º@c_fsIú[:tïÅ(Úº(+¤×ßz=³ŽQtgk¶uFá@‰Šˆ¾ßOuap5f½ª+žÚ™kVœ®©G*6ËcÔTž½GØ UÁëã [ʼÇ\R¨eVÀQdBfÖÙ¼ÉLkïsÖd%Jð>£mC~ „ißþBçË˶l’¼Æ–Í.ˆŽ…ƒU€ÒN‡Û1”£;›‡PÏ5ðS®T‰­ó‰©mð´oï}NRdg9 ¢ÅR¬ðTF™ùOãÜÎØ.Ó&é@:<¢ø{Lj2-:/;<3<œi!SP¯¢ AÁ? Š^[fÌý‚N G€š#zYc3èp påCÞ"peÀ‹€ƒG_¸ÊœÅíÌV¢:JÊ×É2 VEœô`z2‘LoOÅJý'(-s­(€ª¬D øÂ73•–Ã_+ç¤kµ·t uÒ^\ë*ç$hö›ápkÅÒÄ ½¶žÇôÀ-¾ P‚ƒx@ €²^`»Ob§÷÷¼³O¯–Ø¡`000;`'`˜øÜ">ÄÒÔ*weÔ*GçkÐ1eÀ¼€ýÁ3eÙ÷·7ÃàËö’àQOUÒ ˜Ô€ªþÎ)} ö•(ºbˆ®Ìcˆ€*8ÛúËýÊ Ê´ÞäÐØ=—=o—@n7ÇŒÄ-ùJÖYQ´‡ƒ.ðq±5êÎþž5%xFç¢6hAÅv°€ÚÂÔýEÑwT €Ë]ŽUZå*Pn‚N0àÛ{CÁw`Rê~{ü‚C\ç`ùñ9ùØ€ž€ý«¸œ‡”¥¾ gðÒƒ&ß9ÓÂæφàÕÌi¿yw™›–ÍSŽüôd›ÔN„PHÒÚÚúD^ÜŒ’žS›BgyDZ%°õ…À VŒ"™+[¢®”-m|cC­• €ü"b>™„>ÆÈq¦¾¼{HiX+‘ˆÈÎûÞj˲m-÷ÊiMŽÒá„k䜠¶Ìò=÷W¬‰õépÈK>P褻ªÞ ²%E&|æbs= ‘è#þÁ…¤ÅH‘SvYÞ{ˆI‹FªÝ…›óåB;jâHßÝYÊÄ£ƒ@NßšRà©i¡±Å QNfù‰ü½«›æó.QtÝéºN¡Ç×|eH•7X ˆb(ÈM²Ä Á6j`ñåÑußÖ™`ùðaIð"Ÿ@ÊUàÂpÕ%È]Ý”W¢ÞWÛŸM™üH%á@Lª[„óòüHh_ÄÖêv;¼èïEZ9/ÜTZç+hÛS›†ÞkQÕ:j»Uõ ÏX¹¤+¸ç =¹²¥Q†ñwƒf—,§ƒqù.‹—¸* pŠóY5Ùö]ÐÔxÞõÌ1V5lS(W¥ ìÈ“ö3z÷hè#:ÞrQòÁÌav¹w’"µWgaò!SÊ:t¥t¼CS—+L/¹á0³SöE‰•KíX²™è Í\vÊ â\×ȧհÈä¹ÊIÝ -9‘È3‰@QtOÏMc9Trp>Ò,ø±ïà#«ËÒA ‰w`ì›4 ¦ÔI ûmTü/šóJÅÜŠ<En¦*ø¶tþa9ÕNù|QÓw﵂:Ç ¼øÑz½®róëR.&@öÅû †5J9_´“ ­• šê|®âΞîUô¬SY9¦Ó6hžH”–µ³Á 6Ç9˜m…#4ÉãÊ´6^Ì#Lé«"fͮ祈”³ýO¬©‹Æƒ¤Òp®NŸÁ±.r•AÒ¯‚¥`EÞÜ&¬Ïx€\ —ù ëžDôc.<`è°¾ðÝXSãÅq—·bûh\x•¦e\gH_pÇ@É£ëð'÷b,r¾--°é>L9"H£º ‘mYR,«o ÈFWHL=Z&À‡ ?µ:kØ+´¹šö9›XSØ0ë"e·6ò+Í7àLû¥2èEâ‰-½Ü²¨¾Açᄨ³IøÄ,°ŠÎsø?ë¿Õ}+#º×Â1€ ×Ej÷ë u˜‹-5|…Ö¾Q°d\R{¯ž%;Œ"Säu«AƒimΚtí㣧¸› U5—®BÉ(ŸÉ(.˜–rY&K#q‰F!%¶¢JHál× †óî°ï6Ë{«ÃÙ¼xOKˆú¡¬û}sdä÷ËÙ¦S1Cïm+ø­,À%ùÀºF-2a T]9–Ê`1ü7Qä¯ðq/>\©«gÄuÈωBÒÉ>=öÓ«M˜\÷½'oo¥Sçýê°Ýb@ýÏÙ­! %ÒXø©¯”\¦ $¦Ñ 3ç£f}I|½A¢Lk?«pˆë+$xÑ0ï®ÿ¸¾X é n5Èoå0ž=bÓ3tˆ‘2»$»èÅ@6U–ÓäO†P¬ ñÐHmÒo{šžD_n䆃¸î•.ŒÈ9¹ Ö^ŽZ^7˜+èË W'œ»o‹4xû8 mý“k‡—N úŸò}ð@Ò£ -QÐ%¬Òë¿_QX[ ¹àíPÙ]:©¡ûÎ%& r£®‡QDæ )òí°.©®çs¶»Êy@L@ûzÓqט¢k«ŒâŠ"Éæœ?bP —€ÊvÙ0^Òo–¾Í³S¦ ï»5†:=&çoO“\™élKõƒ„vÅö 9DºÔ8]ÊõzMåG¼^Š9ä§[å†ï†q!ØÙä°Yxö N¨ûÐ3÷kmKÞÃÿ-]ÿ«‘RâNÅàãC|¢÷ªîÐ~Ð)±-®[ù^®µØõB\²æ 2 –öý~Þ¾¼qÍ)uååeð;Kå_)ä:c_hßÚw^ãm<’†œµ>Ž<äÊÚ¢Jœ-Ÿãã ËUÐ;mÀ>€ÐÕ‰¢;>JP\û)­É¨Æ¶]ïRØ=µoÉmû1¤Ö¢Ê¦t•ó UvùA^ÐõÏéûoØ÷ßïûÎßg—º¡ÓG¯ƒÜî]FÛ?ÐÁ§[eiË®oSŒ_J‚m–¾d¿AßPêÐ^|ø‹Í#3àÄÏèñ¾š‰ á_ür$`¿ƒ!YÆzV6°±~®ÞŸÔ}Q'†œJï-×Ä‘1Ì:¯m˜Q›^N.ÛÎ÷“úhlâ¤èöí»ó„‰Fœ.ûd~ÔæDbòê›x®ëÓ5Îév…«,JxROŽÀ…µ#Þ#p}þÓ®º\{9"¾®‘‹ø-[­¥–¾¿"ùy/Þù,'QjÇ¢i+Ü4ã¼×V×TH›)Á–:ætÙRQ s¹dš7§Á`€þýÒš@R×*•Eç©ò—ØAæXÅ7Y”s4$ÊÁ©Ó£Ž€ª÷u% ¡QS–ìô¢Œs=nñ5¥Äºt±µ•$çÊ{a=ò!ÍMJ`ÈS‹T•FΧí©räÖ/d‡ÈZôFoYÔ°YáÎÑ6¹Ž!ìç%ÁtÔj¢ÚÕrD¯MÐÅúu9ÀÔŸ˜¤!}À=ùuº ð.mA *€ Àx¸ÐÖ&€¡ì¼‡÷XoÍÃhÁU’©“7äé2%ø†<(¦# ¾bž²¹…G_„r¹m=@ûueCØM­UÙ²À: ,Òzc¨ú>Ey‹øQ-hÀˆ¦U[x-æÕƒ¶ñ ›)¶J‰¾+©öFÈßJÒ¢ˆ¥ÀÔT±p!/mgï°ü™` ƒÏMÒOýòàU\|z‰—ÇW°P®ìçlÎÏ¿Èṙ»S²±®oÈåy“¿Õ¥ÄÈfMxñ‚nY¢;L–QŠ…Éç\•±³ÊT^›ã“Æ“_Ccè õðè›Óãÿ(úÕendstream endobj 72 0 obj 5605 endobj 75 0 obj <> stream xœí]K“ܶ®ÊqÅåT†"‚½¤œlT‰«’ÈÒVùç íêeI+ÉzYùQùä@ 6†3ÒJûà2Ä£Ñèçט7§e¡NËáßñ¿—/OÞœ¼9UÛ¶é?—/Oÿtqrû^UžöEßTM}zñøÄ} Nk]õiÛ™¢µí/O†Ö‹«“[ûîâ—]hÓÖÕØôÃÐd{k­ÍØthjm“R®eúüîð‡¦Pª-ë±é×iDÓTaçWÃ_LQÚQ¦ß MUÑš~êŒz]Ò^/¦¦¾1áÄ÷iç×sÓØòh7IÍOûl^o;6ýN´Þ¢½ƒáÁF¯‡¦Û÷ìÿ{½©•.;ߦ²3wþöï¸!tßW={"Ú?>Ë%¦ÕmØy$VZwá_~£Ã<˜I0Îyë¥c¢¶/ÛŽž‚öOÑ‘ !'3-éÖ\“ËÔáZþºeIeGPÕ4¦ÇäÓiÿàš:½ãRÇ%ÝÀ?U´sE—Y¸eUN«,ÝölŸø’a/°‰^ÞŒþQ…Ìã1¤Ù‡úüµÚX![EûŒžÏ5eŒçt¶_è‡yì¼³€J8—ôò´è ?¼w cËÙ¼àˆˆ?¾¥BU!¶ TH¸ ’àþ43µÇ‘Ðü»7]Û´¼ º"j ¬läÂ}Wµm±ã§ýtávÝÙ›kåòÆR²oüaÿì¤n?åò%öòÎZñÄ^QîJ뎈6@\3³8A~~×õ5ªO̼?G «éÃÂõêÙ þ¯Üê±â$üËC†zN§DÃ\Ò©6‹a™ÆŸ6–fr@Ê@˜80ÚROœbE–ֻÉJþ¬DÒ*mìi~“£¥`/p,SJ‰¡¢i'Þv‘‘ýŠ£8[0b††*í1Û™óx‚³™¯äd2;±1LRšhD°|Ï> 7d­ç:âŸO;â—ÑqRžvpÞ“Ùb»b§}HGAotLN`p}”´ÇÁºÑ}iý tÌ‚oé^ÁU«é¡5þA„¢ùŒ~xU4tµ¿ gJD6¯¸ŽE™–RFó”IZ4:à»p,™¸Ù4Ó@Ïð¦€1¥é×Rè®ÕM[U@& ÐIi«JóÆ“²±‡Ó¬P!@ÝŒ£ðŒ»s{#šDW Ä‚¦¡ ' UYTVltUtATç¯(Y€Pãà³,Rñnºˆ}£×Õ1$ô× ‡†K­utSÆà °1×ZŸ2; ,ö­kê{bk‚ ˆÈ¬èö?>qÏ–ˆ…öZÜq`žQ.9Ç%ÎÅã¸èöÖ|ÅlKDCûøš#ØÆR …0ež™ €"o¼€[°Ë¡‹›Üñ«Ùº£3Óè6ž–ý¯SôÛ+Yá³3jô/+ 5ù¦.»¢¬Z` §ƒ{ —>&ÂCóæ—’ MÑ*¢/³¢¶²Eć€KÅÚMEÅr†á稱íÏ·èMðnÐ" ‡›I¢}N4 }ÊŠ‚ÃyʼnK°{°" ¶€š ›þCwÂó÷‘ƒú²y–åbcˆÐàPdy#.Ú¶$©¦šçÓ¼ îÂ%é¤8ОÞ*§þŽ.aTûÀK»p|ágòÓIÆè'Ä_€l «.Ûùô@ŒfRãHˆ•=¦DJ†#ƒ£³ºPfHº]ø>ÉIt§¡•ˆ˜Ú“¦ oÝSI‘u,›^&=MŸ0´³´Ýð–Ùd©â¤% ±½pÎ@Ôˈ×2 Ÿ“•D¾iªÚ 2>Kˋćà @p|6χ¦öÁÏu3ˆcëÍrøÓ5Hó&ö¸^¤4€‡µœEü.–Qä6ð:£nMTsâ‚Eò–Vf0}ÿ\À ¿ø“À8 6´í‡´¸\ÐVóuÈ Ü[ñýæì‚R8mãöÕË:‡ Nç_ Ië©š6%|U`RE“N¸&ÌÌŒl4¥J{ù*º^+6ηä …ÏfŠg¥°#T`•#C[¼ø`œIµíW†­Û‚–ÓH¼ÐéÀ§@T ø\Ô)óœ7%ÿ&E‡‘Á‚ÜS€÷ >Á‚…\ËiÓü€AØôÚ ïÛ÷tuª¬ÃPÛt¹î›ÂÒéÔêý¢ „¹qTìU¯ù¯‹ÞŠÌIbVL¯-Þ:Æpßqi­ö"¥á×¢^oç‰'†yºïðOhÓ™£VŒÅ øPõÝ!Ò^f‰€^@.-ºÒO‡,©Zp÷>”Ù<Ú_&Ôªds€Id~ì€é„–…&ÒNÁ^!Ó•à=Ƭ;õ—0B¹ ‡M||^vKÒ`àˆzYpZ°% Sdá'™Ÿ?.Ôa€!9®‘%u·©èâ®ÌÍÎbt—ÇLóNBS‚Ð9]ŠlôYŒÆ~´LéSË$l£CX¡Ö]í°Bmà“¯u¸(²Ý+–êÙ ­÷)ÅN1 @P$‘yõv:0í=Õ9[úÂÞŒ÷‚ +ŠêÊ‚‡pP÷*eC™ ˜ ÃÈúž«°NÐõ°Š?3@•l«oI‘:qñÏ!3Õé0H`RÎ3 ¼¤™T$J>íÈWü¼Êƈ}ÎM‹®€!%JÛ˜Ez]ìäDÉëúTÿaÆZIÍX]Ú/ûê5c š¶/—*‰‡‰åJ„+?¡+æÝ•µ¡Hd—W¤2›RV ¼¡cQ¼ox‹ùF«Ù¥à³iñ$du/Éæyn”>ÈšÍû_ÿÜRoH˜¸y F‘ÁŠ²ËD†ÌÈoìû«Y¨O$ý0õN¸â9ØàQ£l8\ Ñëo¶ú|›=€nj($¹bå F¦ì„V˜Sv„äHzŽöø` L´è MxøðˆôšHZ•%Ä=¾8ñ«Ö(ümÌzd KddÔ9¸2Ÿe˜KÅ…ûæ¢ÐàœøFÊÞKÙ,`(z„éë†j*£Šá™¢ÃçÆi¨œö¹«mœZ’ùúi< ðrü‰È¼Ì’£ç„3â!9À‚e i.,Œ@<`e0Z@„Æ&d âATYE÷ªn1J“~~eµyÇ屡!“b6ð ¤ÆQ £ï—ŠŸÒ±)ÏZ†‘åÛ·5&çÀ*ljêØãàèð ý‹’f–ì;u šÎÿ=´…˜W°Íi¦º,m+z~á'§4´©ûgìY$õÜ"[Uõèçl•ÿˆ\G4z6"š‡üÝeKBõ`GÛÝoj¥Šªî€ËtäW d¾_ѲZŸG¡žÊ¡n«†e…żO:ˆ-SÞÌŠ,ËÂÈ©(EJ~dÕyò©óµõÁ™6µŽq$߀ÿ(sK²Þ£Ê*YyªßeqTf7~ÏÁ&]6—-¼áVðÀ°Í&êÊ!‰ž©¸4Æ…"¼e5º°#½¾,ƒv£[ë`µ(·÷;HÀAÂ"ý?5‚‘µý´n€Ï~¯Ó•¹<²c¾Ž½<·6 LqÙY<ÝIù8^Ì'dò7Ë9 èz Â<7Z¥ÀŒØJ„÷<¿ií,}{å¡•éÖs)繄QO CªO9š Lz—àDdÖl–O…¬¤`jð|î˜ÅÐ=©ôO>Ì¥Á†¢'-¬0Sµ]}$Y¸\€p»²š žÒ8Qõ‘ámne!_Þ•™=Ÿ‰”®giï½®“½’®b!õV~D\Í?Ÿ“|j5Vþ"gÀ«ïî_ßp ÀØ"“ßMøÚÙŠ7GÓáÁe_àÑÈ9Î&î¦óKb>ì•v ƒ¸³):ú:æ g¥¹yÖ(ÏÌ_!‰/ÃÊ,UQ·JtN»CâN_…É@@$€€é¾´½W<‚·Ç ¾Åû/Èe¿Ä(õlueʬ{Ý;²ao¶"÷LÿoxŸMövŽÄË~<É3ÂÇY¡q>±÷ò¿œ'ŽÄ ÀhòǾ?à‹„L®-Üœ—‰‰L‰œwø%:WV׺ 6ŽÎ×/€\Mú©žÝÓð¸¥jÝîÛ¢QHßÝh— $ø‰KTЃ@ï>oŸYqˆ÷F–ƒskkf@å¥LeãÁó¼ÉÏB„Mc™ŒÒ…iÑ;ZYI„´%•ø±bÙý“ýÂ_žñb*45²@;Y%äÃ=ˆdŠÐ®ñ2üÑDo$ÀC2øªìÑF¾däüxÓ¨nMŠK“ñ?W*Cäþ k›uÅÓR8qG€¬ö~io9ÞÀ‡ú>3v˜XåióG"æ?¾y鸉¥¸E $1µ"=Üäò‹^óÓ¤eD‡tØÁkKC,Û-nêrØ%zã„â¡ÒÕ, ÆE“6‘¢—ÁË8˜¦Ãû/Ç4oˆíö=ÕŸv–èÕ&V\iU4Ûçfê¢ L†ß»[Ý›.>ן܉›^Ã<ÄÀîu Ϻt êM­"€b­»0¦6ò£ éã:ÉðýH‰ºíúfq•/ÝD–E??Y:RW©®7ÒÝ‚I_Ó¥=¢4dz6`âÿn»YcO5§º¢6}HNÓð‹y4©²epš×®s«ºXF}t¬Þ÷ ·ésÍý;ºþWóü擘ª§ùMnÓ^°ªCe{áÀÉí.v«(Ðù壑wëªíy¢xD]žeg™Ÿkºf¸Ñàñ™ÌøôkjûÞ™*ü¾˜šÚø·Ê¿§|–ôI$Á‡ümœiYG~{éèö´OñA¶w]¹lÔ3›»ClÊzrŸœMÙu¨"›ö9e`4%`ÇÓä%ÀÌ_Þ D§Œp¿oÙ‘€½ ½žÑ^€.fWkš·¦áp;œÈŒn·ì*¾ C¾f‡(;p=&ÅWÒ9\8Ðuž¤›&þ£3˜ªÒ/®Ó}g©Ù[j–Öc©ü¹A-{=4ýåâôÇ“áßÿó…Nendstream endobj 76 0 obj 4078 endobj 79 0 obj <> stream xœÕ]msܶNóQ¿âfú¡NÇGo$‘orâÄÊ‹¥ÚNÓ´Ét$Û’[V,Ëqœ__ ïì³$îtT¦ã™(ƒÁÅb÷Áîb±|³( ±(Ûýߧ{oöÞ,D×6üyz±¸÷doÿ‘,¶°•¬ôâÉÙž@,´Ò…^Ô)j×~±×¶>y¶wçð“'¿ì©B™Z˾髶ÉõVJ™¾éqÛT»&!|ËðøqûCUQ—ºoºF4•Œ;_¶¿˜¢t£ _·M²¨:£^O)E ×«¡ÉV&~ñcÚù×uSßò|õÍ¿öç5½ußôq½'Ysɾn›ö µu!…éz©+Q(kKYuN¿jûÛÂ4¶o(|ƒ®LSÅœºßþ"DaD-ÂõtC ]ʸI]*°Ä¢,ŒQÑó¢¥MÇ}Ÿ¦d‡ŸÑ¦çéco{v˜Pî—¦qR)äb©dÑ4á{:þ YˆR'ú“ó@M:¾òMZɹ—³¦•@Yƒ¹z‰ ;Ü…}m˺á›NèX¯×c©su!l:•ñ-áDÙÄÏ?§¯Äv˜Ê5•ä”H0Ö•ïU©Z%/~KþŽ 8 šÀ‹AÓ3N.é{{ºkS«díÏ<ÝRÕ‰€…œ|E9Yø­( F:#ìJ_vÉ#°o,0ÆÆ´€¹¬;§{èµ $ž xÌ°úš>È‹€{a*§”>8•€šhGöl'ë,ý/e×gw£T™àügþc†üºÇU7b"ÀW”¢€S&\[OäÀOºÉr»YÜô–̼¯W‡c&Š/üˆÊZ%¹uH Äg˜P¸wd"O:n'›"ØÕ».uéhqÒ³t›‘­˜G*ʧãã-dê˜ÔáÖµajãõ°Gµahz¸Ö†¡é zQ6Uq™xHE˜ªŠ_K­à…w×BŸ ÿû½U#¥æäˆ0¼`!.”Á¯èƒ`hÎñ¸rÛ§I–h1Ê› ¿%(±žaÈóš3\çXè‚&^œø—ŒÛY 1¼·ÃÛ¥lÜQ«ú‰_¦Öœ2øÎ"ÜB$.PÇ36(Ôù„ÂПq”߆§¬ž6ªÜ•…²ÕXŒÎ7ÒÌ®óuY¨[Ôy0úÃ'ÔÃÏC‹àì/‰ |“"3³·C­‹Š˜ ™™ÞEZÔ#ôn|ÎFÏ:ÁQ¤C؈ŽüyËŸihl³,PTµÞèl3:•[þffÐ1îåÕíÎÃ3à`æ‰û§“pPeÀÁÌôúðƒô‚£8. ¸³*Ò¬°´3È⟙7AúãÐr6^å  P7Ž#>Ë@™-V–E#vAÝj,eŒÐ³£Œ²…¼E”¡ÏýЛ6Öùî«úÁ¿2°hföxÓÄ,ª3°hfz½iRzA‚ÕºZãé nÐÖß=´)j„c³j¬*µ3#f›±HP¦™¤jå[ƒ{ô õvŽõmuÓ(ö•Ç^âŒYÇ©À‰x‚7çVf^ƒwTÖàN“;3ÓÛᎮ½ ñ€ÌKªìÔÛ ò ç潿Ӣ Õ Ò9üô”À õ‚”gÚiß”¸ÐYY°ÔS‘ãœhÎ Éb’,w Þf,ßd©Û¿³â[Ù¢¹=|ûîá×*I×ìd4 €jßf€ÐÌŒò Tf² 43½„  w„õ{Itt @(Aš„GlTdÞLÆ…×nW3r%ÏÇÊ1¨¶X4$J³»Pô6c1€SêfnÀÑVæ ut âó à™™aþXɦà”eÍ<ïˆi0…_hŒ¸:§^ËÁTÔa/j>cð‹ž!MdY ü›ïDïu)ÿñ `DÍ"§&Ü‹ ÜÚb9¬Ñ­vetm5Æ-7”œ·êª°·ˆ[4fxïÑQg9CVCêþƒ‡?t/—¦ÐB¯’mÒ=ž†µ¹ùÙÁšT€§y°&¦amî)t°&%˜BÞA`Ï0Ú=QÁMÌÄ¡ÎH³Vèµ£ÿ± ½#ç}¿ùNv˘Ú߆ùÔ©9ÊÞzú+Õ/”+Üv-Ù[^XˆÞFXYX­õÎŽ¶‹h·›&6m Ñ•(Ìí!ô=ߤk“Þøî‹ Œ™!þð°¡LɃ،læ¹gàs”À Nמgbq÷¶¿%æ.½’n&rž¡v%û0w?ß^Lï}ñ˜§t€ÒÁõÆIœd¢Šñ;h½ƒsÚ)ÃÝFTXP2ÍÎ6¶k#Tjòœ‘ ›BDù1ü ?ál‡tOzÿ¼ÿI5U"Þ9û`|’$[2÷Å*gY&ÛÞaÎÎ=bÕð×€Á]ep-œ«GáuBl2äH!Œõ®Ÿ3àRV––÷DÊÚ¦KvÉ.Ùæ‹c °$}¿< “L¹é]o $`Èñ¢#àÒ?½£ž®Û®/V·=áNÞMv¾þ¸ƒ³¾1±ºwì1\A/«›'O]ipyœÃûz‚º´ŽOÀüÏ«'¸É>”áܦ v‰nKðâÈð@  ( h¤Ä {½XÀs™®yL‰‘¬ÊxƒwRÖÛ™ÿÁY%ã.ØH‰O>ò³Q¥u°UäU,.ˆ¶gYãã@7²B›T†Ü½€hxœ…dùrA:NbŠ|}Õ“dL™D)A$Õš¡¨?ò;Ú—<9WÈàÁ|Ÿ@"k’@Bsߒߧ˜LpÄÈFPŸ8Ù9¾|E¹ÇÝ–[ª¦-dÔ€mÖš2\`†ƒ½ƒ¯¸ H-¨X À?ïLl$ýÝfe‰$CwË<ð:§k˜}å·°šÞ%¦YËmÁ_­Ä<1øÒÁê-¨:.ӺѰ{—ìȃ¦#­àˆ $A6ÝÌ2‡Eþ°œƒÃ{To€`}ÊN tæÃÀ§ RJ³/þäXµ\&ALÉ÷~ Öj;}c PôâÏ{GY8’Qµæ HôäÁ಺Œ´?(•†&2fD¬a6±8ÑÓÝÝNÂ;þ÷¶ Ž ¶þj ØÕ†€¬]8‘«*$]pСJÕ–rwEÄ™¿;u“ú;+ži•8¶ŽqLX¹çµ |hTâé´Œhkrê4Á'x>ºšÚó&ÅÑ”¤Kúü;ÚÔÇ<Ge2äkÚPyá÷$Y4ã^ÐÞ€s½ ÑXtfÕš:½ Ø*šøx8Xnºnøy<]“‘T/—,  MÇ 8—Ø?m/E›ªxaµ3ëöÞe™ÞÏ­ÅþÁB´Ú2|yoÙþ“ÏÂ,¤³Qm›Ûsç#¤_«|<]ºF뺷2æiyÊ.éË,Î^ò4WîõžˆŽæ¿ŒÒ\ Ç7 hæ—NQ¥;gÕèÞÙö֤Ѱá”Æ )DB£´LM‚ hzéÉTn¬DÃ8ˆŠ_ š.ÞöZ/UšÍqf3¡ãž¶„…“¸ÀÀ¯áçx“r§´‰ÛªNUQþc¬êB’¯Ô­Äi¨ÝJú8 üe|Q)JžÈÊCEy8ôâ±ét­M Ýïè0×+Iýð>y@&›<¥s=¡#šWÙôdÈ5©êž³³,k—”Ï*î\Õ6uRÁ:]zS°*‹ ešœ­Ÿ0‘DB¹¹8¡º0#Mðôkbmc˜¦äG›Së0 ¤|Ú:[8€ÑÀéœáóyôó&b»Ñ%Fto¬:û²=j×méyg¬6nCªÚ/¥I[DÉúPBGQ¥.“NÈp…[i©tN2ùÜž—ã‡ìÜ8uH6¥x,ð >ª—¢­´”erTd‡‰pÒ\vØj÷ë³ÃÚ"Ìɤƒì°Ð ;lXIîVÜë§áÅäP°D*z“OzBn$ˆ ·,ïÄÚA4n£˜_1 Y¦‘Ø •õq¡¼üK>Ž>·áyYS Žf—åÞ'¿€ØO,ˆ0уà‡ƒ&àNéÿ†¥šœÝ CŠÇÃã6ÍYâÕê˜2t¤Œ[pI6w=´Å_ ÷!?tª¸çh ‡D¡Æ¯ÞlT4ÿ¦yømSîË%ìqãHæWéxó/®ó©ã#µWoVÕ=žÝ>¤ÓLjšxÜ€—ª±í=[j´¯ÐŒ§þ„¿ƒš±(Gy2X·ÖÕ4¹ì1}ç÷vdôݯñBt#;b©ÉêÌV  ò)ò è ÿx"D’’¾¹lœr´Éð½|ªŠ¨mÑ~P¯ ¡ŒÚg »Ü# š ß‹»£K`C{iÚë'„Ï>?áÞÍfдæ`š÷T˜q@a×`aS ¿ÞãLšòîÅÚ¬&íÒpyWÌä#“d21XgàÁ•»jÒ/nôhòΕ`€ ¨$&˜ºd)æ¾E6yâ Na¹í¡9£Crõ:á͵?²1B$zrêàÚñNÌgi…nШ€È‘ä’àVWç8£´ðßc¥ £9˘ΨeuÜw܃ÌCP*r&14AW”‚× Rlh‚“æQ›MgMxkø«oÀƒ¸ï §F”ÆI¹Z,«6=€yõ0èú‹í¿ÿL¹e4endstream endobj 80 0 obj 4809 endobj 87 0 obj <> stream xœÝXKoÓ@–8úWøÙzßÞ#¥T¢*¨¤©8 !¡”¤¯´Rÿ=ë¬×ÞÝ™u\¸ ”C”ñxÞ3ßLnˊвj>í÷b]Ü·%ÝÑü×b]Ίƒ)«JCŒbJ”³Ë½@KÁ¥®%Ñ–¾.êlY¼|ÿjö«à„K-XK:iH–›s.[ÒyCÒ–D©£ø×ÏšŠPª+Ñ’î¼D©XÌ|Ý<‘¤²R¼àmCbDKã™1®´áZy’Q2V|™ozRKùÞ)yµ?{{uKz1ÊÞù(ßñˆ£›†t0µ¿ƒDOåDY}f5סû_ú{g/v!¡Ve¼¥º\J#™ Ó+‰¤†Ó4½½°Àjšè¬Ð]Oúê‰+ÖV¨ÔÜļشö2&`y{ûÀkÖŽÔº ©T±–{÷ æ]é†yãq1Ý9‚Ôß«>Ô‚D)˜V1µJÂsØ·¡×òm¹w\̶¦Žß?Ú™I)‘UêRÄÚE&ðʺÙ5ùÚjTü´>Y—Ò˜t>í +Û«'Ä?¤x‡{•‡â5±”tt^B‘H¯ßeý;ƒ9WYˆÇ[è˸¯²î*)$–Þð` Z)*ˆtºÄ*_»w ­dRŒÆœ8kdÏŒqåEžôik9rf›}­Ÿ¾]Ÿ=õ)à± ꨀŽj Ó."^k;|„EF Ûƒ0t´”SX°S8 >4¤šÔZi_ 0‘¤ùÌf]%9AZ™&Ax{™Ž »áÎó²n ¬m7ÓÓmé0˜ˆûZ2&=ÀÏ}õ‚ƽêŸ$õÔNtMÁDŸÂÔ"À‡L¼<< -¦?fFüÏAQ:&"–dNhšA€0¬ÈÔ ¦–²t ·iÄÁå <é¼qˆ%9xBç‚7K¸„!2¿e¶ ´rÎá†ùôÜV(¦µ µu¦Žd BN¡áò¸Eî ,xqŒ{o"p€ã2›[)+)öçv ,FJ/HMÞ-¤Ì&É>»Ñ/©0‰uð6ƒjWÙ p[vu,ð)‹q̪±gCaTE3«‚¯G²ÅåUB™Š¨Èyv„‚¥= «îBÿÁrxFÊ×k· ç`jø˜ $|ÏŒ€A¸ù5抪¤CŽ³âºJ–,Dr®÷1²ëÙDr%#u‡„d=‡£j‹!<³[¤Q Ææ×öÇáÅMU8¨áHúÛQ@æþ6ñJ8dú— ¹©P¬GpAŽÂþa†pÐxHcŒÂoøÇà7â8ŽGKâXôž9fnºñ—GNdAY6¤˜sÿsFúV-® RÛ˜8\ -üxiçxP'%Ý)a±¬€$ÏÅ!Wbe!1™M¦›”I“XªØä Þù3-3yÂnCÈðÆ‚¼^•™<ébÁ4µ×{]Nd­I]gtGRßÍÊOEóù ÈÆG1endstream endobj 88 0 obj 1103 endobj 7 0 obj <> /Contents 8 0 R >> endobj 23 0 obj <> /Contents 24 0 R >> endobj 28 0 obj <> /Contents 29 0 R >> endobj 34 0 obj <> /Contents 35 0 R >> endobj 38 0 obj <> /Contents 39 0 R >> endobj 42 0 obj <> /Contents 43 0 R >> endobj 46 0 obj <> /Contents 47 0 R >> endobj 50 0 obj <> /Contents 51 0 R >> endobj 54 0 obj <> /Contents 55 0 R >> endobj 58 0 obj <> /Contents 59 0 R >> endobj 62 0 obj <> /Contents 63 0 R >> endobj 66 0 obj <> /Contents 67 0 R >> endobj 70 0 obj <> /Contents 71 0 R >> endobj 74 0 obj <> /Contents 75 0 R >> endobj 78 0 obj <> /Contents 79 0 R >> endobj 86 0 obj <> /Contents 87 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R 23 0 R 28 0 R 34 0 R 38 0 R 42 0 R 46 0 R 50 0 R 54 0 R 58 0 R 62 0 R 66 0 R 70 0 R 74 0 R 78 0 R 86 0 R ] /Count 16 >> endobj 1 0 obj <> endobj 6 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 5 0 obj <>stream xœkhÙDÀ€ endstream endobj 4 0 obj <>stream xœc`Ù endstream endobj 27 0 obj <> endobj 33 0 obj <> endobj 37 0 obj <> endobj 41 0 obj <> endobj 45 0 obj <> endobj 49 0 obj <> endobj 53 0 obj <> endobj 57 0 obj <> endobj 61 0 obj <> endobj 65 0 obj <> endobj 69 0 obj <> endobj 73 0 obj <> endobj 77 0 obj <> endobj 83 0 obj <>stream 0 0 0 0 57 56 d1 57 0 0 56 0 0 cm BI /IM true /W 57 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID & H°N ¬ XA`¸A`p°a‚á‚„ „ X,B‚äÕÁ‡ÃƆ x><|<0xaàø`ðaððÁá¸<<ø€ EI endstream endobj 84 0 obj <>stream 0 0 0 -51 57 5 d1 57 0 0 56 0 -51 cm BI /IM true /W 57 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &¨Ø8prj¸0ðÃàðÃÁƒÃàÃÃà > <<> <0ø<7ðK\, X\XApX °apAaÁ`‚Â…Á ¡Iªð EI endstream endobj 85 0 obj <> endobj 89 0 obj <> endobj 82 0 obj <>/FontBBox[0 0 57 107]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 1/Widths[ 0 0] >> endobj 26 0 obj <> endobj 90 0 obj <> endobj 18 0 obj <> endobj 20 0 obj <> endobj 91 0 obj <> endobj 19 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 31 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 92 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <> endobj 93 0 obj <> endobj 11 0 obj <> endobj 94 0 obj <> endobj 10 0 obj <> endobj 32 0 obj <> endobj 81 0 obj <> endobj 2 0 obj <>endobj xref 0 95 0000000000 65535 f 0000066811 00000 n 0000080039 00000 n 0000066646 00000 n 0000067209 00000 n 0000067061 00000 n 0000066859 00000 n 0000064302 00000 n 0000000015 00000 n 0000004140 00000 n 0000078776 00000 n 0000077567 00000 n 0000076352 00000 n 0000075213 00000 n 0000073914 00000 n 0000073976 00000 n 0000072641 00000 n 0000072702 00000 n 0000070244 00000 n 0000071509 00000 n 0000070307 00000 n 0000066933 00000 n 0000066963 00000 n 0000064462 00000 n 0000004160 00000 n 0000007929 00000 n 0000069035 00000 n 0000067356 00000 n 0000064614 00000 n 0000007950 00000 n 0000012814 00000 n 0000073839 00000 n 0000078841 00000 n 0000067432 00000 n 0000064766 00000 n 0000012835 00000 n 0000016053 00000 n 0000067519 00000 n 0000064910 00000 n 0000016074 00000 n 0000019705 00000 n 0000067573 00000 n 0000065054 00000 n 0000019726 00000 n 0000022759 00000 n 0000067627 00000 n 0000065198 00000 n 0000022780 00000 n 0000026892 00000 n 0000067681 00000 n 0000065342 00000 n 0000026913 00000 n 0000030570 00000 n 0000067757 00000 n 0000065486 00000 n 0000030591 00000 n 0000035121 00000 n 0000067822 00000 n 0000065630 00000 n 0000035142 00000 n 0000038696 00000 n 0000067876 00000 n 0000065774 00000 n 0000038717 00000 n 0000043433 00000 n 0000067930 00000 n 0000065918 00000 n 0000043454 00000 n 0000048314 00000 n 0000067995 00000 n 0000066062 00000 n 0000048335 00000 n 0000054012 00000 n 0000068049 00000 n 0000066206 00000 n 0000054033 00000 n 0000058183 00000 n 0000068125 00000 n 0000066350 00000 n 0000058204 00000 n 0000063085 00000 n 0000079980 00000 n 0000068851 00000 n 0000068190 00000 n 0000068443 00000 n 0000068701 00000 n 0000066502 00000 n 0000063106 00000 n 0000064281 00000 n 0000068808 00000 n 0000070190 00000 n 0000071455 00000 n 0000075125 00000 n 0000077507 00000 n 0000078722 00000 n trailer << /Size 95 /Root 1 0 R /Info 2 0 R >> startxref 80249 %%EOF 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 250 250 250 333 500 556 889 500 500 333 1000 500 333 944 250 250 250 250 250 25/usr/akumar/alt/devel/gs/ijs/ijs_spec.ps 644 0 0 234637 11241503077 17315ustar00akumarakumar%!PS-Adobe-2.0 %%Creator: dvips(k) 5.86e Copyright 2001 Radical Eye Software %%Title: ijs_spec.dvi %%Pages: 16 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentFonts: Helvetica-Bold Times-Roman Times-Bold Times-Italic %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -q ijs_spec.dvi -o ijs_spec.ps %DVIPSParameters: dpi=600, compressed %DVIPSSource: TeX output 2002.01.22:1612 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: 8r.enc % @@psencodingfile@{ % author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry", % version = "0.6", % date = "1 July 1998", % filename = "8r.enc", % email = "tex-fonts@@tug.org", % docstring = "Encoding for TrueType or Type 1 fonts % to be used with TeX." % @} % % Idea is to have all the characters normally included in Type 1 fonts % available for typesetting. This is effectively the characters in Adobe % Standard Encoding + ISO Latin 1 + extra characters from Lucida. % % Character code assignments were made as follows: % % (1) the Windows ANSI characters are almost all in their Windows ANSI % positions, because some Windows users cannot easily reencode the % fonts, and it makes no difference on other systems. The only Windows % ANSI characters not available are those that make no sense for % typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen % (173). quotesingle and grave are moved just because it's such an % irritation not having them in TeX positions. % % (2) Remaining characters are assigned arbitrarily to the lower part % of the range, avoiding 0, 10 and 13 in case we meet dumb software. % % (3) Y&Y Lucida Bright includes some extra text characters; in the % hopes that other PostScript fonts, perhaps created for public % consumption, will include them, they are included starting at 0x12. % % (4) Remaining positions left undefined are for use in (hopefully) % upward-compatible revisions, if someday more characters are generally % available. % % (5) hyphen appears twice for compatibility with both % ASCII and Windows. % /TeXBase1Encoding [ % 0x00 (encoded characters from Adobe Standard not in Windows 3.1) /.notdef /dotaccent /fi /fl /fraction /hungarumlaut /Lslash /lslash /ogonek /ring /.notdef /breve /minus /.notdef % These are the only two remaining unencoded characters, so may as % well include them. /Zcaron /zcaron % 0x10 /caron /dotlessi % (unusual TeX characters available in, e.g., Lucida Bright) /dotlessj /ff /ffi /ffl /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef % very contentious; it's so painful not having quoteleft and quoteright % at 96 and 145 that we move the things normally found there to here. /grave /quotesingle % 0x20 (ASCII begins) /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash % 0x30 /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question % 0x40 /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O % 0x50 /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore % 0x60 /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o % 0x70 /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef % rubout; ASCII ends % 0x80 /.notdef /.notdef /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft /OE /.notdef /.notdef /.notdef % 0x90 /.notdef /.notdef /.notdef /quotedblleft /quotedblright /bullet /endash /emdash /tilde /trademark /scaron /guilsinglright /oe /.notdef /.notdef /Ydieresis % 0xA0 /.notdef % nobreakspace /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen % Y&Y (also at 45); Windows' softhyphen /registered /macron % 0xD0 /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown % 0xC0 /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis % 0xD0 /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls % 0xE0 /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis % 0xF0 /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def %%EndProcSet %%BeginProcSet: texps.pro %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics exch def dict begin Encoding{exch dup type/integertype ne{pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def} ifelse}forall Metrics/Metrics currentdict end def[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{ dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[exch{dup CharStrings exch known not{pop/.notdef/Encoding true def} if}forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def} def end %%EndProcSet %%BeginProcSet: special.pro %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState save N userdict maxlength dict begin/magscale true def normalscale currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{ CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end} repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N /@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X /yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet %%BeginProcSet: color.pro %! TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll }repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def /TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{ setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{ /currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC /Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC /Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0 setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0 setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61 0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC /Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0 setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87 0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{ 0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{ 0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC /Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0 setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0 setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90 0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0 setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0 0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{ 0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{ 0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0 setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0 0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1 0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11 0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0 setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0 0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC /Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0 setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0 0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0 1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC /PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0 setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{ 0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor} DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70 setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0 setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1 setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end %%EndProcSet TeXDict begin 39158280 55380996 1000 600 600 (ijs_spec.dvi) @start %DVIPSBitmapFont: Fa cmmi9 9 2 /Fa 2 63 df<171C177EEE01FEEE07FCEE1FF0EE7FC0923801FF00ED07FCED1FF0ED7FC0 4A48C7FCEC07FCEC1FF0EC7FC04948C8FCEB07FCEB1FF0EB7FC04848C9FCEA07FCEA1FF0 EA7FC048CAFCA2EA7FC0EA1FF0EA07FCEA01FF38007FC0EB1FF0EB07FCEB01FF9038007F C0EC1FF0EC07FCEC01FF9138007FC0ED1FF0ED07FCED01FF9238007FC0EE1FF0EE07FCEE 01FEEE007E171C2F2E7AA93C>60 D<127012FCB4FCEA7FC0EA1FF0EA07FCEA01FF38007F C0EB1FF0EB07FCEB01FF9038007FC0EC1FF0EC07FCEC01FF9138007FC0ED1FF0ED07FCED 01FF9238007FC0EE1FF0EE07FCEE01FEA2EE07FCEE1FF0EE7FC0923801FF00ED07FCED1F F0ED7FC04A48C7FCEC07FCEC1FF0EC7FC04948C8FCEB07FCEB1FF0EB7FC04848C9FCEA07 FCEA1FF0EA7FC048CAFC12FC12702F2E7AA93C>62 D E %EndDVIPSBitmapFont /Fb 133[60 66 66 1[66 73 40 66 47 1[73 73 73 106 33 2[33 73 73 40 66 73 66 73 66 1[66 5[80 80 113 1[86 73 80 86 93 80 93 86 100 73 86 66 33 86 93 73 80 86 86 86 86 6[40 66 66 66 66 66 66 66 66 66 66 1[33 46[{TeXBase1Encoding ReEncodeFont}59 119.552 /Helvetica-Bold rf /Fc 134[46 2[46 51 28 46 32 2[51 51 74 23 2[23 1[51 1[46 51 46 51 46 10[55 2[55 4[60 69 6[51 55 1[60 64[51 2[{TeXBase1Encoding ReEncodeFont}25 83.022 /Helvetica-Bold rf /Fd 137[37 42 23 32 32 1[42 42 42 60 23 2[23 42 42 23 37 42 37 1[42 11[60 1[42 51 1[51 2[69 46 1[37 28 2[51 51 60 55 51 7[28 42 42 42 42 42 42 42 42 42 42 23 21 28 42[42 2[{TeXBase1Encoding ReEncodeFont}46 83.022 /Times-Italic rf /Fe 134[33 33 50 33 37 21 29 29 1[37 37 37 54 21 33 21 21 37 37 21 33 37 33 37 37 9[62 2[42 37 46 1[46 1[50 1[42 1[33 25 54 3[54 1[46 46 1[37 1[50 2[25 37 2[37 3[37 37 37 1[19 25 19 1[37 25 25 25 36[37 2[{TeXBase1Encoding ReEncodeFont}53 74.7198 /Times-Italic rf /Ff 135[42 2[46 28 32 37 1[46 42 46 69 23 2[23 46 42 28 37 46 37 46 42 9[83 60 1[55 46 4[60 3[42 32 3[55 60 60 14[42 42 42 42 2[21 46[{ TeXBase1Encoding ReEncodeFont}34 83.022 /Times-Bold rf /Fg 107[37 37 22[17 1[37 42 42 60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28 37 42 37 42 37 1[42 1[28 23 28 51 60 60 78 60 60 51 46 55 60 46 60 60 74 51 60 32 28 60 60 46 51 60 55 55 60 3[47 2[23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 2[28 28 28 1[69 1[42 34 30[46 46 2[{TeXBase1Encoding ReEncodeFont}83 83.022 /Times-Roman rf /Fh 135[80 112 80 88 48 80 56 1[88 88 88 128 40 80 1[40 88 88 1[80 88 80 1[80 9[135 3[96 104 1[96 1[104 1[88 2[40 3[96 3[104 9[80 80 80 80 80 80 80 2[40 46[{ TeXBase1Encoding ReEncodeFont}37 143.462 /Helvetica-Bold rf /Fi 104[172 35[96 67 2[105 105 4[48 3[96 3[96 10[115 11[96 18[96 3[96 96 96 96 1[48 46[{TeXBase1Encoding ReEncodeFont}16 172.154 /Helvetica-Bold rf /Fj 139[69 1[80 1[126 126 126 1[57 2[57 3[115 1[115 1[115 13[138 2[138 5[115 57 70[126 2[{TeXBase1Encoding ReEncodeFont}15 206.584 /Helvetica-Bold rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: A4 %%EndSetup %%Page: 1 1 1 0 bop Black 0 TeXcolorgray Black Black 867 140 a Fj(IJS)58 b(Pr)l(otocol)g(Speci\002cation)1021 493 y Fi(V)-9 b(er)m(sion)48 b(0.32)f(\227)h(17)f(Jan)h(2002)1714 769 y Fh(Raph)39 b(Le)n(vien)396 1126 y Fg(This)21 b(document)d(contains)h(a)i (speci\002cation)e(for)h(the)g(IJS)h(protocol,)d(which)i(is)h(intended) e(to)h(mak)o(e)g(it)h(easier)f(to)g(deplo)o(y)396 1234 y(raster)n(-based)f(printer)h(dri)n(v)o(ers)f(in)h(a)g(wide)h(v)n (ariety)e(of)h(en)m(vironments,)d(including)h(Unix)i(desktops.)-2 1730 y Fh(1.)39 b(Intr)m(oduction)396 2004 y Fg(IJS)21 b(is,)g(\002rst)g(and)f(foremost,)e(a)j(protocol)d(for)i(transmission)f (of)h(raster)g(page)g(images.)g(The)f(protocol)g(is)i(a)g(f)o(airly)396 2111 y(traditional)e(client-serv)o(er)g(design.)g(In)h(general,)f(the)h (client)g(sends)g(one)g(or)g(more)f(page)h(images)g(to)g(the)g(serv)o (er)m(,)f(along)396 2219 y(with)i(v)n(arious)e(metadata.)g (Communication)f(is)j(through)d(simple)i(\223commands\224,)e(which)i (are)g(essentially)396 2327 y(size-pre\002x)o(ed)f(pack)o(ets.)g(The)h (client)g(sends)h(a)f(command)e(to)j(the)f(serv)o(er)m(,)f(then)g(w)o (aits)j(for)d(a)i(response)e(command,)396 2435 y(either)h(A)m(CK)h(or)f (N)m(AK.)396 2709 y(Since,)g(in)g(the)g(typical)f(IJS)i(scenario,)e (there)g(is)i(only)e(one)g(client)h(for)f(an)o(y)g(gi)n(v)o(en)g(serv)o (er)m(,)f(it)j(may)e(be)h(helpful)f(to)h(denote)396 2817 y(the)g(client)h(role)f(as)g("master")g(and)g(the)g(serv)o(er)f(role)h (as)h("sla)n(v)o(e".)f(Ho)n(we)n(v)o(er)m(,)e(this)j(document)d(uses)j (the)f(terms)g("client")396 2925 y(and)g("serv)o(er".)396 3199 y(On)g(Unix)g(systems,)h(the)f(serv)o(er)f(\223speaks\224)h(IJS)h (through)d(stdin)i(and)g(stdout.)f(One)h(consequence)e(of)i(this)h (design)396 3307 y(decision)f(is)h(that)f(the)g(serv)o(er)g(can)g(be)g (in)m(v)n(ok)o(ed)e(remotely)-5 b(,)18 b(for)i(e)o(xample)f(through)f Ff(ssh)p Fg(.)p Black -85 3425 a Fe(*)p Black 46 w(It')m(s)g(not)h (clear)g(yet)g(how)g(useful)h(this)e(will)g(be)o(,)h(b)o(ut)g(at)g (least)g(people)g(can)h(e)o(xperiment)f(with)g(it.)396 3699 y Fg(Other)h(forms)g(of)f(communication)f(\(such)h(as)i(domain)e (sock)o(ets\))h(may)g(be)g(useful,)f(as)i(well,)g(b)n(ut)f(are)g(not)g (speci\002ed)g(in)396 3807 y(this)h(v)o(ersion.)396 4081 y(There)f(are)g(also)g(a)h(lar)o(ge)e(number)f(of)i(things)g(that)g (the)h(IJS)f(speci\002cation)g(does)g Fd(not)h Fg(address.)f(It)g(does) g(not)g(pro)o(vide)396 4189 y(strings)g(for)g(a)h(UI)f(\(although)e (the)i(parameter)f(names)h(and)f(v)n(alues)h(may)g(be)g(used)g(as)h(a)f (f)o(allback)g(when)f(higher)n(-le)n(v)o(el)396 4297 y(mechanisms)g(designed)g(to)i(pro)o(vide)d(these)i(f)o(ail\).)g(It)h (does)f(not)f(address)h(the)g(task)h(of)f(disco)o(v)o(ering)d(printers) j(or)396 4405 y(dri)n(v)o(ers.)f(It)h(is)i(not)d(designed)g(to)i (dispatch)e(jobs)h(to)h(multiple)e(printers.)g(It)i(does)f(not)g(pro)o (vide)e(queue)h(management)396 4513 y(features.)h(It)g(does)g(not)g (address)g(higher)e(le)n(v)o(el)i(imaging)f(models,)h(or)f(fonts.)h (These)g(are)g(important)f(components)f(of)i(a)396 4621 y(printing)f(system,)h(and)g(should)f(be)h(addressed)f(by)h(other)f (modules)g(and)h(interf)o(aces.)p Black 3842 5569 a Fd(1)p Black eop %%Page: 2 2 2 1 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 94 a Fh(2.)39 b(Wire)h(pr)m(otocol)396 368 y Fg(After)20 b(a)h(brief)e (initialization)h(handshak)o(e,)e(all)j(IJS)g(communication)c(occurs)i (through)f Fd(commands)p Fg(.)h(Most)h(of)g(these)396 476 y(are)g(sent)h(from)e(the)h(client)g(to)h(the)f(serv)o(er)m(,)f(b)n (ut)h(three)g(\(IJS_CMD_PONG,)f(IJS_CMD_A)m(CK,)h(and)396 584 y(IJS_CMD_N)m(AK\))g(are)g(sent)g(from)g(the)g(serv)o(er)f(to)h (the)h(client.)396 858 y(W)m(ith)g(the)f(e)o(xception)e(of)i (IJS_CMD_PING,)g(the)g(appropriate)e(response)h(to)h(a)h(command)d (sent)j(from)e(the)h(serv)o(er)f(is)396 966 y(either)h(IJS_CMD_A)m(CK)g (or)g(IJS_CMD_N)m(AK.)396 1240 y(The)g(initialization)g(handshak)o(e)e (is)j(as)g(follo)n(ws.)f(First,)g(the)g(client)h(sends)f(the)g(string)g ("IJS\\n\\252v1\\n")d(\(with)j(C)396 1348 y(backslash)g(escaping\).)e (Upon)i(receipt)f(of)h(this)h(string,)f(the)g(serv)o(er)f(sends)h(the)h (string)e("IJS\\n\\253v1\\n".)f(At)i(this)396 1456 y(point,)f(the)i (client)f(may)g(send)g(IJS)g(commands)f(to)h(the)g(serv)o(er)-5 b(.)396 1730 y(IJS)21 b(is)g(designed)e(to)h(ha)n(v)o(e)g(a)h(simple)f (wire)g(encoding.)e(Inte)o(gers)h(are)h(encoded)e(as)j(32-bit)e (big-endian)f(\(ie)j(\223netw)o(ork)396 1838 y(order\224\))e(v)n (alues.)g(The)h(encoding)e(for)i(a)g(command)f(is)i(as)g(follo)n(ws:) 396 2039 y Ff(T)-8 b(able)21 b(1.)f(W)o(ir)o(e)g(Encoding)h(of)e(IJS)i (Commands)p 396 2142 1206 4 v 396 2142 V 396 2268 4 127 v 400 2244 a Fg(Command)p 997 2268 V 253 w(4-byte)e(inte)o(ger)p 1598 2268 V 396 2272 1206 4 v 396 2272 V 396 2398 4 127 v 400 2373 a(Size)h(in)h(bytes)p 997 2398 V 176 w(4-byte)e(inte)o(ger)p 1598 2398 V 396 2401 1206 4 v 396 2401 V 396 2528 4 127 v 805 2503 a(Ar)o(guments)p 1598 2528 V 396 2654 V 957 2629 a(...)p 1598 2654 V 396 2657 1206 4 v 396 2657 V 396 2931 a(The)h(ar)o(guments)e(are)i(simply)g(concatenated.)e(F)o(or)i (v)n(ariable)f(size)i(ar)o(guments,)d(the)i(size)h(is)g(either)f(e)o (xplicitly)f(gi)n(v)o(en)g(as)396 3039 y(another)g(ar)o(gument,)f(or)m (,)h(in)h(the)g(case)h(of)f(the)g(last)h(ar)o(gument,)d(is)j(inferred)e (from)g(the)h(size)h(of)f(the)g(command.)396 3313 y(A)h(wire)f (encoding)e(for)i(a)h(typical)e(command)f(is)k(gi)n(v)o(en)c(belo)n(w) -5 b(.)19 b(This)i(command)d(sets)j(the)f(Dpi)h(parameter)d(to)j(600.) 396 3515 y Ff(T)-8 b(able)21 b(2.)f(Example)h(W)o(ir)o(e)e(Encoding)p 396 3618 3501 4 v 396 3618 V 396 3744 4 127 v 400 3719 a Fc(Encoded)j(b)n(ytes)p 1296 3744 V 312 w(Field)p 2097 3744 V 606 w(V)-5 b(alue)p 3893 3744 V 396 3748 3501 4 v 396 3748 V 396 3874 4 127 v 400 3849 a Fg(00)19 b(00)h(00)g(0c)p 1296 3874 V 510 w(Command)p 2097 3874 V 452 w(IJS_COMMAND_SET_P)-8 b(ARAM)p 3893 3874 V 396 3877 3501 4 v 396 3877 V 396 4004 4 127 v 400 3979 a(00)19 b(00)h(00)g(16)p 1296 4004 V 505 w(Size)g(in)h(bytes)p 2097 4004 V 375 w(22)p 3893 4004 V 396 4007 3501 4 v 396 4007 V 396 4133 4 127 v 400 4108 a(00)e(00)h(00)g(00)p 1296 4133 V 505 w(Job)g(id)p 2097 4133 V 599 w(0)p 3893 4133 V 396 4137 3501 4 v 396 4137 V 396 4371 4 235 v 400 4238 a(00)f(00)h(00)g(03)p 1296 4371 V 505 w(Size)g(of)g(parameter)f(name)p 2097 4371 V 13 w(3)p 3893 4371 V 396 4374 3501 4 v 396 4374 V 396 4501 4 127 v 400 4476 a(44)g(70)h(69)p 1296 4501 V 609 w(P)o(arameter)f(name)p 2097 4501 V 263 w(Dpi)p 3893 4501 V 396 4504 3501 4 v 396 4504 V 396 4630 4 127 v 400 4605 a(36)g(30)h(30)p 1296 4630 V 609 w(V)-9 b(alue)p 2097 4630 V 610 w(600)p 3893 4630 V 396 4634 3501 4 v 396 4634 V 396 4883 a(The)20 b(numerical)f(v)n(alues)h(of)g(the)g (commands)e(are:)p Black 3842 5569 a Fd(2)p Black eop %%Page: 3 3 3 2 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black 396 72 a Ff(T)-8 b(able)21 b(3.)f(Numerical)h(V)-8 b(alues)21 b(of)f(IJS)g(Commands)p 396 167 2401 4 v 396 167 V 396 293 4 127 v 400 268 a Fc(Command)p 2193 293 V 1389 w(V)-5 b(alue)p 2794 293 V 396 296 2401 4 v 396 296 V 396 423 4 127 v 400 398 a Fg(IJS_CMD_A)m(CK)p 2193 423 V 1245 w(0)p 2794 423 V 396 426 2401 4 v 396 426 V 396 552 4 127 v 400 528 a(IJS_CMD_N)m(AK)p 2193 552 V 1240 w(1)p 2794 552 V 396 556 2401 4 v 396 556 V 396 682 4 127 v 400 657 a(IJS_CMD_PING)p 2193 682 V 1223 w(2)p 2794 682 V 396 685 2401 4 v 396 685 V 396 812 4 127 v 400 787 a(IJS_CMD_PONG)p 2193 812 V 1191 w(3)p 2794 812 V 396 815 2401 4 v 396 815 V 396 942 4 127 v 400 917 a(IJS_CMD_OPEN)p 2193 942 V 1200 w(4)p 2794 942 V 396 945 2401 4 v 396 945 V 396 1071 4 127 v 400 1046 a(IJS_CMD_CLOSE)p 2193 1071 V 1154 w(5)p 2794 1071 V 396 1075 2401 4 v 396 1075 V 396 1201 4 127 v 400 1176 a(IJS_CMD_BEGIN_JOB)p 2193 1201 V 974 w(6)p 2794 1201 V 396 1204 2401 4 v 396 1204 V 396 1331 4 127 v 400 1306 a(IJS_CMD_END_JOB)p 2193 1331 V 1057 w(7)p 2794 1331 V 396 1334 2401 4 v 396 1334 V 396 1460 4 127 v 400 1435 a(IJS_CMD_CANCEL_JOB)p 2193 1460 V 896 w(8)p 2794 1460 V 396 1464 2401 4 v 396 1464 V 396 1590 4 127 v 400 1565 a(IJS_CMD_Q)o(UER)g(Y_ST)d(A)f(TUS)p 2193 1590 V 798 w(9)p 2794 1590 V 396 1593 2401 4 v 396 1593 V 396 1720 4 127 v 400 1695 a(IJS_CMD_LIST_P)h(ARAMS)p 2193 1720 V 866 w(10)p 2794 1720 V 396 1723 2401 4 v 396 1723 V 396 1849 4 127 v 400 1824 a(IJS_CMD_ENUM_P)g(ARAM)p 2193 1849 V 843 w(11)p 2794 1849 V 396 1853 2401 4 v 396 1853 V 396 1979 4 127 v 400 1954 a(IJS_CMD_SET_P)g(ARAM)p 2193 1979 V 940 w(12)p 2794 1979 V 396 1982 2401 4 v 396 1982 V 396 2109 4 127 v 400 2084 a(IJS_CMD_GET_P)g(ARAM)p 2193 2109 V 926 w(13)p 2794 2109 V 396 2112 2401 4 v 396 2112 V 396 2238 4 127 v 400 2213 a(IJS_CMD_BEGIN_P)g(A)m(GE)p 2193 2238 V 915 w(14)p 2794 2238 V 396 2242 2401 4 v 396 2242 V 396 2368 4 127 v 400 2343 a(IJS_CMD_SEND_D)m(A)f(T)h (A_BLOCK)p 2193 2368 V 624 w(15)p 2794 2368 V 396 2371 2401 4 v 396 2371 V 396 2498 4 127 v 400 2473 a(IJS_CMD_END_P)g(A)m(GE) p 2193 2498 V 998 w(16)p 2794 2498 V 396 2501 2401 4 v 396 2501 V 396 2627 4 127 v 400 2602 a(IJS_CMD_EXIT)p 2193 2627 V 1227 w(17)p 2794 2627 V 396 2631 2401 4 v 396 2631 V 396 2880 a(A)21 b(state)g(transition)e(diagram)g(for)h(serv) o(ers)f(supporting)f(a)j(maximum)d(of)i(one)g(acti)n(v)o(e)g(job)f(at)i (a)g(time)f(is)h(gi)n(v)o(en)e(belo)n(w:)396 4062 y currentpoint currentpoint translate 0.5 0.5 scale neg exch neg exch translate 396 4062 a @beginspecial 0 @llx 0 @lly 912 @urx 257 @ury 9120 @rwi @setspecial %%BeginDocument: state.eps %!PS-Adobe-2.0 EPSF-2.0 %%Title: state.eps %%Creator: fig2dev Version 3.2 Patchlevel 3d %%CreationDate: Sat Dec 22 01:59:04 2001 %%For: raph@pixel.artofcode.com (Raph Levien,,,) %%BoundingBox: 0 0 912 257 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 257 moveto 0 0 lineto 912 0 lineto 912 257 lineto closepath clip newpath -24.1 355.7 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06299 0.06299 sc % % Fig objects follow % /Times-Roman ff 180.00 scf sf 9225 2475 m gs 1 -1 sc (IJS_LIST_PARAMS) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 2700 m gs 1 -1 sc (IJS_QUERY_PARAM) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 2925 m gs 1 -1 sc (IJS_SET_PARAM) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 3150 m gs 1 -1 sc (IJS_GET_PARAM) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 3375 m gs 1 -1 sc (IJS_QUERY_STATUS) col0 sh gr % Arc 7.500 slw gs clippath 8630 2937 m 8620 2997 l 8769 3022 l 8656 2973 l 8779 2962 l cp eoclip n 8746.9 2733.8 259.3 -139.4 114.3 arc gs col0 s gr gr % arrowhead n 8779 2962 m 8656 2973 l 8769 3022 l col0 s % Arc gs clippath 12183 2983 m 12176 3043 l 12326 3061 l 12211 3017 l 12333 3001 l cp eoclip n 12293.2 2761.4 272.0 -133.8 111.2 arc gs col0 s gr gr % arrowhead n 12333 3001 m 12211 3017 l 12326 3061 l col0 s % Arc gs clippath 8518 3029 m 8472 3067 l 8569 3184 l 8516 3073 l 8616 3145 l cp eoclip n 10170.0 1755.0 2115.5 38.1 141.9 arc gs col0 s gr gr % arrowhead n 8616 3145 m 8516 3073 l 8569 3184 l col0 s % Arc gs clippath 11736 2597 m 11776 2552 l 11663 2451 l 11733 2554 l 11623 2496 l cp eoclip n 10032.9 4384.8 2498.6 -131.7 -46.7 arc gs col0 s gr gr % arrowhead n 11623 2496 m 11733 2554 l 11663 2451 l col0 s % Arc gs clippath 8176 2550 m 8222 2512 l 8124 2395 l 8179 2507 l 8078 2434 l cp eoclip n 7091.9 3365.8 1386.1 -140.0 -37.6 arc gs col0 s gr gr % arrowhead n 8078 2434 m 8179 2507 l 8124 2395 l col0 s % Arc gs clippath 5659 2551 m 5701 2509 l 5594 2401 l 5658 2508 l 5551 2444 l cp eoclip n 4545.0 3548.9 1524.5 -137.6 -42.4 arc gs col0 s gr gr % arrowhead n 5551 2444 m 5658 2508 l 5594 2401 l col0 s % Arc gs clippath 3435 2985 m 3386 3020 l 3476 3142 l 3430 3028 l 3525 3106 l cp eoclip n 4600.2 2225.5 1420.0 38.3 146.2 arc gs col0 s gr gr % arrowhead n 3525 3106 m 3430 3028 l 3476 3142 l col0 s % Arc gs clippath 5952 3028 m 5907 3068 l 6008 3181 l 5951 3072 l 6053 3141 l cp eoclip n 7087.5 2115.0 1486.5 39.5 140.5 arc gs col0 s gr gr % arrowhead n 6053 3141 m 5951 3072 l 6008 3181 l col0 s % Arc gs clippath 3055 2553 m 3089 2503 l 2962 2419 l 3046 2511 l 2929 2469 l cp eoclip n 1935.0 4072.5 1917.3 -125.9 -54.1 arc gs col0 s gr gr % arrowhead n 2929 2469 m 3046 2511 l 2962 2419 l col0 s % Arc gs clippath 5866 3075 m 5816 3109 l 5901 3235 l 5859 3119 l 5951 3201 l cp eoclip n 8918.1 1112.7 3658.2 32.2 147.0 arc gs col0 s gr gr % arrowhead n 5951 3201 m 5859 3119 l 5901 3235 l col0 s % Ellipse n 675 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 3240 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 8370 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 3240 5355 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 5805 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 11925 2790 284 284 0 360 DrawEllipse gs col0 s gr % Polyline gs clippath 3210 5055 m 3270 5055 l 3270 4903 l 3240 5023 l 3210 4903 l cp eoclip n 3240 3060 m 3240 5040 l gs col0 s gr gr % arrowhead n 3210 4903 m 3240 5023 l 3270 4903 l col0 s /Times-Roman ff 180.00 scf sf 3060 5400 m gs 1 -1 sc (exit) col0 sh gr /Times-Roman ff 180.00 scf sf 11700 2880 m gs 1 -1 sc (in_page) col0 sh gr /Times-Roman ff 180.00 scf sf 7965 4950 m gs 1 -1 sc (IJS_CMD_CANCEL_JOB) col0 sh gr /Times-Roman ff 180.00 scf sf 2025 4095 m gs 1 -1 sc (IJS_CMD_EXIT) col0 sh gr /Times-Roman ff 180.00 scf sf 1215 2520 m gs 1 -1 sc (\(IJS_CMD_PONG\)) col0 sh gr /Times-Roman ff 180.00 scf sf 1350 2070 m gs 1 -1 sc (IJS_CMD_PING) col0 sh gr /Times-Roman ff 180.00 scf sf 3960 1935 m gs 1 -1 sc (IJS_CMD_OPEN) col0 sh gr /Times-Roman ff 180.00 scf sf 4005 3870 m gs 1 -1 sc (IJS_CMD_CLOSE) col0 sh gr /Times-Roman ff 180.00 scf sf 9045 4095 m gs 1 -1 sc (IJS_CMD_END_PAGE) col0 sh gr /Times-Roman ff 180.00 scf sf 12150 3420 m gs 1 -1 sc (IJS_CMD_SEND_DATA_BLOCK) col0 sh gr /Times-Roman ff 180.00 scf sf 9180 1755 m gs 1 -1 sc (IJS_CMD_BEGIN_PAGE) col0 sh gr /Times-Roman ff 180.00 scf sf 6345 1845 m gs 1 -1 sc (IJS_CMD_BEGIN_JOB) col0 sh gr /Times-Roman ff 180.00 scf sf 6660 3870 m gs 1 -1 sc (IJS_CMD_END_JOB) col0 sh gr /Times-Roman ff 180.00 scf sf 3015 2880 m gs 1 -1 sc (closed) col0 sh gr /Times-Roman ff 180.00 scf sf 540 2835 m gs 1 -1 sc (init) col0 sh gr /Times-Roman ff 180.00 scf sf 5625 2835 m gs 1 -1 sc (open) col0 sh gr /Times-Roman ff 180.00 scf sf 8145 2835 m gs 1 -1 sc (in_job) col0 sh gr $F2psEnd rs %%EndDocument @endspecial 396 4062 a currentpoint currentpoint translate 1 0.5 div 1 0.5 div scale neg exch neg exch translate 396 4062 a -2 4473 a Fb(2.1.)34 b(IJS_CMD_A)-5 b(CK)396 4747 y Fg(This)21 b(command)d(is)j(sent)f(from) g(serv)o(er)f(to)h(the)g(client)h(in)f(response)f(to)i(a)f(command)e (from)i(the)g(client,)g(to)g(indicate)396 4855 y(successful)g (completion.)e(There)i(are)g(no)g(ar)o(guments)e(speci\002c)i(to)g (this)h(command.)d(Ho)n(we)n(v)o(er)m(,)g(for)i(commands)e(\(such)396 4963 y(as)j(IJS_CMD_GET_P)-8 b(ARAM\))19 b(which)h(request)f(a)i(v)n (alue,)e(this)i(v)n(alue)f(is)h(returned)d(as)j(the)f(ar)o(gument)e(in) i(an)h(A)m(CK)396 5071 y(command.)p Black 3842 5569 a Fd(3)p Black eop %%Page: 4 4 4 3 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 77 a Fb(2.2.)34 b(IJS_CMD_NAK)396 351 y Fg(This)21 b(command)d(is)j(sent)f(from)g(serv) o(er)f(to)h(the)g(client)h(in)f(response)f(to)i(a)f(command)e(from)i (the)g(client,)g(to)g(indicate)g(an)396 459 y(error)-5 b(.)20 b(There)f(is)i(one)f(inte)o(ger)f(ar)o(gument,)e(which)j(is)h (the)f(error)f(code.)h(A)g(list)i(of)e(error)f(codes)g(is)j(gi)n(v)o (en)c(in)p 0 TeXcolorgray 21 w(Section)i(6)p Black(.)-2 797 y Fb(2.3.)34 b(IJS_CMD_PING)396 1071 y Fg(The)20 b(PING)h(command)d(is)j(sent)f(from)g(the)g(client)g(to)g(the)h(serv)o (er)e(as)i(part)f(of)g(the)g(connection)e(setup.)i(It)g(contains)g(one) 396 1179 y(inte)o(ger)f(ar)o(gument,)f(which)i(is)h(the)f(100)f(times)i (the)f(real-v)n(alued)e(v)o(ersion)h(number)f(of)i(the)h(lar)o(gest)e (IJS)i(protocol)396 1287 y(understood)d(by)i(the)g(client.)g(Thus,)f (for)h(the)g(v)o(ersion)f(of)h(the)g(protocol)f(described)g(in)h(this)h (document,)d(the)i(ar)o(gument)396 1395 y(is)h(30.)f(The)g(appropriate) e(response)h(to)h(a)h(PING)f(is)h(a)g(PONG.)-2 1733 y Fb(2.4.)34 b(IJS_CMD_PONG)396 2007 y Fg(The)20 b(PONG)h(command)d(is)j (sent)g(from)e(the)h(serv)o(er)f(to)i(the)f(client)g(in)g(response)g (to)g(the)g(PING)h(command.)d(It)i(contains)396 2115 y(one)g(inte)o(ger)f(ar)o(gument,)f(which)h(is)i(100)f(times)g(the)g (lar)o(gest)g(IJS)h(v)o(ersion)e(number)f(understood)g(by)i(the)g(serv) o(er)-5 b(.)19 b(After)396 2223 y(a)i(PING/PONG)f(handshak)o(e,)f(both) g(client)h(and)g(serv)o(er)f(should)g(use)i(the)f(minimum)f(of)g(the)i (tw)o(o)f(v)o(ersion)f(numbers.)396 2331 y(This)i(ne)o(gotiation)d (mechanism)h(preserv)o(es)g(the)h(ability)g(to)g(mak)o(e)g(deep)f (changes)h(in)g(future)f(v)o(ersion)g(of)h(the)g(protocol,)396 2439 y(while)g(preserving)f(backw)o(ards)g(compatibility)f(for)i(both)f (clients)i(and)e(serv)o(ers.)-2 2777 y Fb(2.5.)34 b(IJS_CMD_OPEN)396 3051 y Fg(The)20 b(client)g(should)g(send)f(an)i(OPEN)f(command)e(to)j (the)f(serv)o(er)f(to)i(indicate)e(that)h(printing)f(is)i(imminent.)e (The)h(serv)o(er)396 3159 y(can)g(allocate)g(resources,)f(such)h(as)h (tables,)f(at)h(this)g(time.)-2 3498 y Fb(2.6.)34 b(IJS_CMD_CLOSE)396 3772 y Fg(The)20 b(client)g(should)g(send)f(a)i(CLOSE)g(command)d(to)i (the)g(serv)o(er)g(to)g(indicate)g(that)g(printing)f(is)i(complete)e (for)h(no)n(w)-5 b(.)396 3880 y(The)20 b(serv)o(er)f(can)h(free)g(an)o (y)g(allocated)f(resources)g(at)i(this)g(time.)396 4154 y(There)f(should)f(not)h(be)g(an)o(y)f(jobs)h(open)f(at)i(the)f(time)h (of)f(the)g(CLOSE)h(command.)c(Handling)i(of)h(an)o(y)g(such)f(jobs)i (is)396 4262 y(unde\002ned.)-2 4600 y Fb(2.7.)34 b(IJS_CMD_BEGIN_JOB) 396 4874 y Fg(The)20 b(client)g(should)g(send)f(a)i(BEGIN_JOB)g(to)f (the)g(serv)o(er)f(to)i(be)o(gin)e(a)h(job)m(.)g(There)f(is)i(one)f (inte)o(ger)f(ar)o(gument,)e(a)k(job)396 4982 y(id.)f(This)h(id)f(is)h (allocated)f(by)f(the)i(client,)f(and)f(jobs)h(are)h(uniquely)d (identi\002ed)h(by)h(the)g(\(client,)g(job)g(id\))g(tuple.)f(This)i (job)p Black 3842 5569 a Fd(4)p Black eop %%Page: 5 5 5 4 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black 396 72 a Fg(id)h(is)g(present)f (as)h(an)f(ar)o(gument)e(for)i(all)h(the)g(commands)d(which)i(operate)f (within)i(the)f(conte)o(xt)f(of)h(a)h(job)m(.)f(This)g(job)g(id)h(is) 396 180 y(v)n(alid)g(until)g(the)g(corresponding)d(END_JOB)j(command)f (is)i(in)m(v)n(ok)o(ed,)d(at)j(which)e(point)h(it)h(can)f(be)g(reused)f (if)i(desired.)396 454 y(The)f(connection)e(must)i(be)h(in)f(an)g(open) f(state)i(to)f(be)o(gin)f(a)i(job,)f(ie)g(an)g(OPEN)h(command)d(must)i (ha)n(v)o(e)g(been)g(sent,)396 562 y(without)g(a)g(corresponding)d (CLOSE.)396 836 y(Serv)o(ers)j(can)g(choose)f(whether)g(or)h(not)g(to)g (implement)f(multiple)h(jobs,)g(depending)d(on)j(their)g (sophistication.)f(When)396 944 y(the)h(number)f(of)h(jobs)g(supported) e(is)j(e)o(xceeded,)d(the)j(serv)o(er)e(should)g(return)g(an)h(IJS_ET)o (OOMANYJOBS)g(error)396 1052 y(code.)-2 1391 y Fb(2.8.)34 b(IJS_CMD_END_JOB)396 1665 y Fg(The)20 b(client)g(should)g(send)f(an)i (END_JOB)f(command)e(to)j(the)f(serv)o(er)f(on)h(the)g(completion)e(of) i(a)h(job)m(.)e(The)h(one)396 1773 y(ar)o(gument)e(is)j(the)f(job)g (id.)g(This)h(command)d(cannot)h(be)h(used)g(in)g(the)h(middle)e(of)h (a)h(page,)e(i.e.)h(when)g(a)g(BEGIN_P)-8 b(A)m(GE)396 1880 y(command)18 b(has)j(been)e(issued)i(without)e(its)i (corresponding)c(END_P)-8 b(A)m(GE.)-2 2219 y Fb(2.9.)34 b(IJS_CMD_CANCEL_JOB)396 2493 y Fg(This)21 b(command)d(cancels)i(a)h (job)m(.)e(The)h(one)f(ar)o(gument)f(is)j(the)f(job)g(id.)g(This)h (command)d(can)i(be)g(used)g(whether)f(or)h(not)396 2601 y(a)h(page)e(is)j(open.)-2 2939 y Fb(2.10.)35 b(IJS_CMD_Q)o(UER)-6 b(Y_ST)-11 b(A)g(TUS)396 3213 y Fg(This)21 b(command)d(queries)h(the)i (status)f(of)g(a)h(job,)f(or)f(general)h(printer)f(status)i(within)e(a) i(job)f(conte)o(xt.)f(The)g(one)396 3321 y(ar)o(gument)f(is)j(the)f (job)g(id.)g(The)g(return)f(data)h(is)h(the)g(printer)e(status.)396 3595 y(The)h(format)f(of)g(the)h(printer)f(status)i(is)g(yet)f(to)g(be) g(determined.)e(Glen)i(Petrie)g(has)g(made)f(a)i(proposal)d(on)i(the)g (inkjet-list)396 3703 y(mailing)g(list.)h(Michael)f(Sweet)g(has)h (suggested)e(adopting)f(the)i(IPP)h(status)g(codes.)f(That)f(standard)h (is)h(f)o(airly)e(rich)h(in)396 3811 y(status)h(queries.)e(There)h (appear)f(to)h(be)g(at)h(least)g(four)e(queries)g(related)h(to)g(this)h (IJS)g(command:)d(printer)n(-state)i(\(enum\),)396 3919 y(printer)n(-state-reasons)e(\(k)o(e)o(yw)o(ord\),)g(printer)n (-state-message)g(\(te)o(xt\),)h(printer)n(-is-accepting-jobs)d (\(boolean\).)-2 4257 y Fb(2.11.)35 b(IJS_CMD_LIST_P)-12 b(ARAMS)396 4531 y Fg(This)21 b(command)d(queries)h(the)i(serv)o(er)e (for)g(a)i(complete)e(list)i(of)f(parameters.)f(Note)h(that)h(this)f (list)i(may)d(change)396 4639 y(dynamically)-5 b(,)18 b(in)i(response)f(to)i(setting)f(v)n(arious)f(parameters,)g(or)h(e)o (xternal)f(e)n(v)o(ents.)g(The)h(ar)o(gument)e(is)j(the)f(job)g(id.)396 4747 y(The)g(return)f(v)n(alue)h(is)h(a)f(comma-separated)e(list)j(of)f (parameters.)p Black 3842 5569 a Fd(5)p Black eop %%Page: 6 6 6 5 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 77 a Fb(2.12.)35 b(IJS_CMD_ENUM_P)-12 b(ARAM)396 351 y Fg(This)21 b(command)d(queries)h (the)i(possible)e(v)n(alues)h(for)g(a)g(gi)n(v)o(en)f(parameter)-5 b(.)19 b(The)h(ar)o(guments)e(are)i(the)h(job)e(id)i(and)e(the)396 459 y(name)h(of)g(the)g(parameter)-5 b(.)19 b(The)h(return)f(v)n(alue)g (is)i(a)g(comma-separated)c(list)22 b(of)d(v)n(alues,)h(with)g(the)h (def)o(ault)e(gi)n(v)o(en)g(\002rst.)396 733 y(Some)h(parameters)f(may) h(not)g(ha)n(v)o(e)f(a)i(small)g(\002nite)f(enumeration.)e(In)h(these)i (cases,)f(the)h(serv)o(er)e(should)g(report)396 840 y(IJS_ERANGE.)396 1114 y(Note)h(also)h(that)f(the)g(comma-separated)e(encoding)g(does)i (not)g(pro)o(vide)e(a)i(w)o(ay)h(to)f(report)f(v)n(alues)h(containing) 396 1222 y(commas.)f(Thus,)h(these)g(should)g(be)g(a)n(v)n(oided.)-2 1561 y Fb(2.13.)35 b(IJS_CMD_SET_P)-12 b(ARAM)396 1835 y Fg(This)21 b(command)d(sets)j(a)g(parameter)-5 b(.)19 b(There)g(are)h(four)f(ar)o(guments:)f(the)j(job)e(id,)i(the)f(size)h (of)e(the)i(parameter)d(name)i(\(in)396 1943 y(bytes\),)f(the)g (parameter)e(name,)i(and)f(the)h(v)n(alue.)g(The)f(size)i(of)f(the)g(v) n(alue)g(is)h(inferred)d(from)h(the)h(size)h(of)f(the)g(command.)396 2217 y(If)h(the)h(parameter)d(is)j(unkno)n(wn,)d(the)i(serv)o(er)f (returns)h(an)g(IJS_EUNKP)-8 b(ARAM)20 b(error)-5 b(.)19 b(If)i(the)f(parameter)e(is)k(kno)n(wn)396 2325 y(b)n(ut)e(the)h(v)n (alue)e(is)i(not)f(appropriate,)e(the)i(serv)o(er)f(returns)h(an)g (IJS_ERANGE)g(error)-5 b(.)-2 2663 y Fb(2.14.)35 b(IJS_CMD_GET_P)-12 b(ARAM)396 2937 y Fg(This)21 b(command)d(retrie)n(v)o(es)h(the)h (current)f(v)n(alue)h(of)g(a)g(parameter)-5 b(.)19 b(There)g(are)i(tw)o (o)f(ar)o(guments:)e(the)i(job)g(id)h(and)e(the)396 3045 y(parameter)g(name.)g(The)h(v)n(alue)g(of)g(the)g(parameter)e(is)k (returned.)396 3319 y(If)e(the)h(parameter)d(is)j(unkno)n(wn,)d(the)i (serv)o(er)f(returns)h(an)g(IJS_EUNKP)-8 b(ARAM)20 b(error)-5 b(.)-2 3657 y Fb(2.15.)35 b(IJS_CMD_BEGIN_P)-12 b(A)-6 b(GE)396 3931 y Fg(This)21 b(command)d(be)o(gins)h(a)i(ne)n(w)f(page.)f (All)i(of)f(the)g(parameters)f(af)n(fecting)g(the)h(data)g(format)f(of) h(the)g(page)g(should)396 4039 y(ha)n(v)o(e)g(already)f(been)g(set)i (by)f(this)h(time.)-2 4378 y Fb(2.16.)35 b(IJS_CMD_SEND_D)-5 b(A)-11 b(T)g(A_BLOCK)396 4652 y Fg(This)21 b(command)d(sends)i(a)h (block)e(of)h(data,)g(in)g(the)g(format)f(de\002ned)g(by)h(P)o (ageImageLanguage)c(and)k(its)h(subsidiary)396 4760 y(parameters.)e (There)g(are)h(no)g(alignment)f(restrictions.)h(There)f(are)h(tw)o(o)g (ar)o(guments:)f(the)h(job)g(id,)g(and)f(the)i(size)g(of)e(the)396 4868 y(data)h(block)g(in)g(bytes.)g(The)g(data)g(block)f(follo)n(ws)h (the)g(command,)e(in)i(the)g(same)h(stream.)p Black 3840 5569 a Fd(6)p Black eop %%Page: 7 7 7 6 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black 396 72 a Fg(Note)h(that)h (shared-memory)16 b(transport)j(of)h(b)n(ulk)g(data)g(is)h(anticipated) e(in)i(a)f(future)f(v)o(ersion)g(of)h(this)h(standard.)e(Pipe)396 180 y(transport)g(will)i(still)g(be)g(used)f(as)g(a)h(f)o(allback)e(in) i(case)f(shared-memory)d(transport)i(is)i(una)n(v)n(ailable.)396 454 y(The)f(serv)o(er)f(must)i(be)f(in)g(the)g(middle)g(of)g(a)g(page)g (\(ie)g(BEGIN_P)-8 b(A)m(GE)20 b(without)f(the)i(corresponding)16 b(END_P)-8 b(A)m(GE\))396 562 y(when)20 b(this)h(command)d(is)j (issued.)-2 901 y Fb(2.17.)35 b(IJS_CMD_END_P)-12 b(A)-6 b(GE)396 1175 y Fg(This)21 b(command)d(ends)i(a)g(page.)g(The)f(serv)o (er)h(must)g(be)g(in)h(the)f(middle)f(of)h(a)h(page)e(when)h(this)g (command)f(is)i(issued.)396 1283 y(The)f(ar)o(gument)e(is)j(the)f(job)g (id.)-2 1621 y Fb(2.18.)35 b(IJS_CMD_EXIT)396 1895 y Fg(This)21 b(command)d(signals)i(the)g(end)g(of)g(the)g(IJS)h (connection.)d(In)i(the)g(typical)g(case)g(of)g(a)h(serv)o(er)e(with)i (a)f(single)g(client,)396 2003 y(the)g(serv)o(er)g(process)g (terminates)f(upon)g(receipt)h(of)g(this)g(command.)396 2277 y(The)g(connection)e(must)i(be)h(in)f(a)g(closed)g(state)h(at)g (the)f(time)h(of)e(this)i(command.)p Black -85 2395 a Fe(*)p Black 46 w(Need)e(to)g(look)g(into)g(r)o(ace)g(condition.)-2 2855 y Fh(3.)39 b(P)l(arameter)n(s)396 3129 y Fg(IJS)21 b(de\002nes)f(a)h(small)f(set)h(of)f(standard)f(parameters,)g(which)h (all)g(clients)h(and)f(serv)o(ers)f(are)h(e)o(xpected)f(to)h (understand.)396 3237 y(Indi)n(vidual)d(implementations)h(may)h(e)o (xtend)f(this)i(standard)e(set)i(with)g(additional)e(parameters)g (speci\002c)i(to)f(the)h(de)n(vice)396 3345 y(or)g(dri)n(v)o(er)-5 b(.)19 b(Clients)i(should,)e(in)h(general,)f(pro)o(vide)f(some)i (mechanism)f(for)h(setting)g(\(and)f(possibly)h(querying\))396 3453 y(arbitrary)f(additional)g(parameters.)f(In)i(particular)m(,)f (command)f(line)i(clients)h(should)e(accept)h(command)e(line)i(options) 396 3561 y(to)h(set)g(additional)d(parameters.)h(Interacti)n(v)o(e)g (clients)h(should)f(ideally)h(query)f(the)h(serv)o(er)f(for)h(a)h(list) g(of)f(these)396 3669 y(parameters)f(to)i(display)e(in)i(the)f(interf)o (ace,)f(then)h(query)e(each)i(parameter)f(for)g(the)i(list)g(of)f (possible)g(v)n(alues,)f(presented)396 3777 y(as)i(menu)e(choices.)396 4051 y(In)g(addition,)f(in)i(man)o(y)e(scenarios,)h(the)g(client)h(may) e(ha)n(v)o(e)h(additional)f(information)f(speci\002c)j(to)g(the)f(de)n (vice,)f(obtained)396 4159 y(through)g(other)i(means,)f(for)h(e)o (xample)f(a)h(PPD)h(\(or)f(PPD-lik)o(e\))g(\002le)h(speci\002ed)f(by)f (the)i(user)-5 b(.)20 b(Such)g(\002le)g(formats)g(are)396 4267 y(well)h(be)o(yond)d(the)i(scope)g(of)g(this)h(speci\002cation.)e (Ho)n(we)n(v)o(er)m(,)f(man)o(y)h(users)h(may)g(\002nd)g(the)g(simple)g (parameter)396 4375 y(mechanism)f(of)h(IJS)h(to)f(be)g(suf)n(\002cient) g(for)g(their)g(needs.)f(A)i(particular)e(strength)g(of)h(the)g(IJS)h (parameter)e(mechanism)396 4483 y(is)i(that)g(no)e(additional)g(ef)n (fort)g(is)i(required)e(to)h(handle)f(dynamic)g(capability)g (information,)f(for)h(e)o(xample)g(the)396 4591 y(presence)g(of)h(a)h (hot-pluggable)16 b(duple)o(x)o(er)-5 b(.)396 4865 y(Often,)20 b(one)f(parameter)g(will)i(be)f(subsidiary)f(to)i(another)-5 b(.)19 b(In)g(this)i(case,)g(the)f(subsidiary)f(parameter)f(should)i (be)g(set,)396 4973 y(gotten,)f(or)h(enumerated)e(after)i(the)g(other)g (parameter)e(is)k(set.)p Black 3839 5569 a Fd(7)p Black eop %%Page: 8 8 8 7 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 94 a Fh(4.)39 b(Standar)m(d)f(parameter)n(s)396 368 y Fg(This)21 b(section)f (describes)f(the)h(standard)f(parameters)g(speci\002ed)h(by)g(IJS.)-2 696 y Fb(4.1.)34 b(OutputFile)396 970 y Fg(This)21 b(parameter)d(is)j (the)g(\002lename)e(intended)g(for)h(IJS)g(output.)f(It)i(will)g(often) e(refer)g(to)i(a)f(de)n(vice,)f(b)n(ut)i(can)f(also)g(be)g(a)396 1078 y(re)o(gular)f(\002le.)396 1352 y(Note)h(that)g(this)h(parameter)d (should)h(be)h(considered)e(security-sensiti)n(v)o(e.)g(Clients)i (should)f(tak)o(e)h(care)g(to)g(ensure)f(that)h(it)396 1460 y(is)h(set)g(only)f(to)g(le)o(gitimate)g(v)n(alues.)-2 1798 y Fb(4.2.)34 b(OutputFD)396 2072 y Fg(This)21 b(is)g(an)f (alternati)n(v)o(e)f(to)h(OutputFile,)f(and)h(is)h(intended)e(to)h (support)f(-sOutputFile=-)g(and)h(-sOutputFile="|cmd")396 2180 y(con\002gurations)e(of)i(Ghostscript.)f(The)h(parameter)f(is)i(a) g(numeric)d(\002le)j(descriptor)-5 b(.)-2 2519 y Fb(4.3.)34 b(De)n(viceMan)o(ufacturer)396 2793 y Fg(This)21 b(parameter)d(is)j (the)g(manuf)o(acturer)c(of)j(the)g(printer)-5 b(.)20 b(In)f(general,)g(it)i(should)e(match)h(the)g("MANUF)-6 b(A)m(CTURER")396 2901 y(\(or)20 b("MFR"\))g(\002eld)h(of)f(the)g(IEEE) f(1284)g(De)n(vice)h(ID)g(string)g(e)o(xactly[IEEE1284].)396 3175 y(There)g(are)g(man)o(y)f(dif)n(ferent)f(scenarios)i(for)f (setting)i(and)e(querying)f(this)j(parameter)m(,)d(depending)g(on)h (what)396 3283 y(information)f(is)j(kno)n(wn)e(about)g(the)h(de)n (vice.)396 3557 y(In)g(the)g(case)h(where)f(the)g(serv)o(er)f(is)i (able)f(to)h(identify)e(the)h(de)n(vice,)f(for)h(e)o(xample)e(by)i (retrie)n(ving)f(the)h(IEEE)f(1284)396 3665 y(De)n(vice)h(ID)g(string,) g(or)g(through)e(the)i(GET_DEVICE_ID)e(request)i(of)g(the)g(USB)h (Printer)f(Class[USBPrint],)h(getting)396 3772 y(the)f(v)n(alue)g(of)g (the)g(parameter)e(will)j(retrie)n(v)o(e)e(this)h(identi\002cation)f (string.)h(In)g(general,)e(the)i(serv)o(er)g(should)f(perform)f(the)396 3880 y(de)n(vice)i(ID)g(query)f(at)h(the)h(time)f(of)g(the)g(GET_P)-8 b(ARAM)20 b(command.)396 4154 y(In)g(the)g(case)h(where)f(the)g(de)n (vice)f(identi\002cation)g(is)i(con\002gured)d(by)i(the)g(client,)g (the)g(client)g(may)g(set)h(this)g(parameter)m(,)396 4262 y(then)f(set)h(the)f(De)n(viceModel)f(parameter)-5 b(.)396 4536 y(Finally)g(,)20 b(enumerating)d(this)k(parameter)e (returns)g(a)i(list)g(of)f(manuf)o(acturers)e(kno)n(wn)g(by)i(the)g (serv)o(er)-5 b(.)20 b(This)g(may)g(be)396 4644 y(helpful)f(for)h (installing)g(a)g(ne)n(w)g(printer)f(in)i(cases)g(where)e(automatic)g (de)n(vice)h(identi\002cation)f(is)i(not)f(a)n(v)n(ailable.)396 4918 y(There)g(may)f(be)h(cases)h(where)f(the)g(serv)o(er)g(is)h(able)f (to)g(automatically)f(identify)g(the)h(de)n(vice,)f(and)h(the)g(client) g(attempts)396 5026 y(to)h(o)o(v)o(erride)d(this)i(identi\002cation.)f (The)h(serv)o(er)f(should)g(allo)n(w)h(this)h(o)o(v)o(erride)d(to)i (occur)m(,)f(particularly)f(when)i(the)p Black 3842 5569 a Fd(8)p Black eop %%Page: 9 9 9 8 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black 396 72 a Fg(de)n(vice)h(ID)g (is)h(not)f(one)g(kno)n(wn)e(to)j(the)f(serv)o(er)-5 b(.)19 b(Ho)n(we)n(v)o(er)m(,)f(the)j(serv)o(er)e(can)h(reject)g(such)g (attempts)g(by)g(returning)e(an)396 180 y(IJS_ERANGE)i(error)-5 b(.)-2 519 y Fb(4.4.)34 b(De)n(viceModel)396 793 y Fg(This)21 b(parameter)d(is)j(the)g(model)e(name)h(of)f(the)i(printer)m(,)d(and)i (together)f(with)h(De)n(viceManuf)o(acturer)m(,)c(identi\002es)k(the) 396 901 y(de)n(vice.)f(In)h(general)f(it)i(should)e(match)h(the)g ("MODEL")g(\(or)g("MDL"\))f(\002eld)i(of)e(the)i(IEEE)e(1284)g(De)n (vice)h(ID)g(string.)396 1175 y(Usage)g(scenarios)g(are)g(similar)h(to) f(De)n(viceManuf)o(acturer)-5 b(.)17 b(This)j(parameter)f(is)i (subsidiary)e(to)i(De)n(viceManuf)o(acturer)-5 b(.)396 1449 y(Setting)20 b(the)h(de)n(vice)e(manuf)o(acturer)e(and)j(model)f (may)h(ha)n(v)o(e)g(profound)d(ef)n(fects)j(on)f(the)i(list)g(of)f (other)f(parameters)396 1557 y(a)n(v)n(ailable.)h(F)o(or)g(e)o(xample,) e(the)i(serv)o(er)g(may)f(in)i(f)o(act)f(be)g(a)h(wrapper)e(that)h(in)m (v)n(ok)o(es)f(the)h(\223real\224)g(serv)o(er)g(once)f(the)h(de)n(vice) 396 1665 y(id)h(is)g(kno)n(wn,)d(and)i(then)g(proxies)f(all)h(IJS)h (commands)e(subsequently)-5 b(.)17 b(Thus,)j(all)h(other)e(parameters)g (other)g(than)396 1773 y(OutputFD,)h(OutputFile,)f(and)g(De)n (viceManuf)o(acturer)m(,)e(should)i(be)h(considered)e(subsidiary)h(to)i (this)f(one.)-2 2111 y Fb(4.5.)34 b(P)l(a)o(g)q(eIma)o(g)q(eFormat)396 2385 y Fg(This)21 b(parameter)d(speci\002es)j(the)f(format)f(of)h(the)g (page)g(image)g(data)g(to)g(be)g(sent)h(to)f(the)g(printer)-5 b(.)19 b(This)i(standard)e(only)396 2493 y(de\002nes)h(one)g(standard)f (v)n(alue:)g("Raster".)i(Other)f(v)n(alues,)f(including)g(compressed)f (raster)i(formats,)g(as)g(well)h(as)396 2601 y(possibly)f(higher)f(le)n (v)o(el)h(page)f(description)g(languages)f(such)i(as)h(PostScript)f (and)g(PDF)-7 b(,)21 b(are)f(en)m(visioned)f(as)h(possible)396 2709 y(future)f(e)o(xtensions.)396 2983 y(When)h(it)h(mak)o(es)f (sense,)h(names)e(consistent)h(with)h(the)f("COMMAND)g(SET")g(\(or)g ("CMD"\))g(\002eld)h(of)f(the)g(IEEE)f(1284)396 3091 y(De)n(vice)h(ID)g(string)g(are)g(recommended.)d(Ho)n(we)n(v)o(er)m(,)h (this)j(namespace)e(has)h(man)o(y)f(shortcomings)g(for)g(use)i(with)f (IJS.)396 3199 y(In)g(particular)m(,)f(it)h(tends)g(to)h(identify)e (the)h(command)e(set)j(too)f(v)n(aguely)-5 b(.)18 b(F)o(or)i(e)o (xample,)e(man)o(y)h(Epson)h(printers)f(report)396 3307 y(merely)h("ESCPL2",)f(which)h(is)h(not)f(nearly)f(precise)h(enough)e (to)j(usefully)e(dri)n(v)o(e)g(the)h(printer)-5 b(.)396 3580 y(When)20 b(the)g(v)n(alue)g(is)h("Raster",)f(the)h(follo)n(wing)d (parameters)h(are)h(required,)e(and)i(are)g(subsidiary)f(to)i(this)f (one:)g(Dpi,)396 3688 y(W)m(idth,)g(Height,)g(BitsPerSample,)g (ColorSpace,)e(and)i(NumChan.)-2 4027 y Fb(4.6.)34 b(Dpi)396 4301 y Fg(This)21 b(parameter)d(is)j(the)g(resolution)d(for)i(transfer) f(of)h(raster)g(data.)g(It)h(is)g(speci\002ed)f(as)h(a)f(horizontal)f (resolution,)f(in)396 4409 y(\003oating)i(decimal)f(dpi)h(units,)g(an)g ("x",)g(and)g(a)g(v)o(ertical)g(resolution,)e(in)j(\003oating)e (decimal)h(dpi)g(units.)g(Thus,)f(a)i(typical)396 4517 y(v)n(alue)f(is)h("1440x720".)396 4791 y(Note)f(that)h(the)f(serv)o(er) f(may)h(perform)e(scaling)i(of)g(the)g(raster)g(data)g(as)h(part)f(of)g (its)h(processing,)e(before)g(sending)g(it)i(to)396 4899 y(the)f(de)n(vice.)g(In)g(these)g(cases,)h(the)f(Dpi)g(parameter)f (speci\002es)h(the)h(resolution)d(prior)i(to)g(scaling.)g(F)o(or)f(e)o (xample,)g(a)396 5007 y(dri)n(v)o(er)g(might)g(accept)h(720)g(dpi)f (raster)i(data,)e(then)h(perform)e(2:1)i(horizontal)f(pix)o(el)g (replication)g(to)h(dri)n(v)o(e)f(the)i(actual)396 5114 y(de)n(vice)f(at)g(1440x720)d(dpi.)j(In)g(this)g(e)o(xample,)f(the)h(v) n(alue)g(of)g(the)g(Dpi)g(parameter)f(is)i("720x720".)p Black 3842 5569 a Fd(9)p Black eop %%Page: 10 10 10 9 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 77 a Fb(4.7.)34 b(Width)396 351 y Fg(This)21 b(parameter)d(is)j(the)g(decimal)e (encoded)g(width)h(of)f(the)i(raster)f(image,)f(in)i(pix)o(els.)e(It)i (MUST)f(be)g(set)h(when)396 459 y(P)o(ageImageF)o(ormat)c(is)k(Raster) -5 b(.)-2 797 y Fb(4.8.)34 b(Height)396 1071 y Fg(This)21 b(parameter)d(is)j(the)g(decimal)e(encoded)g(height)g(of)h(the)g (raster)g(image,)g(in)g(pix)o(els.)g(It)g(MUST)g(be)h(set)g(for)e (raster)396 1179 y(images.)-2 1517 y Fb(4.9.)34 b(BitsP)l(erSample)396 1791 y Fg(This)21 b(parameter)d(is)j(the)g(decimal)e(encoded)g(bit)h (depth)f(of)h(samples)g(for)g(pix)o(el)g(v)n(alues.)f(It)i(MUST)f(be)g (set)h(for)f(raster)396 1899 y(images.)g(V)-9 b(alid)20 b(v)n(alues)g(include)f(1-7)g(\(implying)g(client-side)g(dithering)g (of)h(image)f(pix)o(els\),)h(8,)g(and)f(16)h(\(both)396 2007 y(implying)f(serv)o(er)n(-side)g(dithering)f(if)j(needed)e(by)h (the)g(de)n(vice\).)f(In)h(general,)e(the)j(total)f(number)e(of)i(bits) h(per)f(pix)o(el)f(is)396 2115 y(equal)h(to)g(BitsPerSample)h(times)f (NumChan.)396 2389 y(In)g(man)o(y)f(cases,)i(querying)d(this)i (parameter)f(will)i(be)f(useful.)g(A)g(\223dumb\224)f(serv)o(er)g(may)h (choose)f(not)h(to)g(implement)396 2497 y(color)g(transform)e(and)i (dithering,)e(lea)n(ving)i(these)g(to)g(the)h(client.)f(In)f(this)i (case,)g(the)f(result)g(of)g(the)g(query)f(operation)396 2605 y(will)i(be)f(a)h(list)g(of)f(bit)g(depths)g(actually)f(supported) f(by)i(the)g(de)n(vice.)f(Simple)h(de)n(vices)g(may)f(report)g("1",)h (while)g(de)n(vices)396 2713 y(capable)g(of)f(both)h(bile)n(v)o(el)f (and)h(4-le)n(v)o(el)f(v)n(ariable)g(dots)h(may)g(report)f("1,2".)396 2987 y(Note)h(that)h(not)f(all)g(combinations)e(of)i(BitsPerSample)h (and)e(ColorSpace)g(are)i(v)n(alid.)e(In)h(particular)m(,)e (BitsPerSample)396 3095 y(less)k(than)d(8)i(in)f(combination)e(with)i (a)h(ColorSpace)e(of)h(sRGB)i(or)d(an)o(y)h(other)f(colorimetric)g (color)g(space)h(are)g(not)396 3203 y(v)n(alid.)g(Also)g(for)g(scRGB)h (\(also)g(kno)n(wn)d(as)j(sRGB64\),)f(16)g(is)h(the)f(only)g(v)n(alid)g (v)n(alue.)396 3477 y(When)g(the)g(v)n(alue)g(is)h(16,)f(the)g(ByteSe)o (x)g(parameter)e(is)k(required,)c(and)h(is)i(subsidiary)e(to)i(this)g (one.)-2 3815 y Fb(4.10.)35 b(ByteSe)n(x)396 4089 y Fg(When)20 b(BitsPerSample)h(is)g(equal)e(to)i(16,)e(this)i(parameter)e (speci\002es)h(the)g(byte)g(se)o(x)g(of)g(the)g(raster)h(data.)e (Possible)396 4197 y(v)n(alues)h(are)g("big-endian")e(and)h ("little-endian".)396 4471 y(Enumerating)f(this)j(parameter)d(should)h (list)j(the)e(preferred)e(byte)i(se)o(x)g(as)h(the)f(def)o(ault)f(\(ie) i(\002rst)g(in)f(the)396 4579 y(comma-separated)e(list\).)i(In)g(most)g (cases,)h(this)g(will)g(be)f(the)g(byte)g(se)o(x)g(of)g(the)g(serv)o (er')-5 b(s)20 b(host)g(architecture.)396 4853 y(Serv)o(ers)g(limited)g (to)g(8)g(bits)h(of)f(depth)f(need)h(not)g(implement)f(this)h (parameter)f(at)i(all.)p Black 3800 5569 a Fd(10)p Black eop %%Page: 11 11 11 10 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 77 a Fb(4.11.)35 b(ColorSpace)396 351 y Fg(This)21 b(parameter)d(is)j(a)g(string)f (identifying)e(the)i(color)g(space)g(of)g(the)g(raster)g(image)g(data.) g(It)g(MUST)g(be)h(set)g(for)e(raster)396 459 y(images.)h(Standard)f(v) n(alues)h(include)f("De)n(viceGray",)f("De)n(viceRGB",)i("De)n (viceCMYK",)f(and)h("sRGB".)h(Serv)o(ers)396 566 y(should)e(support)g (at)i(least)g(one)f(of)f(these)i(color)e(spaces.)h(Clients)h(should)f (be)g(able)g(to)g(produce)e(raster)i(output)f(if)i(at)396 674 y(least)g(one)f(of)g(these)g(color)f(spaces)i(is)g(supported)d(by)i (the)g(serv)o(er)-5 b(.)p Black -85 793 a Fe(*)p Black 64 w(I)19 b(think)g(we)g(should)h(have)g(a)f(wide-gamut)g(colorimetric) g(color)h(space)f(in)g(the)g(standar)m(d)i(list)d(as)h(well.)f(I)g(lik) o(e)h(La*b*)h(with)e(a)h(r)m(ecommended)i(bit)-2 901 y(depth)e(of)g(16.)g(Any)g(objections?)396 1175 y Fg(A)i(de)n(vice)e (may)h(choose)f(to)i(pro)o(vide)d(more)h(color)h(spaces.)g(F)o(or)g(e)o (xample,)e(6)i(color)g(inkjets)g(may)g(pro)o(vide)e(a)396 1283 y("De)n(viceCcMmYK")h(space.)h(In)g(general,)f(for)h(a)g(client)g (to)h(use)f(an)o(y)g(of)f(these)i(nonstandard)c(spaces)k(requires)396 1390 y(detailed)f(kno)n(wledge)e(of)i(the)g(color)f(rendering)f (characteristics)i(of)g(the)g(de)n(vice.)396 1664 y(Serv)o(ers)g (should)f(not)h(pro)o(vide)e(additional)h(color)g(spaces)i(which)e(are) h(merely)g(transforms)e(of)i(the)h(standard)e(color)396 1772 y(spaces.)h(Examples)g(of)g(such)f(discouraged)f(color)i(spaces)g (are)g(HSV)-11 b(,)21 b(XYZ,)f(Luv)-5 b(,)19 b(Y)-9 b(uv)k(,)19 b(YCC,)i(and)f(colorimetric)396 1880 y(RGB)i(spaces)e(other)g(than)f (sRGB)j(\(T)o(ODO:)e(unless)g(we)g(decide)g(to)g(accept)g (scRGB/sRGB64\).)-2 2219 y Fb(4.12.)35 b(NumChan)396 2493 y Fg(This)20 b(parameter)d(is)k(the)e(number)e(of)i(channels)f(in) i(the)f(chosen)f(color)h(space.)g(In)g(general,)e(it)j(can)f(be)h (determined)d(from)396 2601 y(the)j(ColorSpace.)f(In)h(particular)m(,)f (De)n(viceGray)f(implies)j(1,)f(De)n(viceRGB)g(and)g(sRGB)h(imply)f(3,) g(and)g(De)n(viceCMYK)396 2709 y(implies)h(4.)f(Attempting)f(to)h(set)h (a)f(NumChan)g(inconsistent)f(with)h(ColorSpace)f(should)h(result)g(in) g(an)g(error)-5 b(.)-2 3047 y Fb(4.13.)35 b(P)l(aperSiz)q(e)396 3321 y Fg(This)21 b(parameter)d(is)j(in)g(W)-8 b(.WWxH.HH)21 b(format,)e(in)h(inches,)g(i.e.)g(a)h(string)e(that)i(may)e(be)i (produced)c(by)j(sprintf)f(\(str)m(,)396 3429 y("\045fx\045f",)h (width,)f(height\).)g(If)h(the)g(serv)o(er)g(kno)n(ws)f(the)h(paper)f (size)i(\(which)f(is)h(unlik)o(ely)e(for)g(inkjets\),)h(then)g(getting) 396 3537 y(the)g(parameter)f(will)i(gi)n(v)o(e)e(a)i(good)e(v)n(alue.)g (In)h(the)g(more)g(common)e(case,)i(get)h(simply)e(returns)h(an)g (error)f(code)g(\(todo:)396 3645 y(probably)f(need)i(to)g(allocate)g(a) h(ne)n(w)f(one)f(for)h(this\).)g(Enumerating)e(this)i(parameter)f(may)h (gi)n(v)o(e)f(a)i(list)g(of)f(paper)f(sizes)396 3753 y(kno)n(wn)g(by)h(the)g(dri)n(v)o(er)f(that)h(are)g(plausible)g(for)f (the)h(de)n(vice.)396 4027 y(The)g(result)g(of)g(getting)f(or)h (enumerating)e(P)o(aperSize)i(may)f(change)g(dynamically)f(depending)g (on)h(the)i(De)n(viceModel,)396 4135 y(Duple)o(x,)e(and)h(possibly)f (\223e)o(xtension\224)g(parameters)g(such)g(as)i(those)f(for)g (selecting)g(trays.)396 4409 y(Note)g(that)h(this)f(parameter)f(is)i (essentially)f(the)h(same)f(as)h(the)f(P)o(ageSize)g(page)g(de)n(vice)f (parameter)-5 b(.)19 b(The)h(main)396 4517 y(dif)n(ference)e(is)k (units)e(\(PostScript)g(uses)g(1/72")g(inch)f(units\),)h(and)g(the)g (minor)f(syntax)g(nit)i(of)f(PostScript)g(array)396 4625 y(encoding.)p Black 3800 5569 a Fd(11)p Black eop %%Page: 12 12 12 11 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 77 a Fb(4.14.)35 b(Printab)o(leArea)396 351 y Fg(This)21 b(parameter)d(is)j(in)g(W)-8 b(.WWxH.HH)21 b(format,)e(and)g(describes)h(the)g(printable)f(area)h (of)g(the)g(page.)f(It)i(is)g(e)o(xpected)396 459 y(that)g(the)f (client)g(will)h(usually)f(get)g(it)h(from)e(the)h(serv)o(er)-5 b(.)20 b(An)o(y)f(attempt)h(to)g(set)h(it)g(is)g(allo)n(wed)f(to)g(f)o (ail)h(with)f(an)g(error)m(,)396 566 y(e)n(v)o(en)f(if)i(it')-5 b(s)21 b(the)f(same)h(v)n(alue)e(as)i(the)f(get.)g(The)g(v)n(alue)g (may)f(change)g(dynamically)g(depending)e(on)j(P)o(aperSize)f(and)396 674 y(other)h(parameters.)-2 1013 y Fb(4.15.)35 b(Printab)o(leT)-10 b(opLeft)396 1287 y Fg(This)21 b(parameter)d(is)j(in)g(W)-8 b(.WWxH.HH)21 b(format,)e(and)g(contains)h(the)g(left)g(and)g(top)g (mar)o(gins)f(of)h(the)g(printable)f(area)396 1395 y(with)i(respect)f (to)g(the)g(media.)f(It)i(is)g(the)f(companion)e(to)i(PrintableArea)f (\(I'm)g(considering)g(ha)n(ving)g(a)h(single)396 1503 y(parameter)f(that)h(ASCII)h(encodes)e(the)h(four)f(\003oats\).)-2 1841 y Fb(4.16.)35 b(T)-10 b(opLeft)396 2115 y Fg(This)21 b(parameter)m(,)d(in)i(W)-8 b(.WWxH.HH)21 b(is)g(intended)e(to)h(be)g (set,)h(and)f(controls)f(the)h(placement)f(of)h(the)g(raster)h(image)e (on)396 2223 y(the)h(page.)g(The)g(corresponding)c(size)21 b(of)f(the)g(raster)g(image)g(area)g(can)g(be)g(inferred)f(from)g(the)h (W)m(idth,)g(Height,)f(and)396 2331 y(Dpi)i(parameters.)-2 2670 y Fb(4.17.)35 b(P)-5 b(ostScript)33 b(P)l(a)o(g)q(e)i(De)n(vice)g (P)l(arameter)n(s)396 2944 y Fg(PostScript)20 b(de\002nes)g(a)h(number) d(of)i(page)g(de)n(vice)f(parameters,)g(man)o(y)g(of)h(which)f(are)i (rele)n(v)n(ant)e(to)h(IJS,)h(whether)e(using)396 3051 y(PostScript)h(or)g(not.)g(Further)m(,)f(man)o(y)g(proposals)f(for)i (characterizing)e(de)n(vice)h(capabilities)h(are)g(based)g(on)g(PPD)h (\002les,)396 3159 y(which)f(use)g(a)h(consistent)f(namespace)f(and)g (semantics)i(to)f(page)f(de)n(vice)h(parameters.)396 3433 y(IJS)h(imports)f(the)g(namespace)f(of)h(PostScript)g(page)f(de)n (vice)h(parameters,)e(pre\002xing)h(it)i(with)f(the)g(string)g("PS:".)h (The)396 3541 y(client)f(can)g(assume)h(that)f(an)o(y)f(parameters)g (returned)g(by)g(a)i(LIST_P)-8 b(ARAMS)20 b(command)f(matching)f(this)j (pre\002x)e(are)396 3649 y(in)i(f)o(act)f(PostScript)g(page)g(de)n (vice)f(parameters.)g(V)-9 b(alues)20 b(are)g(straightforw)o(ard)e (ASCII)i(encodings.)e(F)o(or)i(e)o(xample,)396 3757 y(arrays)g(are)g (encoded)e(as)j(space-separated)e(v)n(alues,)g(enclosed)g(in)i(square)e (brack)o(ets.)g(The)h(set)h(of)f(v)n(alid)g(page)f(de)n(vice)396 3865 y(parameters)g(is)i(de\002ned)f(in)g(the)g(PostScript)g(Language)e (Reference)i(Manual[PLRM],)e(particularly)h(Chapter)g(6.)396 4139 y(Some)h(page)g(de)n(vice)f(parameters)g(are)h(subsumed)f(by)h (nati)n(v)o(e)f(IJS)i(parameters,)e(and)g(should)g(not)h(be)g(used.)g (These)396 4247 y(include)f(P)o(ageSize)h(\(subsumed)f(by)h(P)o (aperSize\),)e(ProcessColorModel)h(\(subsumed)f(by)i(ColorSpace\),)f (Mar)o(gins)396 4355 y(and)h(P)o(ageOf)n(fset)f(\(subsumed)g(by)g(T)-7 b(opLeft\),)19 b(and)h(HWResolution)g(\(subsumed)e(by)i(Dpi\).)396 4629 y(De)n(vices)g(supporting)e(duple)o(xing)g(should)h(implement)g (PS:Duple)o(x)g(and)h(PS:T)l(umble,)f(both)h(booleans.)e(A)j(v)n(alue)f (of)396 4737 y(true)g(for)g(PS:Duple)o(x)f(requests)h(printing)e(on)i (both)g(sides)g(of)g(the)h(page.)e(When)h(PS:Duple)o(x)f(is)i(true,)f (PS:T)l(umble)396 4845 y(speci\002es)h(the)e(relati)n(v)o(e)h (orientation)e(of)h(the)h(pages.)f(When)h(PS:T)l(umble)f(is)i(f)o (alse,)f(the)g(pages)g(are)f(oriented)g(suitably)g(at)396 4953 y(the)h(left)g(or)f(right.)g(When)h(PS:T)l(umble)f(is)h(true,)f (the)h(pages)f(are)h(oriented)e(suitably)i(for)f(binding)f(at)i(the)f (top)h(or)f(bottom.)396 5061 y(Enumerating)f(the)i(PS:Duple)o(x)f (parameter)g(should)g(return)g(a)i(single)f("f)o(alse")g(v)n(alue)g (when)g(the)g(serv)o(er)f(kno)n(ws)g(that)396 5168 y(the)h(de)n(vice)g (is)h(not)f(capable)f(of)h(duple)o(xing,)d(and)j(either)g("f)o (alse,true")f(or)h("true,f)o(alse")f(if)i(it)g(may)e(be.)p Black 3800 5569 a Fd(12)p Black eop %%Page: 13 13 13 12 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black Black -85 72 a Fe(*)p Black 46 w(Note)f(that)g(the)g(HPIJS)g(1.0)g(implementation)h (of)f(IJS,)g(identifying)h(itself)e(as)h(IJS)h(ver)o(sion)g(0.29,)f (speci\002es)h(an)g(inte)m(g)o(er)o(-valued)g(Duple)o(x)g(par)o(ameter) -8 b(,)-2 180 y(with)18 b(values)i(of)f(0)g(\(PS:Duple)o(x)f(=)h(false) o(,)g(PS:T)l(umble)g(don')n(t)g(car)m(e\),)g(1)g(\(PS:Duple)o(x)g(=)g (true)o(,)g(PS:T)l(umble)g(=)g(false\),)f(and)i(2)f(\(PS:Duple)o(x)g(=) g(true)o(,)-2 288 y(PS:T)l(umble)f(=)h(true\).)g(An)g(inte)m(g)o(er)g (valued)h(Duple)o(x)f(par)o(ameter)h(is)f(inconsistent)g(with)g(the)g (P)-6 b(ostScript)19 b(speci\002cation.)h(Howe)o(ver)-8 b(,)19 b(clients)-2 396 y(desiring)g(compatibility)g(should)h(set)f (the)g(inte)m(g)o(er)o(-valued)h(Duple)o(x)f(par)o(ameter)h(r)o(ather)f (than)h(the)f(PS:)g(par)o(ameter)o(s)h(when)f(the)g(server)g(r)m (eports)h(a)-2 504 y(ver)o(sion)g(of)e(0.29.)396 778 y Fg(De)n(vices)i(supporting)e(roll-fed)h(media)h(should)f(implement)g (PS:RollFedMedia,)g(PS:Orientation,)396 886 y(PS:Adv)n(anceMedia,)f (PS:Adv)n(anceDistance)h(\(note)g(that)i(units)f(are)g(inte)o(ger)f (1/72"\),)g(and)g(PS:CutMedia.)396 1160 y(Other)h(parameters)f(that)h (may)g(be)g(useful)g(for)f(some)h(de)n(vices)g(include)f(PS:MediaColor) m(,)g(PS:MediaW)-7 b(eight,)396 1268 y(PS:MediaT)g(ype,)19 b(PS:MediaClass,)i(PS:InsertSheet,)f(PS:LeadingEdge,)d(PS:ManualFeed,)i (PS:T)m(raySwitch,)396 1376 y(PS:MediaPosition,)h(PS:ImageShift,)e (PS:MirrorPrint,)h(PS:Ne)o(gati)n(v)o(ePrint,)f(PS:NumCopies,)i (PS:Collate,)396 1484 y(PS:Jog,)g(PS:OutputF)o(aceUp,)f (PS:Separations,)g(and)h(PS:SeparationColorNames.)e(Other)h(parameters) g(are)396 1592 y(allo)n(wed,)h(b)n(ut)g(are)g(unlik)o(ely)f(to)h(be)g (useful)g(in)g(an)h(IJS)f(conte)o(xt.)-2 2062 y Fh(5.)39 b(P)l(arameter)f(Namespace)f(Extension)396 2336 y Fg(While)21 b(this)g(document)d(speci\002es)j(enough)d(parameters)h(to)h(be)g(able) g(to)h(print)e(usefully)-5 b(,)19 b(there)g(is)j(a)e(huge)f(di)n(v)o (ersity)g(of)396 2444 y(de)n(vices)h(and)g(applications,)e(often)i (indicating)f(additional)f(parameters)h(not)h(speci\002ed.)g(IJS)h(is)g (designed)e(to)396 2552 y(accomodate)g(these)h(additional)f(parameters) g(as)i(e)o(xtensions.)d(It)j(is)g(e)o(xpected)e(that)h(the)g(namespace) f(of)h(these)396 2660 y(e)o(xtensions)e(will)j(be)e(managed)e (informally)-5 b(.)17 b(Note)i(that)h(collisions)f(in)h(this)g (namespace)e(are)h(not)g(necessarily)g(f)o(atal,)g(as)396 2768 y(man)o(y)g(will)i(be)f(de)n(vice)g(or)g(manuf)o(acturer)d (speci\002c,)j(so)h(that)f(the)g(de)n(vice)g(id)g(may)g(be)g(used)g(to) g(disentangle)f(them.)396 2876 y(Ev)o(en)g(so,)i(it)g(is)g(clearly)e(a) i(good)e(idea)h(to)g(manage)f(this)i(namespace)e(well.)h(This)h (section)f(recommends)e(some)396 2984 y(practices)i(to)n(w)o(ards)g (this)g(goal.)396 3258 y(When)g(possible,)f(e)o(xtension)g(parameters)g (should)g(be)g(pre\002x)o(ed,)f(with)j(a)f(colon)f(separating)g(the)h (pre\002x)f(from)g(the)h(base)396 3366 y(parameter)f(name.)g(W)-7 b(ell)22 b(kno)n(wn)c(pre\002x)o(es)i(gi)n(v)o(e)f(clients)i(useful)e (information)f(about)h(parameters,)g(e)n(v)o(en)g(when)h(the)396 3474 y(client)g(lacks)h(information)d(about)h(the)h(speci\002c)g (parameter)-5 b(.)19 b(An)i(unkno)n(wn)c(pre\002x)j(at)g(least)h(allo)n (ws)g(the)f(client)g(to)396 3582 y(identify)f(the)i(parameter)d(as)j(a) g(nonstandard)c(e)o(xtension.)396 3856 y(This)k(document)d(speci\002es) j(a)f(number)f(of)g(standard)g(pre\002x)o(es.)h(W)-7 b(e)21 b(also)f(reserv)o(e)g(the)g(follo)n(wing)e(pre\002x)o(es)i(for) 396 3964 y(possible)g(use)h(in)f(future)f(re)n(visions)g(of)h(this)h (protocol:)e(IPP)-9 b(,)20 b(UPDF)-7 b(.)21 b(Further)m(,)e(the)h (Omni:)g(pre\002x)f(is)i(reserv)o(ed)e(for)h(the)396 4071 y(Omni)g(group)f(at)h(IBM,)h(and)e(CUPS:)j(is)f(reserv)o(ed)e(for) g(the)h(CUPS)i(project.)p Black -85 4190 a Fe(*)p Black 46 w(Robert,)d(do)g(you)g(want)g(STP:?)g(Anyone)h(else?)-2 4518 y Fb(5.1.)34 b(Quality:)396 4792 y Fg(Inkjet)20 b(printers)f(often)g(pro)o(vide)g(a)h(rich)g(set)h(of)f(options)f(for)h (tuning)f(output)g(quality)-5 b(,)18 b(or)i(selecting)g(a)h(point)e (along)h(a)396 4900 y(speed/quality)f(tradeof)n(f.)f(The)i(details)g (of)g(these)h(options)e(v)n(ary)g(widely)h(from)f(de)n(vice)g(to)i(de)n (vice.)e(When)h(made)396 5008 y(a)n(v)n(ailable)g(through)e(IJS,)j(the) o(y)e(should)g(be)h(grouped)e(under)h(the)h(Quality:)g(pre\002x.)p Black 3800 5569 a Fd(13)p Black eop %%Page: 14 14 14 13 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black 396 72 a Fg(F)o(or)h(e)o (xample,)f(HPIJS)i(1.0)e(has)i(the)f(follo)n(wing)e(parameters,)h(for)h (HP)g(inkjet)g(printers:)g(Quality)-5 b(,)19 b(MediaT)-7 b(ype,)396 180 y(ColorMode,)19 b(and)g(PenSet.)h(T)-7 b(o)21 b(be)f(compliant)f(with)h(v)o(ersions)f(0.30)g(and)h(later)g(of) g(IJS,)h(the)o(y)e(should)g(be)i(named)396 288 y(Quality:Quality)-5 b(,)19 b(Quality:MediaT)-7 b(ype,)17 b(Quality:ColorMode,)h(and)h (Quality:PenSet.)396 562 y(Note)h(that)h(Quality:MediaT)-7 b(ype)18 b(o)o(v)o(erlaps)g(some)n(what)i(with)g(PS:MediaT)-7 b(ype.)19 b(In)h(general,)f(the)h(former)f(speci\002es)h(a)396 670 y(color)g(pro\002le)f(or)h(printing)f(mode)g(\(for)g(e)o(xample,)g (to)h(optimize)f(printing)g(on)h(transparencies\).)e(The)i(latter)g(is) h(often)396 778 y(used)f(for)g(selecting)g(a)g(paper)f(source,)h(for)f (e)o(xample)g(letterhead)g(or)h(en)m(v)o(elopes.)e(The)i(former)e(is)k (more)d(lik)o(ely)h(to)g(be)396 886 y(useful)g(in)g(inkjet)g (applications.)396 1160 y(The)g(Dpi)g(and)g(ColorSpace)f(parameters)g (are)h(subsidiary)f(to)i(an)o(y)e(Quality:)h(parameters)f(pro)o(vided.) -2 1499 y Fb(5.2.)34 b(Finishing:)396 1773 y Fg(Finishing)20 b(options,)f(such)h(as)h(stapling)e(and)h(collating,)f(should)g(be)h (grouped)e(under)h(the)h(Finishing)g(pre\002x.)396 2046 y(The)g(PS)h(page)f(de)n(vice)f(parameter)g(namespace)g(includes)g (some)h(\002nishing)g(options,)f(including)f(Duple)o(x,)h(T)l(umble,) 396 2154 y(Collate,)i(Jog,)e(and)h(the)g(roll-fed)f(parameters:)g (RollFedMedia,)g(Orientation,)g(Adv)n(anceMedia,)f(Adv)n(anceDistance,) 396 2262 y(and)i(CutMedia.)f(F)o(or)h(these)h(parameters,)d(the)j(PS:)g (pre\002x)e(is)i(preferred.)396 2536 y(The)f(PPD)h(speci\002cation)f (describes)f(a)i(number)d(of)i(additional)f(\002nishing)g(parameters)g (\(section)h(5.18)f(of)h([PPD]\).)396 2644 y(Where)g(possible,)g (Finishing:)f(parameters)g(should)h(be)g(consistent)g(with)g(the)g(PPD) h(speci\002cation.)-2 2983 y Fb(5.3.)34 b(PPD:)396 3257 y Fg(The)20 b(PPD)h(speci\002cation[PPD])e(contains)h(a)g(lar)o(ge)f (number)g(of)h(options)f(and)h(parameters)f(that)h(may)g(be)g(pro)o (vided)d(by)396 3365 y(printers.)i(The)h(PPD:)h(pre\002x)f(is)h(reserv) o(ed)e(for)g(PPD)i(parameters)e(that)h(are)h(made)e(a)n(v)n(ailable)h (through)e(the)i(IJS)396 3473 y(protocol.)396 3747 y(In)g(cases)h (where)f(both)f(a)i(page)e(de)n(vice)h(parameter)e(and)i(a)g(PPD)h (parameter)e(specify)h(the)g(same)g(setting,)g(the)g(PS:)i(page)396 3854 y(de)n(vice)e(parameter)e(tak)o(es)j(priority)-5 b(.)18 b(In)i(man)o(y)f(cases,)i(page)e(de)n(vice)g(parameters)g(are)i (adv)n(antageous)c(because)j(the)o(y)396 3962 y(are)g(designed)f(for)h (both)f(getting)h(and)f(setting,)h(while)g(PPD)h(itself)g(is)g(a)g (static)g(\002le)g(format.)e(In)h(addition,)e(\002nishing)396 4070 y(parameters)h(should)g(be)i(under)d(the)j(Finishing:)e (namespace.)396 4344 y(In)h(general,)f(use)h(of)g(the)h(PPD:)g(e)o (xtension)d(is)k(not)d(recommended,)e(as)k(the)f(PPD)h(\002le)g(format) e(tends)h(to)h(be)f(speci\002c)g(to)396 4452 y(PostScript)g(printers.)p Black -85 4571 a Fe(*)p Black 46 w(W)-7 b(e)19 b(could)h(use)f(mor)m(e) g(speci\002c)h(advice)g(on)f(when)h(to)f(use)g(PPD:)f(par)o(ameter)o (s,)h(and)h(when)g(not)f(to.)f(Anyone)i(with)e(mor)m(e)i(PPD)e (knowledg)o(e)i(willing)-2 4678 y(to)f(help)g(with)f(this?)p Black 3800 5569 a Fd(14)p Black eop %%Page: 15 15 15 14 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black -2 91 a Fh(6.)39 b(Err)m(or)g(codes)396 365 y Fg(An)o(y)20 b(IJS)h(command)d(may)i (either)f(succeed)h(or)g(f)o(ail.)g(Success)h(is)g(indicated)e(by)h(an) g(IJS_A)m(CK)g(response.)f(F)o(ailure)h(is)396 473 y(indicated)f(by)h (an)g(IJS_N)m(AK)h(response,)e(which)g(includes)h(an)g(inte)o(ger)f (error)g(code.)396 747 y(The)h(current)f(draft)g(contains)h(the)g (follo)n(wing)f(error)g(codes:)396 948 y Ff(T)-8 b(able)21 b(4.)f(Draft)g(IJS)g(Err)o(or)g(Codes)p 396 1042 3501 4 v 396 1042 V 396 1169 4 127 v 400 1144 a Fc(Symbolic)j(de\002nition)p 1562 1169 V 398 w(Numeric)g(v)n(alue)p 2728 1169 V 601 w(Meaning)p 3893 1169 V 396 1172 3501 4 v 396 1172 V 396 1299 4 127 v 400 1274 a Fg(IJS_EIO)p 1562 1299 V 878 w(-2)p 2728 1299 V 1096 w(I/O)d(error)p 3893 1299 V 396 1302 3501 4 v 396 1302 V 396 1428 4 127 v 400 1403 a(IJS_EPR)m(O)m(T)o(O)p 1562 1428 V 701 w(-3)p 2728 1428 V 1096 w(protocol)e(error)p 3893 1428 V 396 1432 3501 4 v 396 1432 V 396 1558 4 127 v 400 1533 a(IJS_ERANGE)p 1562 1558 V 680 w(-4)p 2728 1558 V 1096 w(out)i(of)g(range)p 3893 1558 V 396 1561 3501 4 v 396 1561 V 396 1688 4 127 v 400 1663 a(IJS_EINTERN)m(AL)p 1562 1688 V 553 w(-5)p 2728 1688 V 1096 w(internal)f(error)p 3893 1688 V 396 1691 3501 4 v 396 1691 V 396 1817 4 127 v 400 1792 a(IJS_ENYI)p 1562 1817 V 818 w(-6)p 2728 1817 V 1096 w(not)h(yet)g(implemented)p 3893 1817 V 396 1821 3501 4 v 396 1821 V 396 1947 4 127 v 400 1922 a(IJS_ESYNT)-8 b(AX)p 1562 1947 V 637 w(-7)p 2728 1947 V 1096 w(syntax)19 b(error)p 3893 1947 V 396 1950 3501 4 v 396 1950 V 396 2077 4 127 v 400 2052 a(IJS_ECOLORSP)-8 b(A)m(CE)p 1562 2077 V 438 w(-8)p 2728 2077 V 1096 w(unkno)n(wn)18 b(color)h(space)p 3893 2077 V 396 2080 3501 4 v 396 2080 V 396 2206 4 127 v 400 2181 a(IJS_EUNKP)-8 b(ARAM)p 1562 2206 V 499 w(-9)p 2728 2206 V 1096 w(unkno)n(wn)18 b(parameter)p 3893 2206 V 396 2210 3501 4 v 396 2210 V 396 2336 4 127 v 400 2311 a(IJS_EJOBID)p 1562 2336 V 731 w(-10)p 2728 2336 V 1054 w(job)i(id)g(doesn')o(t)f(match)p 3893 2336 V 396 2339 3501 4 v 396 2339 V 396 2466 4 127 v 400 2441 a(IJS_ET)o(OOMANYJOBS)p 1562 2466 V 349 w(-11)p 2728 2466 V 1054 w(reached)g(limit)h(of)g(serv)o(er')-5 b(s)20 b(#jobs)p 3893 2466 V 396 2469 3501 4 v 396 2469 V 396 2595 4 127 v 400 2570 a(IJS_EB)o(UF)p 1562 2595 V 806 w(-12)p 2728 2595 V 1054 w(b)n(uf)n(fer)f(isn')o(t)h(big)f(enough)p 3893 2595 V 396 2599 3501 4 v 396 2599 V 396 2848 a(Ho)n(we)n(v)o(er)m (,)f(I)i(see)g(that)g(this)g(list)h(o)o(v)o(erlaps)d(the)i(status)g (codes)f(for)h(IPP)g(operations)e(\(section)h(13.2)g(of)g([RFC)i (2911]\))c(to)j(a)396 2956 y(lar)o(ge)f(e)o(xtent.)h(I)g(am)g(strongly) f(considering)f(unifying)g(these.)-2 3343 y Fh(7.)39 b(Ac)m(kno)n(wledg)q(ements)396 3617 y Fg(IJS)21 b(is)g(directly)f (inspired)f(by)h(the)g(HPIJS)h(w)o(ork)e(done)h(by)f(the)h(HP)h(V)-9 b(ancouv)o(er)18 b(team,)i(particularly)e(Da)n(vid)i(Suf)n(\002eld.)396 3725 y(This)h(spec)f(also)g(bene\002ted)g(from)f(comments)g(and)g (suggestions)h(from)f(Robert)g(Kra)o(witz,)h(Grant)g(T)-7 b(aylor)m(,)19 b(Glen)396 3833 y(Petrie,)h(Russell)i(Lang,)d(Michael)h (Sweet,)g(and)g(the)g(Omni)g(team)g(at)h(IBM:)f(Mark)g(V)-9 b(anderW)m(iele,)18 b(Mark)i(Hamzy)-5 b(,)19 b(and)396 3941 y(Pete)i(Zannucci.)p Black -85 4059 a Fe(*)p Black 46 w(Please)e(add)g(your)h(name)g(her)m(e)o(.)f(Incidentally)l(,)g(the) g Fa(<)p Fe(ac)o(kno)p Fa(>)g Fe(ta)o(g)g(of)g(DocBook)h(seems)f(mor)m (e)h(r)m(easonable)h(than)e(a)g(section,)g(b)o(ut)g(I)f(can')n(t)h(g)o (et)h(it)e(to)-2 4167 y(format)h(with)f(a)h(nice)g(title)o(.)-2 4412 y Fb(Ref)o(erences)396 4586 y Fg([RFC)j(2911])c(T)-6 b(.)20 b(Hastings,)g(R.)h(Herriot,)e(R.)i(deBry)-5 b(,)19 b(S.)i(Isaacson,)e(and)h(P)-9 b(.)20 b(Po)n(well,)g Fd(Internet)g (Printing)g(Pr)l(otocol/1.1:)596 4694 y(Model)f(and)h(Semantics)p Fg(,)f(September)g(2000.)396 4884 y([IEEE1284])e Fd(IEEE)j (Std.1284-1994)15 b(Standar)m(d)j(Signaling)g(Method)i(for)g(a)h (Bi-dir)m(ectional)d(P)-7 b(ar)o(allel)20 b(P)-7 b(eripher)o(al)596 4992 y(Interface)19 b(for)i(P)-7 b(er)o(sonal)20 b(Computer)o(s)p Fg(,)g(1994.)p Black 3800 5569 a Fd(15)p Black eop %%Page: 16 16 16 15 bop Black 0 TeXcolorgray Black 3020 -132 a Fd(IJS)20 b(Pr)l(otocol)f(Speci\002cation)p Black 396 72 a Fg([USBPrint])h Fd(Univer)o(sal)h(Serial)f(Bus)g(De)o(vice)g(Class)h(De\002nition)e (for)i(Printing)e(De)o(vices)p Fg(,)h(1.1,)g(January)f(2000.)396 263 y([PLRM])h Fd(P)-7 b(ostScript)20 b(Langua)o(g)o(e)f(Refer)m(ence)p Fg(,)g(third)h(edition,)f(Adobe)g(Systems)h(Incorporated,)d(Addison-W) -7 b(esle)o(y,)596 371 y(1999.)396 562 y([PPD])21 b Fd(P)-7 b(ostScript)20 b(Printer)g(Description)g(F)l(ile)h(F)-9 b(ormat)q Fg(,)20 b(v)o(ersion)f(4.3,)g(Adobe)g(Systems)i (Incorporated,)c(T)-6 b(echnical)596 670 y(Note)20 b(5003,)e(9)i (February)f(1996.)p Black 3798 5569 a Fd(16)p Black eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF ed)g(to) g(disentangle)f(them.)396 2876 y(Ev)o(en)g(so,)i(it)g(is)g(clearly)e(a) i(good)e(idea)h(/usr/akumar/alt/devel/gs/ijs/ijs_spec.sgml 644 0 0 107431 11241503077 17624ustar00akumarakumar
IJS Protocol Specification Version 0.32 — 17 Jan 2002 Raph Levien This document contains a specification for the IJS protocol, which is intended to make it easier to deploy raster-based printer drivers in a wide variety of environments, including Unix desktops. Introduction IJS is, first and foremost, a protocol for transmission of raster page images. The protocol is a fairly traditional client-server design. In general, the client sends one or more page images to the server, along with various metadata. Communication is through simple “commands”, which are essentially size-prefixed packets. The client sends a command to the server, then waits for a response command, either ACK or NAK. Since, in the typical IJS scenario, there is only one client for any given server, it may be helpful to denote the client role as "master" and the server role as "slave". However, this document uses the terms "client" and "server". On Unix systems, the server “speaks” IJS through stdin and stdout. One consequence of this design decision is that the server can be invoked remotely, for example through ssh. It's not clear yet how useful this will be, but at least people can experiment with it. Other forms of communication (such as domain sockets) may be useful, as well, but are not specified in this version. There are also a large number of things that the IJS specification does not address. It does not provide strings for a UI (although the parameter names and values may be used as a fallback when higher-level mechanisms designed to provide these fail). It does not address the task of discovering printers or drivers. It is not designed to dispatch jobs to multiple printers. It does not provide queue management features. It does not address higher level imaging models, or fonts. These are important components of a printing system, and should be addressed by other modules and interfaces. Wire protocol After a brief initialization handshake, all IJS communication occurs through commands. Most of these are sent from the client to the server, but three (IJS_CMD_PONG, IJS_CMD_ACK, and IJS_CMD_NAK) are sent from the server to the client. With the exception of IJS_CMD_PING, the appropriate response to a command sent from the server is either IJS_CMD_ACK or IJS_CMD_NAK. The initialization handshake is as follows. First, the client sends the string "IJS\n\252v1\n" (with C backslash escaping). Upon receipt of this string, the server sends the string "IJS\n\253v1\n". At this point, the client may send IJS commands to the server. IJS is designed to have a simple wire encoding. Integers are encoded as 32-bit big-endian (ie “network order”) values. The encoding for a command is as follows: Wire Encoding of IJS Commands Command4-byte integerSize in bytes4-byte integerArguments...
The arguments are simply concatenated. For variable size arguments, the size is either explicitly given as another argument, or, in the case of the last argument, is inferred from the size of the command. A wire encoding for a typical command is given below. This command sets the Dpi parameter to 600. Example Wire Encoding Encoded bytes Field Value 00 00 00 0c Command IJS_COMMAND_SET_PARAM00 00 00 16 Size in bytes 2200 00 00 00 Job id 000 00 00 03 Size of parameter name 3 44 70 69 Parameter name Dpi 36 30 30 Value 600
The numerical values of the commands are: Numerical Values of IJS Commands Command Value IJS_CMD_ACK 0IJS_CMD_NAK 1IJS_CMD_PING 2IJS_CMD_PONG 3IJS_CMD_OPEN 4IJS_CMD_CLOSE 5IJS_CMD_BEGIN_JOB 6IJS_CMD_END_JOB 7IJS_CMD_CANCEL_JOB 8IJS_CMD_QUERY_STATUS 9IJS_CMD_LIST_PARAMS 10IJS_CMD_ENUM_PARAM 11IJS_CMD_SET_PARAM 12IJS_CMD_GET_PARAM 13IJS_CMD_BEGIN_PAGE 14IJS_CMD_SEND_DATA_BLOCK 15IJS_CMD_END_PAGE 16IJS_CMD_EXIT 17
A state transition diagram for servers supporting a maximum of one active job at a time is given below: IJS_CMD_ACK This command is sent from server to the client in response to a command from the client, to indicate successful completion. There are no arguments specific to this command. However, for commands (such as IJS_CMD_GET_PARAM) which request a value, this value is returned as the argument in an ACK command. IJS_CMD_NAK This command is sent from server to the client in response to a command from the client, to indicate an error. There is one integer argument, which is the error code. A list of error codes is given in . IJS_CMD_PING The PING command is sent from the client to the server as part of the connection setup. It contains one integer argument, which is the 100 times the real-valued version number of the largest IJS protocol understood by the client. Thus, for the version of the protocol described in this document, the argument is 30. The appropriate response to a PING is a PONG. IJS_CMD_PONG The PONG command is sent from the server to the client in response to the PING command. It contains one integer argument, which is 100 times the largest IJS version number understood by the server. After a PING/PONG handshake, both client and server should use the minimum of the two version numbers. This negotiation mechanism preserves the ability to make deep changes in future version of the protocol, while preserving backwards compatibility for both clients and servers. IJS_CMD_OPEN The client should send an OPEN command to the server to indicate that printing is imminent. The server can allocate resources, such as tables, at this time. IJS_CMD_CLOSE The client should send a CLOSE command to the server to indicate that printing is complete for now. The server can free any allocated resources at this time. There should not be any jobs open at the time of the CLOSE command. Handling of any such jobs is undefined. IJS_CMD_BEGIN_JOB The client should send a BEGIN_JOB to the server to begin a job. There is one integer argument, a job id. This id is allocated by the client, and jobs are uniquely identified by the (client, job id) tuple. This job id is present as an argument for all the commands which operate within the context of a job. This job id is valid until the corresponding END_JOB command is invoked, at which point it can be reused if desired. The connection must be in an open state to begin a job, ie an OPEN command must have been sent, without a corresponding CLOSE. Servers can choose whether or not to implement multiple jobs, depending on their sophistication. When the number of jobs supported is exceeded, the server should return an IJS_ETOOMANYJOBS error code. IJS_CMD_END_JOB The client should send an END_JOB command to the server on the completion of a job. The one argument is the job id. This command cannot be used in the middle of a page, i.e. when a BEGIN_PAGE command has been issued without its corresponding END_PAGE. IJS_CMD_CANCEL_JOB This command cancels a job. The one argument is the job id. This command can be used whether or not a page is open. IJS_CMD_QUERY_STATUS This command queries the status of a job, or general printer status within a job context. The one argument is the job id. The return data is the printer status. The format of the printer status is yet to be determined. Glen Petrie has made a proposal on the inkjet-list mailing list. Michael Sweet has suggested adopting the IPP status codes. That standard is fairly rich in status queries. There appear to be at least four queries related to this IJS command: printer-state (enum), printer-state-reasons (keyword), printer-state-message (text), printer-is-accepting-jobs (boolean). IJS_CMD_LIST_PARAMS This command queries the server for a complete list of parameters. Note that this list may change dynamically, in response to setting various parameters, or external events. The argument is the job id. The return value is a comma-separated list of parameters. IJS_CMD_ENUM_PARAM This command queries the possible values for a given parameter. The arguments are the job id and the name of the parameter. The return value is a comma-separated list of values, with the default given first. Some parameters may not have a small finite enumeration. In these cases, the server should report IJS_ERANGE. Note also that the comma-separated encoding does not provide a way to report values containing commas. Thus, these should be avoided. IJS_CMD_SET_PARAM This command sets a parameter. There are four arguments: the job id, the size of the parameter name (in bytes), the parameter name, and the value. The size of the value is inferred from the size of the command. If the parameter is unknown, the server returns an IJS_EUNKPARAM error. If the parameter is known but the value is not appropriate, the server returns an IJS_ERANGE error. IJS_CMD_GET_PARAM This command retrieves the current value of a parameter. There are two arguments: the job id and the parameter name. The value of the parameter is returned. If the parameter is unknown, the server returns an IJS_EUNKPARAM error. IJS_CMD_BEGIN_PAGE This command begins a new page. All of the parameters affecting the data format of the page should have already been set by this time. IJS_CMD_SEND_DATA_BLOCK This command sends a block of data, in the format defined by PageImageLanguage and its subsidiary parameters. There are no alignment restrictions. There are two arguments: the job id, and the size of the data block in bytes. The data block follows the command, in the same stream. Note that shared-memory transport of bulk data is anticipated in a future version of this standard. Pipe transport will still be used as a fallback in case shared-memory transport is unavailable. The server must be in the middle of a page (ie BEGIN_PAGE without the corresponding END_PAGE) when this command is issued. IJS_CMD_END_PAGE This command ends a page. The server must be in the middle of a page when this command is issued. The argument is the job id. IJS_CMD_EXIT This command signals the end of the IJS connection. In the typical case of a server with a single client, the server process terminates upon receipt of this command. The connection must be in a closed state at the time of this command. Need to look into race condition.
Parameters IJS defines a small set of standard parameters, which all clients and servers are expected to understand. Individual implementations may extend this standard set with additional parameters specific to the device or driver. Clients should, in general, provide some mechanism for setting (and possibly querying) arbitrary additional parameters. In particular, command line clients should accept command line options to set additional parameters. Interactive clients should ideally query the server for a list of these parameters to display in the interface, then query each parameter for the list of possible values, presented as menu choices. In addition, in many scenarios, the client may have additional information specific to the device, obtained through other means, for example a PPD (or PPD-like) file specified by the user. Such file formats are well beyond the scope of this specification. However, many users may find the simple parameter mechanism of IJS to be sufficient for their needs. A particular strength of the IJS parameter mechanism is that no additional effort is required to handle dynamic capability information, for example the presence of a hot-pluggable duplexer. Often, one parameter will be subsidiary to another. In this case, the subsidiary parameter should be set, gotten, or enumerated after the other parameter is set. Standard parameters This section describes the standard parameters specified by IJS. OutputFile This parameter is the filename intended for IJS output. It will often refer to a device, but can also be a regular file. Note that this parameter should be considered security-sensitive. Clients should take care to ensure that it is set only to legitimate values. OutputFD This is an alternative to OutputFile, and is intended to support -sOutputFile=- and -sOutputFile="|cmd" configurations of Ghostscript. The parameter is a numeric file descriptor. DeviceManufacturer This parameter is the manufacturer of the printer. In general, it should match the "MANUFACTURER" (or "MFR") field of the IEEE 1284 Device ID string exactlyIEEE1284. There are many different scenarios for setting and querying this parameter, depending on what information is known about the device. In the case where the server is able to identify the device, for example by retrieving the IEEE 1284 Device ID string, or through the GET_DEVICE_ID request of the USB Printer ClassUSBPrint, getting the value of the parameter will retrieve this identification string. In general, the server should perform the device ID query at the time of the GET_PARAM command. In the case where the device identification is configured by the client, the client may set this parameter, then set the DeviceModel parameter. Finally, enumerating this parameter returns a list of manufacturers known by the server. This may be helpful for installing a new printer in cases where automatic device identification is not available. There may be cases where the server is able to automatically identify the device, and the client attempts to override this identification. The server should allow this override to occur, particularly when the device ID is not one known to the server. However, the server can reject such attempts by returning an IJS_ERANGE error. DeviceModel This parameter is the model name of the printer, and together with DeviceManufacturer, identifies the device. In general it should match the "MODEL" (or "MDL") field of the IEEE 1284 Device ID string. Usage scenarios are similar to DeviceManufacturer. This parameter is subsidiary to DeviceManufacturer. Setting the device manufacturer and model may have profound effects on the list of other parameters available. For example, the server may in fact be a wrapper that invokes the “real” server once the device id is known, and then proxies all IJS commands subsequently. Thus, all other parameters other than OutputFD, OutputFile, and DeviceManufacturer, should be considered subsidiary to this one. PageImageFormat This parameter specifies the format of the page image data to be sent to the printer. This standard only defines one standard value: "Raster". Other values, including compressed raster formats, as well as possibly higher level page description languages such as PostScript and PDF, are envisioned as possible future extensions. When it makes sense, names consistent with the "COMMAND SET" (or "CMD") field of the IEEE 1284 Device ID string are recommended. However, this namespace has many shortcomings for use with IJS. In particular, it tends to identify the command set too vaguely. For example, many Epson printers report merely "ESCPL2", which is not nearly precise enough to usefully drive the printer. When the value is "Raster", the following parameters are required, and are subsidiary to this one: Dpi, Width, Height, BitsPerSample, ColorSpace, and NumChan. Dpi This parameter is the resolution for transfer of raster data. It is specified as a horizontal resolution, in floating decimal dpi units, an "x", and a vertical resolution, in floating decimal dpi units. Thus, a typical value is "1440x720". Note that the server may perform scaling of the raster data as part of its processing, before sending it to the device. In these cases, the Dpi parameter specifies the resolution prior to scaling. For example, a driver might accept 720 dpi raster data, then perform 2:1 horizontal pixel replication to drive the actual device at 1440x720 dpi. In this example, the value of the Dpi parameter is "720x720". Width This parameter is the decimal encoded width of the raster image, in pixels. It MUST be set when PageImageFormat is Raster. Height This parameter is the decimal encoded height of the raster image, in pixels. It MUST be set for raster images. BitsPerSample This parameter is the decimal encoded bit depth of samples for pixel values. It MUST be set for raster images. Valid values include 1-7 (implying client-side dithering of image pixels), 8, and 16 (both implying server-side dithering if needed by the device). In general, the total number of bits per pixel is equal to BitsPerSample times NumChan. In many cases, querying this parameter will be useful. A “dumb” server may choose not to implement color transform and dithering, leaving these to the client. In this case, the result of the query operation will be a list of bit depths actually supported by the device. Simple devices may report "1", while devices capable of both bilevel and 4-level variable dots may report "1,2". Note that not all combinations of BitsPerSample and ColorSpace are valid. In particular, BitsPerSample less than 8 in combination with a ColorSpace of sRGB or any other colorimetric color space are not valid. Also for scRGB (also known as sRGB64), 16 is the only valid value. When the value is 16, the ByteSex parameter is required, and is subsidiary to this one. ByteSex When BitsPerSample is equal to 16, this parameter specifies the byte sex of the raster data. Possible values are "big-endian" and "little-endian". Enumerating this parameter should list the preferred byte sex as the default (ie first in the comma-separated list). In most cases, this will be the byte sex of the server's host architecture. Servers limited to 8 bits of depth need not implement this parameter at all. ColorSpace This parameter is a string identifying the color space of the raster image data. It MUST be set for raster images. Standard values include "DeviceGray", "DeviceRGB", "DeviceCMYK", and "sRGB". Servers should support at least one of these color spaces. Clients should be able to produce raster output if at least one of these color spaces is supported by the server. I think we should have a wide-gamut colorimetric color space in the standard list as well. I like La*b* with a recommended bit depth of 16. Any objections? A device may choose to provide more color spaces. For example, 6 color inkjets may provide a "DeviceCcMmYK" space. In general, for a client to use any of these nonstandard spaces requires detailed knowledge of the color rendering characteristics of the device. Servers should not provide additional color spaces which are merely transforms of the standard color spaces. Examples of such discouraged color spaces are HSV, XYZ, Luv, Yuv, YCC, and colorimetric RGB spaces other than sRGB (TODO: unless we decide to accept scRGB/sRGB64). NumChan This parameter is the number of channels in the chosen color space. In general, it can be determined from the ColorSpace. In particular, DeviceGray implies 1, DeviceRGB and sRGB imply 3, and DeviceCMYK implies 4. Attempting to set a NumChan inconsistent with ColorSpace should result in an error. PaperSize This parameter is in W.WWxH.HH format, in inches, i.e. a string that may be produced by sprintf (str, "%fx%f", width, height). If the server knows the paper size (which is unlikely for inkjets), then getting the parameter will give a good value. In the more common case, get simply returns an error code (todo: probably need to allocate a new one for this). Enumerating this parameter may give a list of paper sizes known by the driver that are plausible for the device. The result of getting or enumerating PaperSize may change dynamically depending on the DeviceModel, Duplex, and possibly “extension” parameters such as those for selecting trays. Note that this parameter is essentially the same as the PageSize page device parameter. The main difference is units (PostScript uses 1/72" inch units), and the minor syntax nit of PostScript array encoding. PrintableArea This parameter is in W.WWxH.HH format, and describes the printable area of the page. It is expected that the client will usually get it from the server. Any attempt to set it is allowed to fail with an error, even if it's the same value as the get. The value may change dynamically depending on PaperSize and other parameters. PrintableTopLeft This parameter is in W.WWxH.HH format, and contains the left and top margins of the printable area with respect to the media. It is the companion to PrintableArea (I'm considering having a single parameter that ASCII encodes the four floats). TopLeft This parameter, in W.WWxH.HH is intended to be set, and controls the placement of the raster image on the page. The corresponding size of the raster image area can be inferred from the Width, Height, and Dpi parameters. PostScript Page Device Parameters PostScript defines a number of page device parameters, many of which are relevant to IJS, whether using PostScript or not. Further, many proposals for characterizing device capabilities are based on PPD files, which use a consistent namespace and semantics to page device parameters. IJS imports the namespace of PostScript page device parameters, prefixing it with the string "PS:". The client can assume that any parameters returned by a LIST_PARAMS command matching this prefix are in fact PostScript page device parameters. Values are straightforward ASCII encodings. For example, arrays are encoded as space-separated values, enclosed in square brackets. The set of valid page device parameters is defined in the PostScript Language Reference ManualPLRM, particularly Chapter 6. Some page device parameters are subsumed by native IJS parameters, and should not be used. These include PageSize (subsumed by PaperSize), ProcessColorModel (subsumed by ColorSpace), Margins and PageOffset (subsumed by TopLeft), and HWResolution (subsumed by Dpi). Devices supporting duplexing should implement PS:Duplex and PS:Tumble, both booleans. A value of true for PS:Duplex requests printing on both sides of the page. When PS:Duplex is true, PS:Tumble specifies the relative orientation of the pages. When PS:Tumble is false, the pages are oriented suitably at the left or right. When PS:Tumble is true, the pages are oriented suitably for binding at the top or bottom. Enumerating the PS:Duplex parameter should return a single "false" value when the server knows that the device is not capable of duplexing, and either "false,true" or "true,false" if it may be. Note that the HPIJS 1.0 implementation of IJS, identifying itself as IJS version 0.29, specifies an integer-valued Duplex parameter, with values of 0 (PS:Duplex = false, PS:Tumble don't care), 1 (PS:Duplex = true, PS:Tumble = false), and 2 (PS:Duplex = true, PS:Tumble = true). An integer valued Duplex parameter is inconsistent with the PostScript specification. However, clients desiring compatibility should set the integer-valued Duplex parameter rather than the PS: parameters when the server reports a version of 0.29. Devices supporting roll-fed media should implement PS:RollFedMedia, PS:Orientation, PS:AdvanceMedia, PS:AdvanceDistance (note that units are integer 1/72"), and PS:CutMedia. Other parameters that may be useful for some devices include PS:MediaColor, PS:MediaWeight, PS:MediaType, PS:MediaClass, PS:InsertSheet, PS:LeadingEdge, PS:ManualFeed, PS:TraySwitch, PS:MediaPosition, PS:ImageShift, PS:MirrorPrint, PS:NegativePrint, PS:NumCopies, PS:Collate, PS:Jog, PS:OutputFaceUp, PS:Separations, and PS:SeparationColorNames. Other parameters are allowed, but are unlikely to be useful in an IJS context. Parameter Namespace Extension While this document specifies enough parameters to be able to print usefully, there is a huge diversity of devices and applications, often indicating additional parameters not specified. IJS is designed to accomodate these additional parameters as extensions. It is expected that the namespace of these extensions will be managed informally. Note that collisions in this namespace are not necessarily fatal, as many will be device or manufacturer specific, so that the device id may be used to disentangle them. Even so, it is clearly a good idea to manage this namespace well. This section recommends some practices towards this goal. When possible, extension parameters should be prefixed, with a colon separating the prefix from the base parameter name. Well known prefixes give clients useful information about parameters, even when the client lacks information about the specific parameter. An unknown prefix at least allows the client to identify the parameter as a nonstandard extension. This document specifies a number of standard prefixes. We also reserve the following prefixes for possible use in future revisions of this protocol: IPP, UPDF. Further, the Omni: prefix is reserved for the Omni group at IBM, and CUPS: is reserved for the CUPS project. Robert, do you want STP:? Anyone else? Quality: Inkjet printers often provide a rich set of options for tuning output quality, or selecting a point along a speed/quality tradeoff. The details of these options vary widely from device to device. When made available through IJS, they should be grouped under the Quality: prefix. For example, HPIJS 1.0 has the following parameters, for HP inkjet printers: Quality, MediaType, ColorMode, and PenSet. To be compliant with versions 0.30 and later of IJS, they should be named Quality:Quality, Quality:MediaType, Quality:ColorMode, and Quality:PenSet. Note that Quality:MediaType overlaps somewhat with PS:MediaType. In general, the former specifies a color profile or printing mode (for example, to optimize printing on transparencies). The latter is often used for selecting a paper source, for example letterhead or envelopes. The former is more likely to be useful in inkjet applications. The Dpi and ColorSpace parameters are subsidiary to any Quality: parameters provided. Finishing: Finishing options, such as stapling and collating, should be grouped under the Finishing prefix. The PS page device parameter namespace includes some finishing options, including Duplex, Tumble, Collate, Jog, and the roll-fed parameters: RollFedMedia, Orientation, AdvanceMedia, AdvanceDistance, and CutMedia. For these parameters, the PS: prefix is preferred. The PPD specification describes a number of additional finishing parameters (section 5.18 of PPD). Where possible, Finishing: parameters should be consistent with the PPD specification. PPD: The PPD specificationPPD contains a large number of options and parameters that may be provided by printers. The PPD: prefix is reserved for PPD parameters that are made available through the IJS protocol. In cases where both a page device parameter and a PPD parameter specify the same setting, the PS: page device parameter takes priority. In many cases, page device parameters are advantageous because they are designed for both getting and setting, while PPD itself is a static file format. In addition, finishing parameters should be under the Finishing: namespace. In general, use of the PPD: extension is not recommended, as the PPD file format tends to be specific to PostScript printers. We could use more specific advice on when to use PPD: parameters, and when not to. Anyone with more PPD knowledge willing to help with this? Error codes Any IJS command may either succeed or fail. Success is indicated by an IJS_ACK response. Failure is indicated by an IJS_NAK response, which includes an integer error code. The current draft contains the following error codes: Draft IJS Error Codes Symbolic definition Numeric value Meaning IJS_EIO -2 I/O errorIJS_EPROTO -3 protocol errorIJS_ERANGE -4 out of rangeIJS_EINTERNAL -5 internal errorIJS_ENYI -6 not yet implementedIJS_ESYNTAX -7 syntax errorIJS_ECOLORSPACE -8 unknown color spaceIJS_EUNKPARAM -9 unknown parameterIJS_EJOBID -10 job id doesn't matchIJS_ETOOMANYJOBS -11 reached limit of server's #jobsIJS_EBUF -12 buffer isn't big enough
However, I see that this list overlaps the status codes for IPP operations (section 13.2 of RFC 2911) to a large extent. I am strongly considering unifying these.
Acknowledgements IJS is directly inspired by the HPIJS work done by the HP Vancouver team, particularly David Suffield. This spec also benefited from comments and suggestions from Robert Krawitz, Grant Taylor, Glen Petrie, Russell Lang, Michael Sweet, and the Omni team at IBM: Mark VanderWiele, Mark Hamzy, and Pete Zannucci. Please add your name here. Incidentally, the <ackno> tag of DocBook seems more reasonable than a section, but I can't get it to format with a nice title. References RFC 2911 T. Hastings R. Herriot R. deBry S. Isaacson P. Powell Internet Printing Protocol/1.1: Model and Semantics September 2000 IEEE1284 IEEE Std.1284-1994 Standard Signaling Method for a Bi-directional Parallel Peripheral Interface for Personal Computers 1994 USBPrint Universal Serial Bus Device Class Definition for Printing Devices 1.1 January 2000 PLRM PostScript Language Reference third edition Adobe Systems Incorporated Addison-Wesley 1999 PPD PostScript Printer Description File Format version 4.3 Adobe Systems Incorporated Technical Note 5003 9 February 1996
Some page device parameters are subsumed by native IJS parameters, and should not be used. These include PageSize (subsumed by PaperSize), ProcessColorModel (subsumed by ColorSpace), Margins and PageOffset (subsumed by TopLeft), a/usr/akumar/alt/devel/gs/ijs/install-sh 755 0 0 12736 11241503077 17130ustar00akumarakumar#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 ail. Success is indicated by an IJ/usr/akumar/alt/devel/gs/ijs/state.eps 644 0 0 16423 11241503077 16752ustar00akumarakumar%!PS-Adobe-2.0 EPSF-2.0 %%Title: state.eps %%Creator: fig2dev Version 3.2 Patchlevel 3d %%CreationDate: Sat Dec 22 01:59:04 2001 %%For: raph@pixel.artofcode.com (Raph Levien,,,) %%BoundingBox: 0 0 912 257 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 257 moveto 0 0 lineto 912 0 lineto 912 257 lineto closepath clip newpath -24.1 355.7 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06299 0.06299 sc % % Fig objects follow % /Times-Roman ff 180.00 scf sf 9225 2475 m gs 1 -1 sc (IJS_LIST_PARAMS) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 2700 m gs 1 -1 sc (IJS_QUERY_PARAM) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 2925 m gs 1 -1 sc (IJS_SET_PARAM) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 3150 m gs 1 -1 sc (IJS_GET_PARAM) col0 sh gr /Times-Roman ff 180.00 scf sf 9225 3375 m gs 1 -1 sc (IJS_QUERY_STATUS) col0 sh gr % Arc 7.500 slw gs clippath 8630 2937 m 8620 2997 l 8769 3022 l 8656 2973 l 8779 2962 l cp eoclip n 8746.9 2733.8 259.3 -139.4 114.3 arc gs col0 s gr gr % arrowhead n 8779 2962 m 8656 2973 l 8769 3022 l col0 s % Arc gs clippath 12183 2983 m 12176 3043 l 12326 3061 l 12211 3017 l 12333 3001 l cp eoclip n 12293.2 2761.4 272.0 -133.8 111.2 arc gs col0 s gr gr % arrowhead n 12333 3001 m 12211 3017 l 12326 3061 l col0 s % Arc gs clippath 8518 3029 m 8472 3067 l 8569 3184 l 8516 3073 l 8616 3145 l cp eoclip n 10170.0 1755.0 2115.5 38.1 141.9 arc gs col0 s gr gr % arrowhead n 8616 3145 m 8516 3073 l 8569 3184 l col0 s % Arc gs clippath 11736 2597 m 11776 2552 l 11663 2451 l 11733 2554 l 11623 2496 l cp eoclip n 10032.9 4384.8 2498.6 -131.7 -46.7 arc gs col0 s gr gr % arrowhead n 11623 2496 m 11733 2554 l 11663 2451 l col0 s % Arc gs clippath 8176 2550 m 8222 2512 l 8124 2395 l 8179 2507 l 8078 2434 l cp eoclip n 7091.9 3365.8 1386.1 -140.0 -37.6 arc gs col0 s gr gr % arrowhead n 8078 2434 m 8179 2507 l 8124 2395 l col0 s % Arc gs clippath 5659 2551 m 5701 2509 l 5594 2401 l 5658 2508 l 5551 2444 l cp eoclip n 4545.0 3548.9 1524.5 -137.6 -42.4 arc gs col0 s gr gr % arrowhead n 5551 2444 m 5658 2508 l 5594 2401 l col0 s % Arc gs clippath 3435 2985 m 3386 3020 l 3476 3142 l 3430 3028 l 3525 3106 l cp eoclip n 4600.2 2225.5 1420.0 38.3 146.2 arc gs col0 s gr gr % arrowhead n 3525 3106 m 3430 3028 l 3476 3142 l col0 s % Arc gs clippath 5952 3028 m 5907 3068 l 6008 3181 l 5951 3072 l 6053 3141 l cp eoclip n 7087.5 2115.0 1486.5 39.5 140.5 arc gs col0 s gr gr % arrowhead n 6053 3141 m 5951 3072 l 6008 3181 l col0 s % Arc gs clippath 3055 2553 m 3089 2503 l 2962 2419 l 3046 2511 l 2929 2469 l cp eoclip n 1935.0 4072.5 1917.3 -125.9 -54.1 arc gs col0 s gr gr % arrowhead n 2929 2469 m 3046 2511 l 2962 2419 l col0 s % Arc gs clippath 5866 3075 m 5816 3109 l 5901 3235 l 5859 3119 l 5951 3201 l cp eoclip n 8918.1 1112.7 3658.2 32.2 147.0 arc gs col0 s gr gr % arrowhead n 5951 3201 m 5859 3119 l 5901 3235 l col0 s % Ellipse n 675 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 3240 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 8370 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 3240 5355 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 5805 2790 284 284 0 360 DrawEllipse gs col0 s gr % Ellipse n 11925 2790 284 284 0 360 DrawEllipse gs col0 s gr % Polyline gs clippath 3210 5055 m 3270 5055 l 3270 4903 l 3240 5023 l 3210 4903 l cp eoclip n 3240 3060 m 3240 5040 l gs col0 s gr gr % arrowhead n 3210 4903 m 3240 5023 l 3270 4903 l col0 s /Times-Roman ff 180.00 scf sf 3060 5400 m gs 1 -1 sc (exit) col0 sh gr /Times-Roman ff 180.00 scf sf 11700 2880 m gs 1 -1 sc (in_page) col0 sh gr /Times-Roman ff 180.00 scf sf 7965 4950 m gs 1 -1 sc (IJS_CMD_CANCEL_JOB) col0 sh gr /Times-Roman ff 180.00 scf sf 2025 4095 m gs 1 -1 sc (IJS_CMD_EXIT) col0 sh gr /Times-Roman ff 180.00 scf sf 1215 2520 m gs 1 -1 sc (\(IJS_CMD_PONG\)) col0 sh gr /Times-Roman ff 180.00 scf sf 1350 2070 m gs 1 -1 sc (IJS_CMD_PING) col0 sh gr /Times-Roman ff 180.00 scf sf 3960 1935 m gs 1 -1 sc (IJS_CMD_OPEN) col0 sh gr /Times-Roman ff 180.00 scf sf 4005 3870 m gs 1 -1 sc (IJS_CMD_CLOSE) col0 sh gr /Times-Roman ff 180.00 scf sf 9045 4095 m gs 1 -1 sc (IJS_CMD_END_PAGE) col0 sh gr /Times-Roman ff 180.00 scf sf 12150 3420 m gs 1 -1 sc (IJS_CMD_SEND_DATA_BLOCK) col0 sh gr /Times-Roman ff 180.00 scf sf 9180 1755 m gs 1 -1 sc (IJS_CMD_BEGIN_PAGE) col0 sh gr /Times-Roman ff 180.00 scf sf 6345 1845 m gs 1 -1 sc (IJS_CMD_BEGIN_JOB) col0 sh gr /Times-Roman ff 180.00 scf sf 6660 3870 m gs 1 -1 sc (IJS_CMD_END_JOB) col0 sh gr /Times-Roman ff 180.00 scf sf 3015 2880 m gs 1 -1 sc (closed) col0 sh gr /Times-Roman ff 180.00 scf sf 540 2835 m gs 1 -1 sc (init) col0 sh gr /Times-Roman ff 180.00 scf sf 5625 2835 m gs 1 -1 sc (open) col0 sh gr /Times-Roman ff 180.00 scf sf 8145 2835 m gs 1 -1 sc (in_job) col0 sh gr $F2psEnd rs emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the us/usr/akumar/alt/devel/gs/ijs/state.fig 644 0 0 5714 11241503077 16711ustar00akumarakumar#FIG 3.2 Landscape Center Metric A4 100.00 Single -2 1200 2 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 8746.875 2733.750 8550 2565 9000 2790 8640 2970 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 12293.182 2761.364 12105 2565 12555 2835 12195 3015 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 10170.000 1755.000 11835 3060 10125 3870 8505 3060 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 10032.936 4384.816 8370 2520 10170 1890 11745 2565 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 7091.910 3365.812 6030 2475 7065 1980 8190 2520 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 4545.000 3548.864 3420 2520 4500 2025 5670 2520 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 4600.227 2225.455 5715 3105 4635 3645 3420 3015 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 7087.500 2115.000 8235 3060 7155 3600 5940 3060 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 1935.000 4072.500 810 2520 1800 2160 3060 2520 0 0 1.00 60.00 120.00 5 1 0 1 0 7 50 0 -1 0.000 0 0 1 0 8918.122 1112.675 12015 3060 9000 4770 5850 3105 0 0 1.00 60.00 120.00 6 9225 2340 10980 3420 4 0 0 50 0 0 12 0.0000 4 180 1560 9225 2475 IJS_LIST_PARAMS\001 4 0 0 50 0 0 12 0.0000 4 180 1725 9225 2700 IJS_QUERY_PARAM\001 4 0 0 50 0 0 12 0.0000 4 180 1410 9225 2925 IJS_SET_PARAM\001 4 0 0 50 0 0 12 0.0000 4 180 1440 9225 3150 IJS_GET_PARAM\001 4 0 0 50 0 0 12 0.0000 4 180 1755 9225 3375 IJS_QUERY_STATUS\001 -6 1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 675 2790 284 284 675 2790 894 2970 1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3240 2790 284 284 3240 2790 3459 2970 1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 8370 2790 284 284 8370 2790 8589 2970 1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3240 5355 284 284 3240 5355 3459 5535 1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5805 2790 284 284 5805 2790 6024 2970 1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 11925 2790 284 284 11925 2790 12144 2970 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 3240 3060 3240 5040 4 0 0 50 0 0 12 0.0000 4 135 285 3060 5400 exit\001 4 0 0 50 0 0 12 0.0000 4 180 585 11700 2880 in_page\001 4 0 0 50 0 0 12 0.0000 4 180 1995 7965 4950 IJS_CMD_CANCEL_JOB\001 4 0 0 50 0 0 12 0.0000 4 180 1260 2025 4095 IJS_CMD_EXIT\001 4 0 0 50 0 0 12 0.0000 4 180 1500 1215 2520 (IJS_CMD_PONG)\001 4 0 0 50 0 0 12 0.0000 4 180 1275 1350 2070 IJS_CMD_PING\001 4 0 0 50 0 0 12 0.0000 4 180 1335 3960 1935 IJS_CMD_OPEN\001 4 0 0 50 0 0 12 0.0000 4 180 1425 4005 3870 IJS_CMD_CLOSE\001 4 0 0 50 0 0 12 0.0000 4 180 1815 9045 4095 IJS_CMD_END_PAGE\001 4 0 0 50 0 0 12 0.0000 4 180 2640 12150 3420 IJS_CMD_SEND_DATA_BLOCK\001 4 0 0 50 0 0 12 0.0000 4 180 1995 9180 1755 IJS_CMD_BEGIN_PAGE\001 4 0 0 50 0 0 12 0.0000 4 180 1830 6345 1845 IJS_CMD_BEGIN_JOB\001 4 0 0 50 0 0 12 0.0000 4 180 1650 6660 3870 IJS_CMD_END_JOB\001 4 0 0 50 0 0 12 0.0000 4 135 495 3015 2880 closed\001 4 0 0 50 0 0 12 0.0000 4 135 240 540 2835 init\001 4 0 0 50 0 0 12 0.0000 4 135 360 5625 2835 open\001 4 0 0 50 0 0 12 0.0000 4 180 450 8145 2835 in_job\001 b} bind def /col16 {0.000 0.690 0.690 srgb} bind def/usr/akumar/alt/devel/gs/ijs/unistd_.h 644 0 0 375 11241503077 16676ustar00akumarakumar/* unistd_.h */ #ifdef _MSC_VER #include #include #include #define read(handle, buffer, count) _read(handle, buffer, count) #define write(handle, buffer, count) _write(handle, buffer, count) #else #include #endif /usr/akumar/alt/devel/gs/ijs/unix.mak 644 0 0 446 11241503077 16534ustar00akumarakumar# Linux CC=gcc CFLAGS=-g -Wall -ansi -pedantic -Wmissing-prototypes LDLIBS= OBJ=.o EXE= FE=-o IJS_EXEC_SERVER=ijs_exec_unix$(OBJ) RM=rm -f include common.mak clean: common_clean $(RM) *~ gmon.out core ijs_spec.log ijs_spec.tex ijs_spec.aux ijs_spec.pdf: ijs_spec.sgml db2pdf ijs_spec.sgml/usr/akumar/alt/devel/gs/ijs/windows.mak 644 0 0 263 11241503077 17240ustar00akumarakumar# MS-Windows CC=cl CFLAGS=-W3 -Zi LDLIBS= OBJ=.obj EXE=.exe FE=/Fe IJS_EXEC_SERVER=ijs_exec_win$(OBJ) RM=-del !include "common.mak" clean: common_clean $(RM) *.ilk *.pdb *.opt /usr/akumar/alt/devel/gs/ijs/configure 755 0 0 110536 11241503077 17050ustar00akumarakumar#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=ijs.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi IJS_VERSION=0.33 # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:530: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:560: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:611: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:643: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 654 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:685: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:690: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:718: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:752: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_RANLIB="ranlib" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" fi fi RANLIB="$ac_cv_prog_RANLIB" if test -n "$RANLIB"; then echo "$ac_t""$RANLIB" 1>&6 else echo "$ac_t""no" 1>&6 fi ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break fi done if test -z "$ac_aux_dir"; then { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:810: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. cat > conftest.defs <<\EOF s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%\[%\\&%g s%\]%\\&%g s%\$%$$%g EOF DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` rm -f conftest.defs # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "Makefile ijs-config" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@IJS_VERSION@%$IJS_VERSION%g s%@CC@%$CC%g s%@RANLIB@%$RANLIB%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac case "$ac_given_INSTALL" in [/$]*) INSTALL="$ac_given_INSTALL" ;; *) INSTALL="$ac_dots$ac_given_INSTALL" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF case "$CONFIG_FILES" in *ijs-config*) chmod +x ijs-config;; esac exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:810: checking for a BSD compatible install" >&5 if test -z "$INS/usr/akumar/alt/devel/gs/src/ 755 0 0 0 11242411641 150715ustar00akumarakumar/usr/akumar/alt/devel/gs/src/plan9.mak 644 0 0 34464 11242411641 16641ustar00akumarakumar# Copyright (C) 1997-2002 artofcode LLC. All rights reserved. # # This software is provided AS-IS with no warranty, either express or # implied. # # This software is distributed under license and may not be copied, # modified or distributed except as expressly authorized under the terms # of the license contained in the file LICENSE in this distribution. # # For more information about licensing, please refer to # http://www.ghostscript.com/licensing/. For information on # commercial licensing, go to http://www.artifex.com/licensing/ or # contact Artifex Software, Inc., 101 Lucas Valley Road #110, # San Rafael, CA 94903, U.S.A., +1(415)492-9861. # # $Id: unixansi.mak,v 1.41 2005/08/31 05:52:32 ray Exp $ # makefile for Unix/ANSI C/X11 configuration. # ------------------------------- Options ------------------------------- # ####### The following are the only parts of the file you should need to edit. # Define the directory for the final executable, and the # source, generated intermediate file, and object directories # for the graphics library (GL) and the PostScript/PDF interpreter (PS). BINDIR=./bin GLSRCDIR=./src GLGENDIR=./obj GLOBJDIR=./obj PSSRCDIR=./src PSLIBDIR=./lib PSGENDIR=./obj PSOBJDIR=./obj # Do not edit the next group of lines. #include $(COMMONDIR)/ansidefs.mak #include $(COMMONDIR)/unixdefs.mak #include $(COMMONDIR)/generic.mak include src/version.mak DD=$(GLGENDIR)/ GLD=$(GLGENDIR)/ PSD=$(PSGENDIR)/ # ------ Generic options ------ # # Define the installation commands and target directories for # executables and files. The commands are only relevant to `make install'; # the directories also define the default search path for the # initialization files (gs_*.ps) and the fonts. INSTALL = $(GLSRCDIR)/instcopy -c INSTALL_PROGRAM = $(INSTALL) -m 755 INSTALL_DATA = $(INSTALL) -m 644 prefix = /usr/local exec_prefix = $(prefix) bindir = $(exec_prefix)/bin scriptdir = $(bindir) mandir = $(prefix)/man man1ext = 1 datadir = $(prefix)/share gsdir = $(datadir)/ghostscript gsdatadir=/sys/src/cmd/gs docdir=$(gsdatadir)/doc exdir=$(gsdatadir)/examples GS_DOCDIR=$(docdir) # Define the default directory/ies for the runtime initialization, resource and # font files. Separate multiple directories with a :. GS_LIB_DEFAULT=/sys/lib/ghostscript:/sys/lib/ghostscript/font:/sys/lib/postscript/font # Define whether or not searching for initialization files should always # look in the current directory first. This leads to well-known security # and confusion problems, but users insist on it. # NOTE: this also affects searching for files named on the command line: # see the "File searching" section of Use.htm for full details. # Because of this, setting SEARCH_HERE_FIRST to 0 is not recommended. SEARCH_HERE_FIRST=1 # Define the name of the interpreter initialization file. # (There is no reason to change this.) GS_INIT=gs_init.ps # Choose generic configuration options. # -DDEBUG # includes debugging features (-Z switch) in the code. # Code runs substantially slower even if no debugging switches # are set. # -DNOPRIVATE # makes private (static) procedures and variables public, # so they are visible to the debugger and profiler. # No execution time or space penalty. GENOPT= # Define the name of the executable file. GS=gs # Define the name of a pre-built executable that can be invoked at build # time. Currently, this is only needed for compiled fonts. The usual # alternatives are: # - the standard name of Ghostscript on your system (typically `gs'): BUILD_TIME_GS=gs # - the name of the executable you are building now. If you choose this # option, then you must build the executable first without compiled fonts, # and then again with compiled fonts. #BUILD_TIME_GS=$(BINDIR)/$(GS) -I$(PSLIBDIR) # Define the directories for debugging and profiling binaries, relative to # the standard binaries. DEBUGRELDIR=../debugobj PGRELDIR=../pgobj # Define the directory where the IJG JPEG library sources are stored, # and the major version of the library that is stored there. # You may need to change this if the IJG library version changes. # See jpeg.mak for more information. JSRCDIR=jpeg JVERSION=6 # Note: if a shared library is used, it may not contain the # D_MAX_BLOCKS_IN_MCU patch, and thus may not be able to read # some older JPEG streams that violate the standard. If the JPEG # library built from local sources, the patch will be applied. SHARE_JPEG=0 JPEG_NAME=jpeg # Define the directory where the PNG library sources are stored, # and the version of the library that is stored there. # You may need to change this if the libpng version changes. # See libpng.mak for more information. PSRCDIR=libpng PVERSION=10208 # Choose whether to use a shared version of the PNG library, and if so, # what its name is. # See gs.mak and Make.htm for more information. SHARE_LIBPNG=0 LIBPNG_NAME=png # Define the directory where the zlib sources are stored. # See zlib.mak for more information. ZSRCDIR=zlib # Choose whether to use a shared version of the zlib library, and if so, # what its name is (usually libz, but sometimes libgz). # See gs.mak and Make.htm for more information. SHARE_ZLIB=0 #ZLIB_NAME=gz ZLIB_NAME=z # Choose shared or compiled in libjbig2dec and source location SHARE_JBIG2=0 JBIG2SRCDIR=jbig2dec # Define the directory where the icclib source are stored. # See icclib.mak for more information ICCSRCDIR=icclib # Define the directory where the ijs source is stored, # and the process forking method to use for the server. # See ijs.mak for more information. IJSSRCDIR=ijs IJSEXECTYPE=unix # Define how to build the library archives. (These are not used in any # standard configuration.) AR=ar ARFLAGS=qc RANLIB=ranlib # ------ Platform-specific options ------ # # Define the name of the C compiler. If the standard compiler for your # platform is ANSI-compatible, leave this line commented out; if not, # uncomment the line and insert the proper definition. #CC=some_C_compiler # Define the name of the linker for the final link step. # Normally this is the same as the C compiler. CCLD=$(CC) # Define the added flags for standard, debugging, and profiling builds. CFLAGS_STANDARD= CFLAGS_DEBUG=-g CFLAGS_PROFILE=-pg -O # Define the other compilation flags. Add at most one of the following: # -Aa -w -D_HPUX_SOURCE for the HP 400. # -DBSD4_2 for 4.2bsd systems. # -DSYSV for System V or DG/UX. # -DSVR4 -DSVR4_0 (not -DSYSV) for System V release 4.0. # -DSVR4 (not -DSYSV) for System V release 4.2 (or later) and Solaris 2. # XCFLAGS can be set from the command line. XCFLAGS=-D_BSD_EXTENSION -DPlan9 CFLAGS=$(CFLAGS_STANDARD) $(XCFLAGS) # Define platform flags for ld. # SunOS and some others want -X; Ultrix wants -x. # SunOS 4.n may need -Bstatic. # Solaris 2.6 (and possibly some other versions) with any of the SHARE_ # parameters set to 1 may need # -R /usr/local/xxx/lib:/usr/local/lib # giving the full path names of the shared library directories. # Apollos running DomainOS don't support -X (and -x has no effect). # XLDFLAGS can be set from the command line. XLDFLAGS= LDFLAGS=$(XLDFLAGS) # Define any extra libraries to link into the executable. # ISC Unix 2.2 wants -linet. # SCO Unix needs -lsocket if you aren't including the X11 driver. # SVR4 may need -lnsl. # Solaris may need -lnsl -lsocket -lposix4. # (Libraries required by individual drivers are handled automatically.) EXTRALIBS= # Define the standard libraries to search at the end of linking. # Most platforms require -lpthread for the POSIX threads library; # on FreeBSD, change -lpthread to -lc_r; BSDI and perhaps some others # include pthreads in libc and don't require any additional library. # All reasonable platforms require -lm, but Rhapsody and perhaps one or # two others fold libm into libc and don't require any additional library. #STDLIBS=-lpthread -lm # Since the default build is for nosync, don't include pthread lib STDLIBS=-lm # Define the include switch(es) for the X11 header files. # This can be null if handled in some other way (e.g., the files are # in /usr/include, or the directory is supplied by an environment variable); # in particular, SCO Xenix, Unix, and ODT just want #XINCLUDE= # Note that x_.h expects to find the header files in $(XINCLUDE)/X11, # not in $(XINCLUDE). XINCLUDE=-I/usr/X11R6/include # Define the directory/ies and library names for the X11 library files. # XLIBDIRS is for ld and should include -L; XLIBDIR is for LD_RUN_PATH # (dynamic libraries on SVR4) and should not include -L. # Newer SVR4 systems can use -R in XLIBDIRS rather than setting XLIBDIR. # Both can be null if these files are in the default linker search path; # in particular, SCO Xenix, Unix, and ODT just want #XLIBDIRS= # Solaris and other SVR4 systems with dynamic linking probably want #XLIBDIRS=-L/usr/openwin/lib -R/usr/openwin/lib # X11R6 (on any platform) may need #XLIBS=Xt SM ICE Xext X11 XLIBDIRS=-L/usr/X11R6/lib XLIBDIR= XLIBS=Xt Xext X11 # Define whether this platform has floating point hardware: # FPU_TYPE=2 means floating point is faster than fixed point. # (This is the case on some RISCs with multiple instruction dispatch.) # FPU_TYPE=1 means floating point is at worst only slightly slower # than fixed point. # FPU_TYPE=0 means that floating point may be considerably slower. # FPU_TYPE=-1 means that floating point is always much slower than # fixed point. FPU_TYPE=1 # Define the .dev module that implements thread and synchronization # primitives for this platform. Don't change this unless you really know # what you're doing. # If POSIX sync primitives are used, also change the STDLIBS to include # the pthread library. #SYNC=posync # Default is No sync primitives since some platforms don't have it (HP-UX) SYNC=nosync # ------ Devices and features ------ # # Choose the language feature(s) to include. See gs.mak for details. FEATURE_DEVS=$(PSD)psl3.dev $(PSD)pdf.dev $(PSD)dpsnext.dev $(PSD)ttfont.dev $(PSD)epsf.dev $(GLD)pipe.dev $(PSD)fapi.dev # Choose whether to compile the .ps initialization files into the executable. # See gs.mak for details. COMPILE_INITS=0 # Choose whether to store band lists on files or in memory. # The choices are 'file' or 'memory'. BAND_LIST_STORAGE=file # Choose which compression method to use when storing band lists in memory. # The choices are 'lzw' or 'zlib'. BAND_LIST_COMPRESSOR=zlib # Choose the implementation of file I/O: 'stdio', 'fd', or 'both'. # See gs.mak and sfxfd.c for more details. FILE_IMPLEMENTATION=stdio # Choose the implementation of stdio: '' for file I/O and 'c' for callouts # See gs.mak and ziodevs.c/ziodevsc.c for more details. STDIO_IMPLEMENTATION=c # Choose the device(s) to include. See devs.mak for details, # devs.mak and contrib.mak for the list of available devices. DEVICE_DEVS=$(DD)plan9.dev $(DD)bj10e.dev $(DD)bjc600.dev $(DD)bjc800.dev $(DD)cdj1600.dev $(DD)cdj670.dev $(DD)cdj850.dev $(DD)cdj890.dev $(DD)dfaxlow.dev $(DD)epswrite.dev $(DD)inferno.dev $(DD)jpeg.dev $(DD)jpeggray.dev $(DD)laserjet.dev $(DD)ljet2p.dev $(DD)ljet3.dev $(DD)ljet3d.dev $(DD)ljet4.dev $(DD)ijs.dev $(DD)pbm.dev $(DD)pbmraw.dev $(DD)pdfwrite.dev $(DD)pgm.dev $(DD)pgmraw.dev $(DD)plan9bm.dev $(DD)pnm.dev $(DD)pnmraw.dev $(DD)ppm.dev $(DD)ppmraw.dev $(DD)pswrite.dev $(DD)stcolor.dev $(DD)tiffg32d.dev $(DD)tiffg3.dev $(DD)tiffg4.dev DEVICE_DEVS1= DEVICE_DEVS2= DEVICE_DEVS3= DEVICE_DEVS4= DEVICE_DEVS5= DEVICE_DEVS6= DEVICE_DEVS7= DEVICE_DEVS8= DEVICE_DEVS9= DEVICE_DEVS10= DEVICE_DEVS11= DEVICE_DEVS12= DEVICE_DEVS13= DEVICE_DEVS14= DEVICE_DEVS15= DEVICE_DEVS16= # Overflow from DEVS9 DEVICE_DEVS17= DEVICE_DEVS18= DEVICE_DEVS19= DEVICE_DEVS20= # ---------------------------- End of options --------------------------- # # Define the name of the partial makefile that specifies options -- # used in dependencies. MAKEFILE=$(GLSRCDIR)/unixansi.mak TOP_MAKEFILES=$(MAKEFILE) $(GLSRCDIR)/unixhead.mak # Define the auxilary program dependency. AK= # Define the compilation rules and flags. # If you system has a 64 bit type you should pass it through # CCFLAGS to improve support for multiple colorants. e.g.: # -DGX_COLOR_INDEX_TYPE='unsigned long long' # or use the autoconf build, which sets this automatically. # If you do not define a 64 bit type, there may be some warnings # about oversize shifts. It's a bug if these are not harmless. CCFLAGS=$(GENOPT) $(CFLAGS) CC_=$(CC) $(CCFLAGS) CCAUX=$(CC) CC_NO_WARN=$(CC_) # ---------------- End of platform-specific section ---------------- # include src/unixhead.mak include src/gs.mak include src/lib.mak include src/int.mak include src/cfonts.mak include src/jpeg.mak # zlib.mak must precede libpng.mak include src/zlib.mak include src/libpng.mak include src/jbig2.mak include src/icclib.mak include src/ijs.mak include src/devs.mak include src/contrib.mak include src/plan9-aux.mak include src/unixlink.mak include src/unix-end.mak include src/unixinst.mak # platform-specific clean-up # this makefile is intended to be hand edited so we don't distribute # the (presumedly modified) version in the top level directory distclean : clean config-clean -$(RM) Makefile maintainer-clean : distclean # nothing special to do # Contributed drivers not found in the current distribution # We reinsert them whenever we download a new distribution. ### ------------------------- Plan 9 bitmaps -------------------------- ### ### Note: this driver was contributed by a user: please contact ### ### Russ Cox if you have questions. ### plan9_=$(GLOBJ)gdevplan9.$(OBJ) $(DD)plan9.dev : $(plan9_) $(DD)page.dev $(SETPDEV) $(DD)plan9 $(plan9_) $(GLOBJ)gdevplan9.$(OBJ) : $(GLSRC)gdevplan9.c $(PDEVH) $(gsparam_h) $(gxlum_h) $(GLCC) $(GLO_)gdevplan9.$(OBJ) $(C_) $(GLSRC)gdevplan9.c ### -------------- cdj850 - HP 850c Driver under development ------------- ### ### For questions about this driver, please contact: ### ### Uli Wortmann (uliw@erdw.ethz.ch) ### cdeskjet8_=$(GLOBJ)gdevcd8.$(OBJ) $(HPPCL) $(DD)cdj850.dev : $(cdeskjet8_) $(DD)page.dev $(SETPDEV2) $(DD)cdj850 $(cdeskjet8_) $(DD)cdj670.dev : $(cdeskjet8_) $(DD)page.dev $(SETPDEV2) $(DD)cdj670 $(cdeskjet8_) $(DD)cdj890.dev : $(cdeskjet8_) $(DD)page.dev $(SETPDEV2) $(DD)cdj890 $(cdeskjet8_) $(DD)cdj1600.dev : $(cdeskjet8_) $(DD)page.dev $(SETPDEV2) $(DD)cdj1600 $(cdeskjet8_) $(GLOBJ)gdevcd8.$(OBJ) : $(GLSRC)gdevcd8.c $(PDEVH) $(math__h)\ $(gsparam_h) $(gxlum_h) $(gdevpcl_h) $(GLCC) $(GLO_)gdevcd8.$(OBJ) $(C_) $(GLSRC)gdevcd8.c local sources, the patch will be applied. SHARE_JPEG=0 JPEG_NAME=jpeg # Define the directory where the PNG library sources are stored, # and the version of the library that is stored there. # You may ne/usr/akumar/alt/devel/gs/mkfile 644 0 0 16726 11242411647 15536ustar00akumarakumar# # This Plan 9 mkfile is for ``easy'' building. # It worked for Ghostscript 8.53. # # This mkfile consists of two parts: the first part builds the gs executable, # the second unpacks the gs distribution and sets configuration parameters. # # Place this mkfile in the root directory of the gs distribution (the gsX.XX dir) # Edit the drivers list below, and mk fake-make to let gs configure # itself. Fake-make doesn't actually build very much. # # Then you can run mk normally. # # Be sure to have the jpeg, libpng, and zlib subdirectories before starting. # These have been included in recent gs tar files so we do not maintain # our own anymore. # # Each time you change the drivers list you must rerun mk fake-make # before building. # # If you want to try out a new GS distribution, you should be able # to mk try-X.XX, test it out, and then do mk install-X.XX, where X.XX # is the version number (e.g. 5.70). If outside BL, you may have to edit the # scripts to remove some local dependencies (e.g. calling outside and the # cpu call to thresher, alpha to make mips.h, alpha.h). # # Recent versions of src/gxshade1.c cause the compiler to run out # of registers. Brucee is looking into this. In the meantime, use this # replacement: # # private inline void # make_other_poles(patch_curve_t curve[4]) # { # int i, j; # # for (i = 0; i < 4; i++) { # j = (i + 1) % 4; # curve[i].control[0].x = (curve[i].vertex.p.x * 2 + curve[j].vertex.p.x); # curve[i].control[0].x /= 3; # curve[i].control[0].y = (curve[i].vertex.p.y * 2 + curve[j].vertex.p.y); # curve[i].control[0].y /= 3; # curve[i].control[1].x = (curve[i].vertex.p.x + curve[j].vertex.p.x * 2); # curve[i].control[1].y /= 3; # curve[i].control[1].y = (curve[i].vertex.p.y + curve[j].vertex.p.y * 2); # curve[i].control[1].y /= 3; # curve[i].straight = true; # } # } # # (the original includes the /3 in the big expressions). # # src/gxshade6.c also needs editing to remove use of the # vlong , operator on some architectures. # # you may need to change this line in gs/src/gshtscr.c: # // sample = (int) (value * max_ht_sample) + max_ht_sample; # to # sample = (vlong)(value * max_ht_sample) + max_ht_sample; [2] /dev/null | sort} # The first driver is the default. DRIVERS=\ plan9\ bj10e\ bjc600\ bjc800\ cdj1600\ cdj670\ cdj850\ cdj890\ dfaxlow\ epswrite\ inferno\ jpeg\ jpeggray\ laserjet\ ljet2p\ ljet3\ ljet3d\ ljet4\ ijs\ pbm\ pbmraw\ pdfwrite\ pgm\ pgmraw\ plan9bm\ pnm\ pnmraw\ ppm\ ppmraw\ pswrite\ stcolor\ tiffg32d\ tiffg3\ tiffg4\ HFILES=$objtype.h\ arch.h\ # enforce some startup conditions x=`{mkdir obj >[2]/dev/null; mv jpeg/jmorecfg.h jpeg/jmorecfg.h.save >[2] /dev/null} $target chmod +x $target src/plan9.mak: src/unixansi.mak /sys/src/cmd/gs/contrib9.mak devlist='$(DD)'^$DRIVERS^'.dev' devlist=$"devlist sed 's#^GS_LIB_DEFAULT=.*#GS_LIB_DEFAULT=/sys/lib/ghostscript:/sys/lib/ghostscript/font:/sys/lib/postscript/font# s#^XCFLAGS=.*#XCFLAGS=-D_BSD_EXTENSION -DPlan9# s#^CFLAGS_STANDARD=.*#CFLAGS_STANDARD=# s#^include \$\(.*\)/(.*)#include src/\1# s#unix-aux.mak#plan9-aux.mak# s#gsdatadir *=.*#gsdatadir=/sys/src/cmd/gs# s#DEVICE_DEVS=.*#DEVICE_DEVS='$devlist'# s#(DEVICE_DEVS[0-9]+)=.*#\1=#' $prereq >$target src/plan9-aux.mak: src/unix-aux.mak sed 's#^INCLUDE=.*#INCLUDE=/sys/include/ape#' $prereq >$target try-%:V: gs%/$O.out bind gs$stem/$O.out /bin/gs bind -b gs$stem/lib /sys/lib/ghostscript echo 'give it a whirl' gs([0-9]+\.[0-9]+)/$O.out:R: gs\1/src @{ cd gs$stem1 # for(i in jpeg zlib libpng) # bind -c ../$i $i if(! test -f src/ld.tr) mk fake-make cp ../arch.h . rm -f obj/*.c mk $O.out # for(i in jpeg zlib libpng) # unmount $i || status='' } gs%/src: ghostscript-%.tar.gz rm -rf gs$stem gunzip < ghostscript-$stem.tar.gz | tar x mv ghostscript-$stem gs$stem chmod g+w gs$stem/* gs$stem/*/* # local drivers cp src/gdevifno.c src/gdevplan9.c src/gdevcd8.c gs$stem/src # local conventions ed gs$stem/lib/gs_init.ps gs$stem/mkfile cp default.*.h gs$stem @{cd gs$stem; mk startover} ghostscript-%.tar.gz: #outside #hget -o $target http://download.sourceforge.net/ghostscript/$target hget -o $target ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/gs^`{echo $stem | sed 's/\.//'}^/$target #ftpfs -a $user^'@' ftp.cs.wisc.edu #cp /n/ftp/ghost/aladdin/*/ghostscript-$stem.tar.gz . startover:V: rm -rf obj/* rm -f src/ld.tr rm -f src/plan9.mak src/plan9-aux.mak install-%:V: unmount /bin/gs || status='' unmount /sys/lib/ghostscript || status='' mk installsrc-$stem cpu -h thresher -c 'mk mips.h' || status='' cpu -h alpha -c 'mk alpha.h' || status='' mk all mk installall for(i in lib/*.ps) if(! cmp $i /sys/lib/ghostscript/^`{basename $i} >/dev/null) cp $i /sys/lib/ghostscript cp /sys/lib/ghostscript/pdf_sec-ps.bak /sys/lib/ghostscript/pdf_sec.ps installsrc-%:V: gs%/$O.out pwd=`{pwd} # don't accidentally do this from gsX.XX if(! ~ $pwd */gs) echo 'i don''t think you meant to do that' && exit oops tocopy=(doc examples icclib lib man obj src zlib jpeg libpng) if(! cmp src/version.mak gs$stem/src/version.mak) { rm -rf $tocopy @{cd gs$stem; tar c $tocopy} | tar xT mk clean } status='' clean-%:V: for (i in gs$stem/*) unmount $i >[2]/dev/null || status='' rm -rf gs$stem ghostscript-$stem.tar.gz nclude src/libpng.mak include src/jbig2.ma