[comp.sources.sun] v01i034: contool - A new Sunview console message handler

mcgrew@dartagnan.rutgers.edu (Charles Mcgrew) (06/22/89)

Submitted-by: chuck@melmac.harris-atd.com
Posting-number: Volume 1, Issue 34
Archive-name: contool2.1

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  Makefile README contool.c contool.man misc.c sample.filter
#   icons icons/console1.icon icons/console1_bad.icon
#   icons/console1_flash.icon icons/contool.icon
#   icons/contool_bad.icon icons/stopsign.icon icons/stopsign_inv.icon
# Wrapped by chuck@melmac on Fri Feb 10 11:25:37 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(702 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
XBIN	= /usr/local/bin
X
XMAN	= /usr/man/manl
XMANEXT	= l
X
X# directory where icons can be found, must end with '/'!
XICON_DIR = ./icons/
X
XOFILES	= contool.o misc.o
X
X.c.o:
X	cc -O -c -DICON_DIRECTORY=\"$(ICON_DIR)\" $<
X
Xcontool: $(OFILES)
X	cc -o contool $(OFILES) -lsuntool -lsunwindow -lpixrect
X
Xinstall: contool $(MAN)/contool.$(MANEXT)
X	cp contool $(BIN)
X	chmod 755 $(BIN)/contool
X
X$(MAN)/contool.$(MANEXT): contool.man
X	cp -p contool.man $(MAN)/contool.$(MANEXT)
X
Xinstall-icons: 
X	for i in icons/*.icon; do \
X	    cp $$i $(ICON_DIR); \
X	done;
X
Xclean:
X	rm -f *~ $(OFILES) contool core
X
Xshar:
X	rm -f contool.shar
X	shar -o contool.shar Makefile README contool.c contool.man misc.c sample.filter icons icons/*
END_OF_FILE
if test 702 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(3733 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X     Contool Version 2.1
X     
X     Change history:
X     	1.0	20 Jun 88	Original release
X     	1.1	30 Jun 88	Added -p option to pop open when messages
X     				   arrive.  Suggested by Doug Lind
X     				   (lind@perron.ms.washington.edu).
X     				Added alternate icon sets for more attractive
X     				   appearance when messages arrive.  Alternate
X     				   set two is from David Eckelcamp 
X     				   (eckelcamp@mcc.com).
X     				Cleaned up Makefile.  Again, courtesy of
X     				   David Eckelcamp.
X	2.0	23 Aug 88	Added automatic reload of filters when
X				   filter file is modified.  Suggested by
X				   Craig Musicant (cmusican@stanford.prime.com).
X				Filter strings are now regular expressions.
X				   Provided by jqj@hogg.cc.uoregon.edu.
X				Reworked frame menu, based upon diffs posted
X				   to sun-source@titan.rice.edu.
X				Added protection from overflowing the text edit
X				   window when too many messages arrive.
X				Filters can now be read from any file, not
X				   just ~/.contool.
X	2.1	10 Feb 89	Added logging capability, courtesy of
X				   Gregory Bond (gnb@melba.bby.oz.au).
X
X     Contool will capture and display system console messages with timestamps.
XIt is a replacement for the standard Sun console, which is created with 
X"cmdtool -C".  Contool will flash its icon and beep when messages are written
Xto the icon, so you can keep it closed on your desktop until a message arrives.
XYou can modify this beeping and flashing behavior; see the man page for more
Xdetails.
X
X     Contool comes with several icons which you can use for different flash
Xstyles.  The default is a flashing stop sign; some of us prefer a little
Xmonitor whose screen flashes.  To achieve this behavior, you can invoke
X
X	contool -g contool.icon -b contool.icon -f contool_bad.icon
X
Xto set the good, bad, and flash icons.
X
X     You can instruct contool to filter and ignore certain common console
Xmessages.  The man file explains how to create a file of filters in 
X~/.contool; the included sample.filter is how my filters are set up.  You
Xcan modify this to suit yourself, and copy it to ~/.contool.
X
X     Before building contool, you need to check several site dependencies
Xin the Makefile and contool.c.  These paths are:
X
X	In Makefile:
X		BIN		Where the executable will go, normally
X				/usr/local/bin
X		MANDIR		Where the man page will go, normally
X				/usr/man/manl
X		MANEXT		The man page extension, usually 'l',
X				for local man pages.  You may want to
X				make MANDIR /usr/man/man1, in which case
X				MANEXT should be '1'.
X
X		ICON_DIRECTORY	Where you will keep the contool icons.
X				On our system, this is /usr/local/images.
X				Contool is shipped with this set to "./icons/",
X				so that it will compile in the directory 
X				in which you unshar'ed it.  Move the icons
X				to your local icon repository, and change 
X				this path accordingly.  MAKE SURE IT ENDS
X				IN A '/'!
X
X	In contool.c:
X		You may wish to use an alternate icon set for contool.  Simply
X		uncomment the set you want to use as noted in contool.c.
X
XOnce you have adjusted these values, just type "make contool" or "make
Xinstall".  
X
X     Contool honors window command line options, described in suntools(1),
Xso you can change the default window size, icon position, etc.  We like
Xto bring contool up closed, using "-Wi".
X
X     Comments, bugs, to me, please.  I would be very interested in your 
Ximpressions of contool and any suggestions you might have to make it better.
XBy the way, there are a few convenient untility routines in misc.c you might
Xfind useful in other programs you are writing.
X
XChuck Musciano
XAdvanced Technology Department
XHarris Corporation
XPO Box 37, MS 3A/1912
XMelbourne, FL 32902
X(407) 727-6131
XARPA: chuck@trantor.harris-atd.com
END_OF_FILE
if test 3733 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'contool.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'contool.c'\"
else
echo shar: Extracting \"'contool.c'\" \(21726 characters\)
sed "s/^X//" >'contool.c' <<'END_OF_FILE'
X/************************************************************************/
X/*	Copyright 1988 by Chuck Musciano and Harris Corporation		*/
X/*									*/
X/*	Permission to use, copy, modify, and distribute this software	*/
X/*	and its documentation for any purpose and without fee is	*/
X/*	hereby granted, provided that the above copyright notice	*/
X/*	appear in all copies and that both that copyright notice and	*/
X/*	this permission notice appear in supporting documentation, and	*/
X/*	that the name of Chuck Musciano and Harris Corporation not be	*/
X/*	used in advertising or publicity pertaining to distribution	*/
X/*	of the software without specific, written prior permission.	*/
X/*	Chuck Musciano and Harris Corporation make no representations	*/
X/*	about the suitability of this software for any purpose.  It is	*/
X/*	provided "as is" without express or implied warranty.		*/
X/************************************************************************/
X
X
X/************************************************************************/
X/*									*/
X/*	contool:	capture and display timestamped console i/o	*/
X/*									*/
X/************************************************************************/
X
X#include	<stdio.h>
X#include	<fcntl.h>
X#include	<sys/ioctl.h>
X#include	<sys/types.h>
X#include	<sys/stat.h>
X
X#include	<suntool/sunview.h>
X#include	<suntool/textsw.h>
X#include	<suntool/icon_load.h>
X
X/**************** Site dependent parameters ****************************/
X
X/* Where the default contool icons are kept.  !Must end in '/'! */
X
X#if !defined(ICON_DIRECTORY)
X#define		ICON_DIRECTORY		"./icons/"
X#endif
X
X/* The default icon names.  Alternate sets are shown, and you might want
X   to try these instead of the default set by uncommenting the desired set. */
X
X/* This set gives a blinking stop sign when messages arrive. */
X#define		GOOD_ICON		"contool.icon"
X#define		BAD_ICON		"stopsign.icon"
X#define		INVERSE_ICON		"stopsign_inv.icon"
X
X/* This set gives a terminal, labelled "Console", in a box.  The screen
X   flashes when messages arrive. */
X/* #define		GOOD_ICON	"contool.icon" */
X/* #define		BAD_ICON	"contool.icon" */
X/* #define		INVERSE_ICON	"contool_bad.icon" */
X
X/* This set gives a terminal, without a box.  Again, the screen flashes
X   when messages arrive. */
X/* #define		GOOD_ICON	"console1.icon" */
X/* #define		BAD_ICON	"console1_bad.icon" */
X/* #define		INVERSE_ICON	"console1_flash.icon" */
X
X/*************** End of site dependencies ******************************/
X
X#define		TOOL_LABEL		"<< Console Tool 2.1 >>"
X
X#define		MAX_FILTERS		64
X
X#define		strsave(s)		((char *) strcpy(malloc(strlen(s) + 1), s))
X
X#define		BEEP_COUNT		3
X#define		TS_INTERVAL		60
X
X#define		NORMAL_MODE		1
X#define		QUIET_MODE		2
X#define		IGNORE_MODE		3
X
X#define		TEXT_SIZE_LIMIT		32768
X#define		TEXT_SIZE_FUZZ		1024
X#define		TEXT_DELETE_SIZE	1024
X
X#define		INPUT_BUFFER_SIZE	4096
X
X/*************** Stuff that regexp(3) needs ****************************/
X
Xstatic	regexp_error();
X
X#define		INIT			register char *expbuf = ep, *sp = instring;
X#define		GETC()			(*sp++)
X#define		PEEKC()			(*sp)
X#define		UNGETC(c)		(--sp)
X#define		RETURN(p)		{bcopy(expbuf, sp = (char *) malloc(p - expbuf), p - expbuf); return(sp);}
X#define		ERROR(val)		{regexp_error(val, instring); return(NULL);}
X
X#include	<regexp.h>
X
X/*************** Things that contool uses ******************************/
X
Xstruct	f_rec	{char	*start;
X		 char	*end;
X		 int	scircf;
X		 int	ecircf;
X		 int	mode;
X		};
X
Xchar	*ct_usage = "usage: contool [-b <file>] [-c <file>] [-d <size>] [-f <file>] [-g <file>] [-l <size>] [-o <logfile>] [-p] [-r <amt>] [-s <amt>]\n";
X
Xstatic	Frame	bf;
Xstatic	Textsw	text;
Xstatic	Icon	good, bad, inverse;
Xstatic	struct	pixrect	*good_pr, *bad_pr, *inv_pr;
Xstatic	Menu_item	stop_blink;
Xstatic	Rect	open_rect;
X
Xstatic	char	bad_icon[256];			/* -b */
Xstatic	char	filter_path[256];		/* -c */
Xstatic	int	delete_amt = TEXT_DELETE_SIZE;	/* -d */
Xstatic	char	inv_icon[256];			/* -f */
Xstatic	char	good_icon[256];			/* -g */
Xstatic	int	size_limit = TEXT_SIZE_LIMIT;	/* -l */
Xstatic	int	pop_open = FALSE;		/* -p */
Xstatic	int	resolution = TS_INTERVAL;	/* -r */
Xstatic	int	beep_amount = BEEP_COUNT;	/* -s */
X
Xstatic	int	bad_is_up;
Xstatic	int	beep_count;
Xstatic	int	blinking = FALSE;
Xstatic	int	event_in_progress = FALSE;
Xstatic	int	explicit_filters = FALSE;
Xstatic	struct	f_rec	filter[MAX_FILTERS];
Xstatic	int	filters = 0;
Xstatic	int	icon_height;
Xstatic	int	icon_width;
Xstatic	FILE	*master = NULL;
Xstatic	int	old_time = 0;
Xstatic	char	*program;
Xstatic	FILE	*slave = NULL;
Xstatic  FILE	*logfile = NULL;
X
Xstatic	struct	itimerval	timer = {{0, 500000}, {0, 500000}};
X
X/************************************************************************/
X/*	First, some basic console utility routines 			*/
X/************************************************************************/
X
X/************************************************************************/
Xstatic	acquire_console(path)
X
Xchar	*path;
X
X{
X	if (ioctl(fileno(slave), TIOCCONS, NULL) == -1) {
X	   fprintf(stderr, "%s: could not attach %s to /dev/console\n", program, path);
X	   exit(1);
X	   }
X}
X
X/************************************************************************/
Xstatic	clear_messages()
X
X{
X	textsw_reset(text, 0, 0);
X	old_time = 0;
X}
X
X/************************************************************************/
Xstatic	stop_blinking()
X
X{
X	notify_set_itimer_func(bf, NULL, ITIMER_REAL, NULL, NULL);
X	window_set(bf, FRAME_ICON, good, 0);
X	blinking = FALSE;
X	menu_set(stop_blink, MENU_INACTIVE, TRUE, 0);
X}
X
X/************************************************************************/
X/*	Now, filter and regular expression handlers			*/
X/************************************************************************/
X
X/************************************************************************/
Xstatic	internal_message(a, b, c, d, e, f)
X
Xint	a, b, c, d, e, f;
X
X{	char	buf[512];
X
X	sprintf(buf, a, b, c, d, e, f);
X	time_stamp();
X	write_log(buf);
X	do_insertion(buf, strlen(buf));
X}
X
X/************************************************************************/
Xstatic	internal_error(a, b, c, d, e, f)
X
Xint	a, b, c, d, e, f;
X
X{	char	buf[512];
X
X	sprintf(buf, a, b, c, d, e, f);
X	time_stamp();
X	fprintf(stderr, buf);
X}
X
X/************************************************************************/
Xstatic	int	match_exp(exp, circ, str)
X
Xchar	*exp;
Xint	circ;
Xchar	*str;
X
X{
X	circf = circ;
X	return(step(str, exp));
X}
X
X/************************************************************************/
Xstatic	regexp_error(val, string)
X
Xint	val;
Xchar	*string;
X
X{	char	*msg;
X
X	switch (val) {
X	   case 11 : msg = "range endpoint too large";
X	   case 16 : msg = "bad number";
X	   case 25 : msg = "\"\\digit\" out of range";
X	   case 36 : msg = "illegal or missing delimiter";
X	   case 41 : msg = "no remembered search string";
X	   case 42 : msg = "\\(\\) imbalance";
X	   case 43 : msg = "too many \\(";
X	   case 44 : msg = "more than 2 numbers given in \\{\\}";
X	   case 45 : msg = "} expected after \\";
X	   case 46 : msg = "first number exceeds second in \\{\\}";
X	   case 49 : msg = "[] imbalance";
X	   case 50 : msg = "regular expression overflow";
X	   default : msg = "regular expression compilation error";
X	   }
X	internal_error("*** %s: %s in '%s'\n", program, msg, string);
X}
X
X/************************************************************************/
Xstatic	load_filters()
X
X{	FILE	*f;
X	char	buf[256], rbuf[1024], *token[6], *p, *index();
X	int	count;
X	struct	stat	sb;
X	static	int	load_time = 0;
X
X	if (stat(filter_path, &sb) == -1) {
X	   if (explicit_filters && load_time == 0) {
X	      internal_error("*** %s: filter file %s cannot be accessed\n", program, filter_path);
X	      load_time = 1;
X	      }
X	   return;
X	   }
X	if (sb.st_mtime > load_time) {
X	   for (count = 0; count < filters; count++) {
X	      free(filter[count].start);
X	      if (filter[count].end)
X	         free(filter[count].end);
X	      }
X	   filters = 0;
X	   }
X	else
X	   return;
X
X	if ((f = fopen(filter_path, "r")) != NULL) {
X	   while (getline(f, buf, 256) != EOF) {
X	      if ((p = index(buf, '#')) != NULL)
X	         *p = '\0';
X	      if (strlen(buf) == 0 || verify(buf, " "))
X	         continue;
X	      tokenize(buf, &count, token, 6);
X	      if (count == 2 || count == 4) {
X	         if (strcmp(lower(token[0]), "ignore") == 0)
X	            filter[filters].mode = IGNORE_MODE;
X	         else if (strcmp(token[0], "quiet") == 0)
X	            filter[filters].mode = QUIET_MODE;
X	         else {
X	            internal_error("*** %s: invalid contool filter:\n***\t%s\n", program, buf);
X	            continue;
X	            }
X	         if ((filter[filters].start = compile(token[1], rbuf, rbuf+1024, '\0')) == NULL)
X	            continue;
X	         filter[filters].scircf = circf;
X	         if (count == 4)
X	            if (strcmp(lower(token[2]), "to") == 0) {
X	               filter[filters].end = compile(token[3], rbuf, rbuf+1024, '\0');
X	               filter[filters].ecircf = circf;
X	               }
X	            else {
X	               internal_error("*** %s: invalid contool filter:\n***\t%s\n", program, buf);
X	               continue;
X	               }
X	         else
X	            filter[filters].end = NULL;
X	         filters++;
X	         }
X	      else
X	         internal_error("*** %s: invalid contool filter:\n\t%s\n", program, buf);
X	      }
X	   fclose(f);
X	   internal_message("*** filters loaded from %s\n", filter_path);
X	   load_time = sb.st_mtime;
X	   }
X	else
X	   internal_error("*** %s: could not read filter file %s\n", program, filter_path);
X}
X
X/************************************************************************/
X/*	Various event handlers for the console frame			*/
X/************************************************************************/
X
X/************************************************************************/
Xstatic	Notify_value	blink_proc(me, which)
X
Xint	*me;
Xint	which;
X
X{
X	if (event_in_progress)
X	   return(NOTIFY_DONE);
X	if (beep_count > 0) {
X	   window_bell(bf);
X	   beep_count--;
X	   }
X	else if (blinking) {
X	   if (bad_is_up)
X	      window_set(bf, FRAME_ICON, inverse, 0);
X	   else
X	      window_set(bf, FRAME_ICON, bad, 0);
X	   bad_is_up = !bad_is_up;
X	   }
X	if (beep_count == 0 && !blinking)
X	   notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL);
X	return(NOTIFY_DONE);
X}
X
X/************************************************************************/
Xstatic	Notify_value	close_proc(frame, event, arg, type)
X
XFrame	frame;
XEvent	*event;
XNotify_arg	arg;
XNotify_event_type	type;
X
X{	int	init_closed, curr_closed, is_resize;
X	Notify_value	value;
X	Rect	*temp;
X
X	event_in_progress = TRUE;
X	init_closed = (int) window_get(frame, FRAME_CLOSED);
X	is_resize = (event_id(event) == WIN_RESIZE);
X	value = notify_next_event_func(frame, event, arg, type);
X	curr_closed = (int) window_get(frame, FRAME_CLOSED);
X	if (init_closed != curr_closed)
X	   if (!curr_closed && blinking) {
X	      notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL);
X	      window_set(bf, FRAME_ICON, good, 0);
X	      blinking = FALSE;
X	      menu_set(stop_blink, MENU_INACTIVE, TRUE, 0);
X	      }
X	event_in_progress = FALSE;
X	if (is_resize) {
X	   temp = (Rect *) window_get(frame, FRAME_OPEN_RECT);
X	   if (temp->r_width <= icon_width && temp->r_height <= icon_height) { /* override spurious resize request */
X	      window_set(frame, FRAME_OPEN_RECT, &open_rect, FRAME_CLOSED, FALSE, 0);
X	      notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, NULL, NULL);
X	      window_set(bf, FRAME_ICON, good, 0);
X	      blinking = FALSE;
X	      menu_set(stop_blink, MENU_INACTIVE, TRUE, 0);
X	      }
X	   else /* save away new open rect */
X	      open_rect = *temp;
X	   }
X	return(value);
X}
X
X/************************************************************************/
Xstatic	Notify_value	destroy_proc(frame, status)
X
XFrame	frame;
XDestroy_status	status;
X
X{
X	if (status == DESTROY_CHECKING) {
X	   textsw_reset(text, 0, 0);
X	   return(NOTIFY_DONE);
X	   }
X	else
X	   return(notify_next_destroy_func(frame, status));
X}
X
X/************************************************************************/
X/*	Routines which handle capturing and displaying messages		*/
X/************************************************************************/
X
X/************************************************************************/
Xstatic	write_log(s)
X
Xchar	*s;
X
X{	int	t;
X	static	char	hostname[100] = "";
X
X	if (logfile) {
X	   if (*hostname == NULL) 
X	      if (gethostname(hostname, 99) != 0)
X	         strcpy(hostname, "(unknown)");
X	   t = time(0);
X	   fseek(logfile, 0L, 2);
X	   fprintf(logfile, "%s\t%.16s\t%s", hostname, ctime(&t) + 4, s);
X	   fflush(logfile);
X	   }
X}
X
X/************************************************************************/
Xstatic	do_insertion(buf, len)
X
Xchar	*buf;
Xint	len;
X
X{	int	first, last;
X
X	while (len > size_limit - ((int) window_get(text, TEXTSW_LENGTH) - TEXT_SIZE_FUZZ)) { /* make some room */
X	   first = 1;
X	   last = TEXTSW_INFINITY;
X	   if (textsw_find_bytes(text, &first, &last, "\n<<<", 4, 0) == -1)
X	      if (textsw_find_bytes(text, &first, &last, "\n", 1, 0) == -1)
X	         first = delete_amt;
X	   textsw_delete(text, 0, first + 1);
X	   }
X	window_set(text, TEXTSW_INSERTION_POINT, TEXTSW_INFINITY, 0);
X	textsw_insert(text, buf, len);
X}
X
X/************************************************************************/
Xstatic	time_stamp()
X
X{	int	t, pos;
X	char	buf[5];
X
X	t = time(0);
X	if (t - old_time >= resolution) {
X	   window_set(text, TEXTSW_INSERTION_POINT, TEXTSW_INFINITY, 0);
X	   pos = (int) window_get(text, TEXTSW_LENGTH);
X	   if (pos != 0) {
X	      window_get(text, TEXTSW_CONTENTS, pos - 1, buf, 1);
X	      if (buf[0] != '\n')
X	         do_insertion("\n", 1);
X	      }
X	   do_insertion("\n<<< ", 5);
X	   do_insertion(ctime(&t), 24);
X	   do_insertion(" >>>\n", 5);
X	   old_time = t;
X	   }
X}
X
X/************************************************************************/
Xstatic	Notify_value	input_func(me, fd)
X
Xint	*me;
Xint	fd;
X
X{	char	old_c, *s, *t, *index();
X	int	i, count, do_blink = FALSE;
X	static	int	curr_filter = -1, curr_mode = NORMAL_MODE;
X	static	char	in_buf[INPUT_BUFFER_SIZE + 2];
X
X	while ((count = read(fileno(master), in_buf, INPUT_BUFFER_SIZE)) >= 0) {
X	   in_buf[count] = '\0';
X	   while (s = index(in_buf, '\015')) {
X	      strcpy(s, s + 1);
X	      count--;
X	      }
X	   for (t = in_buf; *t; *s = old_c, t = s) {
X	      if (s = index(t, '\n')) {
X	         old_c = *++s;
X	         *s = '\0';
X	         }
X	      else {
X	         s = t + strlen(t);
X	         old_c = '\0';
X	         }
X	      if (curr_mode == NORMAL_MODE) {
X	         load_filters();
X	         for (i = 0; i < filters; i++)
X	            if (match_exp(filter[i].start, filter[i].scircf, t)) {
X	               if (filter[i].mode == QUIET_MODE) {
X	                  time_stamp();
X			  write_log(t);
X	                  do_insertion(t, strlen(t));
X	                  }
X	               if (filter[i].end) {
X	                  curr_mode = filter[i].mode;
X	                  curr_filter = i;
X	                  }
X	               break;
X	               }
X	         if (i == filters) {
X	            time_stamp();
X		    write_log(t);
X	            do_insertion(t, strlen(t));
X	            do_blink = TRUE;
X	            }
X	         }
X	      else {
X	         if (curr_mode == QUIET_MODE) {
X	            time_stamp();
X		    write_log(t);
X		    do_insertion(t, strlen(t));
X	            }
X	         if (match_exp(filter[curr_filter].end, filter[curr_filter].ecircf, t)) {
X	            curr_mode = NORMAL_MODE;
X	            curr_filter = -1;
X	            }
X	         }
X	      }
X	   }
X	window_set(text, TEXTSW_UPDATE_SCROLLBAR, 0);
X	if (do_blink) {
X	   if (pop_open)
X	      window_set(bf, FRAME_CLOSED, FALSE, 0);
X	   if (window_get(bf, FRAME_CLOSED) && !blinking) {
X	      window_set(bf, FRAME_ICON, bad, 0);
X	      blinking = TRUE;
X	      bad_is_up = TRUE;
X	      menu_set(stop_blink, MENU_INACTIVE, FALSE, 0);
X	      }
X	   beep_count = beep_amount;
X	   notify_set_itimer_func(bf, blink_proc, ITIMER_REAL, &timer, NULL);
X	   }
X	return(NOTIFY_DONE);
X}
X
X/************************************************************************/
X/*	Routines which parse options, create windows, and main()	*/
X/************************************************************************/
X
X/************************************************************************/
Xstatic	parse_options(argc, argv)
X
Xint	*argc;
Xchar	**argv;
X
X{	char	*s, c;
X
X	strcpy(good_icon, ICON_DIRECTORY);
X	strcat(good_icon, GOOD_ICON);
X	strcpy(bad_icon, ICON_DIRECTORY);
X	strcat(bad_icon, BAD_ICON);
X	strcpy(inv_icon, ICON_DIRECTORY);
X	strcat(inv_icon, INVERSE_ICON);
X
X	strcpy(filter_path, getenv("HOME"));
X	strcat(filter_path, "/.contool");
X
X	while ((c = getopt(argc, argv, "b:c:d:f:g:l:o:pr:s:?", &s)) != EOF)
X	   switch (c) {
X	      case 'b' : strcpy(bad_icon, s);
X	      		 break;
X	      case 'c' : strcpy(filter_path, s);
X	      		 explicit_filters = TRUE;
X	      		 break;
X	      case 'd' : if (verify(s, "0123456789"))
X	      		    delete_amt = atoi(s);
X	      		 else {
X	      		    fprintf(stderr, "%s: invalid delete amount: %s\n", program, s);
X	      		    exit(1);
X	      		    }
X	      		 break;
X	      case 'f' : strcpy(inv_icon, s);
X	      		 break;
X	      case 'g' : strcpy(good_icon, s);
X	      		 break;
X	      case 'l' : if (verify(s, "0123456789"))
X	      		    window_set(text, TEXTSW_MEMORY_MAXIMUM, (size_limit = atoi(s)) + TEXT_SIZE_FUZZ, 0);
X	      		 else {
X	      		    fprintf(stderr, "%s: invalid message limit: %s\n", program, s);
X	      		    exit(1);
X	      		    }
X	      		 break;
X	      case 'o':  if ((logfile = fopen(s, "a")) == NULL) {
X		   	    fprintf(stderr, "%s : can't open logfile: %s\n", program, s);
X			    exit(1);
X		         }
X		         break;
X	      case 'p' : pop_open = TRUE;
X	      		 break;
X	      case 'r' : if (verify(s, "0123456789"))
X	      		    resolution = atoi(s);
X	      		 else {
X	      		    fprintf(stderr, "%s: invalid timestamp resolution: %s\n", program, s);
X	      		    exit(1);
X	      		    }
X	      		 break;
X	      case 's' : if (verify(s, "0123456789"))
X	      		    beep_amount = atoi(s);
X	      		 else {
X	      		    fprintf(stderr, "%s: invalid beep count: %s\n", program, s);
X	      		    exit(1);
X	      		    }
X	      		 break;
X	      case '?' : fprintf(stderr, ct_usage);
X	      		 exit(0);
X	      		 break;
X	      default  : fprintf(stderr, ct_usage);
X	                 exit(1);
X	      }
X}
X
X/************************************************************************/
Xstatic	load_icons()
X
X{	char	msg[IL_ERRORMSG_SIZE];
X
X	if ((good_pr = icon_load_mpr(good_icon, msg)) == NULL) {
X	   fprintf(stderr, "%s: %s\n", program, msg);
X	   exit(1);
X	   }
X	good = icon_create(ICON_IMAGE, good_pr,
X			   ICON_LABEL, "",
X			   ICON_WIDTH, good_pr->pr_size.x,
X			   ICON_HEIGHT, good_pr->pr_size.y,
X			   0);
X	icon_width = good_pr->pr_size.x;
X	icon_height = good_pr->pr_size.y;
X	if ((bad_pr = icon_load_mpr(bad_icon, msg)) == NULL) {
X	   fprintf(stderr, "%s: %s\n", program, msg);
X	   exit(1);
X	   }
X	bad = icon_create(ICON_IMAGE, bad_pr,
X			  ICON_LABEL, "",
X			  ICON_WIDTH, bad_pr->pr_size.x,
X			  ICON_HEIGHT, bad_pr->pr_size.y,
X			  0);
X	if (bad_pr->pr_size.x > icon_width)
X	   icon_width = bad_pr->pr_size.x;
X	if (bad_pr->pr_size.y > icon_height)
X	   icon_height = bad_pr->pr_size.y;
X	if (*inv_icon == '\0')
X	   strcpy(inv_icon, bad_icon);
X	if ((inv_pr = icon_load_mpr(inv_icon, msg)) == NULL) {
X	   fprintf(stderr, "%s: %s\n", program, msg);
X	   exit(1);
X	   }
X	inverse = icon_create(ICON_IMAGE, inv_pr,
X			      ICON_LABEL, "",
X			      ICON_WIDTH, inv_pr->pr_size.x,
X			      ICON_HEIGHT, inv_pr->pr_size.y,
X			      0);
X	if (inv_pr->pr_size.x > icon_width)
X	   icon_width = inv_pr->pr_size.x;
X	if (inv_pr->pr_size.y > icon_height)
X	   icon_height = inv_pr->pr_size.y;
X	window_set(bf, FRAME_ICON, good, 0);
X}
X
X/************************************************************************/
Xmain(argc, argv)
X
Xint	argc;
Xchar	**argv;
X
X{	char	*path, *open_psuedo_tty(), **saveargs();
X	int	i;
X	Menu	menu;
X
X	program = strsave(argv[0]);
X
X	bf = window_create(NULL, FRAME, 
X			      FRAME_ARGC_PTR_ARGV, &argc, argv,
X			      FRAME_LABEL, TOOL_LABEL,
X			   0);
X	text = window_create(bf, TEXTSW, 
X			        TEXTSW_DISABLE_CD, TRUE,
X			        TEXTSW_DISABLE_LOAD, TRUE, 
X			        TEXTSW_AGAIN_RECORDING, FALSE,
X			        TEXTSW_IGNORE_LIMIT, TEXTSW_INFINITY,
X			        TEXTSW_MEMORY_MAXIMUM, size_limit + TEXT_SIZE_FUZZ,
X			     0);
X	open_rect = *((Rect *) window_get(bf, FRAME_OPEN_RECT));
X
X	argv = saveargs(argc, argv);
X	parse_options(&argc, argv);
X	if (argc != 1) {
X	   fprintf(stderr, ct_usage);
X	   exit(1);
X	   }
X
X	load_icons();
X
X	path = open_psuedo_tty(&master, "r", &slave, "w");
X	if (master == NULL) {
X	   fprintf(stderr, "%s: couldn't open any psuedo-tty\n");
X	   exit(1);
X	   }
X	if (slave == NULL) {
X	   fprintf(stderr, "%s: couldn't open slave side of %s\n", program, path);
X	   exit(1);
X	   }
X
X	i = fcntl(fileno(master), F_GETFL, 0);
X	i |= FNDELAY;
X	if (fcntl(fileno(master), F_SETFL, i) == -1) {
X	   fprintf(stderr, "%s: could not force %s to non-blocking i/o\n", program, path);
X	   exit(1);
X	   }
X
X	acquire_console(path);
X
X	stop_blink = menu_create_item(MENU_STRING, "Stop Blinking",
X				      MENU_INACTIVE, TRUE,
X				      MENU_ACTION_PROC, stop_blinking,
X				      0);
X	menu = menu_create(MENU_APPEND_ITEM, stop_blink,
X			   MENU_ACTION_ITEM, "Become Console", acquire_console,
X			   MENU_ACTION_ITEM, "Clear Messages", clear_messages,
X			   MENU_PULLRIGHT_ITEM, "Frame", window_get(bf, WIN_MENU),
X			   0);
X	window_set(bf, WIN_MENU, menu, 0);
X
X	notify_set_input_func(bf, input_func, fileno(master));
X	notify_interpose_destroy_func(bf, destroy_proc);
X	notify_interpose_event_func(bf, close_proc, NOTIFY_SAFE);
X
X	load_filters();
X
X	window_main_loop(bf);
X}
END_OF_FILE
if test 21726 -ne `wc -c <'contool.c'`; then
    echo shar: \"'contool.c'\" unpacked with wrong size!
fi
# end of 'contool.c'
fi
if test -f 'contool.man' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'contool.man'\"
else
echo shar: Extracting \"'contool.man'\" \(4928 characters\)
sed "s/^X//" >'contool.man' <<'END_OF_FILE'
X.TH CONTOOL 1 "10 December 1986"
X.SH NAME
Xcontool \- capture and display console output
X.SH SYNOPSIS
X.IP "\fBcontool\fP"
X[\fB\(hyb\fP \fIfile\fP] [\fB\(hyc\fP \fIfile\fP] [\fB\(hyd\fP \fIsize\fP] [\fB\(hyf\fP \fIfile\fP] [\fB\(hyg\fP \fIfile\fP] [\fB\(hyl\fP \fIsize\fP] [\f3\(hyo\fP \f2logfile\fP] [\f3\(hyp\fP] [\f3\(hyr\fP \f2amount\fP] [\f3\(hys\fP \f2count\fP] 
X.SH DESCRIPTION
X.LP
X\f2Contool\fP captures and displays any messages sent to the system console.
XEach message is timestamped as it arrives.  The messages are displayed in a
Xscrolling text window, so the user can scroll through old messages.
X.LP
XWhen a message arrives, \f3contool\fP will beep and, if closed, begin
Xblinking its icon until the user opens the tool.  This behavior can be changed
Xwith the various options, described below.
X.LP
X\f2Contool\fP must be run under \f2suntools\fP(1), and accepts the
Xstandard window command line options.
X.LP
X\f2Contool\fP can be configured to ignore certain console messages using 
Xentries in the file ~/.contool.  Each line in the file has the format
X\*(lq\f2action start\fP [ \f3to\fP \f2stop\fP ]\*(rq.  The \fIstart\fP and
X\fIstop\fP strings are regular expressions, as described in \fIed\fP(1).
XEach line of text written
Xto the console is compared against the list of \f2start\fP strings.  A match
Xcauses the \f2action\fP to take place.  If the \f2action\fP is \f3quiet\fP, the
Xmessage is written to the console, but no beeping or blinking occurs.  If it
Xis \f3ignore\fP, the message is thrown away.  If the optional \f3to\fP clause is
Xincluded, the desired \f2action\fP remains in effect until a line matching the \f2stop\fP
Xstring is encountered.  Comments can be introduced into the file using the '#'
Xcharacter.
X.SH OPTIONS
X.IP "\fB\\(hyb\fP \fIfile\fP"
Xspecifies the \*(lqbad\*(rq icon to be displayed when a message
Xhas arrived on the console.  The \f2file\fP must be in the format used by
X\f2iconedit\fP(1).
X.IP "\fB\\(hyc\fP \fIfile\fP"
Xspecifies a different filter file.  If \fB\(hyc\fP is not used, \fIcontool\fP
Xwill read filters from ~/.contool, if it exists.
X.IP "\fB\\(hyd\fP \fIsize\fP"
Xsets the amount of text that will be removed from the front of the message
Xlog when the message size limit (see \fB\(hyl\fP, below) is exceeded.  At
Xleast \fIsize\fP bytes will be removed, along with any text up to the start
Xof the next message.  The default value is 1024 bytes.
X.IP "\fB\\(hyf\fP \fIfile\fP"
Xspecifies the \*(lqflash\*(rq icon which is alternated with the
Xbad icon (see \f3\(hyb\fP, above) when a message has arrived on the console.
XLike \f3\(hyb\fP, the file must be in the format used by \f2iconedit\fP(1).
XTo disable the flashing feature, specify \*(lq\*(rq as the \f2file\fP.
X.IP "\fB\\(hyg\fP \fIfile\fP"
Xspecifies the \*(lqgood\*(rq icon which is displayed when
Xno unviewed messages are present on the console.  This icon is displayed
Xwhen the user closes \f2contool\fP, and remains displayed until a new message
Xarrives.  Like \f3\(hyb\fP and \f3\(hyf\fP, the \f2file\fP must be in the
Xformat used by \f2iconedit\fP(1).
X.IP "\fB\\(hyl\fP \fIsize\fP"
Xsets the limit, in bytes, on the number of messages that will be saved.
XWhen a message would exceed this limit, some number of bytes of text (see 
X\fB\(hyd\fP, above) will be deleted from the start of the message log.  The
Xdefault value is 32768 bytes.
X.IP "\fB\\(hyo\fP \fIfile\fP"
Xinstructs contool to keep a log of all messages (that are accepted by
Xthe filters) into the named \fIfile\fP.  This is useful for logging the
Xconsole messages from a network of workstations into files on a
Xserver, making administration of such a network much simpler.  Care
Xshould be exercised in logging multiple machines to the one file; NFS
Xsometimes doesn't append if concurrent updates are done.  This may be
Xan NFS bug.
X.IP "\f3\(hyp\fP"
Xcauses contool to pop open when a message arrives.  By default,
Xcontool stays closed and blinks when messages arrive.
X.IP "\f3\(hyr\fP \f2amount\fP"
Xcontrols the resolution of the timestamps placed in the 
Xmessage display.  Normally, a message is not timestamped if it has arrived
Xwithin sixty seconds of the last timestamp.  This prevents a cascade
Xof messages from receiving several, identical timestamps.  If this option
Xis specified, the \f2amount\fP indicates the time, in seconds, to allow
Xbetween timestamps.
X.IP "\f3\(hys\fP \f2count\fP"
Xchanges the number of times \f2contool\fP will sound the bell
Xwhen a message arrives.  To disable the bell, set the \f2count\fP to zero.
X.SH FILES
X.ta 2i
Xcontool.icon	default \f3\(hyg\fP icon
X.br
Xstopsign.icon	default \f3\(hyb\fP icon
X.br
Xstopsign_inv.icon	default \f3\(hyf\fP icon
X.br
X~/.contool	filter pattern file
X.SH AUTHOR
X.LP
XChuck Musciano
X.br
XAdvanced Technology Department
X.br
XHarris Corporation
X.br
X(407) 727-6131
X.br
XARPA: chuck@trantor.harris-atd.com
X.SH BUGS
X.LP
X\f2Contool\fP is a view-only tool, and there is no way to type commands
Xon the console.
END_OF_FILE
if test 4928 -ne `wc -c <'contool.man'`; then
    echo shar: \"'contool.man'\" unpacked with wrong size!
fi
# end of 'contool.man'
fi
if test -f 'misc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'misc.c'\"
else
echo shar: Extracting \"'misc.c'\" \(6517 characters\)
sed "s/^X//" >'misc.c' <<'END_OF_FILE'
X/************************************************************************/
X/*	Copyright 1988 by Chuck Musciano and Harris Corporation		*/
X/*									*/
X/*	Permission to use, copy, modify, and distribute this software	*/
X/*	and its documentation for any purpose and without fee is	*/
X/*	hereby granted, provided that the above copyright notice	*/
X/*	appear in all copies and that both that copyright notice and	*/
X/*	this permission notice appear in supporting documentation, and	*/
X/*	that the name of Chuck Musciano and Harris Corporation not be	*/
X/*	used in advertising or publicity pertaining to distribution	*/
X/*	of the software without specific, written prior permission.	*/
X/*	Chuck Musciano and Harris Corporation make no representations	*/
X/*	about the suitability of this software for any purpose.  It is	*/
X/*	provided "as is" without express or implied warranty.		*/
X/************************************************************************/
X
X
X/************************************************************************/
X/*									*/
X/*	misc:	miscellaneous support routines for contool		*/
X/*									*/
X/************************************************************************/
X
X#include	<stdio.h>
X#include	<ctype.h>
X
X/************************************************************************/
X/*									*/
X/*	getline		read a line from a stream, removing the newline	*/
X/*			and returning the length of the line.		*/
X/*									*/
X/************************************************************************/
X
Xint	getline(stream, string, max)
X
XFILE	*stream;
Xchar	*string;
Xint	max;
X
X{	register	int	i, j;
X
X	i = (int) fgets(string, max, stream);
X	if (i == NULL)
X	   return(EOF);
X	j = strlen(string);
X	if (j > 0 && string[j - 1] == '\n')
X	   string[--j] = '\0';
X	return(j);
X}
X
X/************************************************************************/
X/*									*/
X/*	getopt		extract options and their parameters from a	*/
X/*			list of strings (most likely the command line	*/
X/*			arguments.					*/
X/*									*/
X/*			The 'opts' descriptor is a string of letters,	*/
X/*			indicating which options are valid.  If a	*/
X/*			letter is followed by a ':', that option is	*/
X/*			assumed to have a parameter following it.	*/
X/*			Getopt returns the discovered option, NULL when	*/
X/*			an illegal option is found, and EOF when no	*/
X/*			more options are found.  Options and their	*/
X/*			parameters are removed from the string list.	*/
X/*									*/
X/************************************************************************/
X
Xstatic	delarg(argc, argv)
X
Xint	*argc;
Xchar	**argv;
X
X{	char	*p;
X
X	while (*argv = *(argv+1))
X	   argv++;
X	(*argc)--;
X}
X
Xchar	getopt(argc, argv, opts, parm)
X
Xint	*argc;
Xchar	**argv;
Xchar	*opts;
Xchar	**parm;
X
X{	char	c, *p, *strcpy(), *index();
X	int	killed;
X
X	*parm = NULL;
X	while (*argv && ((**argv != '-') || (*(*argv+1) == '\0')))
X	   argv++;
X	if (*argv == NULL)
X	   return(EOF);
X	c = *(*argv+1);
X	*++(*argv) = '-';
X	if (killed = (*(*argv+1) == '\0'))
X	   delarg(argc, argv);
X	if ((p = index(opts, c)) == NULL)
X	   c = '\0';
X	else if (*(p+1) == ':') {
X	   *parm = killed ? *argv : *argv+1;
X	   delarg(argc, argv);
X	   }
X	return(c);
X}
X
X/************************************************************************/
X/*									*/
X/*	lower		convert a string to lower case			*/
X/*									*/
X/************************************************************************/
X
Xchar	*lower(s)
X
Xchar	*s;
X
X{	char	*p;
X
X	p = s;
X	while (*s) {
X	   if (isupper(*s))
X	      *s = tolower(*s);
X	   s++;
X	   }
X	return(p);
X}
X
X/************************************************************************/
X/*									*/
X/*	verify(source, valid)						*/
X/*									*/
X/*	char	*source;						*/
X/*	char	*valid;							*/
X/*									*/
X/*	This routine verifies that every character in source is also in	*/
X/*	valid.								*/
X/*									*/
X/************************************************************************/
X
Xverify(source, valid)
X
Xchar	*source;
Xchar	*valid;
X
X{	register	char	*s;
X
X	for ( ; *source; source++) {
X	   for (s = valid; *s && *s != *source; s++)
X	      ;
X	   if (*s == '\0')
X	      return(0);
X	   }
X	return(1);
X}
X
X/************************************************************************/
X/*									*/
X/*	saveargs	Replicate and return a pointer to the argument	*/
X/*			list passed in.					*/
X/*									*/
X/************************************************************************/
X
Xchar	**saveargs(argc, argv)
X
Xint	argc;
Xchar	**argv;
X
X{	int	i;
X	char	**copy;
X
X	copy = (char **) malloc((argc + 1) * sizeof(char *));
X	for (i = 0; i < argc; i++)
X	   strcpy(copy[i] = (char *) malloc(strlen(argv[i]) + 1), argv[i]);
X	copy[i] = (char *) 0;
X	return(copy);
X}
X
X/************************************************************************/
X/*									*/
X/*	tokenize	break a line into tokens			*/
X/*									*/
X/************************************************************************/
X
Xtokenize(line, argc, argv, max)
X
Xchar	*line;
Xint	*argc;
Xchar	*argv[];
Xint	max;
X
X{	char	*buf, match;
X
X	*argc = 0;
X	buf = (char *) malloc(strlen(line) * 2 + 1);
X	while (*line && (*argc < (max-1))) {
X	   while (isspace(*line))
X	      line++;
X	   argv[(*argc)++] = buf;
X	   switch (*line) {
X	      case '"'  :
X	      case '\'' : match = *line++; /* remove the quote mark */
X	      		  while (*line && (*line != match))
X	      		     *buf++ = *line++;
X	      		  if (*line)
X	      		     line++; /* wipe out quote mark */
X	      		  break;
X	      default   : while (*line && !isspace(*line) && (*line != '"') && (*line != '\''))
X	      		     *buf++ = *line++;
X	      		  break;
X	      }
X	   *buf++ = '\0';
X	   }
X	*buf = '\0';
X	argv[*argc] = (char *) 0;
X}
X
X/************************************************************************/
X/*									*/
X/*	open_psuedo_tty	opens the first available psuedo terminal	*/
X/*									*/
X/************************************************************************/
X
X#define		P_POS		5
X#define		L_POS		8
X#define		D_POS		9
X
X#define		PATH		"/dev/ptyp0"
X#define		LETTERS		"pqr"
X#define		DIGITS		"0123456789abcdef"
X
Xstatic	char	path[12];
X
Xchar	*open_psuedo_tty(master, m_mode, slave, s_mode)
X
XFILE	**master;
Xchar	*m_mode;
XFILE	**slave;
Xchar	*s_mode;
X
X{	char	*s, *t;
X
X	strcpy(path, PATH);
X	for (s = LETTERS; *s && *master == NULL; s++) {
X	   path[L_POS] = *s;
X	   for (t = DIGITS; *t && *master == NULL; t++) {
X	      path[D_POS] = *t;
X	      *master = fopen(path, m_mode);
X	      }
X	   }
X	if (*master != NULL) {
X	   path[P_POS] = 't';
X	   *slave = fopen(path, s_mode);
X	   path[P_POS] = 'p';
X	   }
X	return(path);
X}
END_OF_FILE
if test 6517 -ne `wc -c <'misc.c'`; then
    echo shar: \"'misc.c'\" unpacked with wrong size!
fi
# end of 'misc.c'
fi
if test -f 'sample.filter' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sample.filter'\"
else
echo shar: Extracting \"'sample.filter'\" \(480 characters\)
sed "s/^X//" >'sample.filter' <<'END_OF_FILE'
X# quietly retain chuck going su:
XQUIET	'SU: chuck'
X
X# ignore Frame Maker coming up:
XIGNORE	'maker: Starting Frame Maker' TO 'maker: finished loading'
X
X# ignore Frame Writer coming up:
XIGNORE	'writer: Starting Frame Writer' TO 'writer: finished loading'
X
X# ignore window data lock messages
XIGNORE	'Window data lock' TO 'The offending process'
X
X# retain some window messages
XQUIET	'WIN ioctl number'
X
X# retain another crazy window system message
XQUIET	'A tty window' TO 'Its child'
END_OF_FILE
if test 480 -ne `wc -c <'sample.filter'`; then
    echo shar: \"'sample.filter'\" unpacked with wrong size!
fi
# end of 'sample.filter'
fi
if test ! -d 'icons' ; then
    echo shar: Creating directory \"'icons'\"
    mkdir 'icons'
fi
if test -f 'icons/console1.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/console1.icon'\"
else
echo shar: Extracting \"'icons/console1.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/console1.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600,
X	0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0x8000,0x0000,0x2480,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x0718,0xA000,0x1440,
X	0x0005,0x0824,0xD000,0x1440,0x0005,0x0824,0x93C0,0x1440,
X	0x0005,0x0824,0x9000,0x1440,0x0005,0x0718,0x9000,0x1440,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X	0x0005,0x0000,0x0180,0x1440,0x0005,0x001C,0x6086,0x1440,
X	0x0005,0x0020,0x9089,0x1440,0x0005,0x0018,0x908E,0x1440,
X	0x0005,0x0004,0x9088,0x1440,0x0005,0x0038,0x6087,0x1440,
X	0x0005,0x0000,0x0000,0x1480,0x0005,0x0000,0x0000,0x1480,
X	0x0005,0x0000,0x0000,0x1500,0x0005,0x0000,0x0000,0x1500,
X	0x001C,0x8000,0x0000,0x2600,0x0064,0x7FFF,0xFFFF,0xC600,
X	0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800,
X	0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000,
X	0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0,
X	0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0,
X	0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040,
X	0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80,
X	0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X	0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X	0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00,
X	0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200,
X	0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400,
X	0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800,
X	0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
END_OF_FILE
if test 1933 -ne `wc -c <'icons/console1.icon'`; then
    echo shar: \"'icons/console1.icon'\" unpacked with wrong size!
fi
# end of 'icons/console1.icon'
fi
if test -f 'icons/console1_bad.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/console1_bad.icon'\"
else
echo shar: Extracting \"'icons/console1_bad.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/console1_bad.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600,
X	0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0x8000,0x0000,0x2480,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x00A1,0x8880,0x1440,
X	0x0005,0x00D2,0x4880,0x1440,0x0005,0x0093,0x8A80,0x1440,
X	0x0005,0x0092,0x0A80,0x1440,0x0005,0x0091,0xC500,0x1440,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x0000,0x0000,0x1440,
X	0x0005,0x0000,0x0000,0x1440,0x0005,0x0347,0x1C70,0x1440,
X	0x0005,0x02A8,0x2480,0x1440,0x0005,0x02A6,0x2460,0x1440,
X	0x0005,0x02A1,0x1C10,0x1440,0x0005,0x02AE,0x04E0,0x1440,
X	0x0005,0x0000,0x3800,0x1440,0x0005,0x0000,0x0000,0x1440,
X	0x0005,0x0000,0x0000,0x1480,0x0005,0x0000,0x0000,0x1480,
X	0x0005,0x0000,0x0000,0x1500,0x0005,0x0000,0x0000,0x1500,
X	0x001C,0x8000,0x0000,0x2600,0x0064,0x7FFF,0xFFFF,0xC600,
X	0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800,
X	0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000,
X	0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0,
X	0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0,
X	0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040,
X	0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80,
X	0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X	0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X	0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00,
X	0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200,
X	0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400,
X	0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800,
X	0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
END_OF_FILE
if test 1933 -ne `wc -c <'icons/console1_bad.icon'`; then
    echo shar: \"'icons/console1_bad.icon'\" unpacked with wrong size!
fi
# end of 'icons/console1_bad.icon'
fi
if test -f 'icons/console1_flash.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/console1_flash.icon'\"
else
echo shar: Extracting \"'icons/console1_flash.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/console1_flash.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0003,0xFFFF,0xFFFF,0xF800,0x0004,0x0000,0x0000,0x0600,
X	0x0004,0x7FFF,0xFFFF,0xC500,0x0004,0xFFFF,0xFFFF,0xE480,
X	0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440,
X	0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFF5E,0x777F,0xF440,
X	0x0005,0xFF2D,0xB77F,0xF440,0x0005,0xFF6C,0x757F,0xF440,
X	0x0005,0xFF6D,0xF57F,0xF440,0x0005,0xFF6E,0x3AFF,0xF440,
X	0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440,
X	0x0005,0xFFFF,0xFFFF,0xF440,0x0005,0xFCB8,0xE38F,0xF440,
X	0x0005,0xFD57,0xDB7F,0xF440,0x0005,0xFD59,0xDB9F,0xF440,
X	0x0005,0xFD5E,0xE3EF,0xF440,0x0005,0xFD51,0xFB1F,0xF440,
X	0x0005,0xFFFF,0xC7FF,0xF440,0x0005,0xFFFF,0xFFFF,0xF440,
X	0x0005,0xFFFF,0xFFFF,0xF480,0x0005,0xFFFF,0xFFFF,0xF480,
X	0x0005,0xFFFF,0xFFFF,0xF500,0x0005,0xFFFF,0xFFFF,0xF500,
X	0x001C,0xFFFF,0xFFFF,0xE600,0x0064,0x7FFF,0xFFFF,0xC600,
X	0x0084,0x0000,0x0000,0x0400,0x0103,0xFFFF,0xFFFF,0xF800,
X	0x0200,0x0004,0x0100,0x0000,0x0400,0x0004,0x0100,0x0000,
X	0x080F,0xFFF8,0x00FF,0xFFE0,0x081F,0xFFF8,0x00FF,0xFFD0,
X	0x081F,0xFFFC,0x01FF,0xFFD0,0x083F,0xFFFF,0xFFFF,0xFFA0,
X	0x083F,0xFFFF,0xFFFF,0xFFA0,0x0820,0x0000,0x0000,0x0040,
X	0x0820,0x0000,0x0000,0x0040,0x083F,0xFFFF,0xFFFF,0xFF80,
X	0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X	0x0800,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,
X	0x0800,0x0000,0x0000,0x0000,0x047F,0xFFFF,0xFFFF,0xFF00,
X	0x0380,0x0000,0x0000,0x0200,0x008A,0xAAAA,0xAAAA,0x8200,
X	0x0100,0x0000,0x0000,0x0400,0x0115,0x5555,0x5554,0x8400,
X	0x0200,0x0000,0x0001,0x0800,0x020D,0xFFFF,0xFFDB,0x0800,
X	0x0400,0x0000,0x0000,0x1000,0x07FF,0xFFFF,0xFFFF,0xF000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
END_OF_FILE
if test 1933 -ne `wc -c <'icons/console1_flash.icon'`; then
    echo shar: \"'icons/console1_flash.icon'\" unpacked with wrong size!
fi
# end of 'icons/console1_flash.icon'
fi
if test -f 'icons/contool.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/contool.icon'\"
else
echo shar: Extracting \"'icons/contool.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/contool.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,0x0001,
X	0x8003,0xFFFF,0xFFFF,0xF801,0x8004,0x0000,0x0000,0x0601,
X	0x8004,0x7FFF,0xFFFF,0xC501,0x8004,0x8000,0x0000,0x2481,
X	0x8005,0x0000,0x0000,0x1441,0x8005,0x3E80,0x0000,0x1441,
X	0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X	0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X	0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X	0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X	0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X	0x8005,0x0000,0x0000,0x1441,0x8005,0x0000,0x0000,0x1441,
X	0x8005,0x0000,0x0000,0x1481,0x8005,0x0000,0x0000,0x1481,
X	0x8005,0x0000,0x0000,0x1501,0x8005,0x0000,0x0000,0x1501,
X	0x801C,0x8000,0x0000,0x2601,0x8064,0x7FFF,0xFFFF,0xC601,
X	0x8084,0x0000,0x0000,0x0401,0x8103,0xFFFF,0xFFFF,0xF801,
X	0x8200,0x0004,0x0100,0x0001,0x8400,0x0004,0x0100,0x0001,
X	0x880F,0xFFF8,0x00FF,0xFFE1,0x881F,0xFFF8,0x00FF,0xFFE1,
X	0x881F,0xFFFC,0x01FF,0xFFE1,0x883F,0xFFFF,0xFFFF,0xFFE1,
X	0x883F,0xFFFF,0xFFFF,0xFFE1,0x8820,0x0000,0x0000,0x00E1,
X	0x8820,0x0000,0x0000,0x00C1,0x847F,0xFFFF,0xFFFF,0xFFC1,
X	0x8380,0x0000,0x0000,0x0381,0x808A,0xAAAA,0xAAAA,0x8301,
X	0x8100,0x0000,0x0000,0x0501,0x8115,0x5555,0x5554,0x8501,
X	0x8200,0x0000,0x0001,0x0A01,0x820D,0xFFFF,0xFFDB,0x0A01,
X	0x8400,0x0000,0x0000,0x1401,0x87FF,0xFFFF,0xFFFF,0xF401,
X	0x8400,0x0000,0x0000,0x0801,0x87FF,0xFFFF,0xFFFF,0xF801,
X	0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X	0x8F80,0x0000,0x0001,0xE001,0x98C0,0x0000,0x0000,0x6001,
X	0x98C0,0x0000,0x0000,0x6001,0x9807,0xC5E1,0xF0F8,0x61F1,
X	0x980C,0x6733,0x198C,0x6319,0x980C,0x6633,0x018C,0x6319,
X	0x980C,0x6631,0xF18C,0x63F9,0x98CC,0x6630,0x198C,0x6301,
X	0x98CC,0x6633,0x198C,0x6319,0x8F87,0xC631,0xF0F8,0x61F1,
X	0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X	0x8000,0x0000,0x0000,0x0001,0xFFFF,0xFFFF,0xFFFF,0xFFFF
END_OF_FILE
if test 1933 -ne `wc -c <'icons/contool.icon'`; then
    echo shar: \"'icons/contool.icon'\" unpacked with wrong size!
fi
# end of 'icons/contool.icon'
fi
if test -f 'icons/contool_bad.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/contool_bad.icon'\"
else
echo shar: Extracting \"'icons/contool_bad.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/contool_bad.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8000,0x0000,0x0000,0x0001,
X	0x8003,0xFFFF,0xFFFF,0xF801,0x8004,0x0000,0x0000,0x0601,
X	0x8004,0x7FFF,0xFFFF,0xC501,0x8004,0x8000,0x0000,0x2481,
X	0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x417F,0xFFFF,0xD441,
X	0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X	0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X	0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X	0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X	0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X	0x8005,0x7FFF,0xFFFF,0xD441,0x8005,0x7FFF,0xFFFF,0xD441,
X	0x8005,0x7FFF,0xFFFF,0xD481,0x8005,0x7FFF,0xFFFF,0xD481,
X	0x8005,0x7FFF,0xFFFF,0xD501,0x8005,0x7FFF,0xFFFF,0xD501,
X	0x801C,0x8000,0x0000,0x2601,0x8064,0x7FFF,0xFFFF,0xC601,
X	0x8084,0x0000,0x0000,0x0401,0x8103,0xFFFF,0xFFFF,0xF801,
X	0x8200,0x0004,0x0100,0x0001,0x8400,0x0004,0x0100,0x0001,
X	0x880F,0xFFF8,0x00FF,0xFFE1,0x881F,0xFFF8,0x00FF,0xFFE1,
X	0x881F,0xFFFC,0x01FF,0xFFE1,0x883F,0xFFFF,0xFFFF,0xFFE1,
X	0x883F,0xFFFF,0xFFFF,0xFFE1,0x8820,0x0000,0x0000,0x00E1,
X	0x8820,0x0000,0x0000,0x00C1,0x847F,0xFFFF,0xFFFF,0xFFC1,
X	0x8380,0x0000,0x0000,0x0381,0x808A,0xAAAA,0xAAAA,0x8301,
X	0x8100,0x0000,0x0000,0x0501,0x8115,0x5555,0x5554,0x8501,
X	0x8200,0x0000,0x0001,0x0A01,0x820D,0xFFFF,0xFFDB,0x0A01,
X	0x8400,0x0000,0x0000,0x1401,0x87FF,0xFFFF,0xFFFF,0xF401,
X	0x8400,0x0000,0x0000,0x0801,0x87FF,0xFFFF,0xFFFF,0xF801,
X	0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X	0x8F80,0x0000,0x0001,0xE001,0x98C0,0x0000,0x0000,0x6001,
X	0x98C0,0x0000,0x0000,0x6001,0x9807,0xC5E1,0xF0F8,0x61F1,
X	0x980C,0x6733,0x198C,0x6319,0x980C,0x6633,0x018C,0x6319,
X	0x980C,0x6631,0xF18C,0x63F9,0x98CC,0x6630,0x198C,0x6301,
X	0x98CC,0x6633,0x198C,0x6319,0x8F87,0xC631,0xF0F8,0x61F1,
X	0x8000,0x0000,0x0000,0x0001,0x8000,0x0000,0x0000,0x0001,
X	0x8000,0x0000,0x0000,0x0001,0xFFFF,0xFFFF,0xFFFF,0xFFFF
END_OF_FILE
if test 1933 -ne `wc -c <'icons/contool_bad.icon'`; then
    echo shar: \"'icons/contool_bad.icon'\" unpacked with wrong size!
fi
# end of 'icons/contool_bad.icon'
fi
if test -f 'icons/stopsign.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/stopsign.icon'\"
else
echo shar: Extracting \"'icons/stopsign.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/stopsign.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0x8888,0xBFFF,0xFFFC,0x8888,0x8888,0xC000,0x0002,0x8888,
X	0x2222,0x8000,0x0001,0x2222,0x2223,0x0FFF,0xFFF0,0xA222,
X	0x888A,0x1FFF,0xFFF8,0x4888,0x888C,0x3FFF,0xFFFC,0x2888,
X	0x2228,0x7FFF,0xFFFE,0x1222,0x2230,0xFFFF,0xFFFF,0x0A22,
X	0x88A1,0xFFFF,0xFFFF,0x8488,0x8843,0xFFFF,0xFFFF,0xC288,
X	0x2287,0xFFFF,0xFFFF,0xE122,0x230F,0xFFFF,0xFFFF,0xF0A2,
X	0x8A1F,0xFFFF,0xFFFF,0xF848,0x8C3F,0xFFFF,0xFFFF,0xFC28,
X	0x287F,0xFFFF,0xFFFF,0xFE12,0x30FF,0xFFFF,0xFFFF,0xFF0A,
X	0xA1FF,0xFFFF,0xFFFF,0xFF84,0xC3FF,0xFFFF,0xFFFF,0xFFC2,
X	0x87FF,0xFFFF,0xFFFF,0xFFE1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X	0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X	0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X	0x8FF0,0x0C00,0xF87C,0x03F1,0x8FE7,0xCDCE,0xF73E,0x79F1,
X	0x8FCF,0xEFCF,0xEF9E,0x7CF1,0x8FCF,0xEFCF,0xEFCE,0x7CF1,
X	0x8FC7,0xFFCF,0xCFCE,0x7CF1,0x8FE1,0xFFCF,0xCFCE,0x79F1,
X	0x8FF0,0xFFCF,0xCFCE,0x03F1,0x8FFC,0x3FCF,0xCFCE,0x7FF1,
X	0x8FFF,0x1FCF,0xCFCE,0x7FF1,0x8FFF,0x8FCF,0xCFCE,0x7FF1,
X	0x8FDF,0xCFCF,0xEFCE,0x7FF1,0x8FDF,0xCFCF,0xE7DE,0x7FF1,
X	0x8FCF,0x9FCF,0xF3BE,0x7FF1,0x8FC0,0x3F03,0xF87C,0x3FF1,
X	0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X	0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X	0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x8FFF,0xFFFF,0xFFFF,0xFFF1,
X	0x8FFF,0xFFFF,0xFFFF,0xFFF1,0x87FF,0xFFFF,0xFFFF,0xFFE1,
X	0x43FF,0xFFFF,0xFFFF,0xFFC2,0x21FF,0xFFFF,0xFFFF,0xFF86,
X	0x90FF,0xFFFF,0xFFFF,0xFF08,0x887F,0xFFFF,0xFFFF,0xFE18,
X	0x243F,0xFFFF,0xFFFF,0xFC22,0x221F,0xFFFF,0xFFFF,0xF862,
X	0x890F,0xFFFF,0xFFFF,0xF088,0x8887,0xFFFF,0xFFFF,0xE188,
X	0x2243,0xFFFF,0xFFFF,0xC222,0x2221,0xFFFF,0xFFFF,0x8622,
X	0x8890,0xFFFF,0xFFFF,0x0888,0x8888,0x7FFF,0xFFFE,0x1888,
X	0x2224,0x3FFF,0xFFFC,0x2222,0x2222,0x1FFF,0xFFF8,0x6222,
X	0x8889,0x0FFF,0xFFF0,0x8888,0x8888,0x8000,0x0001,0x8888,
X	0x2222,0x4000,0x0002,0x2222,0x2222,0x3FFF,0xFFFE,0x2222
END_OF_FILE
if test 1933 -ne `wc -c <'icons/stopsign.icon'`; then
    echo shar: \"'icons/stopsign.icon'\" unpacked with wrong size!
fi
# end of 'icons/stopsign.icon'
fi
if test -f 'icons/stopsign_inv.icon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'icons/stopsign_inv.icon'\"
else
echo shar: Extracting \"'icons/stopsign_inv.icon'\" \(1933 characters\)
sed "s/^X//" >'icons/stopsign_inv.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X	0x8888,0x8888,0x8888,0x8888,0x8888,0xBFFF,0xFFFC,0x8888,
X	0x2222,0x7FFF,0xFFFE,0x2222,0x2222,0xFFFF,0xFFFF,0x2222,
X	0x8889,0xE000,0x0007,0x8888,0x888B,0xC000,0x0003,0xC888,
X	0x2227,0x8000,0x0001,0xE222,0x222F,0x0000,0x0000,0xF222,
X	0x889E,0x0000,0x0000,0x7888,0x88BC,0x0000,0x0000,0x3C88,
X	0x2278,0x0000,0x0000,0x1E22,0x22F0,0x0000,0x0000,0x0F22,
X	0x89E0,0x0000,0x0000,0x0788,0x8BC0,0x0000,0x0000,0x03C8,
X	0x2780,0x0000,0x0000,0x01E2,0x2F00,0x0000,0x0000,0x00F2,
X	0x9E00,0x0000,0x0000,0x0078,0xBC00,0x0000,0x0000,0x003C,
X	0x7800,0x0000,0x0000,0x001E,0x7000,0x0000,0x0000,0x000E,
X	0xF000,0x0000,0x0000,0x000E,0xF000,0x0000,0x0000,0x000E,
X	0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E,
X	0xF00F,0xF3FF,0x0783,0xFC0E,0xF018,0x3231,0x08C1,0x860E,
X	0x7030,0x1030,0x1061,0x830E,0x7030,0x1030,0x1031,0x830E,
X	0xF038,0x0030,0x3031,0x830E,0xF01E,0x0030,0x3031,0x860E,
X	0x700F,0x0030,0x3031,0xFC0E,0x7003,0xC030,0x3031,0x800E,
X	0xF000,0xE030,0x3031,0x800E,0xF000,0x7030,0x3031,0x800E,
X	0x7020,0x3030,0x1031,0x800E,0x7020,0x3030,0x1821,0x800E,
X	0xF030,0x6030,0x0C41,0x800E,0xF03F,0xC0FC,0x0783,0xC00E,
X	0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E,
X	0xF000,0x0000,0x0000,0x000E,0xF000,0x0000,0x0000,0x000E,
X	0x7000,0x0000,0x0000,0x000E,0x7000,0x0000,0x0000,0x000E,
X	0xF000,0x0000,0x0000,0x000E,0xF800,0x0000,0x0000,0x001E,
X	0x3C00,0x0000,0x0000,0x003E,0x3E00,0x0000,0x0000,0x007A,
X	0x8F00,0x0000,0x0000,0x00F8,0x8F80,0x0000,0x0000,0x01E8,
X	0x23C0,0x0000,0x0000,0x03E2,0x23E0,0x0000,0x0000,0x07A2,
X	0x88F0,0x0000,0x0000,0x0F88,0x88F8,0x0000,0x0000,0x1E88,
X	0x223C,0x0000,0x0000,0x3C22,0x223E,0x0000,0x0000,0x7822,
X	0x888F,0x0000,0x0000,0xF888,0x888F,0x8000,0x0001,0xE888,
X	0x2223,0xC000,0x0003,0xE222,0x2223,0xE000,0x0007,0xA222,
X	0x8888,0xFFFF,0xFFFF,0x8888,0x8888,0xFFFF,0xFFFE,0x8888,
X	0x2222,0x3FFF,0xFFFE,0x2222,0x2222,0x2222,0x2222,0x2222
END_OF_FILE
if test 1933 -ne `wc -c <'icons/stopsign_inv.icon'`; then
    echo shar: \"'icons/stopsign_inv.icon'\" unpacked with wrong size!
fi
# end of 'icons/stopsign_inv.icon'
fi
echo shar: End of shell archive.
exit 0