Index: releases/appswitch/1.0b2/appswitch/CPS.h
===================================================================
--- releases/appswitch/1.0b2/appswitch/CPS.h	(revision 98)
+++ releases/appswitch/1.0b2/appswitch/CPS.h	(revision 98)
@@ -0,0 +1,299 @@
+// CPS.h
+
+#pragma once
+
+#include <ApplicationServices/ApplicationServices.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if PRAGMA_STRUCT_ALIGN
+    #pragma options align=mac68k
+#elif PRAGMA_STRUCT_PACKPUSH
+    #pragma pack(push, 2)
+#elif PRAGMA_STRUCT_PACK
+    #pragma pack(2)
+#endif
+
+
+struct CPSProcessSerNum
+{
+	UInt32		lo;
+	UInt32		hi;
+};
+
+typedef struct CPSProcessSerNum	CPSProcessSerNum;
+
+enum
+{
+	kCPSNoProcess		=	0,
+	kCPSSystemProcess	=	1,
+	kCPSCurrentProcess	=	2
+};
+
+
+enum
+{
+	bfCPSIntraProcessSwitch =	1,
+	bfCPSDeathBySignal	=	2
+};
+
+typedef UInt16	CPSEventFlags;
+
+
+enum
+{
+	kCPSBlueApp	=	0,
+	kCPSBlueBox	=	1,
+	kCPSCarbonApp	=	2,
+	kCPSYellowApp	=	3,
+	kCPSUnknownApp	=	4
+};
+
+typedef UInt32	CPSAppFlavour;
+
+
+enum
+{
+	kCPSBGOnlyAttr		=	1024,
+	kCPSUIElementAttr	=	65536,
+	kCPSHiddenAttr		=	131072,
+	kCPSNoConnectAttr	=	262144,
+	kCPSFullScreenAttr	=	524288,
+	kCPSClassicReqAttr	=	1048576,
+	kCPSNativeReqAttr	=	2097152
+};
+
+typedef UInt32	CPSProcAttributes;
+
+
+struct CPSProcessInfoRec
+{
+	CPSProcessSerNum 	Parent;
+	UInt64			LaunchDate;
+	CPSAppFlavour		Flavour;
+	CPSProcAttributes	Attributes;
+	UInt32			ExecFileType;
+	UInt32			ExecFileCreator;
+	SInt32			UnixPID; // njr changed from UInt32
+};
+
+typedef struct CPSProcessInfoRec	CPSProcessInfoRec;
+
+
+enum
+{
+	kCPSNotifyChildDeath	=	1,
+	kCPSNotifyNewFront	=	2,
+	kCPSNotifyAppBirth	=	4,
+	kCPSNotifyAppDeath	=	8,
+	kCPSNotifyLaunch	=	9,
+	kCPSNotifyServiceReq	=	16,
+	kCPSNotifyAppHidden	=	32,
+	kCPSNotifyAppRevealed	=	64,
+	kCPSNotifyFGEnabled	=	128,
+	kCPSNotifyLaunchStart	=	256,
+	kCPSNotifyAppReady	=	512,
+	kCPSNotifyLaunchFail	=	1024,
+	kCPSNotifyAppDeathExt	=	2048,
+	kCPSNotifyLostKeyFocus	=	4096
+};
+
+typedef UInt32	CPSNotificationCodes;
+
+
+enum
+{
+	bfCPSLaunchInhibitDaemon	=	128,
+	bfCPSLaunchDontSwitch		=	512,
+	bfCPSLaunchNoProcAttr		=	2048,
+	bfCPSLaunchAsync		=	65536,
+	bfCPSLaunchStartClassic		=	131072,
+	bfCPSLaunchInClassic		=	262144,
+	bfCPSLaunchInstance		=	524288,
+	bfCPSLaunchAndHide		=	1048576,
+	bfCPSLaunchAndHideOthers	=	2097152
+};
+
+typedef UInt32	CPSLaunchOptions;
+
+
+typedef	UInt8	*CPSLaunchRefcon;
+
+
+typedef	UInt8	*CPSLaunchData;
+
+
+enum
+{
+	bfCPSExtLaunchWithData	=	2,
+	bfCPSExtLaunchByParent	=	4,
+	bfCPSExtLaunchAsUidGid	=	8
+};
+
+typedef UInt32	CPSLaunchPBFields;
+
+
+struct CPSLaunchPB
+{
+	CPSLaunchPBFields	Contents;
+	CPSLaunchData		pData;
+	UInt32			DataLen;
+	UInt32			DataTag;
+	UInt32			RefCon;
+	CPSProcessSerNum	Parent;
+	UInt32			ChildUID;
+	UInt32			ChildGID;
+};
+
+typedef struct CPSLaunchPB	CPSLaunchPB;
+
+
+enum
+{
+	bfCPSKillHard		=	1,
+	bfCPSKillAllClassicApps	=	2
+};
+
+typedef UInt32	CPSKillOptions;
+
+
+enum
+{
+	kCPSLaunchService	=	0,
+	kCPSKillService		=	1,
+	kCPSHideService		=	2,
+	kCPSShowService		=	3,
+	kCPSPrivService		=	4,
+	kCPSExtDeathNoteService	=	5
+};
+
+typedef UInt32	CPSServiceReqType;
+
+
+struct CPSLaunchRequest
+{
+	CPSProcessSerNum	TargetPSN;
+	CPSLaunchOptions 	Options;
+	CPSProcAttributes 	ProcAttributes;
+	UInt8			*pUTF8TargetPath;
+	UInt32			PathLen;
+};
+
+typedef struct CPSLaunchRequest	CPSLaunchRequest;
+
+
+struct CPSKillRequest
+{
+	CPSProcessSerNum	TargetPSN;
+	CPSKillOptions		Options;
+};
+
+typedef struct CPSKillRequest	CPSKillRequest;
+
+
+struct CPSHideRequest
+{
+	CPSProcessSerNum 	TargetPSN;
+};
+
+typedef struct CPSHideRequest	CPSHideRequest;
+
+
+struct CPSShowRequest
+{
+	CPSProcessSerNum 	TargetPSN;
+};
+
+typedef struct CPSShowRequest	CPSShowRequest;
+
+
+struct CPSExtDeathNotice
+{
+	CPSProcessSerNum 	DeadPSN;
+	UInt32			Flags;
+	UInt8			*pUTF8AppPath;
+	UInt32			PathLen;
+};
+
+typedef struct CPSExtDeathNotice	CPSExtDeathNotice;
+
+
+union CPSRequestDetails
+{
+	CPSLaunchRequest 	LaunchReq;
+	CPSKillRequest 		KillReq;
+	CPSHideRequest 		HideReq;
+	CPSShowRequest 		ShowReq;
+	CPSExtDeathNotice 	DeathNotice;
+};
+
+typedef union CPSRequestDetails	CPSRequestDetails;
+
+
+struct CPSServiceRequest
+{
+	CPSServiceReqType 	Type;
+	SInt32			ID;
+	CPSRequestDetails 	Details;
+};
+
+typedef struct CPSServiceRequest	CPSServiceRequest;
+
+
+enum
+{
+	kCPSProcessInterruptKey	=	0,
+	kCPSAppSwitchFwdKey	=	1,
+	kCPSAppSwitchBackKey	=	2,
+	kCPSSessionInterruptKey	=	3,
+	kCPSScreenSaverKey	=	4,
+	kCPSDiskEjectKey	=	5,
+	kCPSSpecialKeyCount	=	6
+};
+
+typedef SInt32	CPSSpecialKeyID;
+
+
+extern Boolean	CPSEqualProcess( CPSProcessSerNum *psn1, CPSProcessSerNum *psn2);
+
+extern OSErr	CPSGetCurrentProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetFrontProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetNextProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetNextToFrontProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSGetProcessInfo( CPSProcessSerNum *psn, CPSProcessInfoRec *info, char *path, int maxPathLen, int *len, char *name, int maxNameLen);
+
+extern OSErr	CPSPostHideMostReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSPostHideReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSPostKillRequest( CPSProcessSerNum *psn, CPSKillOptions options);
+
+extern OSErr	CPSPostShowAllReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSPostShowReq( CPSProcessSerNum *psn);
+
+extern OSErr	CPSSetFrontProcess( CPSProcessSerNum *psn);
+
+extern OSErr	CPSReleaseKeyFocus( CPSProcessSerNum *psn);
+
+extern OSErr	CPSStealKeyFocus( CPSProcessSerNum *psn);
+
+
+#if PRAGMA_STRUCT_ALIGN
+    #pragma options align=reset
+#elif PRAGMA_STRUCT_PACKPUSH
+    #pragma pack(pop)
+#elif PRAGMA_STRUCT_PACK
+    #pragma pack()
+#endif
+
+#ifdef __cplusplus
+}
+#endif
Index: releases/appswitch/1.0b2/appswitch/README
===================================================================
--- releases/appswitch/1.0b2/appswitch/README	(revision 98)
+++ releases/appswitch/1.0b2/appswitch/README	(revision 98)
@@ -0,0 +1,86 @@
+appswitch 1.0b2 [11 February 2003]
+===============
+
+A command-line interface to the Mac OS X process manager.
+
+Written by Nicholas Riley <mailto:appswitch@sabi.net>.
+Obtain updates from <http://web.sabi.net/nriley/software/>.
+
+WHAT IS IT?
+-----------
+
+If you use shell scripts to automate Mac OS X applications, you may
+need to switch between applications.  You could use AppleScript via
+osascript(1), but that would take several seconds for the script to
+compile and execute - or you could use appswitch, which works almost
+instantly.
+
+Say you're launching an X11 application from Terminal but the X server
+isn't in front when you need it.  Use appswitch to fix the problem.
+
+Or, if you'd like a version of the ps(1) utility which understands the
+concept of OS X applications, appswitch can help.
+
+INSTALLATION
+------------
+
+The commands below install the 'appswitch' tool in /usr/local/bin,
+which is in the default path.  You should subsequently be able to use
+'appswitch' by typing its name.  If you wish to install it somewhere
+else, modify the install line as appropriate.
+
+% sudo /usr/bin/install -d /usr/local/bin /usr/local/man/man1
+% sudo /usr/bin/install -c build/appswitch /usr/local/bin
+% sudo /usr/bin/install -c appswitch.1 /usr/local/man/man1
+% rehash
+
+Uninstallation:
+
+% sudo rm -f /usr/local/bin/appswitch
+
+COMPILATION
+-----------
+
+A Project Builder project, 'appswitch.pbproj', is included.  A
+precompiled binary is also provided.  'appswitch' was developed and
+tested under Mac OS 10.2.4 with the December 2002 Developer Tools,
+and does not require any additional software to build.
+
+USAGE
+-----
+
+Just type 'appswitch' by itself to receive usage information.  See the
+manual page (man appswitch) for more information.
+
+If you're curious about the speed difference between appswitch and
+other methods, this should give you some indication.
+
+appswitch -a Emacs          0.00s user 0.02s system  5% cpu 0.355 total
+appswitch -i com.gnu.Emacs  0.01s user 0.04s system 13% cpu 0.381 total
+open -a Emacs               0.30s user 0.15s system 53% cpu 0.842 total
+osascript -e 'tell application "Emacs" to activate'
+                            0.66s user 0.42s system 45% cpu 2.361 total
+
+The above tests were performed on a PowerBook G4/800; slower systems
+should show more dramatic differences.
+
+COMMENTS, SUGGESTIONS, BUG REPORTS, ETC.
+----------------------------------------
+
+Please send to the author, Nicholas Riley, at <appswitch@sabi.net>.
+
+VERSION HISTORY
+---------------
+
+1.0b2 - 11 February 2003
+ - display ? characters for unprintable creator code characters
+   (e.g. java)
+ - fixed -P/-p error in man page
+ - revised and clarified man page
+1.0b1 - 10 February 2003
+ - added -S, -S, -h, -H, -k, -P, -l, -F options
+ - fixed reference to bogus -u option
+ - fixed bug where unknown match type was silently discarded
+ - added man page and this README
+1.0d1 - 4 February 2003
+ - initial release
Index: releases/appswitch/1.0b2/appswitch/VERSION
===================================================================
--- releases/appswitch/1.0b2/appswitch/VERSION	(revision 98)
+++ releases/appswitch/1.0b2/appswitch/VERSION	(revision 98)
@@ -0,0 +1,1 @@
+1.0b2
Index: releases/appswitch/1.0b2/appswitch/appswitch.1
===================================================================
--- releases/appswitch/1.0b2/appswitch/appswitch.1	(revision 98)
+++ releases/appswitch/1.0b2/appswitch/appswitch.1	(revision 98)
@@ -0,0 +1,140 @@
+.Dd Mon Feb 11 2003               \" DATE 
+.Dt APPSWITCH 1 LOCAL      \" Program name and manual section number 
+.Os appswitch 1.0b2
+.Sh NAME
+.Nm appswitch
+.Nd switch, hide, show, kill or list Mac OS X applications
+.Sh SYNOPSIS
+.Nm appswitch
+.Op Fl sShHkFlP          \" [-sShHkFlP]
+.Op Fl c Ar creator      \" [-c creator]
+.Op Fl i Ar bundleID     \" [-i bundleID]
+.Op Fl a Ar name         \" [-a name]
+.Op Fl p Ar pid          \" [-p pid]
+.Op Ar path              \" [path]
+.Sh DESCRIPTION
+.Nm
+controls the ordering and visibility of Mac OS X application windows.
+.Nm
+can also list or kill running applications.
+.Ss Matching options
+Matching identifies one or more applications to manipulate.
+.Bl -tag -width -indent
+.It Fl c Ar creator
+Match by creator (a four-character code, also known as a signature).
+.It Fl i Ar bundle ID
+Match by bundle identifier, usually consisting of the reversed dot
+(.)-separated components of the application developer's Internet domain
+name, followed by the application name.  For example, the Finder's
+bundle identifier is
+.Ar com.apple.Finder .
+Bundle identifiers are not case-sensitive.
+.Pp
+If you're extremely concerned about the speed of matching, any other
+match method is faster than a match by bundle identifier.
+.It Fl p Ar pid
+Match by process identifier, a positive number.
+.It Ar path
+Match by bundle path.  For packaged applications, this is the package
+directory whose name typically has the .app extension, for example
+.Ar /Applications/TextEdit.app
+for the default installation location of TextEdit.  For non-packaged
+applications, this is the path to the executable itself.
+.El
+.Ss Application actions
+These actions apply to the matched application. If multiple
+applications match the supplied criteria, only the first matching
+application is acted upon.  The list option
+.Fl l
+displays all matching applications.
+.Bl -tag -width -indent
+.It Fl s
+Show the application, making the application's windows frontmost. Do
+not switch to the application.
+.It Fl h
+Hide the application's windows.
+.It Fl k
+Kill (force quit) the application.
+.It Fl l
+List applications in a format similar to that of
+.Xr ps 1 . The columns of the listing are as follows:
+.Bl -tag -width indent
+.It PSN
+The process serial number of the application.  Process serial numbers
+are unique identifiers among both native Mac OS X and Classic
+applications.
+.It PID
+The process identifier, a positive number which uniquely identifies
+native Mac OS X processes, usable with the
+.Fl p
+matching option.  Because all Classic applications run inside
+TruBlueEnvironment, a single Mac OS X process, their process
+identifiers appear as -1.
+.It TYPE
+The four-character code identifying the application's type,
+usually 
+.Ql APPL
+for most applications or
+.Ql FNDR
+for the Finder.
+Classic applications include additional types such as
+.Ql appe
+and
+.Ql APPC
+for applications which perform the functions of extensions
+and control panels, respectively.
+.It CREA
+The four-character code identifying the application's creator, usable with the
+.Fl c
+matching option. Some Mac OS X applications have no creator, appearing
+as 
+.Ql ???? ;
+for these applications you must use the bundle identifier,
+name or path as match criteria.
+.It NAME
+The user-visible application name, usable with the
+.Fl a
+matching option. This field is truncated to 20 characters; the
+remainder of longer application names is not displayed.
+.It PATH
+The path to the application bundle, usable with the
+.Ar path
+matching option. This field is truncated to the window width, or to 80
+characters if the window width cannot be determined.
+.El
+.It Fl P
+Print the application's process identifier (PID), a positive number
+and unique identifier for all applications except Classic
+applications.
+.El
+.Ss Actions
+These actions affect all applications currently running.
+.Bl -tag -width -indent
+.It Fl S
+Show all applications, layering the windows of initially hidden
+applications on top.
+.It Fl H
+Hide windows of all applications other than the matched application,
+or the frontmost application if no application has been matched.
+.It Fl F
+Order the current application's windows to the front.
+.El
+.Sh SEE ALSO 
+.\" List links in ascending order by section, alphabetically within a section.
+.\" Please do not reference files that do not exist without filing a bug report
+.Xr open 1 ,
+.Xr launch 1 ,
+.Xr ps 1 ,
+.Xr kill 1 ,
+.Xr GetFileInfo 1
+.Sh BUGS              \" Document known, unremedied bugs
+The
+.Fl F
+option may be unreliable if issued immediately after another show or
+hide command; try inserting a
+.Xr sleep 1
+command before it.
+.Sh AUTHORS
+.An "Nicholas Riley" Aq appswitch@sabi.net
+.\" .Sh HISTORY           \" Document history if command behaves in a unique manner 
+
Index: releases/appswitch/1.0b2/appswitch/appswitch.pbproj/nicholas.pbxuser
===================================================================
--- releases/appswitch/1.0b2/appswitch/appswitch.pbproj/nicholas.pbxuser	(revision 98)
+++ releases/appswitch/1.0b2/appswitch/appswitch.pbproj/nicholas.pbxuser	(revision 98)
@@ -0,0 +1,1320 @@
+// !$*UTF8*$!
+{
+	08FB7793FE84155DC02AAC07 = {
+		activeBuildStyle = 014CEA490018CE3211CA2923;
+		activeExecutable = E1A0BD2C03EFAD1C00050001;
+		activeTarget = 08FB779FFE84155DC02AAC07;
+		addToTargets = (
+			08FB779FFE84155DC02AAC07,
+		);
+		breakpoints = (
+		);
+		executables = (
+			E1A0BD2C03EFAD1C00050001,
+		);
+		perUserDictionary = {
+			PBXPerProjectTemplateStateSaveDate = 66554412;
+			"PBXTemplateGeometry-F5314676015831810DCA290F" = {
+				ContentSize = "{618, 257}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 23}, {618, 234}}";
+					Split0 = {
+						ActiveTab = 2;
+						ActiveTabName = PBXBuildResultsModule;
+						Collapsed = YES;
+						Frame = "{{0, 0}, {618, 234}}";
+						Split0 = {
+							Frame = "{{1e+06, 1e+06}, {618, 0}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {952, 321}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {781, 452}}";
+								Split0 = {
+									Frame = "{{0, 24}, {781, 428}}";
+									Split0 = {
+										Frame = "{{0, 0}, {383, 428}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											155.123,
+										);
+										Frame = "{{392, 0}, {389, 428}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {781, 452}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {618, 228}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {618, 228}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {620, 195}}";
+							BuildTranscriptFrame = "{{0, 204}, {620, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {618, 228}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {300, 533}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							267,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {280, 398}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							237,
+						);
+						Frame = "{{0, 0}, {278, 659}}";
+						MembersFrame = "{{0, 407}, {280, 252}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							236,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {200, 100}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {200, 100}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							202.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 100}}";
+					};
+					TabCount = 5;
+					TabsVisible = NO;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = YES;
+				Template = F5314676015831810DCA290F;
+				ToolbarVisible = YES;
+				WindowLocation = "{819, 244}";
+			};
+			"PBXTemplateGeometry-F5534CB2020F3F8A0DCA290F" = {
+				ContentSize = "{594, 303}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 23}, {594, 280}}";
+					Split0 = {
+						ActiveTab = 1;
+						ActiveTabName = PBXRunSessionModule;
+						Collapsed = YES;
+						Frame = "{{0, 0}, {594, 280}}";
+						Split0 = {
+							Frame = "{{1e+06, 1e+06}, {594, 0}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {804, 321}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {594, 274}}";
+								Split0 = {
+									Frame = "{{0, 24}, {594, 250}}";
+									Split0 = {
+										Frame = "{{0, 0}, {290, 250}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											62.123,
+										);
+										Frame = "{{299, 0}, {295, 250}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {594, 274}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {594, 274}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {594, 274}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {614, 262}}";
+							BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {300, 533}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							267,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {280, 398}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							237,
+						);
+						Frame = "{{0, 0}, {278, 659}}";
+						MembersFrame = "{{0, 407}, {280, 252}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							236,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {200, 100}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {200, 386}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							202.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 386}}";
+					};
+					TabCount = 5;
+					TabsVisible = NO;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = YES;
+				Template = F5534CB2020F3F8A0DCA290F;
+				ToolbarVisible = YES;
+				WindowLocation = "{72, 222}";
+			};
+			"PBXTemplateGeometry-F5CA7ECB015C094F0DCA290F" = {
+				ContentSize = "{796, 742}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 0}, {796, 742}}";
+					Split0 = {
+						Collapsed = NO;
+						Frame = "{{0, 0}, {796, 742}}";
+						Split0 = {
+							Frame = "{{0, 0}, {796, 742}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {484, 208}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {664, 208}}";
+								Split0 = {
+									Frame = "{{0, 24}, {664, 184}}";
+									Split0 = {
+										Frame = "{{0, 0}, {325, 184}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											96.123,
+										);
+										Frame = "{{334, 0}, {330, 184}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {664, 208}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {664, 50}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {664, 50}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {614, 262}}";
+							BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {313, 531}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							280,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {280, 398}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							237,
+						);
+						Frame = "{{0, 0}, {278, 659}}";
+						MembersFrame = "{{0, 407}, {280, 252}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							236,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {200, 100}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {200, 557}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							202.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 100}}";
+					};
+					TabCount = 5;
+					TabsVisible = NO;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = NO;
+				Template = F5CA7ECB015C094F0DCA290F;
+				ToolbarVisible = NO;
+				WindowLocation = "{687, 68}";
+			};
+			"PBXTemplateGeometry-F5E465990156DFB90DCA290F" = {
+				ContentSize = "{352, 553}";
+				LeftSlideOut = {
+					ActiveTab = 0;
+					ActiveTabName = PBXGroupTreeModule;
+					Collapsed = YES;
+					Frame = "{{0, 23}, {352, 530}}";
+					Split0 = {
+						Collapsed = NO;
+						Frame = "{{1e+06, 1e+06}, {0, 530}}";
+						Split0 = {
+							Frame = "{{0, 0}, {0, 530}}";
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {484, 208}}";
+						};
+						Tab1 = {
+							Debugger = {
+								Collapsed = NO;
+								Frame = "{{0, 0}, {664, 208}}";
+								Split0 = {
+									Frame = "{{0, 24}, {664, 184}}";
+									Split0 = {
+										Frame = "{{0, 0}, {325, 184}}";
+									};
+									Split1 = {
+										DebugVariablesTableConfiguration = (
+											Name,
+											123,
+											Value,
+											85,
+											Summary,
+											96.123,
+										);
+										Frame = "{{334, 0}, {330, 184}}";
+									};
+									SplitCount = 2;
+								};
+								SplitCount = 1;
+								Tab0 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								Tab1 = {
+									Frame = "{{0, 0}, {100, 50}}";
+								};
+								TabCount = 2;
+								TabsVisible = YES;
+							};
+							Frame = "{{0, 0}, {664, 208}}";
+							LauncherConfigVersion = 7;
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {664, 50}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {664, 50}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {614, 262}}";
+							BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {612, 295}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					SplitCount = 1;
+					Tab0 = {
+						Frame = "{{0, 0}, {328, 530}}";
+						GroupTreeTableConfiguration = (
+							TargetStatusColumn,
+							18,
+							MainColumn,
+							295,
+						);
+					};
+					Tab1 = {
+						ClassesFrame = "{{0, 0}, {343, 348}}";
+						ClassesTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXClassColumnIdentifier,
+							300,
+						);
+						Frame = "{{0, 0}, {341, 578}}";
+						MembersFrame = "{{0, 357}, {343, 221}}";
+						MembersTreeTableConfiguration = (
+							PBXBookColumnIdentifier,
+							20,
+							PBXMethodColumnIdentifier,
+							299,
+						);
+					};
+					Tab2 = {
+						Frame = "{{0, 0}, {319, 576}}";
+					};
+					Tab3 = {
+						Frame = "{{0, 0}, {341, 578}}";
+						TargetTableConfiguration = (
+							ActiveObject,
+							16,
+							ObjectNames,
+							308.296,
+						);
+					};
+					Tab4 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							266,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {319, 576}}";
+					};
+					TabCount = 5;
+					TabsVisible = YES;
+				};
+				NavBarShownByDefault = YES;
+				StatusViewVisible = YES;
+				Template = F5E465990156DFB90DCA290F;
+				ToolbarVisible = YES;
+				WindowLocation = "{19, 217}";
+			};
+			PBXWorkspaceContents = (
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavContent0 = {
+									bookmark = E16C83ED03F83AD700050002;
+									history = (
+										E16C83D103F83AD700050002,
+										E16C83D203F83AD700050002,
+										E16C83D303F83AD700050002,
+										E16C83D403F83AD700050002,
+										E16C83D503F83AD700050002,
+										E16C83D603F83AD700050002,
+										E16C83D703F83AD700050002,
+										E16C83D803F83AD700050002,
+										E16C83D903F83AD700050002,
+										E16C83DA03F83AD700050002,
+										E16C83DB03F83AD700050002,
+										E16C83DC03F83AD700050002,
+										E16C83DD03F83AD700050002,
+										E16C83DE03F83AD700050002,
+										E16C83DF03F83AD700050002,
+										E16C83E003F83AD700050002,
+									);
+									prevStack = (
+										E16C83E103F83AD700050002,
+										E16C83E203F83AD700050002,
+										E16C83E303F83AD700050002,
+										E16C83E403F83AD700050002,
+										E16C83E503F83AD700050002,
+										E16C83E603F83AD700050002,
+										E16C83E703F83AD700050002,
+										E16C83E803F83AD700050002,
+										E16C83E903F83AD700050002,
+										E16C83EA03F83AD700050002,
+										E16C83EB03F83AD700050002,
+										E16C83EC03F83AD700050002,
+									);
+								};
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {729, 633}}";
+									NavBarVisible = YES;
+								};
+								NavSplitVertical = NO;
+							};
+							SplitCount = 1;
+							Tab1 = {
+								Debugger = {
+									Split0 = {
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									TabCount = 2;
+								};
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								LauncherConfigVersion = 3;
+								Runner = {
+								};
+							};
+							TabCount = 5;
+						};
+						SplitCount = 1;
+						Tab1 = {
+							OptionsSetName = "Hierarchy, all classes";
+						};
+						TabCount = 5;
+					};
+				},
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {618, 150}}";
+									NavBarVisible = YES;
+								};
+								NavSplitVertical = NO;
+							};
+							SplitCount = 1;
+							Tab1 = {
+								Debugger = {
+									Split0 = {
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									TabCount = 2;
+								};
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								LauncherConfigVersion = 3;
+								Runner = {
+								};
+							};
+							TabCount = 5;
+						};
+						SplitCount = 1;
+						Tab1 = {
+							OptionsSetName = "Hierarchy, all classes";
+						};
+						TabCount = 5;
+					};
+				},
+			);
+			PBXWorkspaceGeometries = (
+				{
+					ContentSize = "{1018, 656}";
+					LeftSlideOut = {
+						ActiveTab = 0;
+						ActiveTabName = PBXGroupTreeModule;
+						Collapsed = NO;
+						Frame = "{{0, 23}, {1018, 633}}";
+						Split0 = {
+							Collapsed = NO;
+							Frame = "{{289, 0}, {729, 633}}";
+							Split0 = {
+								Frame = "{{0, 0}, {729, 633}}";
+							};
+							SplitCount = 1;
+							Tab0 = {
+								Frame = "{{0, 0}, {681, 289}}";
+							};
+							Tab1 = {
+								Debugger = {
+									Collapsed = NO;
+									Frame = "{{0, 0}, {681, 150}}";
+									Split0 = {
+										Frame = "{{0, 24}, {681, 126}}";
+										Split0 = {
+											Frame = "{{0, 0}, {333, 126}}";
+										};
+										Split1 = {
+											DebugVariablesTableConfiguration = (
+												Name,
+												123,
+												Value,
+												85,
+												Summary,
+												105.123,
+											);
+											Frame = "{{342, 0}, {339, 126}}";
+										};
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									Tab0 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									Tab1 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									TabCount = 2;
+									TabsVisible = YES;
+								};
+								Frame = "{{0, 0}, {681, 120}}";
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								Frame = "{{0, 0}, {681, 234}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {681, 234}}";
+								};
+							};
+							Tab3 = {
+								BuildMessageFrame = "{{0, 0}, {683, 205}}";
+								BuildTranscriptFrame = "{{0, 214}, {683, 2}}";
+								BuildTranscriptFrameExpanded = YES;
+								Frame = "{{0, 0}, {681, 238}}";
+							};
+							Tab4 = {
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							TabCount = 5;
+							TabsVisible = NO;
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {265, 633}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								232,
+							);
+						};
+						Tab1 = {
+							ClassesFrame = "{{0, 0}, {250, 333}}";
+							ClassesTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXClassColumnIdentifier,
+								207,
+							);
+							Frame = "{{0, 0}, {248, 554}}";
+							MembersFrame = "{{0, 342}, {250, 212}}";
+							MembersTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXMethodColumnIdentifier,
+								206,
+							);
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {217, 554}}";
+						};
+						Tab3 = {
+							Frame = "{{0, 0}, {239, 554}}";
+							TargetTableConfiguration = (
+								ActiveObject,
+								16,
+								ObjectNames,
+								206.296,
+							);
+						};
+						Tab4 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 554}}";
+						};
+						TabCount = 5;
+						TabsVisible = YES;
+					};
+					NavBarShownByDefault = YES;
+					StatusViewVisible = YES;
+					Template = 64ABBB4501FA494900185B06;
+					ToolbarVisible = YES;
+					WindowLocation = "{21, 114}";
+				},
+				{
+					ContentSize = "{618, 257}";
+					LeftSlideOut = {
+						Collapsed = NO;
+						Frame = "{{0, 23}, {618, 234}}";
+						Split0 = {
+							ActiveTab = 2;
+							ActiveTabName = PBXBuildResultsModule;
+							Collapsed = YES;
+							Frame = "{{0, 0}, {618, 234}}";
+							Split0 = {
+								Frame = "{{1e+06, 1e+06}, {618, 0}}";
+							};
+							SplitCount = 1;
+							Tab0 = {
+								Frame = "{{0, 0}, {952, 321}}";
+							};
+							Tab1 = {
+								Debugger = {
+									Collapsed = NO;
+									Frame = "{{0, 0}, {781, 452}}";
+									Split0 = {
+										Frame = "{{0, 24}, {781, 428}}";
+										Split0 = {
+											Frame = "{{0, 0}, {383, 428}}";
+										};
+										Split1 = {
+											DebugVariablesTableConfiguration = (
+												Name,
+												123,
+												Value,
+												85,
+												Summary,
+												155.123,
+											);
+											Frame = "{{392, 0}, {389, 428}}";
+										};
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									Tab0 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									Tab1 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									TabCount = 2;
+									TabsVisible = YES;
+								};
+								Frame = "{{0, 0}, {781, 452}}";
+								LauncherConfigVersion = 7;
+							};
+							Tab2 = {
+								Frame = "{{0, 0}, {618, 228}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {618, 228}}";
+								};
+							};
+							Tab3 = {
+								BuildMessageFrame = "{{0, 0}, {620, 195}}";
+								BuildTranscriptFrame = "{{0, 204}, {620, 2}}";
+								BuildTranscriptFrameExpanded = YES;
+								Frame = "{{0, 0}, {618, 228}}";
+							};
+							Tab4 = {
+								Frame = "{{0, 0}, {612, 295}}";
+							};
+							TabCount = 5;
+							TabsVisible = NO;
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {300, 533}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								267,
+							);
+						};
+						Tab1 = {
+							ClassesFrame = "{{0, 0}, {280, 398}}";
+							ClassesTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXClassColumnIdentifier,
+								237,
+							);
+							Frame = "{{0, 0}, {278, 659}}";
+							MembersFrame = "{{0, 407}, {280, 252}}";
+							MembersTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXMethodColumnIdentifier,
+								236,
+							);
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {200, 100}}";
+						};
+						Tab3 = {
+							Frame = "{{0, 0}, {200, 100}}";
+							TargetTableConfiguration = (
+								ActiveObject,
+								16,
+								ObjectNames,
+								202.296,
+							);
+						};
+						Tab4 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 100}}";
+						};
+						TabCount = 5;
+						TabsVisible = NO;
+					};
+					NavBarShownByDefault = YES;
+					StatusViewVisible = YES;
+					Template = F5314676015831810DCA290F;
+					ToolbarVisible = YES;
+					WindowLocation = "{819, 244}";
+				},
+			);
+			PBXWorkspaceStateSaveDate = 66554412;
+		};
+		perUserProjectItems = {
+			E16C83D103F83AD700050002 = E16C83D103F83AD700050002;
+			E16C83D203F83AD700050002 = E16C83D203F83AD700050002;
+			E16C83D303F83AD700050002 = E16C83D303F83AD700050002;
+			E16C83D403F83AD700050002 = E16C83D403F83AD700050002;
+			E16C83D503F83AD700050002 = E16C83D503F83AD700050002;
+			E16C83D603F83AD700050002 = E16C83D603F83AD700050002;
+			E16C83D703F83AD700050002 = E16C83D703F83AD700050002;
+			E16C83D803F83AD700050002 = E16C83D803F83AD700050002;
+			E16C83D903F83AD700050002 = E16C83D903F83AD700050002;
+			E16C83DA03F83AD700050002 = E16C83DA03F83AD700050002;
+			E16C83DB03F83AD700050002 = E16C83DB03F83AD700050002;
+			E16C83DC03F83AD700050002 = E16C83DC03F83AD700050002;
+			E16C83DD03F83AD700050002 = E16C83DD03F83AD700050002;
+			E16C83DE03F83AD700050002 = E16C83DE03F83AD700050002;
+			E16C83DF03F83AD700050002 = E16C83DF03F83AD700050002;
+			E16C83E003F83AD700050002 = E16C83E003F83AD700050002;
+			E16C83E103F83AD700050002 = E16C83E103F83AD700050002;
+			E16C83E203F83AD700050002 = E16C83E203F83AD700050002;
+			E16C83E303F83AD700050002 = E16C83E303F83AD700050002;
+			E16C83E403F83AD700050002 = E16C83E403F83AD700050002;
+			E16C83E503F83AD700050002 = E16C83E503F83AD700050002;
+			E16C83E603F83AD700050002 = E16C83E603F83AD700050002;
+			E16C83E703F83AD700050002 = E16C83E703F83AD700050002;
+			E16C83E803F83AD700050002 = E16C83E803F83AD700050002;
+			E16C83E903F83AD700050002 = E16C83E903F83AD700050002;
+			E16C83EA03F83AD700050002 = E16C83EA03F83AD700050002;
+			E16C83EB03F83AD700050002 = E16C83EB03F83AD700050002;
+			E16C83EC03F83AD700050002 = E16C83EC03F83AD700050002;
+			E16C83ED03F83AD700050002 = E16C83ED03F83AD700050002;
+		};
+		projectwideBuildSettings = {
+		};
+		wantsIndex = 1;
+		wantsSCM = -1;
+	};
+	08FB779FFE84155DC02AAC07 = {
+		activeExec = 0;
+		executables = (
+			E1A0BD2C03EFAD1C00050001,
+		);
+	};
+	E16C83D103F83AD700050002 = {
+		fRef = E16C83EF03F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "CoreGraphics.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1102;
+		vrLoc = 0;
+	};
+	E16C83D203F83AD700050002 = {
+		fRef = E16C83F003F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "CGBase.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 712;
+		vrLoc = 0;
+	};
+	E16C83D303F83AD700050002 = {
+		fRef = E16C83F203F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "CGError.h: 21";
+		rLen = 23;
+		rLoc = 382;
+		rType = 0;
+		vrLen = 1002;
+		vrLoc = 0;
+	};
+	E16C83D403F83AD700050002 = {
+		fRef = E16C83F303F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "Processes.h: 48";
+		rLen = 15;
+		rLoc = 1115;
+		rType = 0;
+		vrLen = 1032;
+		vrLoc = 546;
+	};
+	E16C83D503F83AD700050002 = {
+		fRef = E16C83F403F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "MacErrors.h: 1476";
+		rLen = 3;
+		rLoc = 82842;
+		rType = 0;
+		vrLen = 1637;
+		vrLoc = 82130;
+	};
+	E16C83D603F83AD700050002 = {
+		fRef = E16C83F103F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "Quickdraw.h: 1974";
+		rLen = 105;
+		rLoc = 71385;
+		rType = 0;
+		vrLen = 1086;
+		vrLoc = 70825;
+	};
+	E16C83D703F83AD700050002 = {
+		fRef = E16C83F503F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "types.h: 102";
+		rLen = 42;
+		rLoc = 4351;
+		rType = 0;
+		vrLen = 1301;
+		vrLoc = 3647;
+	};
+	E16C83D803F83AD700050002 = {
+		fRef = E16C83F603F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "OpenTransportProtocol.h: 799";
+		rLen = 50;
+		rLoc = 35039;
+		rType = 0;
+		vrLen = 1534;
+		vrLoc = 34260;
+	};
+	E16C83D903F83AD700050002 = {
+		fRef = E16C83F703F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "stdio.h: 279";
+		rLen = 47;
+		rLoc = 10453;
+		rType = 0;
+		vrLen = 1370;
+		vrLoc = 9757;
+	};
+	E16C83DA03F83AD700050002 = {
+		fRef = E16C83F803F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "NSURL.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1617;
+		vrLoc = 856;
+	};
+	E16C83DB03F83AD700050002 = {
+		fRef = E16C83F903F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "NSFileManager.h: 7";
+		rLen = 0;
+		rLoc = 165;
+		rType = 0;
+		vrLen = 1400;
+		vrLoc = 0;
+	};
+	E16C83DC03F83AD700050002 = {
+		fRef = E1A0BD3203EFAD9E00050001;
+		isa = PBXTextBookmark;
+		name = "CPS.h: 281";
+		rLen = 0;
+		rLoc = 4865;
+		rType = 0;
+		vrLen = 1136;
+		vrLoc = 4090;
+	};
+	E16C83DD03F83AD700050002 = {
+		fRef = E16C83EE03F83AD700050002;
+		isa = PBXTextBookmark;
+		name = "unistd.h: 132";
+		rLen = 41;
+		rLoc = 5271;
+		rType = 0;
+		vrLen = 1423;
+		vrLoc = 4595;
+	};
+	E16C83DE03F83AD700050002 = {
+		fRef = E16C83CC03F7AF7B00050002;
+		isa = PBXTextBookmark;
+		name = "README: 34";
+		rLen = 56;
+		rLoc = 1201;
+		rType = 0;
+		vrLen = 1412;
+		vrLoc = 0;
+	};
+	E16C83DF03F83AD700050002 = {
+		fRef = C6859E970290921104C91782;
+		isa = PBXTextBookmark;
+		name = "appswitch.1: 110";
+		rLen = 0;
+		rLoc = 4118;
+		rType = 0;
+		vrLen = 1732;
+		vrLoc = 2592;
+	};
+	E16C83E003F83AD700050002 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: 117";
+		rLen = 0;
+		rLoc = 4782;
+		rType = 0;
+		vrLen = 1813;
+		vrLoc = 0;
+	};
+	E16C83E103F83AD700050002 = {
+		fRef = E1A0BD3203EFAD9E00050001;
+		isa = PBXTextBookmark;
+		name = "CPS.h: 273";
+		rLen = 0;
+		rLoc = 4618;
+		rType = 0;
+		vrLen = 1089;
+		vrLoc = 4030;
+	};
+	E16C83E203F83AD700050002 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: __VERSION__";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 861;
+		vrLoc = 1740;
+	};
+	E16C83E303F83AD700050002 = {
+		fRef = E1A0BD3203EFAD9E00050001;
+		isa = PBXTextBookmark;
+		name = "CPS.h: CPSPostShowAllReq";
+		rLen = 17;
+		rLoc = 4768;
+		rType = 0;
+		vrLen = 1057;
+		vrLoc = 3979;
+	};
+	E16C83E403F83AD700050002 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: main";
+		rLen = 0;
+		rLoc = 12674;
+		rType = 0;
+		vrLen = 1650;
+		vrLoc = 10700;
+	};
+	E16C83E503F83AD700050002 = {
+		fRef = E1A0BD3203EFAD9E00050001;
+		isa = PBXTextBookmark;
+		name = "CPS.h: 80";
+		rLen = 0;
+		rLoc = 1183;
+		rType = 0;
+		vrLen = 810;
+		vrLoc = 825;
+	};
+	E16C83E603F83AD700050002 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: matchApplication";
+		rLen = 0;
+		rLoc = 10201;
+		rType = 0;
+		vrLen = 1426;
+		vrLoc = 8916;
+	};
+	E16C83E703F83AD700050002 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: 51";
+		rLen = 0;
+		rLoc = 2325;
+		rType = 0;
+		vrLen = 801;
+		vrLoc = 1590;
+	};
+	E16C83E803F83AD700050002 = {
+		fRef = E16C83CC03F7AF7B00050002;
+		isa = PBXTextBookmark;
+		name = "README: 35";
+		rLen = 0;
+		rLoc = 1258;
+		rType = 0;
+		vrLen = 1285;
+		vrLoc = 0;
+	};
+	E16C83E903F83AD700050002 = {
+		fRef = E1A0BD3203EFAD9E00050001;
+		isa = PBXTextBookmark;
+		name = "CPS.h: 80";
+		rLen = 0;
+		rLoc = 1183;
+		rType = 0;
+		vrLen = 832;
+		vrLoc = 741;
+	};
+	E16C83EA03F83AD700050002 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: 117";
+		rLen = 0;
+		rLoc = 4782;
+		rType = 0;
+		vrLen = 1813;
+		vrLoc = 0;
+	};
+	E16C83EB03F83AD700050002 = {
+		fRef = E16C83CC03F7AF7B00050002;
+		isa = PBXTextBookmark;
+		name = "README: 34";
+		rLen = 56;
+		rLoc = 1201;
+		rType = 0;
+		vrLen = 1412;
+		vrLoc = 0;
+	};
+	E16C83EC03F83AD700050002 = {
+		fRef = C6859E970290921104C91782;
+		isa = PBXTextBookmark;
+		name = "appswitch.1: 110";
+		rLen = 0;
+		rLoc = 4118;
+		rType = 0;
+		vrLen = 1732;
+		vrLoc = 2592;
+	};
+	E16C83ED03F83AD700050002 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: 18";
+		rLen = 0;
+		rLoc = 1589;
+		rType = 0;
+		vrLen = 1813;
+		vrLoc = 0;
+	};
+	E16C83EE03F83AD700050002 = {
+		isa = PBXFileReference;
+		name = unistd.h;
+		path = /usr/include/unistd.h;
+		refType = 0;
+	};
+	E16C83EF03F83AD700050002 = {
+		isa = PBXFileReference;
+		name = CoreGraphics.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/Headers/CoreGraphics.h;
+		refType = 0;
+	};
+	E16C83F003F83AD700050002 = {
+		isa = PBXFileReference;
+		name = CGBase.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/Headers/CGBase.h;
+		refType = 0;
+	};
+	E16C83F103F83AD700050002 = {
+		isa = PBXFileReference;
+		name = Quickdraw.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/Headers/Quickdraw.h;
+		refType = 0;
+	};
+	E16C83F203F83AD700050002 = {
+		isa = PBXFileReference;
+		name = CGError.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/Headers/CGError.h;
+		refType = 0;
+	};
+	E16C83F303F83AD700050002 = {
+		isa = PBXFileReference;
+		name = Processes.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/Headers/Processes.h;
+		refType = 0;
+	};
+	E16C83F403F83AD700050002 = {
+		isa = PBXFileReference;
+		name = MacErrors.h;
+		path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/MacErrors.h;
+		refType = 0;
+	};
+	E16C83F503F83AD700050002 = {
+		isa = PBXFileReference;
+		name = types.h;
+		path = /usr/include/sys/types.h;
+		refType = 0;
+	};
+	E16C83F603F83AD700050002 = {
+		isa = PBXFileReference;
+		name = OpenTransportProtocol.h;
+		path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/OpenTransportProtocol.h;
+		refType = 0;
+	};
+	E16C83F703F83AD700050002 = {
+		isa = PBXFileReference;
+		name = stdio.h;
+		path = /usr/include/stdio.h;
+		refType = 0;
+	};
+	E16C83F803F83AD700050002 = {
+		isa = PBXFileReference;
+		name = NSURL.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSURL.h;
+		refType = 0;
+	};
+	E16C83F903F83AD700050002 = {
+		isa = PBXFileReference;
+		name = NSFileManager.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSFileManager.h;
+		refType = 0;
+	};
+	E1A0BD2C03EFAD1C00050001 = {
+		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		configStateDict = {
+		};
+		debuggerPlugin = GDBDebugging;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		name = appswitch;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+}
Index: releases/appswitch/1.0b2/appswitch/appswitch.pbproj/project.pbxproj
===================================================================
--- releases/appswitch/1.0b2/appswitch/appswitch.pbproj/project.pbxproj	(revision 98)
+++ releases/appswitch/1.0b2/appswitch/appswitch.pbproj/project.pbxproj	(revision 98)
@@ -0,0 +1,274 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 38;
+	objects = {
+		014CEA490018CE3211CA2923 = {
+			buildRules = (
+			);
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				OPTIMIZATION_CFLAGS = "-O0";
+			};
+			isa = PBXBuildStyle;
+			name = Development;
+		};
+		014CEA4A0018CE3211CA2923 = {
+			buildRules = (
+			);
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+			};
+			isa = PBXBuildStyle;
+			name = Deployment;
+		};
+//010
+//011
+//012
+//013
+//014
+//030
+//031
+//032
+//033
+//034
+		034768E2FF38A6DC11DB9C8B = {
+			isa = PBXExecutableFileReference;
+			path = appswitch;
+			refType = 3;
+		};
+//030
+//031
+//032
+//033
+//034
+//080
+//081
+//082
+//083
+//084
+		08FB7793FE84155DC02AAC07 = {
+			buildStyles = (
+				014CEA490018CE3211CA2923,
+				014CEA4A0018CE3211CA2923,
+			);
+			hasScannedForEncodings = 1;
+			isa = PBXProject;
+			mainGroup = 08FB7794FE84155DC02AAC07;
+			projectDirPath = "";
+			targets = (
+				08FB779FFE84155DC02AAC07,
+			);
+		};
+		08FB7794FE84155DC02AAC07 = {
+			children = (
+				08FB7795FE84155DC02AAC07,
+				C6859E96029091FE04C91782,
+				08FB779DFE84155DC02AAC07,
+				19C28FBDFE9D53C911CA2CBB,
+			);
+			isa = PBXGroup;
+			name = appswitch;
+			refType = 4;
+		};
+		08FB7795FE84155DC02AAC07 = {
+			children = (
+				08FB7796FE84155DC02AAC07,
+				E1A0BD3203EFAD9E00050001,
+			);
+			isa = PBXGroup;
+			name = Source;
+			refType = 4;
+		};
+		08FB7796FE84155DC02AAC07 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			path = main.c;
+			refType = 4;
+		};
+		08FB779DFE84155DC02AAC07 = {
+			children = (
+				E1A0BD4C03EFB64400050001,
+			);
+			isa = PBXGroup;
+			name = "External Frameworks and Libraries";
+			refType = 4;
+		};
+		08FB779FFE84155DC02AAC07 = {
+			buildPhases = (
+				08FB77A0FE84155DC02AAC07,
+				08FB77A1FE84155DC02AAC07,
+				08FB77A3FE84155DC02AAC07,
+				08FB77A5FE84155DC02AAC07,
+				C6859E980290922304C91782,
+			);
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = "";
+				HEADER_SEARCH_PATHS = "";
+				INSTALL_PATH = "$(HOME)/bin";
+				LIBRARY_SEARCH_PATHS = "";
+				OTHER_CFLAGS = "";
+				OTHER_LDFLAGS = "";
+				OTHER_REZFLAGS = "";
+				PRODUCT_NAME = appswitch;
+				REZ_EXECUTABLE = YES;
+				SECTORDER_FLAGS = "";
+				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+			};
+			dependencies = (
+			);
+			isa = PBXToolTarget;
+			name = appswitch;
+			productInstallPath = "$(HOME)/bin";
+			productName = appswitch;
+			productReference = 034768E2FF38A6DC11DB9C8B;
+		};
+		08FB77A0FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1A0BD3303EFAD9E00050001,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		08FB77A1FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+				08FB77A2FE84155DC02AAC07,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		08FB77A2FE84155DC02AAC07 = {
+			fileRef = 08FB7796FE84155DC02AAC07;
+			isa = PBXBuildFile;
+			settings = {
+				ATTRIBUTES = (
+				);
+			};
+		};
+		08FB77A3FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1A0BD4D03EFB64400050001,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		08FB77A5FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+			);
+			isa = PBXRezBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+//080
+//081
+//082
+//083
+//084
+//190
+//191
+//192
+//193
+//194
+		19C28FBDFE9D53C911CA2CBB = {
+			children = (
+				034768E2FF38A6DC11DB9C8B,
+			);
+			isa = PBXGroup;
+			name = Products;
+			refType = 4;
+		};
+//190
+//191
+//192
+//193
+//194
+//C60
+//C61
+//C62
+//C63
+//C64
+		C6859E96029091FE04C91782 = {
+			children = (
+				C6859E970290921104C91782,
+				E16C83CC03F7AF7B00050002,
+			);
+			isa = PBXGroup;
+			name = Documentation;
+			refType = 4;
+		};
+		C6859E970290921104C91782 = {
+			isa = PBXFileReference;
+			path = appswitch.1;
+			refType = 4;
+		};
+		C6859E980290922304C91782 = {
+			buildActionMask = 8;
+			dstPath = /usr/share/man/man1/;
+			dstSubfolderSpec = 0;
+			files = (
+				C6859E990290922B04C91782,
+				E16C83CD03F7AF7B00050002,
+			);
+			isa = PBXCopyFilesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 1;
+		};
+		C6859E990290922B04C91782 = {
+			fileRef = C6859E970290921104C91782;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+//C60
+//C61
+//C62
+//C63
+//C64
+//E10
+//E11
+//E12
+//E13
+//E14
+		E16C83CC03F7AF7B00050002 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			path = README;
+			refType = 4;
+		};
+		E16C83CD03F7AF7B00050002 = {
+			fileRef = E16C83CC03F7AF7B00050002;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1A0BD3203EFAD9E00050001 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			path = CPS.h;
+			refType = 4;
+		};
+		E1A0BD3303EFAD9E00050001 = {
+			fileRef = E1A0BD3203EFAD9E00050001;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1A0BD4C03EFB64400050001 = {
+			isa = PBXFrameworkReference;
+			name = ApplicationServices.framework;
+			path = /System/Library/Frameworks/ApplicationServices.framework;
+			refType = 0;
+		};
+		E1A0BD4D03EFB64400050001 = {
+			fileRef = E1A0BD4C03EFB64400050001;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+	};
+	rootObject = 08FB7793FE84155DC02AAC07;
+}
Index: releases/appswitch/1.0b2/appswitch/main.c
===================================================================
--- releases/appswitch/1.0b2/appswitch/main.c	(revision 98)
+++ releases/appswitch/1.0b2/appswitch/main.c	(revision 98)
@@ -0,0 +1,372 @@
+/*
+ appswitch - a command-line application switcher
+ Nicholas Riley <appswitch@sabi.net>
+
+ Copyright (c) 2003, Nicholas Riley
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of this software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+#define DEBUG 0
+
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include "CPS.h"
+
+const char *APP_NAME;
+
+#define VERSION "1.0b2"
+
+struct {
+    OSType creator;
+    CFStringRef bundleID;
+    char *name;
+    pid_t pid;
+    char *path;
+    enum {
+        MATCH_UNKNOWN, MATCH_FRONT, MATCH_CREATOR, MATCH_BUNDLE_ID, MATCH_NAME, MATCH_PID, MATCH_PATH, MATCH_ALL
+    } matchType;
+    enum {
+        APP_NONE, APP_SWITCH, APP_SHOW, APP_HIDE, APP_KILL, APP_LIST, APP_PRINT_PID
+    } appAction;
+    enum {
+        ACTION_NONE, ACTION_SHOW_ALL, ACTION_HIDE_OTHERS
+    } action;
+    enum {
+        FINAL_NONE, FINAL_SWITCH
+    } finalAction;
+} OPTS =
+{
+    kLSUnknownCreator, NULL, NULL, -1, NULL, MATCH_UNKNOWN, APP_NONE, ACTION_NONE, FINAL_NONE
+};
+
+typedef struct {
+    OSStatus status;
+    const char *desc;
+} errRec, errList[];
+
+static errList ERRS = {
+    // Process Manager errors
+    { appIsDaemon, "application is background-only\n", },
+    { procNotFound, "unable to connect to system service.\nAre you logged in?" },
+    // CoreGraphics errors
+    { kCGErrorIllegalArgument, "window server error.\nAre you logged in?" },
+    { fnfErr, "file not found" },
+    { 0, NULL }
+};
+
+void usage() {
+    fprintf(stderr, "usage: %s [-sShHkFlP] [-c creator] [-i bundleID] [-a name] [-p pid] [path]\n"
+            "  -s            show application, bring windows to front (do not switch)\n"
+            "  -S            show all applications\n"
+            "  -h            hide application\n"
+            "  -H            hide other applications\n"
+            "  -k            kill application\n"
+            "  -l            list applications\n"
+            "  -P            print application process ID\n"
+            "  -F            bring current application's windows to front\n"
+            "  -c creator    match application by four-character creator code ('ToyS')\n"
+            "  -i bundle ID  match application by bundle identifier (com.apple.scripteditor)\n"
+            "  -p pid        match application by process identifier [slower]\n"
+            "  -a name       match application by name\n"
+            , APP_NAME);
+    fprintf(stderr, "appswitch "VERSION" (c) 2003 Nicholas Riley <http://web.sabi.net/nriley/software/>.\n"
+            "Please send bugs, suggestions, etc. to <appswitch@sabi.net>.\n");
+
+    exit(1);
+}
+
+char *osstatusstr(OSStatus err) {
+    errRec *rec;
+    const char *errDesc = "unknown error";
+    char * const failedStr = "(unable to retrieve error message)";
+    static char *str = NULL;
+    size_t len;
+    if (str != NULL && str != failedStr) free(str);
+    for (rec = &(ERRS[0]) ; rec->status != 0 ; rec++)
+        if (rec->status == err) {
+            errDesc = rec->desc;
+            break;
+        }
+            len = strlen(errDesc) + 10 * sizeof(char);
+    str = (char *)malloc(len);
+    if (str != NULL)
+        snprintf(str, len, "%s (%ld)", errDesc, err);
+    else
+        str = failedStr;
+    return str;
+}
+
+void osstatusexit(OSStatus err, const char *fmt, ...) {
+    va_list ap;
+    const char *errDesc = osstatusstr(err);
+    va_start(ap, fmt);
+    fprintf(stderr, "%s: ", APP_NAME);
+    vfprintf(stderr, fmt, ap);
+    fprintf(stderr, ": %s\n", errDesc);
+    exit(1);
+}
+
+void errexit(const char *fmt, ...) {
+    va_list ap;
+    va_start(ap, fmt);
+    fprintf(stderr, "%s: ", APP_NAME);
+    vfprintf(stderr, fmt, ap);
+    fprintf(stderr, "\n");
+    exit(1);
+}
+
+void getargs(int argc, char * const argv[]) {
+    extern char *optarg;
+    extern int optind;
+    int ch;
+
+    if (argc == 1) usage();
+
+    const char *opts = "c:i:p:a:sShHklPF";
+
+    while ( (ch = getopt(argc, argv, opts)) != -1) {
+        switch (ch) {
+            case 'p':
+                if (OPTS.matchType != MATCH_UNKNOWN) errexit("choose only one of -c, -i, -p, -a options");
+                if (sscanf(optarg, "%d", &OPTS.pid) != 1 || OPTS.pid < 0)
+                    errexit("invalid process identifier (argument of -p)");
+                OPTS.matchType = MATCH_PID;
+                break;
+            case 'c':
+                if (OPTS.matchType != MATCH_UNKNOWN) errexit("choose only one of -c, -i, -p, -a options");
+                if (strlen(optarg) != 4) errexit("creator (argument of -c) must be four characters long");
+                OPTS.creator = *(OSTypePtr)optarg;
+                OPTS.matchType = MATCH_CREATOR;
+                break;
+            case 'i':
+                if (OPTS.matchType != MATCH_UNKNOWN) errexit("choose only one of -c, -i, -p, -a options");
+                OPTS.bundleID = CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding());
+                OPTS.matchType = MATCH_BUNDLE_ID;
+                break;
+            case 'a':
+                if (OPTS.matchType != MATCH_UNKNOWN) errexit("choose only one of -c, -i, -p, -a options");
+                OPTS.name = strdup(optarg);
+                OPTS.matchType = MATCH_NAME;
+                break;
+            case 's':
+                if (OPTS.appAction != APP_NONE) errexit("choose only one of -s, -h, -k, -l, -P options");
+                OPTS.appAction = APP_SHOW;
+                break;
+            case 'h':
+                if (OPTS.appAction != APP_NONE) errexit("choose only one of -s, -h, -k, -l, -P options");
+                OPTS.appAction = APP_HIDE;
+                break;
+            case 'k':
+                if (OPTS.appAction != APP_NONE) errexit("choose only one of -s, -h, -k, -l, -P options");
+                OPTS.appAction = APP_KILL;
+                break;
+            case 'l':
+                if (OPTS.appAction != APP_NONE) errexit("choose only one of -s, -h, -k, -l, -P options");
+                OPTS.appAction = APP_LIST;
+                break;
+            case 'P':
+                if (OPTS.appAction != APP_NONE) errexit("choose only one of -s, -h, -k, -l, -P options");
+                OPTS.appAction = APP_PRINT_PID;
+                break;
+            case 'S':
+                if (OPTS.action != ACTION_NONE) errexit("choose -S, -H or neither option");
+                OPTS.action = ACTION_SHOW_ALL;
+                break;
+            case 'H':
+                if (OPTS.action != ACTION_NONE) errexit("choose -S, -H or neither option");
+                OPTS.action = ACTION_HIDE_OTHERS;
+                break;
+            case 'F':
+                if (OPTS.finalAction != FINAL_NONE) errexit("choose only one -F option");
+                OPTS.finalAction = FINAL_SWITCH;
+                break;
+            default: usage();
+        }
+    }
+
+    argc -= optind;
+    argv += optind;
+
+    if (OPTS.matchType != MATCH_UNKNOWN && argc != 0) usage();
+
+    if (OPTS.matchType == MATCH_UNKNOWN) {
+        if (argc == 0) {
+            if (OPTS.appAction == APP_LIST) {
+                OPTS.matchType = MATCH_ALL;
+            } else if (OPTS.action != ACTION_NONE || OPTS.finalAction != FINAL_NONE) {
+                OPTS.matchType = MATCH_FRONT;
+            } else usage();
+        } else if (argc == 1) {
+            OPTS.path = argv[0];
+            OPTS.matchType = MATCH_PATH;
+        } else usage();
+    }
+
+    if (OPTS.matchType != MATCH_FRONT && OPTS.appAction == APP_NONE)
+        OPTS.appAction = APP_SWITCH;
+
+}
+
+CPSProcessSerNum frontApplication() {
+    CPSProcessSerNum psn;
+    OSStatus err = CPSGetFrontProcess(&psn);
+    if (err != noErr) osstatusexit(err, "can't get frontmost process");
+#if DEBUG
+    fprintf(stderr, "front application PSN %ld.%ld\n", psn.hi, psn.lo);
+#endif
+    return psn;
+}
+
+CPSProcessSerNum matchApplication(CPSProcessInfoRec *info) {
+    long pathMaxLength = pathconf("/", _PC_PATH_MAX);
+    long nameMaxLength = pathconf("/", _PC_NAME_MAX);
+
+    char *path = (char *)malloc(pathMaxLength);
+    char *name = (char *)malloc(nameMaxLength);;
+
+    if (path == NULL || name == NULL) errexit("can't allocate memory for path or filename buffer");
+
+    if (OPTS.matchType == MATCH_FRONT) return frontApplication();
+
+    OSStatus err;
+    CPSProcessSerNum psn = {
+        kNoProcess, kNoProcess
+    };
+    int len;
+    char *format = NULL;
+    if (OPTS.appAction == APP_LIST) {
+        int termwidth = 80;
+        struct winsize ws;
+        char *banner = "       PSN   PID TYPE CREA NAME                ";
+                     // 12345678.0 12345 1234 1234 12345678901234567890
+        printf("%s PATH\n", banner);
+        if ((ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&ws) != -1 ||
+             ioctl(STDERR_FILENO, TIOCGWINSZ, (char *)&ws) != -1 ||
+             ioctl(STDIN_FILENO,  TIOCGWINSZ, (char *)&ws) != -1) ||
+            ws.ws_col != 0) termwidth = ws.ws_col;
+        int pathlen = termwidth - strlen(banner) - 1;
+        asprintf(&format, "%%8ld.%%ld %%5ld %%c%%c%%c%%c %%c%%c%%c%%c %%-20.20s %%-%d.%ds\n", pathlen, pathlen);
+    }
+    
+    while ( (err = CPSGetNextProcess(&psn)) == noErr) {
+        err = CPSGetProcessInfo(&psn, info, path, pathMaxLength, &len, name, nameMaxLength);
+        if (err != noErr) osstatusexit(err, "can't get information for process PSN %ld.%ld", psn.hi, psn.lo);
+
+#if DEBUG
+        fprintf(stderr, "%ld.%ld: %s : %s\n", psn.hi, psn.lo, name, path);
+#endif
+
+        switch (OPTS.matchType) {
+            case MATCH_ALL:
+                break;
+            case MATCH_CREATOR: if (OPTS.creator != info->ExecFileCreator) continue;
+                break;
+            case MATCH_NAME: if (strcmp(name, OPTS.name) != 0) continue;
+                break;
+            case MATCH_PID: if (OPTS.pid != info->UnixPID) continue;
+                break;
+            case MATCH_PATH: if (strcmp(path, OPTS.path) != 0) continue;
+                break;
+            case MATCH_BUNDLE_ID:
+               {
+                   CFURLRef url = CFURLCreateFromFileSystemRepresentation(NULL, path, strlen(path), false);
+                   if (url == NULL) errexit("can't get bundle location for process '%s' (PSN %ld.%ld, pid %ld)", name, psn.hi, psn.lo, info->UnixPID);
+                   CFBundleRef bundle = CFBundleCreate(NULL, url);
+                   if (bundle != NULL) {
+                       CFStringRef bundleID = CFBundleGetIdentifier(bundle);
+#if DEBUG
+                       CFShow(bundleID);
+#endif
+                       if (bundleID != NULL && CFStringCompare(OPTS.bundleID, bundleID, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
+                           break;
+                   }
+                   CFRelease(url);
+                   continue;
+               }
+            default:
+                errexit("internal error: invalid match type");
+        }
+        if (OPTS.appAction == APP_LIST) {
+            char *type = (char *)&(info->ExecFileType), *crea = (char *)&(info->ExecFileCreator);
+#define CXX(c) ( (c) < ' ' ? '?' : (c) )
+#define OSTYPE_CHAR_ARGS(t) CXX(t[0]), CXX(t[1]), CXX(t[2]), CXX(t[3])
+            printf(format, psn.hi, psn.lo, info->UnixPID,
+		   OSTYPE_CHAR_ARGS(type), OSTYPE_CHAR_ARGS(crea),
+                   name, path);
+            continue;
+        }
+        return psn;
+    }
+    if (err != procNotFound) osstatusexit(err, "can't get next process");
+
+    if (OPTS.appAction == APP_LIST) return frontApplication();
+
+    errexit("can't find matching process");
+    return psn;
+}
+
+int main (int argc, char * const argv[]) {
+    OSStatus err = noErr;
+
+    APP_NAME = argv[0];
+    getargs(argc, argv);
+
+    // need to establish connection with window server
+    InitCursor();
+
+    CPSProcessInfoRec info;
+    CPSProcessSerNum psn = matchApplication(&info);
+
+    const char *verb;
+    switch (OPTS.appAction) {
+        case APP_NONE: break;
+        case APP_LIST: break; // already handled in matchApplication
+        case APP_SWITCH: err = CPSSetFrontProcess(&psn); verb = "set front"; break;
+        case APP_SHOW: err = CPSPostShowReq(&psn); verb = "show"; break;
+        case APP_HIDE: err = CPSPostHideReq(&psn); verb = "hide"; break;
+        case APP_KILL: err = CPSPostKillRequest(&psn, kNilOptions); verb = "kill"; break;
+        case APP_PRINT_PID:
+            if (info.UnixPID <= 0) errexit("can't get process ID");
+            printf("%lu\n", info.UnixPID); // pid_t is signed, but this field isn't
+            break;
+        default:
+            errexit("internal error: invalid application action");
+    }
+    if (err != noErr) osstatusexit(err, "can't %s process", verb);
+
+    switch (OPTS.action) {
+        case ACTION_NONE: break;
+        case ACTION_SHOW_ALL: err = CPSPostShowAllReq(&psn); verb = "show all"; break;
+        case ACTION_HIDE_OTHERS: err = CPSPostHideMostReq(&psn); verb = "hide other"; break;
+        default:
+            errexit("internal error: invalid action");
+    }
+    if (err != noErr) osstatusexit(err, "can't %s processes", verb);
+
+    switch (OPTS.finalAction) {
+        case FINAL_NONE: break;
+        case FINAL_SWITCH:
+            psn = frontApplication();
+#if DEBUG
+            fprintf(stderr, "posting show request for %ld.%ld\n", psn.hi, psn.lo);
+#endif
+            if (OPTS.action != ACTION_NONE) usleep(750000); // XXX
+            err = CPSPostShowReq(&psn) || CPSSetFrontProcess(&psn);
+            verb = "bring current application's windows to the front";
+            break;
+        default:
+            errexit("internal error: invalid final action");    
+    }
+    if (err != noErr) osstatusexit(err, "can't %s", verb);
+
+    exit(0);
+}
Index: releases/appswitch/1.0b2/package-appswitch.sh
===================================================================
--- releases/appswitch/1.0b2/package-appswitch.sh	(revision 98)
+++ releases/appswitch/1.0b2/package-appswitch.sh	(revision 98)
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+set -x -v
+
+cd appswitch && \
+find . -name \*~ -exec rm '{}' \; && \
+pbxbuild && \ 
+SetFile -c 'R*ch' -t 'TEXT' README VERSION && \
+strip build/appswitch && \
+sudo /usr/bin/install -c build/appswitch /usr/local/bin && \
+sudo /usr/bin/install -c appswitch.1 /usr/local/man/man1 && \
+rm -rf build/appswitch.build build/intermediates build/.gdb_history && \
+VERSION=`cat VERSION` TARBALL="appswitch-$VERSION.tar.gz" && \
+DMG="appswitch-$VERSION.dmg" VOL="appswitch $VERSION" MOUNTPOINT="/Volumes/$VOL" && \
+cd .. && \
+rm -f appswitch-$VERSION $TARBALL $DMG && \
+ln -s appswitch appswitch-$VERSION && \
+tar --exclude=.DS_Store --exclude=.svn -zchf appswitch-$VERSION.tar.gz appswitch-$VERSION && \
+#hdiutil create $DMG -megabytes 5 -ov -type UDIF && \
+#DISK=`hdid $DMG | sed -ne ' /Apple_partition_scheme/ s|^/dev/\([^ ]*\).*$|\1|p'` && \
+#newfs_hfs -v "$VOL" /dev/r${DISK}s2 && \
+#hdiutil eject $DISK && \
+#hdid $DMG && \
+#ditto -rsrc launch "$MOUNTPOINT" && \
+#ditto -rsrc "InstallAnywhere/launch_Web_Installers/InstData/MacOSX/Install launch $VERSION.sit" "/Volumes/launch $VERSION" && \
+#launch "$MOUNTPOINT/Install launch $VERSION.sit" && \
+#./openUp "$MOUNTPOINT" && \
+#sleep 2 && \
+## hdiutil eject $DISK && \ # this doesn't work
+#osascript -e "tell application \"Finder\" to eject disk \"$VOL\"" && \
+#hdiutil convert $DMG -format UDZO -o z$DMG && \
+#mv z$DMG $DMG && \
+scp $TARBALL ainaz:web/nriley/software/ #$DMG 
+:
