Index: releases/launch/1.0b1/launch/README
===================================================================
--- releases/launch/1.0b1/launch/README	(revision 57)
+++ releases/launch/1.0b1/launch/README	(revision 57)
@@ -0,0 +1,259 @@
+launch 1.0b1 [14 December 2002]
+============
+
+A command-line launcher for Mac OS X in the spirit of open(1).
+
+Written by Nicholas Riley <mailto:launchsw@sabi.net>.
+Obtain updates from <http://web.sabi.net/nriley/software/>.
+
+WHAT IS IT?
+-----------
+
+Apple provides a simple command-line launching program called 'open'
+with Mac OS X.  It offers few options - launching applications by name
+or by path, launching TextEdit, or opening a number of applications,
+documents, folders, or URLs.  With the exception of special support for
+TextEdit, 'launch' does all this and:
+
+- opens URLs, directly or in your preferred helper application (-l)
+- lets you specify applications by their four-character creator
+  (e.g. 'ToyS') or Java-style bundle ID (e.g. com.apple.scripteditor),
+  both of which allow you to move or rename an application without
+  changing references to it
+- asks applications to print documents, something the OS X Finder
+  no longer permits
+- allows you to pipe output to GUI applictions
+- launches applications in the background
+- launches Carbon applications in Classic
+- displays file information including type, creator, bundle ID,
+  data and resource fork sizes, and dates
+- reports errors intelligibly
+- and much more!
+
+'launch' is useful by itself, but is even better when used in scripts.
+Assign a shell command to your favorite Mac OS text, graphics or
+resource editor.  Go to your favorite Web site with a few keystrokes.
+
+Like 'open', 'launch' provides one half of the round-trip between
+Terminal.app and the Finder.  You can drag and drop icons or proxy icons
+into Terminal.app to insert their paths into command lines.  To go in the
+other direction, just type 'launch .' (or 'open .') to open a Finder window
+showing the current directory.
+
+INSTALLATION
+------------
+
+The commands below install the 'launch' tool in /usr/local/bin, which
+is in the default path.  You should subsequently be able to use
+'launch' by typing its name.  If you wish to install it somewhere else,
+modify the install line as appropriate.
+
+% sudo /usr/bin/install -c build/launch /usr/local/bin
+% rehash
+
+Uninstallation:
+
+% sudo rm -f /usr/local/bin/launch
+
+COMPILATION
+-----------
+
+A Project Builder project, 'launch.pbproj', is included.  A
+precompiled binary is also provided.  'launch' was developed and
+tested under Mac OS 10.2.3 with the December 2002 Developer Tools,
+and does not require any additional software to build.
+
+USAGE
+-----
+
+Just type 'launch' by itself to receive usage information.
+
+Some examples:
+
+% launch -c 'R*ch'
+[BBEdit opens]
+                                
+% launch -pbc 'R*ch' test.txt
+[BBEdit starts printing test.txt in the background]
+
+% ls -l | launch -c CWIE -
+[CodeWarrior IDE opens with an untitled document containing the file list]
+
+% launch -i org.mozilla.navigator http://www.apple.com/
+[Chimera Navigator opens Apple's Web site]
+
+% launch -l launchsw@sabi.net
+[Your preferred email client opens a new message to comment on launch]
+
+% launch -f /Applications/Preview.app
+/Applications/Preview.app: Mac OS X application package 
+        type: 'APPL'    creator: 'prvw'
+        bundle ID: com.apple.Preview
+        kind: Application
+        contents: 2 items
+[...]
+
+FREQUENTLY ASKED QUESTIONS
+--------------------------
+
+Q. How do I discover bundle IDs for applications?
+
+A. The -f option to launch can help.  Say you have OmniWeb in the
+/Applications/Internet folder, and want to find out its bundle ID.
+Type 'launch -f', and drop the OmniWeb icon on Terminal:
+
+% launch -f /Applications/Internet/OmniWeb.app
+/Applications/Internet/OmniWeb.app: Mac OS X application package 
+        type: 'APPL'    creator: 'OWEB'
+        bundle ID: com.omnigroup.OmniWeb
+        kind: Application
+
+Note that bundle IDs are not case-sensitive: com.barebones.BBEdit is
+the same as com.barebones.bbedit.
+
+
+Q. Why does application X open a file with a name beginning with 
+'launch-stationery-'?  
+
+A. Your application does not support stationery.  Applications which
+support stationery respond to it by creating a new untitled document
+with the contents of the stationery.  Most (all?) Cocoa applications,
+such as TextEdit, do not support stationery.  If you're looking for
+a text editor which supports stationery, try BBEdit, Tex-Edit Plus,
+the CodeWarrior IDE, or almost any other Carbon editor.
+
+For the curious: launch processes input by simultaneously reading it
+and writing to a temporary stationery file.  Once reading is complete,
+launch opens the stationery file with your selected application, and
+deletes the stationery after one minute (as a safeguard, it is not
+possible to accurately gauge how long it will take for the application
+to open the stationery).
+
+
+Q. Why can't I use -f with -c to get info on an application with a
+given creator (or -f with -i for a bundle ID)?
+
+A. This feature may be added to a later version (or add it yourself!),
+but there is a workaround.  Instead of:
+
+% launch -f -c 'Doug'
+launch: can't get information (-f) on item(s) using an application (-u, -c, -i, -a)
+
+use:
+
+% launch -f "`launch -nc 'Doug'`"
+/Volumes/GrayApps/Utilities/Resorcerer 2.4/Resorcerer: scriptable Mac OS X application [Carbon, prefers native OS X]
+        type: 'APPL'    creator: 'Doug'
+        kind: Application
+
+
+Q. Why won't launch locate non-packaged applications by their bundle
+identifier?
+
+A. This was a LaunchServices/CFBundle bug, fixed in Mac OS X 10.2.
+For example, BBEdit 6.1 for OS X was a packaged application; BBEdit
+6.5 is not, however its 'plst' resource contains a bundle ID.
+LaunchServices prior to OS X 10.2 was unable to locate BBEdit 6.5 by
+its bundle ID.
+
+Non-packaged applications usually originated as Mac OS applications,
+so they will have creators.  If you're using Mac OS X 10.1.x, try
+using the creator instead of the bundle ID as a workaround (-c instead
+of -i).
+
+
+Q. Why does launch display '[can't access CFBundle for application]'
+in place of the bundle identifiers of non-packaged applications?
+
+A. This is a CFBundle bug which remains as of Mac OS X 10.2.3.  If
+this matters to you, please ask Apple to fix it, or implement a
+workaround in launch by parsing the 'plst' id 0 resource directly.
+
+
+Q. Why doesn't launch support opening items as root?
+
+A. Apple eliminated this capability with the Mac OS X 10.1 Security
+Update.  If at some point Apple restores this capability, 'launch'
+will be ready to support it.
+
+
+Q. Why do I get an error -600?
+
+A. A typical occurrence of this would be:
+
+% launch -n .
+launch: can't open items: unable to connect to system service.
+Are you logged in? (-600)
+
+In order to perform certain operations, launch needs to talk to
+various system services owned by the currently logged-on user.  If you
+aren't using 'launch' from a terminal currently logged into the Mac OS
+X GUI, certain operations may not work.  Try opening Terminal.app,
+creating a new terminal, and trying again.
+
+Another possibility is to create your own interprocess messaging.
+For example, place this script in a file:
+
+#!/bin/sh
+PIPE=/tmp/.launchpipe
+[ -e $PIPE ] || mkfifo $PIPE
+while true; do
+    read opts < $PIPE
+    eval "/path/to/launch $opts" & # change this to launch's path
+done
+
+Then, define a function or alias.  For zsh:
+
+rlaunch() { echo $@ > /tmp/.launchpipe }
+
+Or for tcsh:
+
+alias rlaunch 'echo \!* > /tmp/.launchpipe'
+
+Start the shell script above from the console, then you can use
+'rlaunch' in place of 'launch' logged in from anywhere else.
+
+Thanks to robert <robert@allyourbass.org> for this suggestion.
+
+COMMENTS, SUGGESTIONS, BUG REPORTS, ETC.
+----------------------------------------
+
+Please send to the author, Nicholas Riley, at <launchsw@sabi.net>.
+
+VERSION HISTORY
+---------------
+
+1.0b1 - 14 December 2002
+ - accept "slack" (default http) URLs and email addresses with -l
+ - accept input from stdin with '-'
+ - open URLs with arbitrary applications when specified without -l
+ - builds without compiler warnings
+1.0a9 - 2 April 2002
+ - license, comments changes
+1.0a8 - 29 March 2002
+ - errors with -l (from ICeCoffEE), added rlaunch script
+1.0a7 - 3 March 2002
+ - print dates, sizes, folder valence, locked status for -f
+ - don't abort on failure to obtain bundle information
+1.0a6 - 30 November 2001
+ - fixed incorrect messages, broken -u and crash on -nu
+1.0a5 - 28 November 2001
+ - print kind string for -f, still no new installer
+1.0a4 - 20 November 2001
+ - [try to] use Installer VISE instead of InstallAnywhere
+1.0a3 - 15 November 2001
+ - fixed package identification in -f, updated examples
+1.0a2 - 15 November 2001
+ - -f, removed broken -m
+1.0a1 - 14 November 2001
+ - renamed from "FindApp", launch by default, -u
+1.0d5 - 7 November 2001
+ - option -s for launching as root [nonfunctional]
+1.0d4 - 6 November 2001
+ - URL launching and Internet Config support
+1.0d3 - 4 November 2001
+ - more robust, support for docs without app
+1.0d2 - 4 November 2001
+ - options -opsbmhCX, -cin, documents
+1.0d1 - 26 August 2001
+ - returns path of application identified by creator
Index: releases/launch/1.0b1/launch/VERSION
===================================================================
--- releases/launch/1.0b1/launch/VERSION	(revision 57)
+++ releases/launch/1.0b1/launch/VERSION	(revision 57)
@@ -0,0 +1,1 @@
+1.0b1
Index: releases/launch/1.0b1/launch/launch.pbproj/nicholas.pbxuser
===================================================================
--- releases/launch/1.0b1/launch/launch.pbproj/nicholas.pbxuser	(revision 57)
+++ releases/launch/1.0b1/launch/launch.pbproj/nicholas.pbxuser	(revision 57)
@@ -0,0 +1,1443 @@
+// !$*UTF8*$!
+{
+	08FB7793FE84155DC02AAC07 = {
+		activeBuildStyle = 014CEA490018CE3211CA2923;
+		activeExecutable = F561F49E0139D79101AEEDB1;
+		activeTarget = 08FB779FFE84155DC02AAC07;
+		addToTargets = (
+			08FB779FFE84155DC02AAC07,
+		);
+		breakpoints = (
+			F5F4D74101B55E0801AEEDB1,
+			E190CFFD03AAA8A300AEFBE0,
+		);
+		executables = (
+			F561F49E0139D79101AEEDB1,
+		);
+		perUserDictionary = {
+			PBXPerProjectTemplateStateSaveDate = 61528480;
+			"PBXTemplateGeometry-F5314676015831810DCA290F" = {
+				ContentSize = "{685, 434}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 23}, {685, 411}}";
+					Split0 = {
+						ActiveTab = 2;
+						ActiveTabName = PBXBuildResultsModule;
+						Collapsed = NO;
+						Frame = "{{0, 0}, {685, 411}}";
+						Split0 = {
+							Frame = "{{0, 191}, {685, 220}}";
+						};
+						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}, {685, 215}}";
+							LauncherConfigVersion = 3;
+							Runner = {
+								Frame = "{{0, 0}, {685, 215}}";
+							};
+						};
+						Tab3 = {
+							BuildMessageFrame = "{{0, 0}, {687, 152}}";
+							BuildTranscriptFrame = "{{0, 161}, {687, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {685, 185}}";
+						};
+						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 = "{29, 98}";
+			};
+			"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 = "{34, -15}";
+			};
+			"PBXTemplateGeometry-F5CA7EC9015C08ED0DCA290F" = {
+				ContentSize = "{665, 594}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 0}, {665, 594}}";
+					Split0 = {
+						ActiveTab = 3;
+						ActiveTabName = PBXProjectFindModule;
+						Collapsed = NO;
+						Frame = "{{0, 0}, {665, 594}}";
+						Split0 = {
+							Frame = "{{0, 301}, {665, 293}}";
+						};
+						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}, {667, 265}}";
+							BuildTranscriptFrame = "{{0, 274}, {667, 2}}";
+							BuildTranscriptFrameExpanded = YES;
+							Frame = "{{0, 0}, {665, 298}}";
+						};
+						Tab4 = {
+							Frame = "{{0, 0}, {665, 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 = F5CA7EC9015C08ED0DCA290F;
+				ToolbarVisible = NO;
+				WindowLocation = "{293, 27}";
+			};
+			"PBXTemplateGeometry-F5CA7ECB015C094F0DCA290F" = {
+				ContentSize = "{668, 621}";
+				LeftSlideOut = {
+					Collapsed = NO;
+					Frame = "{{0, 0}, {668, 621}}";
+					Split0 = {
+						Collapsed = NO;
+						Frame = "{{0, 0}, {668, 621}}";
+						Split0 = {
+							Frame = "{{0, 0}, {668, 621}}";
+						};
+						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 = "{615, 189}";
+			};
+			PBXWorkspaceContents = (
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavContent0 = {
+									bookmark = E190D02D03ABB17800AEFBE0;
+									history = (
+										E190CFFE03AAD96100AEFBE0,
+										E190CFFF03AAD96100AEFBE0,
+										E190D00203AAD96100AEFBE0,
+										E190D01403ABB17800AEFBE0,
+										E190D01503ABB17800AEFBE0,
+										E190D01603ABB17800AEFBE0,
+										E190D01703ABB17800AEFBE0,
+										E190D01803ABB17800AEFBE0,
+										E190D01903ABB17800AEFBE0,
+										E190D01A03ABB17800AEFBE0,
+										E190D01B03ABB17800AEFBE0,
+										E190D01C03ABB17800AEFBE0,
+										E190D01D03ABB17800AEFBE0,
+										E190D01E03ABB17800AEFBE0,
+										E190D01F03ABB17800AEFBE0,
+										E190D02003ABB17800AEFBE0,
+										E190D02103ABB17800AEFBE0,
+										E190D02203ABB17800AEFBE0,
+										E190D02303ABB17800AEFBE0,
+										E190D02403ABB17800AEFBE0,
+										E190D02503ABB17800AEFBE0,
+									);
+									prevStack = (
+										E190D00403AAD96100AEFBE0,
+										E190D00503AAD96100AEFBE0,
+										E190D00603AAD96100AEFBE0,
+										E190D00703AAD96100AEFBE0,
+										E190D00803AAD96100AEFBE0,
+										E190D00903AAD96100AEFBE0,
+										E190D02603ABB17800AEFBE0,
+										E190D02703ABB17800AEFBE0,
+										E190D02803ABB17800AEFBE0,
+										E190D02903ABB17800AEFBE0,
+										E190D02A03ABB17800AEFBE0,
+										E190D02B03ABB17800AEFBE0,
+										E190D02C03ABB17800AEFBE0,
+									);
+								};
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {717, 554}}";
+									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 = {
+								NavContent0 = {
+									bookmark = E190D02F03ABB17800AEFBE0;
+									history = (
+										E190D02E03ABB17800AEFBE0,
+									);
+								};
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {685, 220}}";
+									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 = "{1001, 577}";
+					LeftSlideOut = {
+						ActiveTab = 0;
+						ActiveTabName = PBXGroupTreeModule;
+						Collapsed = NO;
+						Frame = "{{0, 23}, {1001, 554}}";
+						Split0 = {
+							Collapsed = NO;
+							Frame = "{{284, 0}, {717, 554}}";
+							Split0 = {
+								Frame = "{{0, 0}, {717, 554}}";
+							};
+							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}, {260, 554}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								227,
+							);
+						};
+						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}, {216, 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 = "{5, 193}";
+				},
+				{
+					ContentSize = "{685, 434}";
+					LeftSlideOut = {
+						Collapsed = NO;
+						Frame = "{{0, 23}, {685, 411}}";
+						Split0 = {
+							ActiveTab = 2;
+							ActiveTabName = PBXBuildResultsModule;
+							Collapsed = NO;
+							Frame = "{{0, 0}, {685, 411}}";
+							Split0 = {
+								Frame = "{{0, 191}, {685, 220}}";
+							};
+							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}, {685, 215}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {685, 215}}";
+								};
+							};
+							Tab3 = {
+								BuildMessageFrame = "{{0, 0}, {687, 152}}";
+								BuildTranscriptFrame = "{{0, 161}, {687, 2}}";
+								BuildTranscriptFrameExpanded = YES;
+								Frame = "{{0, 0}, {685, 185}}";
+							};
+							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 = "{3, 42}";
+				},
+			);
+			PBXWorkspaceStateSaveDate = 61528480;
+		};
+		perUserProjectItems = {
+			E190CFFE03AAD96100AEFBE0 = E190CFFE03AAD96100AEFBE0;
+			E190CFFF03AAD96100AEFBE0 = E190CFFF03AAD96100AEFBE0;
+			E190D00203AAD96100AEFBE0 = E190D00203AAD96100AEFBE0;
+			E190D00403AAD96100AEFBE0 = E190D00403AAD96100AEFBE0;
+			E190D00503AAD96100AEFBE0 = E190D00503AAD96100AEFBE0;
+			E190D00603AAD96100AEFBE0 = E190D00603AAD96100AEFBE0;
+			E190D00703AAD96100AEFBE0 = E190D00703AAD96100AEFBE0;
+			E190D00803AAD96100AEFBE0 = E190D00803AAD96100AEFBE0;
+			E190D00903AAD96100AEFBE0 = E190D00903AAD96100AEFBE0;
+			E190D01403ABB17800AEFBE0 = E190D01403ABB17800AEFBE0;
+			E190D01503ABB17800AEFBE0 = E190D01503ABB17800AEFBE0;
+			E190D01603ABB17800AEFBE0 = E190D01603ABB17800AEFBE0;
+			E190D01703ABB17800AEFBE0 = E190D01703ABB17800AEFBE0;
+			E190D01803ABB17800AEFBE0 = E190D01803ABB17800AEFBE0;
+			E190D01903ABB17800AEFBE0 = E190D01903ABB17800AEFBE0;
+			E190D01A03ABB17800AEFBE0 = E190D01A03ABB17800AEFBE0;
+			E190D01B03ABB17800AEFBE0 = E190D01B03ABB17800AEFBE0;
+			E190D01C03ABB17800AEFBE0 = E190D01C03ABB17800AEFBE0;
+			E190D01D03ABB17800AEFBE0 = E190D01D03ABB17800AEFBE0;
+			E190D01E03ABB17800AEFBE0 = E190D01E03ABB17800AEFBE0;
+			E190D01F03ABB17800AEFBE0 = E190D01F03ABB17800AEFBE0;
+			E190D02003ABB17800AEFBE0 = E190D02003ABB17800AEFBE0;
+			E190D02103ABB17800AEFBE0 = E190D02103ABB17800AEFBE0;
+			E190D02203ABB17800AEFBE0 = E190D02203ABB17800AEFBE0;
+			E190D02303ABB17800AEFBE0 = E190D02303ABB17800AEFBE0;
+			E190D02403ABB17800AEFBE0 = E190D02403ABB17800AEFBE0;
+			E190D02503ABB17800AEFBE0 = E190D02503ABB17800AEFBE0;
+			E190D02603ABB17800AEFBE0 = E190D02603ABB17800AEFBE0;
+			E190D02703ABB17800AEFBE0 = E190D02703ABB17800AEFBE0;
+			E190D02803ABB17800AEFBE0 = E190D02803ABB17800AEFBE0;
+			E190D02903ABB17800AEFBE0 = E190D02903ABB17800AEFBE0;
+			E190D02A03ABB17800AEFBE0 = E190D02A03ABB17800AEFBE0;
+			E190D02B03ABB17800AEFBE0 = E190D02B03ABB17800AEFBE0;
+			E190D02C03ABB17800AEFBE0 = E190D02C03ABB17800AEFBE0;
+			E190D02D03ABB17800AEFBE0 = E190D02D03ABB17800AEFBE0;
+			E190D02E03ABB17800AEFBE0 = E190D02E03ABB17800AEFBE0;
+			E190D02F03ABB17800AEFBE0 = E190D02F03ABB17800AEFBE0;
+		};
+		projectwideBuildSettings = {
+		};
+		userBookmarkGroup = E190CFF903AAA80600AEFBE0;
+		wantsIndex = 1;
+		wantsSCM = 0;
+	};
+	08FB7796FE84155DC02AAC07 = {
+		uiCtxt = {
+			sepNavWindowFrame = "{{15, 495}, {750, 502}}";
+		};
+	};
+	08FB779FFE84155DC02AAC07 = {
+		activeExec = 0;
+		executables = (
+			F561F49E0139D79101AEEDB1,
+		);
+	};
+	E190CFF903AAA80600AEFBE0 = {
+		children = (
+			E190CFFB03AAA84B00AEFBE0,
+		);
+		isa = PBXBookmarkGroup;
+		name = Root;
+	};
+	E190CFFB03AAA84B00AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "handle URL/file arguments";
+		rLen = 0;
+		rLoc = 17800;
+		rType = 0;
+		vrLen = 1773;
+		vrLoc = 14523;
+	};
+	E190CFFD03AAA8A300AEFBE0 = {
+		fileReference = 08FB7796FE84155DC02AAC07;
+		isa = PBXFileBreakpoint;
+		lineNumber = 479;
+		state = 1;
+	};
+	E190CFFE03AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190CFFF03AAD96100AEFBE0 = {
+		exec = F561F49E0139D79101AEEDB1;
+		isa = PBXExecutableBookmark;
+	};
+	E190D00203AAD96100AEFBE0 = {
+		fRef = E190D00E03AAD96100AEFBE0;
+		glyphRangeLength = 886;
+		glyphRangeLocation = 314;
+		isa = PBXDocBookmark;
+		name = "Miscellaneous234567891011.html: Adds the val...";
+	};
+	E190D00403AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190D00503AAD96100AEFBE0 = {
+		exec = F561F49E0139D79101AEEDB1;
+		isa = PBXExecutableBookmark;
+	};
+	E190D00603AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190D00703AAD96100AEFBE0 = {
+		isa = PBXTargetBookmark;
+		trg = 08FB779FFE84155DC02AAC07;
+	};
+	E190D00803AAD96100AEFBE0 = {
+		exec = F561F49E0139D79101AEEDB1;
+		isa = PBXExecutableBookmark;
+	};
+	E190D00903AAD96100AEFBE0 = {
+		fRef = E190D01003AAD96100AEFBE0;
+		isa = PBXTextBookmark;
+		name = "CFString.h: 146";
+		rLen = 25;
+		rLoc = 6754;
+		rType = 0;
+		vrLen = 1812;
+		vrLoc = 6085;
+	};
+	E190D00E03AAD96100AEFBE0 = {
+		isa = PBXFileReference;
+		name = Miscellaneous234567891011.html;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/CollectionServices/Collection_Services/Functions/Miscellaneous234567891011.html;
+		refType = 0;
+	};
+	E190D01003AAD96100AEFBE0 = {
+		isa = PBXFileReference;
+		name = CFString.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
+		refType = 0;
+	};
+	E190D01403ABB17800AEFBE0 = {
+		fRef = E190D03803ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "CFArray.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1987;
+		vrLoc = 18422;
+	};
+	E190D01503ABB17800AEFBE0 = {
+		fRef = E190D03E03ABB17800AEFBE0;
+		glyphRangeLength = 682;
+		glyphRangeLocation = 46353;
+		isa = PBXDocBookmark;
+		name = "Miscellaneous.html: Creates an i...";
+	};
+	E190D01603ABB17800AEFBE0 = {
+		fRef = E190D03903ABB17800AEFBE0;
+		glyphRangeLength = 765;
+		glyphRangeLocation = 0;
+		isa = PBXDocBookmark;
+		name = "FSCatalogInfo.html: PATHDocument...";
+	};
+	E190D01703ABB17800AEFBE0 = {
+		fRef = E190D03F03ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "Finder.h: 245";
+		rLen = 0;
+		rLoc = 10667;
+		rType = 0;
+		vrLen = 1889;
+		vrLoc = 9430;
+	};
+	E190D01803ABB17800AEFBE0 = {
+		fRef = E190D04003ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "unistd.h: 180";
+		rLen = 28;
+		rLoc = 6936;
+		rType = 0;
+		vrLen = 1346;
+		vrLoc = 6238;
+	};
+	E190D01903ABB17800AEFBE0 = {
+		fRef = E190D04103ABB17800AEFBE0;
+		glyphRangeLength = 1207;
+		glyphRangeLocation = 99;
+		isa = PBXDocBookmark;
+		name = "Accessing_In__Directories.html: Returns cata...";
+	};
+	E190D01A03ABB17800AEFBE0 = {
+		fRef = E190D03003ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "stat.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1792;
+		vrLoc = 3421;
+	};
+	E190D01B03ABB17800AEFBE0 = {
+		fRef = E190D03103ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "Files.h: 5736";
+		rLen = 105;
+		rLoc = 193930;
+		rType = 0;
+		vrLen = 1145;
+		vrLoc = 193348;
+	};
+	E190D01C03ABB17800AEFBE0 = {
+		fRef = E190D03203ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "stdio.h: 301";
+		rLen = 0;
+		rLoc = 11200;
+		rType = 0;
+		vrLen = 1154;
+		vrLoc = 10552;
+	};
+	E190D01D03ABB17800AEFBE0 = {
+		fRef = E190D03303ABB17800AEFBE0;
+		glyphRangeLength = 702;
+		glyphRangeLocation = 18151;
+		isa = PBXDocBookmark;
+		name = "Miscellaneou39456789101112.html: Creates a ne...";
+	};
+	E190D01E03ABB17800AEFBE0 = {
+		fRef = E190D03403ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "string.h: 78";
+		rLen = 42;
+		rLoc = 3286;
+		rType = 0;
+		vrLen = 1261;
+		vrLoc = 2846;
+	};
+	E190D01F03ABB17800AEFBE0 = {
+		fRef = F574340B01B8A47B01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "VERSION: 1";
+		rLen = 0;
+		rLoc = 5;
+		rType = 0;
+		vrLen = 5;
+		vrLoc = 0;
+	};
+	E190D02003ABB17800AEFBE0 = {
+		fRef = E190D03703ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "CFBase.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1128;
+		vrLoc = 0;
+	};
+	E190D02103ABB17800AEFBE0 = {
+		fRef = E190D03B03ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "CFString.h: 198";
+		rLen = 25;
+		rLoc = 9326;
+		rType = 0;
+		vrLen = 1770;
+		vrLoc = 8490;
+	};
+	E190D02203ABB17800AEFBE0 = {
+		fRef = E190D03C03ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "CFURL.h: 51";
+		rLen = 0;
+		rLoc = 2112;
+		rType = 0;
+		vrLen = 1754;
+		vrLoc = 1462;
+	};
+	E190D02303ABB17800AEFBE0 = {
+		fRef = E190D03D03ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "InternetConfig.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1212;
+		vrLoc = 5916;
+	};
+	E190D02403ABB17800AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: icInst";
+		rLen = 7;
+		rLoc = 29863;
+		rType = 0;
+		vrLen = 1319;
+		vrLoc = 29078;
+	};
+	E190D02503ABB17800AEFBE0 = {
+		fRef = F5C0CA9501B5740C01AEEDB1;
+		isa = PBXBookmark;
+	};
+	E190D02603ABB17800AEFBE0 = {
+		fRef = E190D03603ABB17800AEFBE0;
+		glyphRangeLength = 682;
+		glyphRangeLocation = 46353;
+		isa = PBXDocBookmark;
+		name = "Miscellaneous.html: Creates an i...";
+	};
+	E190D02703ABB17800AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: appSpecified";
+		rLen = 0;
+		rLoc = 11344;
+		rType = 0;
+		vrLen = 1115;
+		vrLoc = 9772;
+	};
+	E190D02803ABB17800AEFBE0 = {
+		fRef = E190D03A03ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "Files.h: 3008";
+		rLen = 16;
+		rLoc = 102224;
+		rType = 0;
+		vrLen = 1154;
+		vrLoc = 101600;
+	};
+	E190D02903ABB17800AEFBE0 = {
+		fRef = E190D04203ABB17800AEFBE0;
+		glyphRangeLength = 1207;
+		glyphRangeLocation = 99;
+		isa = PBXDocBookmark;
+		name = "Accessing_In__Directories.html: Returns cata...";
+	};
+	E190D02A03ABB17800AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: icInst";
+		rLen = 7;
+		rLoc = 29863;
+		rType = 0;
+		vrLen = 1280;
+		vrLoc = 29117;
+	};
+	E190D02B03ABB17800AEFBE0 = {
+		fRef = E190D03503ABB17800AEFBE0;
+		isa = PBXTextBookmark;
+		name = "InternetConfig.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1212;
+		vrLoc = 5916;
+	};
+	E190D02C03ABB17800AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: icInst";
+		rLen = 7;
+		rLoc = 29863;
+		rType = 0;
+		vrLen = 1319;
+		vrLoc = 29078;
+	};
+	E190D02D03ABB17800AEFBE0 = {
+		fRef = F5C0CA9501B5740C01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "README: 177";
+		rLen = 0;
+		rLoc = 6386;
+		rType = 0;
+		vrLen = 1360;
+		vrLoc = 5029;
+	};
+	E190D02E03ABB17800AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		rLen = 1;
+		rLoc = 474;
+		rType = 1;
+	};
+	E190D02F03ABB17800AEFBE0 = {
+		fRef = 08FB7796FE84155DC02AAC07;
+		isa = PBXTextBookmark;
+		name = "main.c: getargs";
+		rLen = 0;
+		rLoc = 18110;
+		rType = 0;
+		vrLen = 716;
+		vrLoc = 17641;
+	};
+	E190D03003ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = stat.h;
+		path = /usr/include/sys/stat.h;
+		refType = 0;
+	};
+	E190D03103ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Files.h;
+		path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/Files.h;
+		refType = 0;
+	};
+	E190D03203ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = stdio.h;
+		path = /usr/include/stdio.h;
+		refType = 0;
+	};
+	E190D03303ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Miscellaneou39456789101112.html;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/URLServices/URL_Services/Functions/Miscellaneou39456789101112.html;
+		refType = 0;
+	};
+	E190D03403ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = string.h;
+		path = /usr/include/string.h;
+		refType = 0;
+	};
+	E190D03503ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = InternetConfig.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/Headers/InternetConfig.h;
+		refType = 0;
+	};
+	E190D03603ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Miscellaneous.html;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/StringServices/String_Services/Functions/Miscellaneous.html;
+		refType = 0;
+	};
+	E190D03703ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = CFBase.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFBase.h;
+		refType = 0;
+	};
+	E190D03803ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = CFArray.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFArray.h;
+		refType = 0;
+	};
+	E190D03903ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = FSCatalogInfo.html;
+		path = /Developer/Documentation/Carbon/Files/FileManager/File_Manager/DataTypes/FSCatalogInfo.html;
+		refType = 0;
+	};
+	E190D03A03ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Files.h;
+		path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/Files.h;
+		refType = 0;
+	};
+	E190D03B03ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = CFString.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
+		refType = 0;
+	};
+	E190D03C03ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = CFURL.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFURL.h;
+		refType = 0;
+	};
+	E190D03D03ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = InternetConfig.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/Headers/InternetConfig.h;
+		refType = 0;
+	};
+	E190D03E03ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Miscellaneous.html;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/StringServices/String_Services/Functions/Miscellaneous.html;
+		refType = 0;
+	};
+	E190D03F03ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Finder.h;
+		path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/Finder.h;
+		refType = 0;
+	};
+	E190D04003ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = unistd.h;
+		path = /usr/include/unistd.h;
+		refType = 0;
+	};
+	E190D04103ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Accessing_In__Directories.html;
+		path = /Developer/Documentation/Carbon/Files/FileManager/File_Manager/Functions/Accessing_In__Directories.html;
+		refType = 0;
+	};
+	E190D04203ABB17800AEFBE0 = {
+		isa = PBXFileReference;
+		name = Accessing_In__Directories.html;
+		path = /Developer/Documentation/Carbon/Files/FileManager/File_Manager/Functions/Accessing_In__Directories.html;
+		refType = 0;
+	};
+	F561F49E0139D79101AEEDB1 = {
+		activeArgIndex = 1;
+		activeArgIndices = (
+			NO,
+			YES,
+		);
+		argumentStrings = (
+			"-nu file:///Applications/Prerelease/Mozilla.app",
+			"-c MSIE http://web.sabi.net/",
+		);
+		configStateDict = {
+		};
+		debuggerPlugin = GDBDebugging;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		name = launch;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	F5F4D74101B55E0801AEEDB1 = {
+		fileReference = 08FB7796FE84155DC02AAC07;
+		isa = PBXFileBreakpoint;
+		lineNumber = 609;
+		state = 1;
+	};
+}
Index: releases/launch/1.0b1/launch/launch.pbproj/project.pbxproj
===================================================================
--- releases/launch/1.0b1/launch/launch.pbproj/project.pbxproj	(revision 57)
+++ releases/launch/1.0b1/launch/launch.pbproj/project.pbxproj	(revision 57)
@@ -0,0 +1,271 @@
+// !$*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 = launch;
+			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,
+				08FB779DFE84155DC02AAC07,
+				19C28FBDFE9D53C911CA2CBB,
+				F5C0CA9501B5740C01AEEDB1,
+				F574340B01B8A47B01AEEDB1,
+			);
+			isa = PBXGroup;
+			name = launch;
+			refType = 4;
+		};
+		08FB7795FE84155DC02AAC07 = {
+			children = (
+				08FB7796FE84155DC02AAC07,
+			);
+			isa = PBXGroup;
+			name = Source;
+			refType = 4;
+		};
+		08FB7796FE84155DC02AAC07 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			path = main.c;
+			refType = 4;
+		};
+		08FB779DFE84155DC02AAC07 = {
+			children = (
+				F5E819BF0198DFF701AEEDB1,
+				F561F49F0139D7DD01AEEDB1,
+				09AB6884FE841BABC02AAC07,
+				F579CF4B019A1C6D01AEEDB1,
+			);
+			isa = PBXGroup;
+			name = "External Frameworks and Libraries";
+			refType = 4;
+		};
+		08FB779FFE84155DC02AAC07 = {
+			buildPhases = (
+				08FB77A0FE84155DC02AAC07,
+				08FB77A1FE84155DC02AAC07,
+				08FB77A3FE84155DC02AAC07,
+				08FB77A5FE84155DC02AAC07,
+			);
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = "";
+				HEADER_SEARCH_PATHS = "";
+				INSTALL_PATH = "\U0001$(HOME)/bin";
+				LIBRARY_SEARCH_PATHS = "";
+				OTHER_CFLAGS = "";
+				OTHER_LDFLAGS = "";
+				OTHER_REZFLAGS = "";
+				PRODUCT_NAME = launch;
+				REZ_EXECUTABLE = YES;
+				SECTORDER_FLAGS = "";
+				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+			};
+			dependencies = (
+			);
+			isa = PBXToolTarget;
+			name = launch;
+			productInstallPath = "$(HOME)/bin";
+			productName = launch;
+			productReference = 034768E2FF38A6DC11DB9C8B;
+		};
+		08FB77A0FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		08FB77A1FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+				08FB77A2FE84155DC02AAC07,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		08FB77A2FE84155DC02AAC07 = {
+			fileRef = 08FB7796FE84155DC02AAC07;
+			isa = PBXBuildFile;
+			settings = {
+				ATTRIBUTES = (
+				);
+			};
+		};
+		08FB77A3FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+				09AB6885FE841BABC02AAC07,
+				F561F4A00139D7DD01AEEDB1,
+				F5E819C00198DFF701AEEDB1,
+				F579CF4C019A1C6D01AEEDB1,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		08FB77A5FE84155DC02AAC07 = {
+			buildActionMask = 2147483647;
+			files = (
+			);
+			isa = PBXRezBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+//080
+//081
+//082
+//083
+//084
+//090
+//091
+//092
+//093
+//094
+		09AB6884FE841BABC02AAC07 = {
+			isa = PBXFrameworkReference;
+			name = CoreFoundation.framework;
+			path = /System/Library/Frameworks/CoreFoundation.framework;
+			refType = 0;
+		};
+		09AB6885FE841BABC02AAC07 = {
+			fileRef = 09AB6884FE841BABC02AAC07;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+//090
+//091
+//092
+//093
+//094
+//190
+//191
+//192
+//193
+//194
+		19C28FBDFE9D53C911CA2CBB = {
+			children = (
+				034768E2FF38A6DC11DB9C8B,
+			);
+			isa = PBXGroup;
+			name = Products;
+			refType = 4;
+		};
+//190
+//191
+//192
+//193
+//194
+//F50
+//F51
+//F52
+//F53
+//F54
+		F561F49F0139D7DD01AEEDB1 = {
+			isa = PBXFrameworkReference;
+			name = ApplicationServices.framework;
+			path = /System/Library/Frameworks/ApplicationServices.framework;
+			refType = 0;
+		};
+		F561F4A00139D7DD01AEEDB1 = {
+			fileRef = F561F49F0139D7DD01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F574340B01B8A47B01AEEDB1 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			path = VERSION;
+			refType = 4;
+		};
+		F579CF4B019A1C6D01AEEDB1 = {
+			isa = PBXFrameworkReference;
+			name = Security.framework;
+			path = /System/Library/Frameworks/Security.framework;
+			refType = 0;
+		};
+		F579CF4C019A1C6D01AEEDB1 = {
+			fileRef = F579CF4B019A1C6D01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F5C0CA9501B5740C01AEEDB1 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			path = README;
+			refType = 4;
+		};
+		F5E819BF0198DFF701AEEDB1 = {
+			isa = PBXFrameworkReference;
+			name = Carbon.framework;
+			path = /System/Library/Frameworks/Carbon.framework;
+			refType = 0;
+		};
+		F5E819C00198DFF701AEEDB1 = {
+			fileRef = F5E819BF0198DFF701AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+	};
+	rootObject = 08FB7793FE84155DC02AAC07;
+}
Index: releases/launch/1.0b1/launch/main.c
===================================================================
--- releases/launch/1.0b1/launch/main.c	(revision 57)
+++ releases/launch/1.0b1/launch/main.c	(revision 57)
@@ -0,0 +1,776 @@
+/*
+ launch - a smarter 'open' replacement
+ Nicholas Riley <launchsw@sabi.net>
+
+ Copyright (c) 2002, 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.
+ 
+*/
+
+/* To do/think about:
+
+- Do we need to assume -b if -h?  Hiding the foreground app just makes
+it flash (only if Cocoa?)
+
+- Does -X work at all?  What does it return if it fails?
+
+- Launching as root: use authentication framework - doesn't work.
+
+- launch URL with specified URL handler (done, except for IC)
+
+- launch apps by IC protocol handler (esp. editor)
+
+Thanks to:
+
+- Nat Irons, for encouragement and suggestions
+
+- Brian Hill, for the great Security.framework tutorial and sample code
+
+*/
+
+#define DEBUG 1
+#define BROKEN_AUTHORIZATION 1
+#define BROKEN_LAUNCHNEWINSTANCE 1
+#define kComponentSignatureString "launch"
+
+#include <unistd.h>
+#include <sys/stat.h>
+#include <Carbon/Carbon.h>
+#include <CoreServices/CoreServices.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <ApplicationServices/ApplicationServices.h>
+
+#ifndef BROKEN_AUTHORIZATION
+#include <Security/Authorization.h>
+#include <Security/AuthorizationTags.h>
+#endif
+
+const char *APP_NAME;
+
+#define VERSION "1.0b1"
+
+#define STRBUF_LEN 1024
+#define ACTION_DEFAULT ACTION_OPEN
+
+struct {
+    OSType creator;
+    CFStringRef bundleID, name;
+    enum { ACTION_FIND, ACTION_FIND_ITEMS,
+	   ACTION_OPEN, ACTION_OPEN_ITEMS, 
+	   ACTION_INFO_ITEMS, ACTION_LAUNCH_URLS } action;
+} OPTS = 
+{
+    kLSUnknownCreator, NULL, NULL,
+    ACTION_DEFAULT
+};
+
+#define DEFAULT_LAUNCH_FLAGS (kLSLaunchNoParams | kLSLaunchStartClassic | kLSLaunchAsync)
+
+LSLaunchURLSpec LSPEC = {NULL, NULL, NULL, DEFAULT_LAUNCH_FLAGS, NULL};
+
+char *TEMPFILE = NULL;
+
+typedef struct {
+    OSStatus status;
+    const char *desc;
+} errRec, errList[];
+
+static errList ERRS = {
+    // Launch Services errors
+    { kLSUnknownErr, "unknown Launch Services error" },
+    { kLSApplicationNotFoundErr, "application not found" },
+    { kLSLaunchInProgressErr, "application is being opened; please try again after the application is open" },
+    { kLSNotRegisteredErr, "application not registered in Launch Services database" },
+#ifndef BROKEN_AUTHORIZATION
+    // Security framework errors
+    { errAuthorizationDenied, "authorization denied" },
+    { errAuthorizationCanceled, "authentication was cancelled" },
+#endif
+    // Internet Config errors
+    { icPrefNotFoundErr, "no helper application is defined for the URL's scheme" },
+    { icNoURLErr, "not a URL" },
+    { icInternalErr, "internal Internet Config error" },
+    // Misc. errors
+    { procNotFound, "unable to connect to system service.\nAre you logged in?" },
+    { 1001, "SystemConfiguration nonspecific failure.\nAre you logged in?" },
+    { fnfErr, "file not found" },
+    { 0, NULL }
+};
+
+void usage() {
+    fprintf(stderr, "usage: %s [-npswbmhCX] [-c creator] [-i bundleID] [-u URL] [-a name] [item ...] [-]\n"
+                    "   or: %s [-npflswbmhCX] item ...\n", APP_NAME, APP_NAME);
+    fprintf(stderr,
+        "  -n            print matching paths/URLs instead of opening them\n"
+        "  -p            ask application(s) to print document(s)\n"
+	"  -f            display information about item(s)\n"
+        "  -l            launch URLs (e.g. treat http:// URLs as Web sites, not WebDAV)\n"
+#ifndef BROKEN_AUTHORIZATION
+        "  -s            launch target(s) as superuser (authenticating if needed)\n"
+#endif
+        "  -w            wait for application to finish opening before exiting\n"
+        "  -b            launch application in the background\n"
+#ifndef BROKEN_LAUNCHNEWINSTANCE
+        "  -m            launch application again, even if already running\n"
+#endif
+        "  -h            hide application once it's finished opening\n"
+        "  -C            force CFM/PEF Carbon application to launch in Classic\n"
+        "  -X            don't start Classic for this app if Classic isn't running\n"
+        "  -c creator    match application by four-character creator code ('ToyS')\n"
+        "  -i bundle ID  match application by bundle identifier (com.apple.scripteditor)\n"
+        "  -u URL        open application at file:// URL (NOT RECOMMENDED for scripts)\n"
+        "  -a name       match application by name (NOT RECOMMENDED, very fragile)\n"
+        "'document' may be a file, folder, or disk - whatever the application can open.\n"
+        "'item' may be a file, folder, disk, or URL.\n\n");
+    fprintf(stderr, "launch "VERSION" (c) 2001-02 Nicholas Riley <http://web.sabi.net/nriley/software/>.\n"
+	            "Please send bugs, suggestions, etc. to <launchsw@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);
+}
+
+#ifndef BROKEN_AUTHORIZATION
+
+Boolean authenticated(AuthorizationItem item, AuthorizationRef *pAuthRef) {
+    AuthorizationRights rights;
+    AuthorizationRights *authorizedRights;
+    AuthorizationFlags flags;
+    OSStatus err;
+
+    // Create an AuthorizationRef yet with the kAuthorizationFlagDefaults
+    // flags to get the user's current authorization rights.
+    rights.count = 0;
+    rights.items = NULL;
+    
+    flags = kAuthorizationFlagDefaults;
+
+    err = AuthorizationCreate(&rights,
+        kAuthorizationEmptyEnvironment, flags,
+        pAuthRef);
+        
+    rights.count = 1;
+    rights.items = &item;
+    
+    flags = kAuthorizationFlagExtendRights;
+    
+    // don't ask for a password, just return failure if no rights
+    err = AuthorizationCopyRights(*pAuthRef, &rights,
+        kAuthorizationEmptyEnvironment, flags, &authorizedRights);
+
+    switch (err) {
+    case errAuthorizationSuccess:
+        // we don't need these items, and they need to be disposed of
+        AuthorizationFreeItemSet(authorizedRights);
+        return true;
+    case errAuthorizationInteractionNotAllowed:
+        return false;
+    default:
+        osstatusexit(err, "unable to determine authentication status");
+    }
+    return false; // to satisfy compiler
+}
+
+void authenticate(AuthorizationItem item, AuthorizationRef authorizationRef) {
+    AuthorizationRights rights = {1, &item};
+    AuthorizationRights *authorizedRights;
+    AuthorizationFlags flags;
+    OSStatus err;
+
+    flags = kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights;
+
+    // Here, since we've specified kAuthorizationFlagExtendRights and
+    // have also specified kAuthorizationFlagInteractionAllowed, if the
+    // user isn't currently authorized to execute tools as root 
+    // (kAuthorizationRightExecute), they will be asked for their password. 
+    // The err return value will indicate authorization success or failure.
+    err = AuthorizationCopyRights(authorizationRef,&rights,
+                        kAuthorizationEmptyEnvironment,
+                        flags,&authorizedRights);
+    
+    if (errAuthorizationSuccess == err)
+        AuthorizationFreeItemSet(authorizedRights);
+    else
+        osstatusexit(err, "unable to authenticate");
+}
+#endif
+
+CFURLRef normalizedURLFromString(CFStringRef str) {
+    CFURLRef url = CFURLCreateWithString(NULL, str, NULL);
+    if (url != NULL) {
+        CFURLRef absURL = CFURLCopyAbsoluteURL(url);
+        CFRelease(url);
+        url = NULL;
+        if (absURL != NULL) {
+            CFStringRef scheme = CFURLCopyScheme(absURL);
+            url = absURL;
+            if (scheme == NULL) {
+                CFRelease(url);
+                url = NULL;
+            }
+        }
+    }
+    return url;
+}
+
+CFURLRef normalizedURLFromPrefixSlack(CFStringRef prefix, CFStringRef slackStr) {
+    CFStringRef str = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@%@"),
+                                               prefix, slackStr);
+    CFURLRef normalizedURL = normalizedURLFromString(str);
+    CFRelease(str);
+    return normalizedURL;
+}
+
+char *tempFile(int *fd) {
+    char *tmpDir = getenv("TMPDIR");
+    const char * const tempTemplate = "/launch-stationery-XXXXXXXX";
+    char *tempPath;
+    OSStatus err;
+    FSRef fsr;
+    FSCatalogInfo catalogInfo;
+    FileInfo *fInfo;
+
+    // create temporary file
+    if (tmpDir == NULL) tmpDir = "/tmp";
+    tempPath = (char *)malloc(strlen(tmpDir) + strlen(tempTemplate) + 1);
+    if (tempPath == NULL) errexit("can't allocate memory");
+    strcpy(tempPath, tmpDir);
+    strcat(tempPath, tempTemplate);
+    if ( (*fd = mkstemp(tempPath)) == -1)
+        errexit("can't create temporary file '%s'", tempPath);
+    // mark file as stationery
+    err = FSPathMakeRef(tempPath, &fsr, NULL);
+    if (err != noErr) osstatusexit(err, "can't find '%s'", tempPath);
+    err = FSGetCatalogInfo(&fsr, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL);
+    if (err != noErr) osstatusexit(err, "can't get information for '%s'", tempPath);
+    fInfo = (FileInfo *)&(catalogInfo.finderInfo);
+    fInfo->finderFlags |= kIsStationery;
+    err = FSSetCatalogInfo(&fsr, kFSCatInfoFinderInfo, &catalogInfo);
+    if (err != noErr) osstatusexit(err, "can't set information for '%s'", tempPath);
+    
+    return tempPath;
+}
+
+char *stdinAsTempFile() {
+    unsigned char *buf;
+    int bufsize;
+    // Actual number of characters read, and therefore written.
+    ssize_t charCount;
+    int fd;
+    struct stat stat_buf;
+    char *tempFilePath;
+
+    tempFilePath = tempFile(&fd);
+
+    if (fstat(fd, &stat_buf) == -1)
+        errexit("can't fstat temporary file '%s'", tempFilePath);
+
+    bufsize = stat_buf.st_blksize;
+    if ( (buf = (unsigned char *)malloc(bufsize * sizeof(unsigned char))) == NULL)
+        errexit("can't allocate %ld bytes of buffer memory",
+                bufsize * sizeof(unsigned char));
+
+    // Loop until the end of the file.
+    while (1) {
+        // Read a block of input.
+        charCount = read(STDIN_FILENO, buf, bufsize);
+        if (charCount < 0) {
+            errexit("can't read from standard input");
+        }
+        // End of this file?
+        if (charCount == 0)
+            break;
+        // Write this block out.
+        if (write(fd, buf, charCount) != charCount)
+            errexit("error writing to file '%s'", tempFilePath);
+    }
+    free(buf);
+    return tempFilePath;
+}
+
+void getargs(int argc, char * const argv[]) {
+    extern char *optarg;
+    extern int optind;
+    int ch;
+    Boolean appSpecified = false;
+
+    if (argc == 1) usage();
+    
+    while ( (ch = getopt(argc, argv, "npflswbmhCXc:i:u:a:")) != -1) {
+        switch (ch) {
+        case 'n':
+            if (OPTS.action != ACTION_DEFAULT) errexit("choose only one of -n, -p, -f, -l options");
+            OPTS.action = ACTION_FIND;
+            break;
+        case 'p':
+            if (OPTS.action != ACTION_DEFAULT) errexit("choose only one of -n, -p, -f, -l options");
+            OPTS.action = ACTION_OPEN;
+            LSPEC.launchFlags |= kLSLaunchAndPrint;
+            break;
+        case 'f':
+            if (OPTS.action != ACTION_DEFAULT) errexit("choose only one of -n, -p, -f, -l options");
+            OPTS.action = ACTION_INFO_ITEMS;
+            break;
+        case 'l':
+            if (OPTS.action != ACTION_DEFAULT) errexit("choose only one of -n, -p, -f, -l options");
+            OPTS.action = ACTION_LAUNCH_URLS;
+            break;
+        case 's':
+#ifdef BROKEN_AUTHORIZATION
+	    errexit("-s option no longer functional after 10.1 Security Update, sorry");
+#else
+        {
+            AuthorizationRef authRef;
+            AuthorizationItem item = { kAuthorizationRightExecute, strlen(argv[0]), argv[0], 0 };
+            OSStatus err;
+            
+            if (authenticated(item, &authRef)) {
+                continue;
+            }
+            authenticate(item, authRef);
+            err = AuthorizationExecuteWithPrivileges(authRef, argv[0], 0, &argv[1], NULL);
+            if (err != noErr) osstatusexit(err, "unable to launch '%s' with superuser privileges", argv[0]);
+            exit(0); // XXX exit status propagate?
+        }
+#endif
+        case 'w': LSPEC.launchFlags ^= kLSLaunchAsync; break;      // synchronous
+        case 'b': LSPEC.launchFlags |= kLSLaunchDontSwitch; break; // open in background
+#ifdef BROKEN_LAUNCHNEWINSTANCE
+        case 'm': errexit("-m option not functional (LaunchServices bug?), sorry");
+#else
+        case 'm': LSPEC.launchFlags |= kLSLaunchNewInstance; break;// open multiple
+#endif
+        case 'h': LSPEC.launchFlags |= kLSLaunchAndHide; break;    // hide once launched
+        case 'C': LSPEC.launchFlags |= kLSLaunchInClassic; break;  // force Classic
+        case 'X': LSPEC.launchFlags ^= kLSLaunchStartClassic; break;// don't start Classic for app
+        case 'c':
+            if (strlen(optarg) != 4) errexit("creator (argument of -c) must be four characters long");
+            OPTS.creator = *(OSTypePtr)optarg;
+	    appSpecified = true;
+            break;
+        case 'i':
+            OPTS.bundleID = CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding());
+	    appSpecified = true;
+            break;
+        case 'a':
+            OPTS.name = CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding());
+	    appSpecified = true;
+            break;
+	case 'u':
+            { CFStringRef str = CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding());
+	      LSPEC.appURL = CFURLCreateWithString(NULL, str, NULL);
+              if (str != NULL) CFRelease(str);
+            }
+	    if (LSPEC.appURL == NULL) {
+		errexit("invalid URL (argument of -u)");
+	    } else {
+		CFURLRef absURL = CFURLCopyAbsoluteURL(LSPEC.appURL);
+		CFRelease(LSPEC.appURL);
+		LSPEC.appURL = NULL;
+		if (absURL != NULL) {
+		    CFStringRef scheme = CFURLCopyScheme(absURL);
+		    LSPEC.appURL = absURL;
+		    if (scheme == NULL || !CFEqual(scheme, CFSTR("file")))
+			errexit("invalid file:// URL (argument of -u)");
+		}
+	    }
+	    appSpecified = true;
+	    break;
+        default: usage();
+        }
+    }
+    
+    argc -= optind;
+    argv += optind;
+    
+    if ( (OPTS.action == ACTION_FIND || OPTS.action == ACTION_LAUNCH_URLS ||
+	  OPTS.action == ACTION_INFO_ITEMS) && LSPEC.launchFlags != DEFAULT_LAUNCH_FLAGS)
+        errexit("options -s, -b, -m, -h, -C, -X apply to application launch (not -n, -f or -l)");
+    
+    if (OPTS.creator == kLSUnknownCreator && OPTS.bundleID == NULL && OPTS.name == NULL) {
+	if (argc == 0 && LSPEC.appURL == NULL)
+	    errexit("must specify an application by -u, or one or more of -c, -i, -a");
+        if (!appSpecified) {
+            if (OPTS.action == ACTION_FIND)
+                OPTS.action = ACTION_FIND_ITEMS;
+            if (OPTS.action == ACTION_OPEN)
+                OPTS.action = ACTION_OPEN_ITEMS;
+        }
+    } else {
+	if (LSPEC.appURL != NULL)
+	    errexit("application URL (argument of -u) incompatible with matching by -c, -i, -a");
+    }
+
+    if (OPTS.action == ACTION_LAUNCH_URLS && appSpecified)
+        errexit("launching URLs with a given application is not supported; try without -l");
+
+    if (OPTS.action == ACTION_INFO_ITEMS && appSpecified)
+	errexit("can't get information (-f) on item(s) using an application (-u, -c, -i, -a)");
+
+    if (argc == 0 && OPTS.action == ACTION_OPEN && LSPEC.launchFlags & kLSLaunchAndPrint)
+        errexit("print option (-p) must be accompanied by document(s) to print");
+    
+    if (argc != 0) {
+        int i;
+        OSStatus err;
+        CFStringRef argStr;
+        CFURLRef itemURL;
+        LSItemInfoRecord docInfo;
+
+        if (OPTS.action == ACTION_FIND)
+            errexit("application with documents only supported for open or print, not find");
+
+        // handle document/item/URL arguments
+        LSPEC.itemURLs = CFArrayCreateMutable(NULL, argc, NULL);
+        for (i = 0 ; i < argc ; i++) {
+            argStr = NULL;
+            if (strcmp(argv[i], "-") == 0) {
+                TEMPFILE = stdinAsTempFile();
+                itemURL = CFURLCreateFromFileSystemRepresentation(NULL, TEMPFILE, strlen(TEMPFILE), false);
+                LSPEC.launchFlags ^= kLSLaunchAsync;
+            } else {
+                argStr = CFStringCreateWithCString(NULL, argv[i], CFStringGetSystemEncoding());
+                // check for URLs
+                itemURL = normalizedURLFromString(argStr);
+                if (itemURL == NULL && OPTS.action == ACTION_LAUNCH_URLS) {
+                    // check for email addresses
+                    if (strchr(argv[i], '@') != NULL && strchr(argv[i], '/') == NULL)
+                        itemURL = normalizedURLFromPrefixSlack(CFSTR("mailto:"), argStr);
+                    // check for "slack" URLs
+                    if (itemURL == NULL && strchr(argv[i], '.') != NULL && strchr(argv[i], '/') != argv[i])
+                        itemURL = normalizedURLFromPrefixSlack(CFSTR("http://"), argStr);
+                }
+                if (itemURL == NULL) {
+                    // check for file paths
+                    itemURL = CFURLCreateWithFileSystemPath(NULL, argStr, kCFURLPOSIXPathStyle, false);
+                    err = LSCopyItemInfoForURL(itemURL, kLSRequestExtensionFlagsOnly, &docInfo);
+                    if (err != noErr) osstatusexit(err, "unable to locate '%s'", argv[i]);
+                }
+            }
+            CFArrayAppendValue((CFMutableArrayRef)LSPEC.itemURLs, itemURL);
+            // don't CFRelease the itemURL because CFArray doesn't retain it by default
+            if (argStr != NULL) CFRelease(argStr);
+        }
+    }
+}
+
+// 'context' is to match prototype for CFArrayApplierFunction, it's unused
+void printPathFromURL(CFURLRef url, void *context) {
+    CFStringRef scheme, pathOrURL;
+    static char strBuffer[STRBUF_LEN];
+    
+    check(url != NULL && context == NULL);
+
+    scheme = CFURLCopyScheme(url);
+    
+    if (CFEqual(scheme, CFSTR("file")))
+        pathOrURL = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
+    else
+        pathOrURL = CFURLGetString(url);
+
+    strBuffer[0] = '\0';
+    CFStringGetCString(pathOrURL, strBuffer, STRBUF_LEN, CFStringGetSystemEncoding()); // XXX buffer size issues?
+    printf("%s\n", strBuffer);
+    CFRelease(scheme);
+    CFRelease(pathOrURL);
+}
+
+void printDateTime(const char *label, UTCDateTime *utcTime, const char *postLabel, Boolean printIfEmpty) {
+    static Str255 dateStr, timeStr;
+    LocalDateTime localTime;
+    LongDateTime longTime;
+    OSStatus err;
+
+    err = ConvertUTCToLocalDateTime(utcTime, &localTime);
+    if (err == kUTCUnderflowErr) {
+        if (printIfEmpty) printf("\t%s: (not set)\n", label);
+        return;
+    }
+    if (err != noErr) osstatusexit(err, "unable to convert UTC %s date to local", label);
+
+    longTime = localTime.highSeconds;
+    longTime <<= 32;
+    longTime |= localTime.lowSeconds;
+
+    // strings include trailing newlines; strip them.
+    LongDateString(&longTime, shortDate, dateStr, nil); dateStr[dateStr[0] + 1] = '\0';
+    LongTimeString(&longTime, true, timeStr, nil); timeStr[timeStr[0] + 1] = '\0';
+    printf("\t%s: %s %s%s\n", label, dateStr + 1, timeStr + 1, postLabel);
+}
+
+#define DFORMAT(SIZE) ((float)(SIZE) / 1024.)
+
+void printSizes(const char *label, UInt64 logicalSize, UInt64 physicalSize, Boolean printIfZero) {
+    UInt32 bigSize = physicalSize >> 32, littleSize = physicalSize;
+    if (!printIfZero && bigSize == 0 && littleSize == 0) return;
+    printf("\t%s: ", label);
+    if (bigSize == 0) {
+        if (littleSize == 0) {
+            printf("zero bytes on disk (zero bytes used)\n"); return;
+        } else if (littleSize < 1024) printf("%lu bytes", littleSize);
+        else {
+            UInt32 adjSize = littleSize >> 10;
+            if (adjSize < 1024) printf("%.1f KB", DFORMAT(littleSize));
+            else {
+                adjSize >>= 10; littleSize >>= 10;
+                if (adjSize < 1024) printf("%.2f MB", DFORMAT(littleSize));
+                else {
+                    adjSize >>= 10; littleSize >>= 10;
+                    printf("%.2f GB", DFORMAT(littleSize));
+                }
+            }
+        }
+    } else {
+        if (bigSize < 256) printf("%lu GB", bigSize);
+        else {
+            bigSize >>= 2;
+            printf("%lu TB", bigSize);
+        }
+    }
+    printf(" on disk (%llu bytes used)\n", logicalSize);
+        
+}
+
+void printMoreInfoFromURL(CFURLRef url) {
+    FSRef fsr;
+    OSStatus err;
+    FSCatalogInfo fscInfo;
+
+    if (!CFURLGetFSRef(url, &fsr)) return;
+    err = FSGetCatalogInfo(&fsr, kFSCatInfoNodeFlags | kFSCatInfoAllDates | kFSCatInfoDataSizes | kFSCatInfoRsrcSizes | kFSCatInfoValence, &fscInfo, NULL, NULL, NULL);
+    if (err != noErr) osstatusexit(err, "unable to get catalog information for file");
+
+    if (fscInfo.nodeFlags & kFSNodeIsDirectoryMask) {
+        printf("\tcontents: %lu item%s\n", fscInfo.valence, fscInfo.valence != 1 ? "s" : "");
+    } else {
+        printSizes("data fork size", fscInfo.dataLogicalSize, fscInfo.dataPhysicalSize, true);
+        printSizes("rsrc fork size", fscInfo.rsrcLogicalSize, fscInfo.rsrcPhysicalSize, false);
+    }
+
+    if (fscInfo.nodeFlags & (kFSNodeLockedMask | kFSNodeForkOpenMask)) {
+        printf("\tstatus:");
+        if (fscInfo.nodeFlags & kFSNodeLockedMask) {
+            if (fscInfo.nodeFlags & kFSNodeForkOpenMask) printf(" in use,");
+            printf(" locked");
+        } else {
+            printf(" in use");
+        }
+        printf("\n");
+    }
+    
+    printDateTime("created", &fscInfo.createDate, "", true);
+    printDateTime("modified", &fscInfo.contentModDate, "", true);
+    printDateTime("accessed", &fscInfo.accessDate, " [only updated by Mac OS X]", false);
+    printDateTime("backed up", &fscInfo.backupDate, "", false);
+}
+
+// 'context' is to match prototype for CFArrayApplierFunction, it's unused
+void printInfoFromURL(CFURLRef url, void *context) {
+    CFStringRef scheme, pathOrURL, kind;
+    Boolean isRemote;
+    static char strBuffer[STRBUF_LEN], tmpBuffer[STRBUF_LEN];
+    
+    check(url != NULL && context == NULL);
+
+    scheme = CFURLCopyScheme(url);
+    
+    isRemote = !CFEqual(scheme, CFSTR("file"));
+    if (isRemote)
+        pathOrURL = CFURLGetString(url);
+    else
+        pathOrURL = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
+
+    strBuffer[0] = '\0';
+    CFStringGetCString(pathOrURL, strBuffer, STRBUF_LEN, CFStringGetSystemEncoding()); // XXX buffer size issues?
+    if (isRemote)
+        printf("<%s>: URL\n", strBuffer);
+    else {
+        static LSItemInfoRecord info;
+        OSStatus err = LSCopyItemInfoForURL(url, kLSRequestAllInfo, &info);
+        if (err != noErr) osstatusexit(err, "unable to get information about '%s'", strBuffer);
+        
+        printf("%s: ", strBuffer);
+        
+        // modifiers
+        if (info.flags & kLSItemInfoIsInvisible) printf("invisible ");
+        if (info.flags & kLSItemInfoAppIsScriptable) printf("scriptable ");
+        if (info.flags & kLSItemInfoIsNativeApp) printf("Mac OS X ");
+        if (info.flags & kLSItemInfoIsClassicApp) printf("Classic ");
+        
+        // kind
+        if (info.flags & kLSItemInfoIsVolume) printf("volume");
+        else if (info.flags & kLSItemInfoIsApplication) printf("application ");
+        else if (info.flags & kLSItemInfoIsPackage) printf("non-application ");
+        else if (info.flags & kLSItemInfoIsContainer) printf("folder");
+        else if (info.flags & kLSItemInfoIsAliasFile) printf("alias");
+        else if (info.flags & kLSItemInfoIsSymlink) printf("symbolic link");
+        else if (info.flags & kLSItemInfoIsPlainFile) printf("document");
+        else printf("unknown file system entity");
+
+        if (info.flags & kLSItemInfoIsPackage) printf("package ");
+
+        if (info.flags & kLSItemInfoAppPrefersNative) printf("[Carbon, prefers native OS X]");
+        else if (info.flags & kLSItemInfoAppPrefersClassic) printf("[Carbon, prefers Classic]");
+
+        printf("\n");
+        if (!(info.flags & kLSItemInfoIsContainer) || info.flags & kLSItemInfoIsPackage) {
+            tmpBuffer[4] = '\0';
+            strncpy(tmpBuffer, (char *)&info.filetype, 4); printf("\ttype: '%s'", tmpBuffer);
+            strncpy(tmpBuffer, (char *)&info.creator, 4); printf("\tcreator: '%s'\n", tmpBuffer);
+        }
+        if (info.flags & kLSItemInfoIsPackage ||
+        	info.flags & kLSItemInfoIsApplication && info.flags & kLSItemInfoIsNativeApp) {
+        	// a package, or possibly a native app with a 'plst' resource
+            CFBundleRef bundle = CFBundleCreate(NULL, url);
+            CFStringRef bundleID;
+            if (bundle == NULL) { // OS X bug causes this to fail when it shouldn't, so just note it, don't die
+            	if (info.flags & kLSItemInfoIsApplication) printf("\t[can't access CFBundle for application]\n");
+            } else {
+                bundleID = CFBundleGetIdentifier(bundle);
+                if (bundleID != NULL) {
+                    CFStringGetCString(bundleID, tmpBuffer, STRBUF_LEN, CFStringGetSystemEncoding());
+                    printf("\tbundle ID: %s\n", tmpBuffer);
+                }
+                CFRelease(bundle);
+            }
+        }
+        
+        // kind string
+        err = LSCopyKindStringForURL(url, &kind);
+        if (err != noErr) osstatusexit(err, "unable to get kind of '%s'", strBuffer);
+        CFStringGetCString(kind, tmpBuffer, STRBUF_LEN, CFStringGetSystemEncoding());
+        printf("\tkind: %s\n", tmpBuffer);
+        printMoreInfoFromURL(url);
+    }
+    CFRelease(scheme);
+    CFRelease(pathOrURL);
+}
+
+
+void launchURL(CFURLRef url, ICInstance icInst) {
+    CFStringRef urlStr = CFURLGetString(url);
+    static char strBuffer[STRBUF_LEN];
+    long strStart, strEnd;
+    OSStatus err;
+
+    strBuffer[0] = '\0';
+    CFStringGetCString(urlStr, strBuffer, STRBUF_LEN, CFStringGetSystemEncoding()); // XXX buffer size issues?
+    strStart = 0;
+    strEnd = strlen(strBuffer);
+    err = ICLaunchURL(icInst, "\p", strBuffer, strEnd, &strStart, &strEnd);
+    if (err != noErr) {
+        fprintf(stderr, "%s: unable to launch URL <%s>: %s\n", APP_NAME, strBuffer, osstatusstr(err));
+    }
+    
+    CFRelease(urlStr);
+}
+
+int main (int argc, char * const argv[]) {
+    OSStatus err;
+    
+    APP_NAME = argv[0];
+    getargs(argc, argv);
+
+    if (OPTS.action == ACTION_FIND || OPTS.action == ACTION_OPEN) {
+        if (LSPEC.appURL != NULL) goto findOK; // already have an application URL
+	err = LSFindApplicationForInfo(OPTS.creator, OPTS.bundleID, OPTS.name, NULL, &LSPEC.appURL);
+        
+	if (err != noErr) {
+	    if (OPTS.name != NULL && !CFStringHasSuffix(OPTS.name, CFSTR(".app"))) {
+		OPTS.name = CFStringCreateMutableCopy(NULL, CFStringGetLength(OPTS.name) + 4, OPTS.name);
+		CFStringAppend((CFMutableStringRef)OPTS.name, CFSTR(".app"));
+		err = LSFindApplicationForInfo(OPTS.creator, OPTS.bundleID, OPTS.name, NULL, &LSPEC.appURL);
+		if (err == noErr) goto findOK;
+	    }
+	    osstatusexit(err, "can't locate application", argv[1]);
+        findOK: ;
+	}
+    }
+    
+    switch (OPTS.action) {
+    case ACTION_FIND:
+	printPathFromURL(LSPEC.appURL, NULL);
+	break;
+    case ACTION_OPEN:
+	err = LSOpenFromURLSpec(&LSPEC, NULL);
+	if (err != noErr) osstatusexit(err, "can't open application", argv[1]);
+	break;
+    case ACTION_FIND_ITEMS:
+        CFArrayApplyFunction(LSPEC.itemURLs, CFRangeMake(0, CFArrayGetCount(LSPEC.itemURLs)),
+			     (CFArrayApplierFunction) printPathFromURL, NULL);
+	break;
+    case ACTION_OPEN_ITEMS:
+	err = LSOpenFromURLSpec(&LSPEC, NULL);
+	if (err != noErr) osstatusexit(err, "can't open items", argv[1]);
+	break;
+    case ACTION_INFO_ITEMS:
+        CFArrayApplyFunction(LSPEC.itemURLs, CFRangeMake(0, CFArrayGetCount(LSPEC.itemURLs)),
+			     (CFArrayApplierFunction) printInfoFromURL, NULL);
+	break;
+    case ACTION_LAUNCH_URLS:
+    {
+        ICInstance icInst;
+        err = ICStart(&icInst, '????');
+        if (err != noErr) osstatusexit(err, "can't initialize Internet Config", argv[1]);
+        CFArrayApplyFunction(LSPEC.itemURLs, CFRangeMake(0, CFArrayGetCount(LSPEC.itemURLs)),
+                             (CFArrayApplierFunction) launchURL, icInst);
+        ICStop(icInst);
+        break;
+    }
+    }
+
+    if (TEMPFILE != NULL) {
+        // the application may take a while to finish opening the temporary file
+        daemon(0, 0);
+        sleep(60);
+        unlink(TEMPFILE);
+    }
+
+    return 0;
+}
Index: releases/launch/1.0b1/openUp.c
===================================================================
--- releases/launch/1.0b1/openUp.c	(revision 57)
+++ releases/launch/1.0b1/openUp.c	(revision 57)
@@ -0,0 +1,109 @@
+/*
+  * Copyright (c) 2001 Apple Computer, Inc. All rights reserved.
+  *
+  * @APPLE_LICENSE_HEADER_START@
+  *
+  * The contents of this file constitute Original Code as defined in and
+  * are subject to the Apple Public Source License Version 1.1 (the
+  * "License").  You may not use this file except in compliance with the
+  * License.  Please obtain a copy of the License at
+  * http://www.apple.com/publicsource and read it before using this file.
+  *
+  * This Original Code and all software distributed under the License are
+  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+  * License for the specific language governing rights and limitations
+  * under the License.
+  *
+  * @APPLE_LICENSE_HEADER_END@
+  */
+/*
+  * Shantonu Sen <ssen@apple.com>
+  * openUp.c - program to set the "first-open-window" field of a volume
+  *
+  * Get the directory ID for the first argument, and set it as word 2
+  * of the Finder Info fields for the volume it lives on
+  *
+  * cc -o openUp openUp.c
+  * Usage: openUp /Volumes/Foo/OpenMe/
+  *
+  */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/attr.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+
+struct directoryinfo {
+	unsigned long length;
+	u_int32_t dirid;
+};
+
+struct volumeinfo {
+	unsigned long length;
+	u_int32_t  finderinfo[8];
+};
+
+const char *APP_NAME;
+
+void errnoexit(const char *fmt, ...) {
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s: ", APP_NAME);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, " (%s)\n", strerror(errno));
+	exit(1);
+}
+
+int main(int argc, char *argv[]) {
+	
+	char *path = NULL;
+	struct attrlist alist;
+	struct directoryinfo dirinfo;
+	struct volumeinfo volinfo;
+	struct statfs sfs;
+	int err;
+	
+	APP_NAME = argv[0];
+	
+	if (argc != 2) {
+		fprintf(stderr, "usage: %s <path to folder whose window should open when volume is mounted>\n",
+				APP_NAME);
+		exit(1);
+	}
+	
+	path = argv[1];
+	
+	bzero(&alist, sizeof(alist));
+	alist.bitmapcount = 5;
+	alist.commonattr = ATTR_CMN_OBJID;
+	
+	if (getattrlist(path, &alist, &dirinfo, sizeof(dirinfo), 0))
+		errnoexit("getattrlist on path failed");
+	
+	printf("directory id: %lu\n", dirinfo.dirid);
+	
+	if (statfs(path, &sfs))
+		errnoexit("statfs failed");
+	
+	printf("mountpoint: %s\n", sfs.f_mntonname);
+	
+	alist.commonattr = ATTR_CMN_FNDRINFO;
+	alist.volattr = ATTR_VOL_INFO;
+	
+	if (getattrlist(sfs.f_mntonname, &alist, &volinfo, sizeof(volinfo), 0))
+		errnoexit("getattrlist on mount point failed");
+	volinfo.finderinfo[2] = dirinfo.dirid;
+	if (setattrlist(sfs.f_mntonname, &alist, volinfo.finderinfo,
+		sizeof(volinfo.finderinfo), 0))
+		errnoexit("setattrlist on mount point failed");
+	
+	return 0;
+
+}
+
Index: releases/launch/1.0b1/package-launch.sh
===================================================================
--- releases/launch/1.0b1/package-launch.sh	(revision 57)
+++ releases/launch/1.0b1/package-launch.sh	(revision 57)
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+set -x -v
+
+cd launch && \
+find . -name \*~ -exec rm '{}' \; && \
+pbxbuild && \ 
+SetFile -c 'R*ch' -t 'TEXT' README VERSION && \
+strip build/launch && \
+sudo /usr/bin/install -c build/launch /usr/local/bin && \
+rm -rf build/launch.build build/intermediates build/.gdb_history && \
+VERSION=`cat VERSION` TARBALL="launch-$VERSION.tar.gz" && \
+DMG="launch-$VERSION.dmg" VOL="launch $VERSION" MOUNTPOINT="/Volumes/$VOL" && \
+cd .. && \
+rm -f launch-$VERSION $TARBALL $DMG && \
+ln -s launch launch-$VERSION && \
+tar --exclude=.DS_Store -zchf launch-$VERSION.tar.gz launch-$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 
