Index: trunk/Cocoa/F-Script Anywhere/Source/Bundle Loader-Info.plist
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/Bundle Loader-Info.plist	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/Bundle Loader-Info.plist	(revision 153)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>SCPatchLoader</string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>net.sabi.FScriptAnywhereLoader</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string></string>
+	<key>CFBundleSignature</key>
+	<string>FSAL</string>
+	<key>CFBundleVersion</key>
+	<string>1.2b1</string>
+</dict>
+</plist>
Index: trunk/Cocoa/F-Script Anywhere/Source/Bundle-Info.plist
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/Bundle-Info.plist	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/Bundle-Info.plist	(revision 153)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>F-Script Anywhere</string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>net.sabi.FScriptAnywhere</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string></string>
+	<key>CFBundleSignature</key>
+	<string>FSAB</string>
+	<key>CFBundleVersion</key>
+	<string>1.2b1</string>
+</dict>
+</plist>
Index: trunk/Cocoa/F-Script Anywhere/Source/DeVercruesseProcess.m
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/DeVercruesseProcess.m	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/DeVercruesseProcess.m	(revision 153)
@@ -185,5 +185,5 @@
    }
 
-    return name ? name : @"Çunknown nameÈ";
+    return name ? name : NSLocalizedString(@"<<unknown application>>", "Name used when application name cannot be determined");
 }
 
@@ -265,5 +265,5 @@
     {
         identifier = [[NSString alloc] initWithFormat:@"%@%.8X%.8X",
-            [self bundleIdentifier], [self type] ? type : 'APPL', [self creator] ? creator : '????'];
+            [self bundleIdentifier], [self type] ? type : 'APPL', [self creator] ? creator : '\?\?\?\?'];
     }
     
Index: trunk/Cocoa/F-Script Anywhere/Source/English.lproj/MainMenu.nib/classes.nib
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/English.lproj/MainMenu.nib/classes.nib	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/English.lproj/MainMenu.nib/classes.nib	(revision 153)
@@ -2,8 +2,8 @@
     IBClasses = (
         {
-            ACTIONS = {installBundleInSelectedApp = id; terminate = id; }; 
+            ACTIONS = {installBundleInSelectedApp = id; }; 
             CLASS = FSAApp; 
             LANGUAGE = ObjC; 
-            OUTLETS = {appList = FSAAppList; appListPanel = NSPanel; }; 
+            OUTLETS = {appList = FSAAppList; appListWindow = NSWindow; }; 
             SUPERCLASS = NSApplication; 
         }, 
Index: trunk/Cocoa/F-Script Anywhere/Source/English.lproj/MainMenu.nib/info.nib
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/English.lproj/MainMenu.nib/info.nib	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/English.lproj/MainMenu.nib/info.nib	(revision 153)
@@ -4,19 +4,19 @@
 <dict>
 	<key>IBDocumentLocation</key>
-	<string>153 16 356 240 0 0 1600 1178 </string>
+	<string>113 10 356 240 0 0 1280 832 </string>
 	<key>IBEditorPositions</key>
 	<dict>
 		<key>29</key>
-		<string>69 252 213 44 0 0 1600 1178 </string>
+		<string>53 175 213 44 0 0 1280 832 </string>
 	</dict>
 	<key>IBFramework Version</key>
-	<string>286.0</string>
+	<string>349.0</string>
 	<key>IBOpenObjects</key>
 	<array>
+		<integer>195</integer>
 		<integer>29</integer>
-		<integer>195</integer>
 	</array>
 	<key>IBSystem Version</key>
-	<string>6D52</string>
+	<string>7D24</string>
 </dict>
 </plist>
Index: trunk/Cocoa/F-Script Anywhere/Source/F-Script Anywhere.pbproj/nicholas.pbxuser
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/F-Script Anywhere.pbproj/nicholas.pbxuser	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/F-Script Anywhere.pbproj/nicholas.pbxuser	(revision 153)
@@ -1,717 +1,3099 @@
 // !$*UTF8*$!
 {
-	103DFC1B016C16650C000109 = {
-		activeExec = 0;
-	};
-	108927070180B1F40C000084 = {
-		uiCtxt = {
-			sepNavWindowFrame = "{{35, 641}, {750, 502}}";
+	089C165DFE840E0CC02AAC07 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 372}}";
+			sepNavSelRange = "{254, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 372}}";
+		};
+	};
+	103DFC16016C12D80C000109 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 696}}";
+			sepNavSelRange = "{996, 17}";
+			sepNavVisRect = "{{0, 308}, {688, 388}}";
+			sepNavWindowFrame = "{{291, 73}, {750, 502}}";
+		};
+	};
+	103DFC17016C12D80C000109 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {704, 3767}}";
+			sepNavSelRange = "{1092, 0}";
+			sepNavVisRect = "{{0, 154}, {704, 751}}";
+			sepNavWindowFrame = "{{197, 43}, {745, 789}}";
+		};
+	};
+	103DFC20016C16E20C000109 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {712, 935}}";
+			sepNavSelRange = "{2459, 0}";
+			sepNavVisRect = "{{0, 551}, {712, 372}}";
+			sepNavWindowFrame = "{{15, 325}, {750, 502}}";
 		};
 	};
 	29B97313FDCFA39411CA2CEA = {
 		activeBuildStyle = 4A9504CCFFE6A4B311CA0CBA;
-		activeExecutable = F59279F301FEA34701AEEC37;
-		activeTarget = 29B97326FDCFA39411CA2CEA;
+		activeExecutable = E1EE9A310575769600F2D92C;
+		activeTarget = E1EE9A010575769600F2D92C;
 		addToTargets = (
-			103DFC1B016C16650C000109,
+			E1EE9A010575769600F2D92C,
 		);
 		breakpoints = (
 			F5184FB202DF90C801AEEDB1,
 			F57D63130318A6D601AEEDB1,
+			E1934FC80575A43D00BC2092,
+			E10BF908057718A40008FEE7,
 		);
+		codeSenseManager = E1AFE00B05753C12008B0109;
 		executables = (
-			F59279F301FEA34701AEEC37,
+			E1EE9A310575769600F2D92C,
 		);
 		perUserDictionary = {
-			PBXPerProjectTemplateStateSaveDate = 55866266;
-			"PBXTemplateGeometry-F5314676015831810DCA290F" = {
-				ContentSize = "{618, 257}";
-				LeftSlideOut = {
-					Collapsed = NO;
-					Frame = "{{0, 23}, {618, 234}}";
-					Split0 = {
-						ActiveTab = 2;
-						Collapsed = YES;
-						Frame = "{{0, 0}, {618, 234}}";
-						Split0 = {
-							Frame = "{{1e+06, 1e+06}, {618, 0}}";
-						};
-						SplitCount = 1;
-						Tab0 = {
-							Debugger = {
-								Collapsed = NO;
-								Frame = "{{0, 0}, {952, 321}}";
-								Split0 = {
-									Frame = "{{0, 24}, {952, 297}}";
-									Split0 = {
-										Frame = "{{0, 0}, {468, 297}}";
-									};
-									Split1 = {
-										DebugVariablesTableConfiguration = (
-											Name,
-											126.803,
-											Value,
-											150.074,
-											Summary,
-											172.123,
-										);
-										Frame = "{{477, 0}, {475, 297}}";
-									};
-									SplitCount = 2;
-								};
-								SplitCount = 1;
-								Tab0 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								Tab1 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								TabCount = 2;
-								TabsVisible = YES;
-							};
-							Frame = "{{0, 0}, {952, 321}}";
-							LauncherConfigVersion = 7;
-						};
-						Tab1 = {
-							Frame = "{{0, 0}, {781, 452}}";
-							LauncherConfigVersion = 3;
-							Runner = {
-								Frame = "{{0, 0}, {781, 452}}";
-							};
-						};
-						Tab2 = {
-							BuildMessageFrame = "{{0, 0}, {620, 123}}";
-							BuildTranscriptFrame = "{{0, 132}, {620, 98}}";
-							Frame = "{{0, 0}, {618, 228}}";
-						};
-						Tab3 = {
-							Frame = "{{0, 0}, {612, 295}}";
-						};
-						TabCount = 4;
-						TabsVisible = NO;
+			PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					360.2085,
+					345.5991,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXBookmarksDataSource_LocationID,
+					PBXBookmarksDataSource_NameID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					439.8799,
+					242.2085,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXErrorsWarningsDataSource_TypeID,
+					PBXErrorsWarningsDataSource_MessageID,
+					PBXErrorsWarningsDataSource_LocationID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					22,
+					683.7974,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXExecutablesDataSource_ActiveFlagID,
+					PBXExecutablesDataSource_NameID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					424,
+					20,
+					78,
+					43,
+					43,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+					PBXFileDataSource_Target_ColumnID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					351.2974,
+					354.2085,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFindDataSource_MessageID,
+					PBXFindDataSource_LocationID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					20,
+					385,
+					20,
+					63,
+					43,
+					43,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_SCM_ColumnID,
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+					PBXFileDataSource_Target_ColumnID,
+				);
+			};
+			PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = 1;
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					362,
+					68,
+					20,
+					68,
+					43,
+					43,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXTargetDataSource_PrimaryAttribute,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+					PBXFileDataSource_Target_ColumnID,
+				);
+			};
+			PBXPerProjectTemplateStateSaveDate = 98318185;
+			PBXPrepackagedSmartGroups_v2 = (
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					activationKey = OldTargetSmartGroup;
+					clz = PBXTargetSmartGroup;
+					description = "Displays all targets of the project.";
+					globalID = 1C37FABC04509CD000000102;
+					name = Targets;
+					preferences = {
+						image = Targets;
 					};
-					SplitCount = 1;
-					Tab0 = {
-						Frame = "{{0, 0}, {300, 533}}";
-						GroupTreeTableConfiguration = (
-							TargetStatusColumn,
-							18,
-							MainColumn,
-							267,
-						);
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXTargetSmartGroup2;
+					description = "Displays all targets of the project as well as nested build phases.";
+					globalID = 1C37FBAC04509CD000000102;
+					name = Targets;
+					preferences = {
+						image = Targets;
 					};
-					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,
-						);
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXExecutablesSmartGroup;
+					description = "Displays all executables of the project.";
+					globalID = 1C37FAAC04509CD000000102;
+					name = Executables;
+					preferences = {
+						image = Executable;
 					};
-					Tab2 = {
-						Frame = "{{0, 0}, {200, 100}}";
+				},
+				{
+					" PBXTransientLocationAtTop " = bottom;
+					absolutePathToBundle = "";
+					clz = PBXErrorsWarningsSmartGroup;
+					description = "Displays files with errors or warnings.";
+					globalID = 1C08E77C0454961000C914BD;
+					name = "Errors and Warnings";
+					preferences = {
+						fnmatch = "";
+						image = WarningsErrors;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
 					};
-					Tab3 = {
-						Frame = "{{0, 0}, {200, 100}}";
-						TargetTableConfiguration = (
-							ActiveObject,
-							16,
-							ObjectNames,
-							202.296,
-						);
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = 1CC0EA4004350EF90044410B;
+					name = "Implementation Files";
+					preferences = {
+						canSave = 1;
+						fnmatch = "";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "?*\\.[mcMC]";
+						root = "<PROJECT>";
 					};
-					Tab4 = {
-						BreakpointsTreeTableConfiguration = (
-							breakpointColumn,
-							197,
-							enabledColumn,
-							31,
-						);
-						Frame = "{{0, 0}, {250, 100}}";
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "This group displays Interface Builder NIB Files.";
+					globalID = 1CC0EA4004350EF90041110B;
+					name = "NIB Files";
+					preferences = {
+						canSave = 1;
+						fnmatch = "*.nib";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
 					};
-					TabCount = 5;
-					TabsVisible = NO;
-				};
-				StatusViewVisible = YES;
-				Template = F5314676015831810DCA290F;
-				ToolbarVisible = YES;
-				WindowLocation = "{453, 592}";
-			};
-			"PBXTemplateGeometry-F5534CB2020F3F8A0DCA290F" = {
-				ContentSize = "{594, 303}";
-				LeftSlideOut = {
-					Collapsed = NO;
-					Frame = "{{0, 23}, {594, 280}}";
-					Split0 = {
-						ActiveTab = 1;
-						Collapsed = YES;
-						Frame = "{{0, 0}, {594, 280}}";
-						Split0 = {
-							Frame = "{{1e+06, 1e+06}, {594, 0}}";
-						};
-						SplitCount = 1;
-						Tab0 = {
-							Debugger = {
-								Collapsed = NO;
-								Frame = "{{0, 0}, {804, 321}}";
-								Split0 = {
-									Frame = "{{0, 24}, {804, 297}}";
-									Split0 = {
-										Frame = "{{0, 0}, {394, 297}}";
-									};
-									Split1 = {
-										DebugVariablesTableConfiguration = (
-											Name,
-											123,
-											Value,
-											85,
-											Summary,
-											167.123,
-										);
-										Frame = "{{403, 0}, {401, 297}}";
-									};
-									SplitCount = 2;
-								};
-								SplitCount = 1;
-								Tab0 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								Tab1 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								TabCount = 2;
-								TabsVisible = YES;
-							};
-							Frame = "{{0, 0}, {804, 321}}";
-							LauncherConfigVersion = 7;
-						};
-						Tab1 = {
-							Frame = "{{0, 0}, {594, 274}}";
-							LauncherConfigVersion = 3;
-							Runner = {
-								Frame = "{{0, 0}, {594, 274}}";
-							};
-						};
-						Tab2 = {
-							BuildMessageFrame = "{{0, 0}, {806, 237}}";
-							BuildTranscriptFrame = "{{0, 246}, {806, 3}}";
-							Frame = "{{0, 0}, {804, 247}}";
-						};
-						Tab3 = {
-							Frame = "{{0, 0}, {612, 295}}";
-						};
-						TabCount = 4;
-						TabsVisible = NO;
+				},
+				{
+					PBXTransientLocationAtTop = no;
+					absolutePathToBundle = "";
+					clz = PBXFindSmartGroup;
+					description = "Displays Find Results.";
+					globalID = 1C37FABC05509CD000000102;
+					name = "Find Results";
+					preferences = {
+						image = spyglass;
 					};
-					SplitCount = 1;
-					Tab0 = {
-						Frame = "{{0, 0}, {300, 533}}";
-						GroupTreeTableConfiguration = (
-							TargetStatusColumn,
-							18,
-							MainColumn,
-							267,
-						);
+				},
+				{
+					PBXTransientLocationAtTop = no;
+					absolutePathToBundle = "";
+					clz = PBXBookmarksSmartGroup;
+					description = "Displays Project Bookmarks.";
+					globalID = 1C37FABC05539CD112110102;
+					name = Bookmarks;
+					preferences = {
+						image = Bookmarks;
 					};
-					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,
-						);
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = XCSCMSmartGroup;
+					description = "Displays files with interesting SCM status.";
+					globalID = E2644B35053B69B200211256;
+					name = SCM;
+					preferences = {
+						image = PBXRepository;
+						isLeaf = 0;
 					};
-					Tab2 = {
-						Frame = "{{0, 0}, {200, 100}}";
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXSymbolsSmartGroup;
+					description = "Displays all symbols for the project.";
+					globalID = 1C37FABC04509CD000100104;
+					name = "Project Symbols";
+					preferences = {
+						image = ProjectSymbols;
+						isLeaf = 1;
 					};
-					Tab3 = {
-						Frame = "{{0, 0}, {200, 386}}";
-						TargetTableConfiguration = (
-							ActiveObject,
-							16,
-							ObjectNames,
-							202.296,
-						);
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = PBXTemplateMarker;
+					name = "Simple Filter SmartGroup";
+					preferences = {
+						canSave = 1;
+						fnmatch = "*.nib";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
 					};
-					Tab4 = {
-						BreakpointsTreeTableConfiguration = (
-							breakpointColumn,
-							197,
-							enabledColumn,
-							31,
-						);
-						Frame = "{{0, 0}, {250, 386}}";
-					};
-					TabCount = 5;
-					TabsVisible = NO;
-				};
-				StatusViewVisible = YES;
-				Template = F5534CB2020F3F8A0DCA290F;
-				ToolbarVisible = YES;
-				WindowLocation = "{52, 554}";
-			};
-			"PBXTemplateGeometry-F5CA7EC8015C06940DCA290F" = {
-				ContentSize = "{705, 569}";
-				LeftSlideOut = {
-					Collapsed = NO;
-					Frame = "{{0, 0}, {705, 569}}";
-					Split0 = {
-						Collapsed = NO;
-						Frame = "{{0, 0}, {705, 569}}";
-						Split0 = {
-							Frame = "{{0, 0}, {705, 569}}";
-						};
-						SplitCount = 1;
-						Tab0 = {
-							Debugger = {
-								Collapsed = NO;
-								Frame = "{{0, 0}, {484, 208}}";
-								Split0 = {
-									Frame = "{{0, 24}, {484, 184}}";
-									Split0 = {
-										Frame = "{{0, 0}, {236, 184}}";
-									};
-									Split1 = {
-										DebugVariablesTableConfiguration = (
-											Name,
-											123,
-											Value,
-											85,
-											Summary,
-											62.123,
-										);
-										Frame = "{{245, 0}, {239, 184}}";
-									};
-									SplitCount = 2;
-								};
-								SplitCount = 1;
-								Tab0 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								Tab1 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								TabCount = 2;
-								TabsVisible = YES;
-							};
-							Frame = "{{0, 0}, {484, 208}}";
-							LauncherConfigVersion = 7;
-						};
-						Tab1 = {
-							Frame = "{{0, 0}, {522, 208}}";
-							LauncherConfigVersion = 3;
-							Runner = {
-								Frame = "{{0, 0}, {522, 208}}";
-							};
-						};
-						Tab2 = {
-							BuildMessageFrame = "{{0, 0}, {809, 410}}";
-							BuildTranscriptFrame = "{{0, 419}, {809, 119}}";
-							Frame = "{{0, 0}, {807, 536}}";
-						};
-						Tab3 = {
-							Frame = "{{0, 0}, {612, 295}}";
-						};
-						TabCount = 4;
-						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}, {222, 536}}";
-						TargetTableConfiguration = (
-							ActiveObject,
-							16,
-							ObjectNames,
-							202.296,
-						);
-					};
-					Tab4 = {
-						BreakpointsTreeTableConfiguration = (
-							breakpointColumn,
-							197,
-							enabledColumn,
-							31,
-						);
-						Frame = "{{0, 0}, {250, 528}}";
-					};
-					TabCount = 5;
-					TabsVisible = NO;
-				};
-				StatusViewVisible = NO;
-				Template = F5CA7EC8015C06940DCA290F;
-				ToolbarVisible = YES;
-				WindowLocation = "{11, 351}";
-			};
-			"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 = {
-							Debugger = {
-								Collapsed = NO;
-								Frame = "{{0, 0}, {484, 208}}";
-								Split0 = {
-									Frame = "{{0, 24}, {484, 184}}";
-									Split0 = {
-										Frame = "{{0, 0}, {236, 184}}";
-									};
-									Split1 = {
-										DebugVariablesTableConfiguration = (
-											Name,
-											123,
-											Value,
-											85,
-											Summary,
-											62.123,
-										);
-										Frame = "{{245, 0}, {239, 184}}";
-									};
-									SplitCount = 2;
-								};
-								SplitCount = 1;
-								Tab0 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								Tab1 = {
-									Frame = "{{0, 0}, {100, 50}}";
-								};
-								TabCount = 2;
-								TabsVisible = YES;
-							};
-							Frame = "{{0, 0}, {484, 208}}";
-							LauncherConfigVersion = 7;
-						};
-						Tab1 = {
-							Frame = "{{0, 0}, {664, 208}}";
-							LauncherConfigVersion = 3;
-							Runner = {
-								Frame = "{{0, 0}, {664, 208}}";
-							};
-						};
-						Tab2 = {
-							BuildMessageFrame = "{{0, 0}, {666, 43}}";
-							BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
-							Frame = "{{0, 0}, {664, 50}}";
-						};
-						Tab3 = {
-							Frame = "{{0, 0}, {612, 295}}";
-						};
-						TabCount = 4;
-						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;
-				};
-				StatusViewVisible = NO;
-				Template = F5CA7ECB015C094F0DCA290F;
-				ToolbarVisible = NO;
-				WindowLocation = "{48, 349}";
-			};
-			PBXWorkspaceContents = (
+				},
 				{
-					LeftSlideOut = {
-						Split0 = {
-							Split0 = {
-								NavCount = 1;
-								NavGeometry0 = {
-									Frame = "{{0, 0}, {150, 530}}";
-									NavBarVisible = YES;
-								};
-							};
-							SplitCount = 1;
-							Tab0 = {
-								Debugger = {
-									Split0 = {
-										SplitCount = 2;
-									};
-									SplitCount = 1;
-									TabCount = 2;
-								};
-								LauncherConfigVersion = 7;
-							};
-							Tab1 = {
-								LauncherConfigVersion = 3;
-								Runner = {
-								};
-							};
-							TabCount = 4;
-						};
-						SplitCount = 1;
-						Tab1 = {
-							OptionsSetName = "Hierarchy, all classes";
-						};
-						TabCount = 5;
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = PBXTemplateMarker;
+					name = "Simple Regular Expression SmartGroup";
+					preferences = {
+						canSave = 1;
+						fnmatch = "";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "?*\\.[mcMC]";
+						root = "<PROJECT>";
 					};
 				},
 			);
+			PBXWorkspaceContents = (
+				{
+					PBXProjectWorkspaceModule_StateKey_Rev39 = {
+						PBXProjectWorkspaceModule_DEGV_Geometry = {
+							_collapsingFrameDimension = 0;
+							_indexOfCollapsedView = 0;
+							_percentageOfCollapsedView = 0;
+							isCollapsed = yes;
+							sizes = (
+								"{{0, 0}, {691, 118}}",
+								"{{0, 118}, {691, 593}}",
+							);
+						};
+						PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = {
+							BoundsStr = "{{0, 0}, {676, 784}}";
+							Rows = (
+								0,
+							);
+							VisibleRectStr = "{{0, 0}, {676, 101}}";
+						};
+						PBXProjectWorkspaceModule_EditorOpen = true;
+						PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
+							PBXSplitModuleInNavigatorKey = {
+								Split0 = {
+									bookmark = E11F415E05DC761800B5B0F5;
+									history = (
+										E1EE997B0575715D00F2D92C,
+										E1EE997D0575715D00F2D92C,
+										E1EE997E0575715D00F2D92C,
+										E1EE99860575715D00F2D92C,
+										E1EE998E0575715D00F2D92C,
+										E1EE998F0575715D00F2D92C,
+										E1EE99900575715D00F2D92C,
+										E1934FEB0575A9B700BC2092,
+										E1D653B805768C630054F5D1,
+										E1D653BD05768C630054F5D1,
+										E1D654190576C1480054F5D1,
+										E1D654560576C6A60054F5D1,
+										E1D654770576D6EC0054F5D1,
+										E1D654780576D6EC0054F5D1,
+										E1D654790576D6EC0054F5D1,
+										E1E114CB057717CA004FA8D9,
+										E1E114CC057717CA004FA8D9,
+										E1F3DF7C0579164100E952A5,
+										E1F3DF820579164100E952A5,
+										E1F3DFCE0579C32900E952A5,
+										E1F3DFCF0579C32900E952A5,
+										E1F3DFD10579C32900E952A5,
+										E1F3DFD20579C32900E952A5,
+										E1F3DFD40579C32900E952A5,
+										E1F3DFD60579C32900E952A5,
+										E1F3E021057A53D100E952A5,
+										E1F3E033057A580C00E952A5,
+										E1839B9705A0D11500E61119,
+										E1E4A97205A282A50097D040,
+										E1E4AA1505A28F4D0097D040,
+										E1E4AA1705A28F4D0097D040,
+										E1D6B28A05A306D9003838B0,
+										E1D6B59305A31C70003838B0,
+										E1D6B5AB05A31D60003838B0,
+										E1D6B61D05A3241D003838B0,
+										E1D6B63305A3259F003838B0,
+										E1D6B66605A4589E003838B0,
+										E1D6B66905A4589E003838B0,
+										E1D6B68B05A45C17003838B0,
+										E1D6B6A205A4AA54003838B0,
+										E14C18C005A4F14C000D4AF3,
+										E14C18C105A4F14C000D4AF3,
+										E14C18C605A4F14C000D4AF3,
+										E14C19B505A72716000D4AF3,
+										E14C19B605A72716000D4AF3,
+										E14C19B705A72716000D4AF3,
+										E14C19B805A72716000D4AF3,
+										E14C19BD05A72716000D4AF3,
+										E14C19C105A72716000D4AF3,
+										E14C19C205A72716000D4AF3,
+										E14C19C305A72716000D4AF3,
+										E14C19C405A72716000D4AF3,
+										E14C19C505A72716000D4AF3,
+										E14C19E205A72A28000D4AF3,
+										E14C19E405A72A28000D4AF3,
+										E14C1C3305A75E73000D4AF3,
+										E14C1C3505A75E73000D4AF3,
+										E14C1C4E05A7642F000D4AF3,
+										E14C1E6905A7CB3F000D4AF3,
+										E14C1E6A05A7CB3F000D4AF3,
+										E14C1E6B05A7CB3F000D4AF3,
+										E14C1E6E05A7CB3F000D4AF3,
+										E14C1E7205A7CB3F000D4AF3,
+										E14C1E7505A7CB3F000D4AF3,
+										E14C1E7C05A7CB3F000D4AF3,
+										E14C1EA105A7CDD7000D4AF3,
+										E14C1EEC05A917F6000D4AF3,
+										E14C1EED05A917F6000D4AF3,
+										E16E1322C5B038BE007EAD5F,
+										E16E1323C5B038BE007EAD5F,
+										E16E1326C5B038BE007EAD5F,
+										E16E132CC5B038BE007EAD5F,
+										E16E132DC5B038BE007EAD5F,
+										E16E1332C5B038BE007EAD5F,
+										E16E134FC5B038BE007EAD5F,
+										E16E1350C5B038BE007EAD5F,
+										E16E1351C5B038BE007EAD5F,
+										E16E1353C5B038BE007EAD5F,
+										E16E1354C5B038BE007EAD5F,
+										E16E1357C5B038BE007EAD5F,
+										E16E137CC5B038BE007EAD5F,
+										E16E137EC5B038BE007EAD5F,
+										E16E137FC5B038BE007EAD5F,
+										E16E1380C5B038BE007EAD5F,
+										E16E1381C5B038BE007EAD5F,
+										E16E1384C5B038BE007EAD5F,
+										E16E1385C5B038BE007EAD5F,
+										E16E1386C5B038BE007EAD5F,
+										E16E1388C5B038BE007EAD5F,
+										E16E1389C5B038BE007EAD5F,
+										E1FD00D105B90B80001DABE0,
+										E1FD00DC05B90C38001DABE0,
+										E1FD00E505B90C9C001DABE0,
+										E1FD00E805B90C9C001DABE0,
+										E1FD00F805B911A8001DABE0,
+										E1FD00FB05B911A8001DABE0,
+										E1FD00FC05B911A8001DABE0,
+										E1FD00FD05B911A8001DABE0,
+										E1FD011E05B912F0001DABE0,
+										E1FD011F05B912F0001DABE0,
+										E1FD012005B912F0001DABE0,
+										E1FD012105B912F0001DABE0,
+										E1FD012205B912F0001DABE0,
+										E1FD012305B912F0001DABE0,
+										E1FD012405B912F0001DABE0,
+										E1FD015805B91B83001DABE0,
+										E1FD015905B91B83001DABE0,
+										E1FD015A05B91B83001DABE0,
+										E1FD015B05B91B83001DABE0,
+										E1FD015C05B91B83001DABE0,
+										E1FD015D05B91B83001DABE0,
+										E16A747F05C25E1F009B66A0,
+										E16A748105C25E1F009B66A0,
+									);
+									prevStack = (
+										E1AFE01005753C9C008B0109,
+										E1AFE02805753CFC008B0109,
+										E1EE98F40575684200F2D92C,
+										E1EE99950575715D00F2D92C,
+										E1EE999E0575715D00F2D92C,
+										E1EE99A20575715D00F2D92C,
+										E1EE99B30575715D00F2D92C,
+										E1EE99B80575715D00F2D92C,
+										E1EE99BF0575715D00F2D92C,
+										E1EE99C00575715D00F2D92C,
+										E1EE99C10575715D00F2D92C,
+										E1EE99C40575715D00F2D92C,
+										E1D653C605768C630054F5D1,
+										E1D653D405768C630054F5D1,
+										E1D653F605768C8F0054F5D1,
+										E1D6541C0576C1480054F5D1,
+										E1F3DF860579164100E952A5,
+										E1E4AA0205A28C300097D040,
+										E1E4AA0405A28C300097D040,
+										E1E4AA2505A28F4D0097D040,
+										E1E4AA2705A28F4D0097D040,
+										E1D6B5B305A31D60003838B0,
+										E1D6B5B405A31D60003838B0,
+										E1D6B5B605A31D60003838B0,
+										E1D6B5B705A31D60003838B0,
+										E1D6B6A805A4AA54003838B0,
+										E14C18F605A50784000D4AF3,
+										E14C19CA05A72716000D4AF3,
+										E14C19CC05A72716000D4AF3,
+										E14C19CD05A72716000D4AF3,
+										E14C1C5305A7642F000D4AF3,
+										E14C1C8605A77322000D4AF3,
+										E14C1E8305A7CB3F000D4AF3,
+										E14C1E8805A7CB3F000D4AF3,
+										E14C1E8A05A7CB3F000D4AF3,
+										E14C1EA605A7CDD7000D4AF3,
+										E14C1EB805A7CF6F000D4AF3,
+										E16E133BC5B038BE007EAD5F,
+										E16E134CC5B038BE007EAD5F,
+										E16E135CC5B038BE007EAD5F,
+										E16E135DC5B038BE007EAD5F,
+										E16E135EC5B038BE007EAD5F,
+										E16E135FC5B038BE007EAD5F,
+										E16E1365C5B038BE007EAD5F,
+										E16E1392C5B038BE007EAD5F,
+										E16E1393C5B038BE007EAD5F,
+										E16E1394C5B038BE007EAD5F,
+										E16E1395C5B038BE007EAD5F,
+										E16E1396C5B038BE007EAD5F,
+										E13879BB05B0E18A00ED3C7C,
+										E1FD00DF05B90C38001DABE0,
+										E1FD00EA05B90C9C001DABE0,
+										E1FD010605B911A8001DABE0,
+										E1FD010805B911A8001DABE0,
+										E1FD012605B912F0001DABE0,
+										E1FD015F05B91B83001DABE0,
+										E1FD016005B91B83001DABE0,
+										E1FD016305B91B83001DABE0,
+										E1FD016505B91B83001DABE0,
+									);
+								};
+								SplitCount = 1;
+							};
+						};
+						PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+							PBXProjectWorkspaceModule_SGTM_Geometry = {
+								_collapsingFrameDimension = 0;
+								_indexOfCollapsedView = 0;
+								_percentageOfCollapsedView = 0;
+								sizes = (
+									"{{0, 0}, {180, 711}}",
+									"{{180, 0}, {691, 711}}",
+								);
+							};
+						};
+						PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {691, 118}}";
+						PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 118}, {691, 593}}";
+						PBXProjectWorkspaceModule_OldSuperviewFrame = "{{180, 0}, {691, 711}}";
+						PBXProjectWorkspaceModule_SGTM = {
+							PBXBottomSmartGroupGIDs = (
+								1C37FBAC04509CD000000102,
+								1C37FAAC04509CD000000102,
+								1C08E77C0454961000C914BD,
+								1C37FABC05509CD000000102,
+								1C37FABC05539CD112110102,
+								E2644B35053B69B200211256,
+								1C37FABC04509CD000100104,
+								1CC0EA4004350EF90044410B,
+								1CC0EA4004350EF90041110B,
+							);
+							PBXSmartGroupTreeModuleColumnData = {
+								PBXSmartGroupTreeModuleColumnWidthsKey = (
+									163,
+								);
+								PBXSmartGroupTreeModuleColumnsKey_v4 = (
+									MainColumn,
+								);
+							};
+							PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
+								PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
+									29B97314FDCFA39411CA2CEA,
+									1C37FBAC04509CD000000102,
+								);
+								PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
+									(
+										10,
+										9,
+									),
+								);
+								PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {163, 693}}";
+							};
+							PBXTopSmartGroupGIDs = (
+							);
+						};
+					};
+				},
+			);
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugBreakpointsModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugSessionModule" = {
+				Debugger = {
+					HorizontalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {283, 202}}",
+							"{{283, 0}, {462, 202}}",
+						);
+					};
+					VerticalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {745, 202}}",
+							"{{0, 202}, {745, 220}}",
+						);
+					};
+				};
+				LauncherConfigVersion = 8;
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugSingleDataValueViewModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
+				PBXSplitModuleInNavigatorKey = {
+					SplitCount = 1;
+				};
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectFindModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
+				PBXProjectWorkspaceModule_StateKey_Rev39 = {
+					PBXProjectWorkspaceModule_DEGV_Geometry = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {691, 112}}",
+							"{{0, 112}, {691, 599}}",
+						);
+					};
+					PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = {
+						BoundsStr = "{{0, 0}, {676, 384}}";
+						Rows = (
+							0,
+						);
+						VisibleRectStr = "{{0, 0}, {676, 95}}";
+					};
+					PBXProjectWorkspaceModule_EditorOpen = true;
+					PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
+						PBXSplitModuleInNavigatorKey = {
+							Split0 = {
+								bookmark = E1FD015005B913BD001DABE0;
+								history = (
+									E1EE997B0575715D00F2D92C,
+									E1EE997D0575715D00F2D92C,
+									E1EE997E0575715D00F2D92C,
+									E1EE99860575715D00F2D92C,
+									E1EE998E0575715D00F2D92C,
+									E1EE998F0575715D00F2D92C,
+									E1EE99900575715D00F2D92C,
+									E1934FEB0575A9B700BC2092,
+									E1D653B805768C630054F5D1,
+									E1D653BD05768C630054F5D1,
+									E1D654190576C1480054F5D1,
+									E1D654560576C6A60054F5D1,
+									E1D654770576D6EC0054F5D1,
+									E1D654780576D6EC0054F5D1,
+									E1D654790576D6EC0054F5D1,
+									E1E114CB057717CA004FA8D9,
+									E1E114CC057717CA004FA8D9,
+									E1F3DF7C0579164100E952A5,
+									E1F3DF820579164100E952A5,
+									E1F3DFCE0579C32900E952A5,
+									E1F3DFCF0579C32900E952A5,
+									E1F3DFD10579C32900E952A5,
+									E1F3DFD20579C32900E952A5,
+									E1F3DFD40579C32900E952A5,
+									E1F3DFD60579C32900E952A5,
+									E1F3E021057A53D100E952A5,
+									E1F3E033057A580C00E952A5,
+									E1839B9705A0D11500E61119,
+									E1E4A97205A282A50097D040,
+									E1E4AA1505A28F4D0097D040,
+									E1E4AA1705A28F4D0097D040,
+									E1D6B28A05A306D9003838B0,
+									E1D6B59305A31C70003838B0,
+									E1D6B5AB05A31D60003838B0,
+									E1D6B61D05A3241D003838B0,
+									E1D6B63305A3259F003838B0,
+									E1D6B66605A4589E003838B0,
+									E1D6B66905A4589E003838B0,
+									E1D6B68B05A45C17003838B0,
+									E1D6B6A205A4AA54003838B0,
+									E14C18C005A4F14C000D4AF3,
+									E14C18C105A4F14C000D4AF3,
+									E14C18C605A4F14C000D4AF3,
+									E14C19B505A72716000D4AF3,
+									E14C19B605A72716000D4AF3,
+									E14C19B705A72716000D4AF3,
+									E14C19B805A72716000D4AF3,
+									E14C19BD05A72716000D4AF3,
+									E14C19C105A72716000D4AF3,
+									E14C19C205A72716000D4AF3,
+									E14C19C305A72716000D4AF3,
+									E14C19C405A72716000D4AF3,
+									E14C19C505A72716000D4AF3,
+									E14C19E205A72A28000D4AF3,
+									E14C19E405A72A28000D4AF3,
+									E14C1C3305A75E73000D4AF3,
+									E14C1C3505A75E73000D4AF3,
+									E14C1C4E05A7642F000D4AF3,
+									E14C1E6805A7CB3F000D4AF3,
+									E14C1E6905A7CB3F000D4AF3,
+									E14C1E6A05A7CB3F000D4AF3,
+									E14C1E6B05A7CB3F000D4AF3,
+									E14C1E6E05A7CB3F000D4AF3,
+									E14C1E7005A7CB3F000D4AF3,
+									E14C1E7205A7CB3F000D4AF3,
+									E14C1E7505A7CB3F000D4AF3,
+									E14C1E7C05A7CB3F000D4AF3,
+									E14C1EA105A7CDD7000D4AF3,
+									E14C1EEC05A917F6000D4AF3,
+									E14C1EED05A917F6000D4AF3,
+									E16E1322C5B038BE007EAD5F,
+									E16E1323C5B038BE007EAD5F,
+									E16E1326C5B038BE007EAD5F,
+									E16E132CC5B038BE007EAD5F,
+									E16E132DC5B038BE007EAD5F,
+									E16E1332C5B038BE007EAD5F,
+									E16E134FC5B038BE007EAD5F,
+									E16E1350C5B038BE007EAD5F,
+									E16E1351C5B038BE007EAD5F,
+									E16E1353C5B038BE007EAD5F,
+									E16E1354C5B038BE007EAD5F,
+									E16E1357C5B038BE007EAD5F,
+									E16E137CC5B038BE007EAD5F,
+									E16E137EC5B038BE007EAD5F,
+									E16E137FC5B038BE007EAD5F,
+									E16E1380C5B038BE007EAD5F,
+									E16E1381C5B038BE007EAD5F,
+									E16E1384C5B038BE007EAD5F,
+									E16E1385C5B038BE007EAD5F,
+									E16E1386C5B038BE007EAD5F,
+									E16E1388C5B038BE007EAD5F,
+									E16E1389C5B038BE007EAD5F,
+									E1FD00CF05B90B80001DABE0,
+									E1FD00D105B90B80001DABE0,
+									E1FD00DC05B90C38001DABE0,
+									E1FD00E505B90C9C001DABE0,
+									E1FD00E805B90C9C001DABE0,
+									E1FD00F805B911A8001DABE0,
+									E1FD00FB05B911A8001DABE0,
+									E1FD00FC05B911A8001DABE0,
+									E1FD00FD05B911A8001DABE0,
+									E1FD011705B91245001DABE0,
+									E1FD011E05B912F0001DABE0,
+									E1FD011F05B912F0001DABE0,
+									E1FD012005B912F0001DABE0,
+									E1FD012105B912F0001DABE0,
+									E1FD012205B912F0001DABE0,
+									E1FD012305B912F0001DABE0,
+									E1FD012405B912F0001DABE0,
+									E1FD013D05B913A8001DABE0,
+									E1FD013E05B913A8001DABE0,
+									E1FD013F05B913A8001DABE0,
+									E1FD014005B913A8001DABE0,
+								);
+								prevStack = (
+									E1AFE01005753C9C008B0109,
+									E1AFE02805753CFC008B0109,
+									E1EE98F40575684200F2D92C,
+									E1EE99950575715D00F2D92C,
+									E1EE999E0575715D00F2D92C,
+									E1EE99A20575715D00F2D92C,
+									E1EE99B30575715D00F2D92C,
+									E1EE99B40575715D00F2D92C,
+									E1EE99B80575715D00F2D92C,
+									E1EE99BF0575715D00F2D92C,
+									E1EE99C00575715D00F2D92C,
+									E1EE99C10575715D00F2D92C,
+									E1EE99C40575715D00F2D92C,
+									E1D653C605768C630054F5D1,
+									E1D653D405768C630054F5D1,
+									E1D653F605768C8F0054F5D1,
+									E1D6541C0576C1480054F5D1,
+									E1F3DF860579164100E952A5,
+									E1E4AA0205A28C300097D040,
+									E1E4AA0405A28C300097D040,
+									E1E4AA2505A28F4D0097D040,
+									E1E4AA2705A28F4D0097D040,
+									E1D6B5B305A31D60003838B0,
+									E1D6B5B405A31D60003838B0,
+									E1D6B5B605A31D60003838B0,
+									E1D6B5B705A31D60003838B0,
+									E1D6B6A805A4AA54003838B0,
+									E14C18F605A50784000D4AF3,
+									E14C19CA05A72716000D4AF3,
+									E14C19CC05A72716000D4AF3,
+									E14C19CD05A72716000D4AF3,
+									E14C1C5305A7642F000D4AF3,
+									E14C1C8605A77322000D4AF3,
+									E14C1E8305A7CB3F000D4AF3,
+									E14C1E8805A7CB3F000D4AF3,
+									E14C1E8A05A7CB3F000D4AF3,
+									E14C1EA605A7CDD7000D4AF3,
+									E14C1EB805A7CF6F000D4AF3,
+									E14C1ECB05A8D55E000D4AF3,
+									E14C1ED805A8E75D000D4AF3,
+									E16E133BC5B038BE007EAD5F,
+									E16E134CC5B038BE007EAD5F,
+									E16E135CC5B038BE007EAD5F,
+									E16E135DC5B038BE007EAD5F,
+									E16E135EC5B038BE007EAD5F,
+									E16E135FC5B038BE007EAD5F,
+									E16E1365C5B038BE007EAD5F,
+									E16E1392C5B038BE007EAD5F,
+									E16E1393C5B038BE007EAD5F,
+									E16E1394C5B038BE007EAD5F,
+									E16E1395C5B038BE007EAD5F,
+									E16E1396C5B038BE007EAD5F,
+									E13879BB05B0E18A00ED3C7C,
+									E1FD00D505B90B80001DABE0,
+									E1FD00D605B90B80001DABE0,
+									E1FD00D705B90B80001DABE0,
+									E1FD00D805B90B80001DABE0,
+									E1FD00DF05B90C38001DABE0,
+									E1FD00E005B90C38001DABE0,
+									E1FD00EA05B90C9C001DABE0,
+									E1FD00EB05B90C9C001DABE0,
+									E1FD00EC05B90C9C001DABE0,
+									E1FD00ED05B90C9C001DABE0,
+									E1FD00EE05B90C9C001DABE0,
+									E1FD00EF05B90C9C001DABE0,
+									E1FD00FE05B911A8001DABE0,
+									E1FD00FF05B911A8001DABE0,
+									E1FD010005B911A8001DABE0,
+									E1FD010105B911A8001DABE0,
+									E1FD010205B911A8001DABE0,
+									E1FD010305B911A8001DABE0,
+									E1FD010405B911A8001DABE0,
+									E1FD010505B911A8001DABE0,
+									E1FD010605B911A8001DABE0,
+									E1FD010705B911A8001DABE0,
+									E1FD010805B911A8001DABE0,
+									E1FD011A05B91245001DABE0,
+									E1FD011B05B91245001DABE0,
+									E1FD012605B912F0001DABE0,
+									E1FD012705B912F0001DABE0,
+									E1FD012805B912F0001DABE0,
+									E1FD012905B912F0001DABE0,
+									E1FD012A05B912F0001DABE0,
+									E1FD012B05B912F0001DABE0,
+									E1FD012C05B912F0001DABE0,
+									E1FD012D05B912F0001DABE0,
+									E1FD012E05B912F0001DABE0,
+									E1FD012F05B912F0001DABE0,
+									E1FD013005B912F0001DABE0,
+									E1FD013105B912F0001DABE0,
+									E1FD013205B912F0001DABE0,
+									E1FD013305B912F0001DABE0,
+									E1FD013405B912F0001DABE0,
+									E1FD013505B912F0001DABE0,
+									E1FD013605B912F0001DABE0,
+									E1FD013705B912F0001DABE0,
+									E1FD013805B912F0001DABE0,
+									E1FD013905B912F0001DABE0,
+									E1FD013A05B912F0001DABE0,
+									E1FD014105B913A8001DABE0,
+									E1FD014205B913A8001DABE0,
+									E1FD014305B913A8001DABE0,
+								);
+							};
+							SplitCount = 1;
+						};
+					};
+					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+						PBXProjectWorkspaceModule_SGTM_Geometry = {
+							_collapsingFrameDimension = 0;
+							_indexOfCollapsedView = 0;
+							_percentageOfCollapsedView = 0;
+							sizes = (
+								"{{0, 0}, {180, 711}}",
+								"{{180, 0}, {691, 711}}",
+							);
+						};
+					};
+					PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {691, 112}}";
+					PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 112}, {691, 599}}";
+					PBXProjectWorkspaceModule_OldSuperviewFrame = "{{180, 0}, {691, 711}}";
+					PBXProjectWorkspaceModule_SGTM = {
+						PBXBottomSmartGroupGIDs = (
+							1C37FBAC04509CD000000102,
+							1C37FAAC04509CD000000102,
+							1C08E77C0454961000C914BD,
+							1C37FABC05509CD000000102,
+							1C37FABC05539CD112110102,
+							E2644B35053B69B200211256,
+							1C37FABC04509CD000100104,
+							1CC0EA4004350EF90044410B,
+							1CC0EA4004350EF90041110B,
+						);
+						PBXSmartGroupTreeModuleColumnData = {
+							PBXSmartGroupTreeModuleColumnWidthsKey = (
+								163,
+							);
+							PBXSmartGroupTreeModuleColumnsKey_v4 = (
+								MainColumn,
+							);
+						};
+						PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
+							PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
+								29B97314FDCFA39411CA2CEA,
+								1C37FBAC04509CD000000102,
+							);
+							PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
+								(
+									4,
+									0,
+								),
+							);
+							PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {163, 693}}";
+						};
+						PBXTopSmartGroupGIDs = (
+						);
+					};
+				};
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
+				LauncherConfigVersion = 3;
+				Runner = {
+					HorizontalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {493, 167}}",
+							"{{0, 176}, {493, 267}}",
+						);
+					};
+					VerticalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {405, 443}}",
+							"{{414, 0}, {514, 443}}",
+						);
+					};
+				};
+			};
 			PBXWorkspaceGeometries = (
 				{
-					ContentSize = "{352, 553}";
-					LeftSlideOut = {
-						ActiveTab = 0;
-						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 = {
-								Debugger = {
-									Collapsed = NO;
-									Frame = "{{0, 0}, {484, 208}}";
-									Split0 = {
-										Frame = "{{0, 24}, {484, 184}}";
-										Split0 = {
-											Frame = "{{0, 0}, {236, 184}}";
-										};
-										Split1 = {
-											DebugVariablesTableConfiguration = (
-												Name,
-												123,
-												Value,
-												85,
-												Summary,
-												62.123,
-											);
-											Frame = "{{245, 0}, {239, 184}}";
-										};
-										SplitCount = 2;
-									};
-									SplitCount = 1;
-									Tab0 = {
-										Frame = "{{0, 0}, {100, 50}}";
-									};
-									Tab1 = {
-										Frame = "{{0, 0}, {100, 50}}";
-									};
-									TabCount = 2;
-									TabsVisible = YES;
-								};
-								Frame = "{{0, 0}, {484, 208}}";
-								LauncherConfigVersion = 7;
-							};
-							Tab1 = {
-								Frame = "{{0, 0}, {664, 208}}";
-								LauncherConfigVersion = 3;
-								Runner = {
-									Frame = "{{0, 0}, {664, 208}}";
-								};
-							};
-							Tab2 = {
-								BuildMessageFrame = "{{0, 0}, {666, 43}}";
-								BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
-								Frame = "{{0, 0}, {664, 50}}";
-							};
-							Tab3 = {
-								Frame = "{{0, 0}, {612, 295}}";
-							};
-							TabCount = 4;
-							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;
+					Frame = "{{0, 0}, {871, 711}}";
+					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
 					};
-					StatusViewVisible = YES;
-					Template = F5E465990156DFB90DCA290F;
-					ToolbarVisible = YES;
-					WindowLocation = "{12, 563}";
+					RubberWindowFrame = "5 75 871 753 0 0 1280 832 ";
 				},
 			);
-			PBXWorkspaceStateSaveDate = 55866266;
-		};
-		projectwideBuildSettings = {
-		};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
+				Frame = "{{0, 0}, {731, 405}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "216 107 731 426 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugBreakpointsModule" = {
+				BreakpointsTreeTableConfiguration = (
+					enabledColumn,
+					16,
+					breakpointColumn,
+					282.583,
+				);
+				Frame = "{{0, 0}, {208, 496}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "1071 315 208 517 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
+				Frame = "{{0, 0}, {400, 201}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "50 804 400 222 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugSessionModule" = {
+				DebugConsoleDrawerSize = "{100, 120}";
+				DebugConsoleVisible = Drawer;
+				DebugConsoleWindowFrame = "{{200, 200}, {500, 300}}";
+				DebugSTDIOWindowFrame = "{{200, 200}, {500, 300}}";
+				Frame = "{{0, 0}, {745, 422}}";
+				RubberWindowFrame = "292 331 745 464 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugSingleDataValueViewModule" = {
+				Frame = "{{0, 0}, {400, 67}}";
+				RubberWindowFrame = "20 611 400 109 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
+				Frame = "{{0, 0}, {750, 481}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "506 77 750 502 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectFindModule" = {
+				Frame = "{{0, 0}, {1119, 359}}";
+				RubberWindowFrame = "323 153 1119 401 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
+				Frame = "{{0, 0}, {871, 711}}";
+				PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+					PBXProjectWorkspaceModule_RunWindowVisible = true;
+				};
+				RubberWindowFrame = "5 75 871 753 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
+				Frame = "{{0, 0}, {598, 166}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "678 43 598 187 0 0 1280 832 ";
+			};
+			PBXWorkspaceStateSaveDate = 98318185;
+		};
+		perUserProjectItems = {
+			E11F415E05DC761800B5B0F5 = E11F415E05DC761800B5B0F5;
+			E13879BB05B0E18A00ED3C7C = E13879BB05B0E18A00ED3C7C;
+			E14C18C005A4F14C000D4AF3 = E14C18C005A4F14C000D4AF3;
+			E14C18C105A4F14C000D4AF3 = E14C18C105A4F14C000D4AF3;
+			E14C18C605A4F14C000D4AF3 = E14C18C605A4F14C000D4AF3;
+			E14C18F605A50784000D4AF3 = E14C18F605A50784000D4AF3;
+			E14C19B505A72716000D4AF3 = E14C19B505A72716000D4AF3;
+			E14C19B605A72716000D4AF3 = E14C19B605A72716000D4AF3;
+			E14C19B705A72716000D4AF3 = E14C19B705A72716000D4AF3;
+			E14C19B805A72716000D4AF3 = E14C19B805A72716000D4AF3;
+			E14C19BD05A72716000D4AF3 = E14C19BD05A72716000D4AF3;
+			E14C19C105A72716000D4AF3 = E14C19C105A72716000D4AF3;
+			E14C19C205A72716000D4AF3 = E14C19C205A72716000D4AF3;
+			E14C19C305A72716000D4AF3 = E14C19C305A72716000D4AF3;
+			E14C19C405A72716000D4AF3 = E14C19C405A72716000D4AF3;
+			E14C19C505A72716000D4AF3 = E14C19C505A72716000D4AF3;
+			E14C19CA05A72716000D4AF3 = E14C19CA05A72716000D4AF3;
+			E14C19CC05A72716000D4AF3 = E14C19CC05A72716000D4AF3;
+			E14C19CD05A72716000D4AF3 = E14C19CD05A72716000D4AF3;
+			E14C19E205A72A28000D4AF3 = E14C19E205A72A28000D4AF3;
+			E14C19E405A72A28000D4AF3 = E14C19E405A72A28000D4AF3;
+			E14C1C3305A75E73000D4AF3 = E14C1C3305A75E73000D4AF3;
+			E14C1C3505A75E73000D4AF3 = E14C1C3505A75E73000D4AF3;
+			E14C1C4E05A7642F000D4AF3 = E14C1C4E05A7642F000D4AF3;
+			E14C1C5305A7642F000D4AF3 = E14C1C5305A7642F000D4AF3;
+			E14C1C8605A77322000D4AF3 = E14C1C8605A77322000D4AF3;
+			E14C1E6905A7CB3F000D4AF3 = E14C1E6905A7CB3F000D4AF3;
+			E14C1E6A05A7CB3F000D4AF3 = E14C1E6A05A7CB3F000D4AF3;
+			E14C1E6B05A7CB3F000D4AF3 = E14C1E6B05A7CB3F000D4AF3;
+			E14C1E6E05A7CB3F000D4AF3 = E14C1E6E05A7CB3F000D4AF3;
+			E14C1E7205A7CB3F000D4AF3 = E14C1E7205A7CB3F000D4AF3;
+			E14C1E7505A7CB3F000D4AF3 = E14C1E7505A7CB3F000D4AF3;
+			E14C1E7C05A7CB3F000D4AF3 = E14C1E7C05A7CB3F000D4AF3;
+			E14C1E8305A7CB3F000D4AF3 = E14C1E8305A7CB3F000D4AF3;
+			E14C1E8805A7CB3F000D4AF3 = E14C1E8805A7CB3F000D4AF3;
+			E14C1E8A05A7CB3F000D4AF3 = E14C1E8A05A7CB3F000D4AF3;
+			E14C1EA105A7CDD7000D4AF3 = E14C1EA105A7CDD7000D4AF3;
+			E14C1EA605A7CDD7000D4AF3 = E14C1EA605A7CDD7000D4AF3;
+			E14C1EB805A7CF6F000D4AF3 = E14C1EB805A7CF6F000D4AF3;
+			E14C1EEC05A917F6000D4AF3 = E14C1EEC05A917F6000D4AF3;
+			E14C1EED05A917F6000D4AF3 = E14C1EED05A917F6000D4AF3;
+			E16A747F05C25E1F009B66A0 = E16A747F05C25E1F009B66A0;
+			E16A748105C25E1F009B66A0 = E16A748105C25E1F009B66A0;
+			E16E1322C5B038BE007EAD5F = E16E1322C5B038BE007EAD5F;
+			E16E1323C5B038BE007EAD5F = E16E1323C5B038BE007EAD5F;
+			E16E1326C5B038BE007EAD5F = E16E1326C5B038BE007EAD5F;
+			E16E132CC5B038BE007EAD5F = E16E132CC5B038BE007EAD5F;
+			E16E132DC5B038BE007EAD5F = E16E132DC5B038BE007EAD5F;
+			E16E1332C5B038BE007EAD5F = E16E1332C5B038BE007EAD5F;
+			E16E133BC5B038BE007EAD5F = E16E133BC5B038BE007EAD5F;
+			E16E134CC5B038BE007EAD5F = E16E134CC5B038BE007EAD5F;
+			E16E134FC5B038BE007EAD5F = E16E134FC5B038BE007EAD5F;
+			E16E1350C5B038BE007EAD5F = E16E1350C5B038BE007EAD5F;
+			E16E1351C5B038BE007EAD5F = E16E1351C5B038BE007EAD5F;
+			E16E1353C5B038BE007EAD5F = E16E1353C5B038BE007EAD5F;
+			E16E1354C5B038BE007EAD5F = E16E1354C5B038BE007EAD5F;
+			E16E1357C5B038BE007EAD5F = E16E1357C5B038BE007EAD5F;
+			E16E135CC5B038BE007EAD5F = E16E135CC5B038BE007EAD5F;
+			E16E135DC5B038BE007EAD5F = E16E135DC5B038BE007EAD5F;
+			E16E135EC5B038BE007EAD5F = E16E135EC5B038BE007EAD5F;
+			E16E135FC5B038BE007EAD5F = E16E135FC5B038BE007EAD5F;
+			E16E1365C5B038BE007EAD5F = E16E1365C5B038BE007EAD5F;
+			E16E137CC5B038BE007EAD5F = E16E137CC5B038BE007EAD5F;
+			E16E137EC5B038BE007EAD5F = E16E137EC5B038BE007EAD5F;
+			E16E137FC5B038BE007EAD5F = E16E137FC5B038BE007EAD5F;
+			E16E1380C5B038BE007EAD5F = E16E1380C5B038BE007EAD5F;
+			E16E1381C5B038BE007EAD5F = E16E1381C5B038BE007EAD5F;
+			E16E1384C5B038BE007EAD5F = E16E1384C5B038BE007EAD5F;
+			E16E1385C5B038BE007EAD5F = E16E1385C5B038BE007EAD5F;
+			E16E1386C5B038BE007EAD5F = E16E1386C5B038BE007EAD5F;
+			E16E1388C5B038BE007EAD5F = E16E1388C5B038BE007EAD5F;
+			E16E1389C5B038BE007EAD5F = E16E1389C5B038BE007EAD5F;
+			E16E1392C5B038BE007EAD5F = E16E1392C5B038BE007EAD5F;
+			E16E1393C5B038BE007EAD5F = E16E1393C5B038BE007EAD5F;
+			E16E1394C5B038BE007EAD5F = E16E1394C5B038BE007EAD5F;
+			E16E1395C5B038BE007EAD5F = E16E1395C5B038BE007EAD5F;
+			E16E1396C5B038BE007EAD5F = E16E1396C5B038BE007EAD5F;
+			E1839B9705A0D11500E61119 = E1839B9705A0D11500E61119;
+			E1934FEB0575A9B700BC2092 = E1934FEB0575A9B700BC2092;
+			E1AFE01005753C9C008B0109 = E1AFE01005753C9C008B0109;
+			E1AFE02805753CFC008B0109 = E1AFE02805753CFC008B0109;
+			E1D653B805768C630054F5D1 = E1D653B805768C630054F5D1;
+			E1D653BD05768C630054F5D1 = E1D653BD05768C630054F5D1;
+			E1D653C605768C630054F5D1 = E1D653C605768C630054F5D1;
+			E1D653D405768C630054F5D1 = E1D653D405768C630054F5D1;
+			E1D653F605768C8F0054F5D1 = E1D653F605768C8F0054F5D1;
+			E1D654190576C1480054F5D1 = E1D654190576C1480054F5D1;
+			E1D6541C0576C1480054F5D1 = E1D6541C0576C1480054F5D1;
+			E1D654560576C6A60054F5D1 = E1D654560576C6A60054F5D1;
+			E1D654770576D6EC0054F5D1 = E1D654770576D6EC0054F5D1;
+			E1D654780576D6EC0054F5D1 = E1D654780576D6EC0054F5D1;
+			E1D654790576D6EC0054F5D1 = E1D654790576D6EC0054F5D1;
+			E1D6B28A05A306D9003838B0 = E1D6B28A05A306D9003838B0;
+			E1D6B59305A31C70003838B0 = E1D6B59305A31C70003838B0;
+			E1D6B5AB05A31D60003838B0 = E1D6B5AB05A31D60003838B0;
+			E1D6B5B305A31D60003838B0 = E1D6B5B305A31D60003838B0;
+			E1D6B5B405A31D60003838B0 = E1D6B5B405A31D60003838B0;
+			E1D6B5B605A31D60003838B0 = E1D6B5B605A31D60003838B0;
+			E1D6B5B705A31D60003838B0 = E1D6B5B705A31D60003838B0;
+			E1D6B61D05A3241D003838B0 = E1D6B61D05A3241D003838B0;
+			E1D6B63305A3259F003838B0 = E1D6B63305A3259F003838B0;
+			E1D6B66605A4589E003838B0 = E1D6B66605A4589E003838B0;
+			E1D6B66905A4589E003838B0 = E1D6B66905A4589E003838B0;
+			E1D6B68B05A45C17003838B0 = E1D6B68B05A45C17003838B0;
+			E1D6B6A205A4AA54003838B0 = E1D6B6A205A4AA54003838B0;
+			E1D6B6A805A4AA54003838B0 = E1D6B6A805A4AA54003838B0;
+			E1E114CB057717CA004FA8D9 = E1E114CB057717CA004FA8D9;
+			E1E114CC057717CA004FA8D9 = E1E114CC057717CA004FA8D9;
+			E1E4A97205A282A50097D040 = E1E4A97205A282A50097D040;
+			E1E4AA0205A28C300097D040 = E1E4AA0205A28C300097D040;
+			E1E4AA0405A28C300097D040 = E1E4AA0405A28C300097D040;
+			E1E4AA1505A28F4D0097D040 = E1E4AA1505A28F4D0097D040;
+			E1E4AA1705A28F4D0097D040 = E1E4AA1705A28F4D0097D040;
+			E1E4AA2505A28F4D0097D040 = E1E4AA2505A28F4D0097D040;
+			E1E4AA2705A28F4D0097D040 = E1E4AA2705A28F4D0097D040;
+			E1EE98F40575684200F2D92C = E1EE98F40575684200F2D92C;
+			E1EE997B0575715D00F2D92C = E1EE997B0575715D00F2D92C;
+			E1EE997D0575715D00F2D92C = E1EE997D0575715D00F2D92C;
+			E1EE997E0575715D00F2D92C = E1EE997E0575715D00F2D92C;
+			E1EE99860575715D00F2D92C = E1EE99860575715D00F2D92C;
+			E1EE998E0575715D00F2D92C = E1EE998E0575715D00F2D92C;
+			E1EE998F0575715D00F2D92C = E1EE998F0575715D00F2D92C;
+			E1EE99900575715D00F2D92C = E1EE99900575715D00F2D92C;
+			E1EE99950575715D00F2D92C = E1EE99950575715D00F2D92C;
+			E1EE999E0575715D00F2D92C = E1EE999E0575715D00F2D92C;
+			E1EE99A20575715D00F2D92C = E1EE99A20575715D00F2D92C;
+			E1EE99B30575715D00F2D92C = E1EE99B30575715D00F2D92C;
+			E1EE99B80575715D00F2D92C = E1EE99B80575715D00F2D92C;
+			E1EE99BF0575715D00F2D92C = E1EE99BF0575715D00F2D92C;
+			E1EE99C00575715D00F2D92C = E1EE99C00575715D00F2D92C;
+			E1EE99C10575715D00F2D92C = E1EE99C10575715D00F2D92C;
+			E1EE99C40575715D00F2D92C = E1EE99C40575715D00F2D92C;
+			E1F3DF7C0579164100E952A5 = E1F3DF7C0579164100E952A5;
+			E1F3DF820579164100E952A5 = E1F3DF820579164100E952A5;
+			E1F3DF860579164100E952A5 = E1F3DF860579164100E952A5;
+			E1F3DFCE0579C32900E952A5 = E1F3DFCE0579C32900E952A5;
+			E1F3DFCF0579C32900E952A5 = E1F3DFCF0579C32900E952A5;
+			E1F3DFD10579C32900E952A5 = E1F3DFD10579C32900E952A5;
+			E1F3DFD20579C32900E952A5 = E1F3DFD20579C32900E952A5;
+			E1F3DFD40579C32900E952A5 = E1F3DFD40579C32900E952A5;
+			E1F3DFD60579C32900E952A5 = E1F3DFD60579C32900E952A5;
+			E1F3E021057A53D100E952A5 = E1F3E021057A53D100E952A5;
+			E1F3E033057A580C00E952A5 = E1F3E033057A580C00E952A5;
+			E1FD00D105B90B80001DABE0 = E1FD00D105B90B80001DABE0;
+			E1FD00DC05B90C38001DABE0 = E1FD00DC05B90C38001DABE0;
+			E1FD00DF05B90C38001DABE0 = E1FD00DF05B90C38001DABE0;
+			E1FD00E505B90C9C001DABE0 = E1FD00E505B90C9C001DABE0;
+			E1FD00E805B90C9C001DABE0 = E1FD00E805B90C9C001DABE0;
+			E1FD00EA05B90C9C001DABE0 = E1FD00EA05B90C9C001DABE0;
+			E1FD00F805B911A8001DABE0 = E1FD00F805B911A8001DABE0;
+			E1FD00FB05B911A8001DABE0 = E1FD00FB05B911A8001DABE0;
+			E1FD00FC05B911A8001DABE0 = E1FD00FC05B911A8001DABE0;
+			E1FD00FD05B911A8001DABE0 = E1FD00FD05B911A8001DABE0;
+			E1FD010605B911A8001DABE0 = E1FD010605B911A8001DABE0;
+			E1FD010805B911A8001DABE0 = E1FD010805B911A8001DABE0;
+			E1FD011E05B912F0001DABE0 = E1FD011E05B912F0001DABE0;
+			E1FD011F05B912F0001DABE0 = E1FD011F05B912F0001DABE0;
+			E1FD012005B912F0001DABE0 = E1FD012005B912F0001DABE0;
+			E1FD012105B912F0001DABE0 = E1FD012105B912F0001DABE0;
+			E1FD012205B912F0001DABE0 = E1FD012205B912F0001DABE0;
+			E1FD012305B912F0001DABE0 = E1FD012305B912F0001DABE0;
+			E1FD012405B912F0001DABE0 = E1FD012405B912F0001DABE0;
+			E1FD012605B912F0001DABE0 = E1FD012605B912F0001DABE0;
+			E1FD015805B91B83001DABE0 = E1FD015805B91B83001DABE0;
+			E1FD015905B91B83001DABE0 = E1FD015905B91B83001DABE0;
+			E1FD015A05B91B83001DABE0 = E1FD015A05B91B83001DABE0;
+			E1FD015B05B91B83001DABE0 = E1FD015B05B91B83001DABE0;
+			E1FD015C05B91B83001DABE0 = E1FD015C05B91B83001DABE0;
+			E1FD015D05B91B83001DABE0 = E1FD015D05B91B83001DABE0;
+			E1FD015F05B91B83001DABE0 = E1FD015F05B91B83001DABE0;
+			E1FD016005B91B83001DABE0 = E1FD016005B91B83001DABE0;
+			E1FD016305B91B83001DABE0 = E1FD016305B91B83001DABE0;
+			E1FD016505B91B83001DABE0 = E1FD016505B91B83001DABE0;
+		};
+		sourceControlManager = E1AFE00A05753C12008B0109;
+		userBuildSettings = {
+		};
+	};
+	29B97316FDCFA39411CA2CEA = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {613, 441}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {613, 441}}";
+		};
+	};
+	E10BF908057718A40008FEE7 = {
+		fileReference = 103DFC20016C16E20C000109;
+		functionName = "FSAThreadStart()";
+		isa = PBXFileBreakpoint;
+		lineNumber = 68;
+		state = 1;
+	};
+	E11F415E05DC761800B5B0F5 = {
+		fRef = E1E4A91B05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchPrivate.c: 30";
+		rLen = 0;
+		rLoc = 935;
+		rType = 0;
+		vrLen = 935;
+		vrLoc = 0;
+	};
+	E13879BB05B0E18A00ED3C7C = {
+		fRef = 103DFC17016C12D80C000109;
+		isa = PBXTextBookmark;
+		name = "FSAApp.mm: PatchNotification";
+		rLen = 0;
+		rLoc = 3117;
+		rType = 0;
+		vrLen = 1089;
+		vrLoc = 2547;
+	};
+	E14C18C005A4F14C000D4AF3 = {
+		fRef = E14C18F005A4F152000D4AF3;
+		isa = PBXTextBookmark;
+		name = "#define NSLocalizedString(key, comment) \\\n";
+		rLen = 42;
+		rLoc = 2762;
+		rType = 0;
+		vrLen = 1407;
+		vrLoc = 2025;
+	};
+	E14C18C105A4F14C000D4AF3 = {
+		fRef = E1F3DF8C0579166500E952A5;
+		isa = PBXTextBookmark;
+		name = "NSWorkspace.h: 96";
+		rLen = 0;
+		rLoc = 3453;
+		rType = 0;
+		vrLen = 1746;
+		vrLoc = 3324;
+	};
+	E14C18C605A4F14C000D4AF3 = {
+		fRef = E14C18EF05A4F152000D4AF3;
+		isa = PBXTextBookmark;
+		name = "#define\tLOG_ALERT\t1\t/* action must be taken immediately */\n";
+		rLen = 59;
+		rLoc = 3418;
+		rType = 0;
+		vrLen = 1261;
+		vrLoc = 2888;
+	};
+	E14C18EF05A4F152000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = syslog.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/sys/syslog.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C18F005A4F152000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSBundle.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSBundle.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C18F605A50784000D4AF3 = {
+		fRef = E14C18F805A507A2000D4AF3;
+		isa = PBXTextBookmark;
+		name = "extern unsigned long NSSymbolReferenceCountInObjectFileImage(\n";
+		rLen = 62;
+		rLoc = 2839;
+		rType = 0;
+		vrLen = 1471;
+		vrLoc = 2140;
+	};
+	E14C18F805A507A2000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = dyld.h;
+		path = "/Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/mach-o/dyld.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19B505A72716000D4AF3 = {
+		fRef = E14C19D805A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = "(null): 291";
+		rLen = 0;
+		rLoc = 9904;
+		rType = 0;
+		vrLen = 764;
+		vrLoc = 1085;
+	};
+	E14C19B605A72716000D4AF3 = {
+		fRef = E14C19DC05A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = isValidIdentifier;
+		rLen = 17;
+		rLoc = 1277;
+		rType = 0;
+		vrLen = 1283;
+		vrLoc = 602;
+	};
+	E14C19B705A72716000D4AF3 = {
+		fRef = E14C19DB05A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = validateSyntaxForIdentifier;
+		rLen = 27;
+		rLoc = 428;
+		rType = 0;
+		vrLen = 1038;
+		vrLoc = 154;
+	};
+	E14C19B805A72716000D4AF3 = {
+		fRef = E14C19DE05A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = FSInterpreter;
+		rLen = 13;
+		rLoc = 227;
+		rType = 0;
+		vrLen = 920;
+		vrLoc = 0;
+	};
+	E14C19BD05A72716000D4AF3 = {
+		fRef = F5680F7F020D35ED01AEEC37;
+		isa = PBXTextBookmark;
+		name = "Read Me: 3";
+		rLen = 0;
+		rLoc = 63;
+		rType = 0;
+		vrLen = 1134;
+		vrLoc = 126;
+	};
+	E14C19C105A72716000D4AF3 = {
+		fRef = E14C19D705A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = "- (BOOL)fileExistsAtPath:(NSString *)path;\n";
+		rLen = 43;
+		rLoc = 742;
+		rType = 0;
+		vrLen = 1324;
+		vrLoc = 0;
+	};
+	E14C19C205A72716000D4AF3 = {
+		fRef = E14C19DA05A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = "(null): 256";
+		rLen = 0;
+		rLoc = 10035;
+		rType = 0;
+		vrLen = 1708;
+		vrLoc = 8903;
+	};
+	E14C19C305A72716000D4AF3 = {
+		fRef = E14C19DD05A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = kCFBundleVersionKey;
+		rLen = 19;
+		rLoc = 915;
+		rType = 0;
+		vrLen = 1412;
+		vrLoc = 424;
+	};
+	E14C19C405A72716000D4AF3 = {
+		fRef = E14C19DF05A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = int;
+		rLen = 3;
+		rLoc = 324;
+		rType = 0;
+		vrLen = 1608;
+		vrLoc = 0;
+	};
+	E14C19C505A72716000D4AF3 = {
+		fRef = E1EE99EE057574EC00F2D92C;
+		isa = PBXTextBookmark;
+		name = "NSBundle.h: 57";
+		rLen = 0;
+		rLoc = 1722;
+		rType = 0;
+		vrLen = 1440;
+		vrLoc = 1058;
+	};
+	E14C19CA05A72716000D4AF3 = {
+		fRef = E14C19D905A72737000D4AF3;
+		isa = PBXTextBookmark;
+		name = isValidIdentifier;
+		rLen = 17;
+		rLoc = 1277;
+		rType = 0;
+		vrLen = 1283;
+		vrLoc = 602;
+	};
+	E14C19CC05A72716000D4AF3 = {
+		fRef = F5FF50BC02E53B9E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAViewAssociationController.h: bullseyeCursor";
+		rLen = 0;
+		rLoc = 1325;
+		rType = 0;
+		vrLen = 991;
+		vrLoc = 628;
+	};
+	E14C19CD05A72716000D4AF3 = {
+		fRef = F5FF50BD02E53B9E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAViewAssociationController.m: 33";
+		rLen = 0;
+		rLoc = 1068;
+		rType = 0;
+		vrLen = 1438;
+		vrLoc = 1069;
+	};
+	E14C19D705A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSFileManager.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSFileManager.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19D805A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = dyld.h;
+		path = "/Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/mach-o/dyld.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19D905A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = Compiler.h;
+		path = "/Volumes/Ti/Users/nicholas/Documents/Development/Third-party/FScriptSources-20031020/FScript/FScriptFramework/Compiler.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19DA05A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = MacTypes.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/MacTypes.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19DB05A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.objc;
+		name = FSInterpreter.m;
+		path = "/Volumes/Ti/Users/nicholas/Documents/Development/Third-party/FScriptSources-20031020/FScript/FScriptFramework/FSInterpreter.m";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19DC05A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = Compiler.h;
+		path = "/Volumes/Ti/Users/nicholas/Documents/Development/Third-party/FScriptSources-20031020/FScript/FScriptFramework/Compiler.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19DD05A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFBundle.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFBundle.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19DE05A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = FSInterpreter.h;
+		path = /Volumes/Ti/Library/Frameworks/FScript.framework/Versions/A/Headers/FSInterpreter.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19DF05A72737000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSPanel.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSPanel.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C19E205A72A28000D4AF3 = {
+		fRef = E1F3E046057A581B00E952A5;
+		isa = PBXTextBookmark;
+		name = obj;
+		rLen = 3;
+		rLoc = 32883;
+		rType = 0;
+		vrLen = 1041;
+		vrLoc = 32132;
+	};
+	E14C19E405A72A28000D4AF3 = {
+		fRef = F5FF50BD02E53B9E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAViewAssociationController.m: update:";
+		rLen = 0;
+		rLoc = 3265;
+		rType = 0;
+		vrLen = 1389;
+		vrLoc = 2571;
+	};
+	E14C1C3305A75E73000D4AF3 = {
+		fRef = F574ADDA020ACAC801AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAController.h: 23";
+		rLen = 0;
+		rLoc = 829;
+		rType = 0;
+		vrLen = 1120;
+		vrLoc = 0;
+	};
+	E14C1C3505A75E73000D4AF3 = {
+		fRef = E14C1C4205A75E77000D4AF3;
+		isa = PBXTextBookmark;
+		name = "(null): 875";
+		rLen = 0;
+		rLoc = 33104;
+		rType = 0;
+		vrLen = 776;
+		vrLoc = 32328;
+	};
+	E14C1C4205A75E77000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = SpeechRecognition.h;
+		path = /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/Headers/SpeechRecognition.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C1C4E05A7642F000D4AF3 = {
+		fRef = E14C1C5C05A7644A000D4AF3;
+		isa = PBXTextBookmark;
+		name = "/**** \"Open With\" menu ****/\n\n/* Format for 'default app', e.g \"Internet Explorer (5.2) (default)\" */\n\"DefaultApp%@\" = \"%@ (default)\";\n\n/* Format for app location, e.g \"Internet Explorer (5.2) -- /Applications\" */\n\"App%@Location%@\" = \"%@ — %@\";\n\n/* First (disabled, label) element of menu */\n\"Open Location With\" = \"Open Location With\";\n\n/* Disabled item above bookmark helper application */\n\"Add Bookmark\" = \"Add Bookmark\";\n\n\n";
+		rLen = 427;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 854;
+		vrLoc = 0;
+	};
+	E14C1C5305A7642F000D4AF3 = {
+		fRef = E1E4A92505A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchLoader.c: 20";
+		rLen = 0;
+		rLoc = 272;
+		rType = 0;
+		vrLen = 1217;
+		vrLoc = 120;
+	};
+	E14C1C5C05A7644A000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = text.plist.strings;
+		name = Localizable.strings;
+		path = /Volumes/Ti/Users/nicholas/Documents/Development/ICeCoffEE/ICeCoffEE/English.lproj/Localizable.strings;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C1C8605A77322000D4AF3 = {
+		fRef = E1D6B7E705A4AACE003838B0;
+		isa = PBXTextBookmark;
+		name = "English: 46";
+		rLen = 0;
+		rLoc = 3136;
+		rType = 0;
+		vrLen = 1754;
+		vrLoc = 1463;
+	};
+	E14C1E6905A7CB3F000D4AF3 = {
+		fRef = E14C1E9C05A7CB60000D4AF3;
+		isa = PBXTextBookmark;
+		name = "(null): 10";
+		rLen = 0;
+		rLoc = 405;
+		rType = 0;
+		vrLen = 891;
+		vrLoc = 1508;
+	};
+	E14C1E6A05A7CB3F000D4AF3 = {
+		fRef = E14C1E9B05A7CB60000D4AF3;
+		isa = PBXTextBookmark;
+		name = "(null): 251";
+		rLen = 0;
+		rLoc = 7002;
+		rType = 0;
+		vrLen = 902;
+		vrLoc = 6435;
+	};
+	E14C1E6B05A7CB3F000D4AF3 = {
+		fRef = E14C1E9E05A7CB60000D4AF3;
+		isa = PBXTextBookmark;
+		name = "(null): 33";
+		rLen = 0;
+		rLoc = 1219;
+		rType = 0;
+		vrLen = 1181;
+		vrLoc = 106;
+	};
+	E14C1E6E05A7CB3F000D4AF3 = {
+		fRef = E1D6B6AF05A4AA55003838B0;
+		isa = PBXTextBookmark;
+		name = "GetProcessPID(\n";
+		rLen = 15;
+		rLoc = 23356;
+		rType = 0;
+		vrLen = 1042;
+		vrLoc = 22864;
+	};
+	E14C1E7205A7CB3F000D4AF3 = {
+		fRef = E1E4A91F05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchClient.h: 17";
+		rLen = 0;
+		rLoc = 343;
+		rType = 0;
+		vrLen = 1045;
+		vrLoc = 14;
+	};
+	E14C1E7505A7CB3F000D4AF3 = {
+		fRef = F5EFC2CB020A6CD101AEEDB1;
+		isa = PBXTextBookmark;
+		name = pid;
+		rLen = 3;
+		rLoc = 1596;
+		rType = 0;
+		vrLen = 570;
+		vrLoc = 1403;
+	};
+	E14C1E7C05A7CB3F000D4AF3 = {
+		fRef = E14C1E9A05A7CB60000D4AF3;
+		isa = PBXTextBookmark;
+		name = NSAppKitVersionNumber;
+		rLen = 21;
+		rLoc = 362;
+		rType = 0;
+		vrLen = 987;
+		vrLoc = 0;
+	};
+	E14C1E8305A7CB3F000D4AF3 = {
+		fRef = F523EA2B020CF06A01AEEC37;
+		isa = PBXTextBookmark;
+		name = "FSAnywhere.h: 23";
+		rLen = 0;
+		rLoc = 528;
+		rType = 0;
+		vrLen = 652;
+		vrLoc = 0;
+	};
+	E14C1E8805A7CB3F000D4AF3 = {
+		fRef = E1F3DFDE0579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = "#define err_sub(x)\t\t(((x)&0xfff)<<14)\n";
+		rLen = 38;
+		rLoc = 4848;
+		rType = 0;
+		vrLen = 1243;
+		vrLoc = 0;
+	};
+	E14C1E8A05A7CB3F000D4AF3 = {
+		fRef = E1E4A91F05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchClient.h: 17";
+		rLen = 0;
+		rLoc = 343;
+		rType = 0;
+		vrLen = 1045;
+		vrLoc = 14;
+	};
+	E14C1E9A05A7CB60000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSApplication.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSApplication.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C1E9B05A7CB60000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = "objc-class.h";
+		path = "/usr/include/objc/objc-class.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C1E9C05A7CB60000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = objc.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/objc/objc.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C1E9E05A7CB60000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = "objc-api.h";
+		path = "/Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/objc/objc-api.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C1EA105A7CDD7000D4AF3 = {
+		fRef = E1E4A92705A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchRecord.h: 5";
+		rLen = 0;
+		rLoc = 62;
+		rType = 0;
+		vrLen = 629;
+		vrLoc = 0;
+	};
+	E14C1EA605A7CDD7000D4AF3 = {
+		fRef = F5EFC2D7020A6E0E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAAppList.m: 199";
+		rLen = 0;
+		rLoc = 7501;
+		rType = 0;
+		vrLen = 1027;
+		vrLoc = 6451;
+	};
+	E14C1EB805A7CF6F000D4AF3 = {
+		fRef = F574ADDB020ACAC801AEEDB1;
+		isa = PBXTextBookmark;
+		name = makeKey;
+		rLen = 7;
+		rLoc = 6213;
+		rType = 0;
+		vrLen = 1542;
+		vrLoc = 3827;
+	};
+	E14C1ECE05A8DB19000D4AF3 = {
+		uiCtxt = {
+			sepNavWindowFrame = "{{222, 136}, {750, 502}}";
+		};
+	};
+	E14C1EEC05A917F6000D4AF3 = {
+		fRef = E14C1F0005A91808000D4AF3;
+		glyphRangeLength = 0;
+		glyphRangeLocation = 0;
+		isa = PBXDocBookmark;
+		name = "Xcode 1.1 Seed Release Notes";
+	};
+	E14C1EED05A917F6000D4AF3 = {
+		fRef = E14C1F0205A91808000D4AF3;
+		isa = PBXTextBookmark;
+		name = "(null): 31";
+		rLen = 0;
+		rLoc = 1486;
+		rType = 0;
+		vrLen = 1583;
+		vrLoc = 0;
+	};
+	E14C1F0005A91808000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = text.html.documentation;
+		name = Xcode.html;
+		path = /Volumes/Ti/Developer/Documentation/ReleaseNotes/Xcode/Xcode.html;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E14C1F0205A91808000D4AF3 = {
+		isa = PBXFileReference;
+		lastKnownFileType = text;
+		name = ReadMe.txt;
+		path = "/Volumes/Ti/Users/nicholas/Documents/Development/Third-party/SCPatch/ReadMe.txt";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E16A747F05C25E1F009B66A0 = {
+		fRef = E1E4A92305A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchController.cpp: 319";
+		rLen = 0;
+		rLoc = 10769;
+		rType = 0;
+		vrLen = 1502;
+		vrLoc = 10336;
+	};
+	E16A748105C25E1F009B66A0 = {
+		fRef = E1E4A91B05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchPrivate.c: 30";
+		rLen = 0;
+		rLoc = 935;
+		rType = 0;
+		vrLen = 935;
+		vrLoc = 0;
+	};
+	E16E1322C5B038BE007EAD5F = {
+		fRef = F5EFC2E0020A6FD501AEEDB1;
+		isa = PBXTextBookmark;
+		name = "- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView ";
+		rLen = 69;
+		rLoc = 2926;
+		rType = 0;
+		vrLen = 1359;
+		vrLoc = 6236;
+	};
+	E16E1323C5B038BE007EAD5F = {
+		fRef = F574ADD5020AC10F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "#define NSAppKitVersionNumber10_2 663\n";
+		rLen = 38;
+		rLoc = 212;
+		rType = 0;
+		vrLen = 997;
+		vrLoc = 0;
+	};
+	E16E1326C5B038BE007EAD5F = {
+		fRef = F5EFC2D7020A6E0E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAAppList.m: 112";
+		rLen = 0;
+		rLoc = 3730;
+		rType = 0;
+		vrLen = 698;
+		vrLoc = 3441;
+	};
+	E16E132CC5B038BE007EAD5F = {
+		fRef = F574ADDB020ACAC801AEEDB1;
+		isa = PBXTextBookmark;
+		name = makeKey;
+		rLen = 7;
+		rLoc = 6213;
+		rType = 0;
+		vrLen = 1367;
+		vrLoc = 4002;
+	};
+	E16E132DC5B038BE007EAD5F = {
+		fRef = F5FF50BC02E53B9E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAViewAssociationController.h: selectedElement";
+		rLen = 0;
+		rLoc = 1325;
+		rType = 0;
+		vrLen = 877;
+		vrLoc = 742;
+	};
+	E16E1332C5B038BE007EAD5F = {
+		fRef = F5EFC2E7020A8F7F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "libMatch.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 230;
+		vrLoc = 0;
+	};
+	E16E133BC5B038BE007EAD5F = {
+		fRef = F5EFC2D6020A6E0E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAAppList.h: 7";
+		rLen = 0;
+		rLoc = 157;
+		rType = 0;
+		vrLen = 1045;
+		vrLoc = 0;
+	};
+	E16E134CC5B038BE007EAD5F = {
+		fRef = F523EA27020CEB5701AEEC37;
+		isa = PBXTextBookmark;
+		name = "English: 4";
+		rLen = 0;
+		rLoc = 57;
+		rType = 0;
+		vrLen = 157;
+		vrLoc = 0;
+	};
+	E16E134FC5B038BE007EAD5F = {
+		fRef = E1EE98BC0575626E00F2D92C;
+		isa = PBXTextBookmark;
+		name = "mach_inject.c: 10";
+		rLen = 0;
+		rLoc = 360;
+		rType = 0;
+		vrLen = 830;
+		vrLoc = 448;
+	};
+	E16E1350C5B038BE007EAD5F = {
+		fRef = E1EE98BD0575626E00F2D92C;
+		isa = PBXTextBookmark;
+		name = "Red Shed Software";
+		rLen = 17;
+		rLoc = 148;
+		rType = 0;
+		vrLen = 1133;
+		vrLoc = 0;
+	};
+	E16E1351C5B038BE007EAD5F = {
+		fRef = F57D63160319B6CA01AEEDB1;
+		isa = PBXBookmark;
+	};
+	E16E1353C5B038BE007EAD5F = {
+		fRef = F523EA27020CEB5701AEEC37;
+		isa = PBXTextBookmark;
+		name = "English: 6";
+		rLen = 0;
+		rLoc = 156;
+		rType = 0;
+		vrLen = 191;
+		vrLoc = 0;
+	};
+	E16E1354C5B038BE007EAD5F = {
+		fRef = E1D652A40575B55B0054F5D1;
+		isa = PBXTextBookmark;
+		name = "Bundle-Info.plist: 27";
+		rLen = 0;
+		rLoc = 785;
+		rType = 0;
+		vrLen = 785;
+		vrLoc = 0;
+	};
+	E16E1357C5B038BE007EAD5F = {
+		fRef = E1D652A90575B5750054F5D1;
+		isa = PBXTextBookmark;
+		name = "Bundle Loader-Info.plist: 17";
+		rLen = 0;
+		rLoc = 565;
+		rType = 0;
+		vrLen = 787;
+		vrLoc = 0;
+	};
+	E16E135CC5B038BE007EAD5F = {
+		fRef = E1D652A90575B5750054F5D1;
+		isa = PBXTextBookmark;
+		name = "Bundle Loader-Info.plist: 17";
+		rLen = 0;
+		rLoc = 565;
+		rType = 0;
+		vrLen = 787;
+		vrLoc = 0;
+	};
+	E16E135DC5B038BE007EAD5F = {
+		fRef = F5694E2702E96FFE01AEEDB1;
+		isa = PBXBookmark;
+	};
+	E16E135EC5B038BE007EAD5F = {
+		fRef = F57D63160319B6CA01AEEDB1;
+		isa = PBXBookmark;
+	};
+	E16E135FC5B038BE007EAD5F = {
+		fRef = E1F3DF910579172A00E952A5;
+		isa = PBXTextBookmark;
+		name = "English: 12";
+		rLen = 0;
+		rLoc = 707;
+		rType = 0;
+		vrLen = 707;
+		vrLoc = 0;
+	};
+	E16E1365C5B038BE007EAD5F = {
+		fRef = E1EE9A2F0575769600F2D92C;
+		isa = PBXTextBookmark;
+		name = "Info-Application.plist: 10";
+		rLen = 0;
+		rLoc = 386;
+		rType = 0;
+		vrLen = 1026;
+		vrLoc = 0;
+	};
+	E16E137CC5B038BE007EAD5F = {
+		fRef = F5EFC2D6020A6E0E01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAAppList.h: 7";
+		rLen = 0;
+		rLoc = 157;
+		rType = 0;
+		vrLen = 1045;
+		vrLoc = 0;
+	};
+	E16E137EC5B038BE007EAD5F = {
+		fRef = E1E4A91C05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "#define\tkSCMessage\t\t'SCmg'\n";
+		rLen = 27;
+		rLoc = 14;
+		rType = 0;
+		vrLen = 646;
+		vrLoc = 0;
+	};
+	E16E137FC5B038BE007EAD5F = {
+		fRef = E16E13B0C5B038BE007EAD5F;
+		isa = PBXTextBookmark;
+		name = AEHelpers;
+		rLen = 9;
+		rLoc = 875;
+		rType = 0;
+		vrLen = 471;
+		vrLoc = 474;
+	};
+	E16E1380C5B038BE007EAD5F = {
+		fRef = E16E13AEC5B038BE007EAD5F;
+		isa = PBXTextBookmark;
+		name = "(null): 67";
+		rLen = 0;
+		rLoc = 1778;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 730;
+	};
+	E16E1381C5B038BE007EAD5F = {
+		fRef = F5FD788A034828E101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAWindowManager.m: 65";
+		rLen = 0;
+		rLoc = 2148;
+		rType = 0;
+		vrLen = 862;
+		vrLoc = 1588;
+	};
+	E16E1384C5B038BE007EAD5F = {
+		fRef = F5EFC2C9020A6CD101AEEDB1;
+		isa = PBXTextBookmark;
+		name = XXX;
+		rLen = 3;
+		rLoc = 2708;
+		rType = 0;
+		vrLen = 1186;
+		vrLoc = 2309;
+	};
+	E16E1385C5B038BE007EAD5F = {
+		fRef = F5EFC2E8020A8F7F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = XXX;
+		rLen = 3;
+		rLoc = 3361;
+		rType = 0;
+		vrLen = 1241;
+		vrLoc = 2861;
+	};
+	E16E1386C5B038BE007EAD5F = {
+		fRef = F5EFC2DC020A6EB901AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSString-NJRExtensions.m: 28";
+		rLen = 0;
+		rLoc = 945;
+		rType = 0;
+		vrLen = 1280;
+		vrLoc = 350;
+	};
+	E16E1388C5B038BE007EAD5F = {
+		fRef = 103DFC16016C12D80C000109;
+		isa = PBXTextBookmark;
+		name = SCPatchController;
+		rLen = 17;
+		rLoc = 996;
+		rType = 0;
+		vrLen = 779;
+		vrLoc = 865;
+	};
+	E16E1389C5B038BE007EAD5F = {
+		fRef = E16E13AFC5B038BE007EAD5F;
+		isa = PBXTextBookmark;
+		name = "(null): 1066";
+		rLen = 0;
+		rLoc = 39570;
+		rType = 0;
+		vrLen = 1130;
+		vrLoc = 38687;
+	};
+	E16E1392C5B038BE007EAD5F = {
+		fRef = E1E4A91C05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = kSCMessagePing;
+		rLen = 14;
+		rLoc = 49;
+		rType = 0;
+		vrLen = 646;
+		vrLoc = 0;
+	};
+	E16E1393C5B038BE007EAD5F = {
+		fRef = F5EFC2C9020A6CD101AEEDB1;
+		isa = PBXTextBookmark;
+		name = XXX;
+		rLen = 3;
+		rLoc = 2708;
+		rType = 0;
+		vrLen = 1186;
+		vrLoc = 2309;
+	};
+	E16E1394C5B038BE007EAD5F = {
+		fRef = F5EFC2E8020A8F7F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = XXX;
+		rLen = 3;
+		rLoc = 3361;
+		rType = 0;
+		vrLen = 1241;
+		vrLoc = 2861;
+	};
+	E16E1395C5B038BE007EAD5F = {
+		fRef = F5EFC2DC020A6EB901AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSString-NJRExtensions.m: 28";
+		rLen = 0;
+		rLoc = 945;
+		rType = 0;
+		vrLen = 1280;
+		vrLoc = 350;
+	};
+	E16E1396C5B038BE007EAD5F = {
+		fRef = F523EA2E020CF15B01AEEC37;
+		isa = PBXTextBookmark;
+		name = "FSAnywhere.m: FSA_FScriptMinimumVersion";
+		rLen = 0;
+		rLoc = 319;
+		rType = 0;
+		vrLen = 321;
+		vrLoc = 0;
+	};
+	E16E13AEC5B038BE007EAD5F = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = AEHelpers.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/Headers/AEHelpers.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E16E13AFC5B038BE007EAD5F = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = AEDataModel.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/Headers/AEDataModel.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E16E13B0C5B038BE007EAD5F = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = AE.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/Headers/AE.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1839B9705A0D11500E61119 = {
+		fRef = E1839B9B05A0D11600E61119;
+		isa = PBXTextBookmark;
+		name = "kern_return_t thread_suspend\n";
+		rLen = 29;
+		rLoc = 2204;
+		rType = 0;
+		vrLen = 616;
+		vrLoc = 1873;
+	};
+	E1839B9B05A0D11600E61119 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = thread_act.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/mach/thread_act.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1934FC80575A43D00BC2092 = {
+		isa = PBXSymbolicBreakpoint;
+		state = 1;
+		symbolName = "-[NSException raise]";
+	};
+	E1934FEB0575A9B700BC2092 = {
+		fRef = E1EE9AD5057596D100F2D92C;
+		isa = PBXTextBookmark;
+		name = path;
+		rLen = 4;
+		rLoc = 2144;
+		rType = 0;
+		vrLen = 2063;
+		vrLoc = 1342;
+	};
+	E1AFE00A05753C12008B0109 = {
+		isa = PBXSourceControlManager;
+		scmConfiguration = {
+		};
+		scmType = scm.cvs;
+	};
+	E1AFE00B05753C12008B0109 = {
+		indexTemplatePath = "";
+		isa = PBXCodeSenseManager;
+		usesDefaults = 1;
+		wantsCodeCompletion = 1;
+		wantsCodeCompletionAutoPopup = 1;
+		wantsCodeCompletionAutoSuggestions = 1;
+		wantsCodeCompletionCaseSensitivity = 1;
+		wantsCodeCompletionOnlyMatchingItems = 1;
+		wantsCodeCompletionParametersIncluded = 1;
+		wantsCodeCompletionPlaceholdersInserted = 1;
+		wantsCodeCompletionTabCompletes = 1;
 		wantsIndex = 1;
-		wantsSCM = -1;
-	};
-	29B97326FDCFA39411CA2CEA = {
+	};
+	E1AFE01005753C9C008B0109 = {
+		fRef = F535E67D020CD95201AEEC37;
+		isa = PBXBookmark;
+	};
+	E1AFE02805753CFC008B0109 = {
+		fRef = F5680F7F020D35ED01AEEC37;
+		isa = PBXTextBookmark;
+		name = "Read Me: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1424;
+		vrLoc = 0;
+	};
+	E1D651FA0575B3D50054F5D1 = {
+		activeExec = 0;
+	};
+	E1D652A40575B55B0054F5D1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 424}}";
+			sepNavSelRange = "{785, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 424}}";
+		};
+	};
+	E1D652A90575B5750054F5D1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 388}}";
+			sepNavSelRange = "{565, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 388}}";
+		};
+	};
+	E1D653B805768C630054F5D1 = {
+		fRef = F5FD7889034828E101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAWindowManager.h: separator";
+		rLen = 0;
+		rLoc = 315;
+		rType = 0;
+		vrLen = 590;
+		vrLoc = 0;
+	};
+	E1D653BD05768C630054F5D1 = {
+		fRef = E1D653EE05768C6A0054F5D1;
+		isa = PBXTextBookmark;
+		name = "- (const char *)fileSystemRepresentation;\n";
+		rLen = 42;
+		rLoc = 991;
+		rType = 0;
+		vrLen = 1220;
+		vrLoc = 0;
+	};
+	E1D653C605768C630054F5D1 = {
+		fRef = E1D653F105768C6A0054F5D1;
+		isa = PBXTextBookmark;
+		name = "(null): 24";
+		rLen = 0;
+		rLoc = 756;
+		rType = 0;
+		vrLen = 785;
+		vrLoc = 0;
+	};
+	E1D653D405768C630054F5D1 = {
+		fRef = E1EE98BC0575626E00F2D92C;
+		isa = PBXTextBookmark;
+		name = "mach_inject.c: 177";
+		rLen = 0;
+		rLoc = 5710;
+		rType = 0;
+		vrLen = 1207;
+		vrLoc = 4720;
+	};
+	E1D653EE05768C6A0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSPathUtilities.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSPathUtilities.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D653F105768C6A0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = text.plist.xml;
+		name = "Bundle-Info.plist";
+		path = "/Volumes/Ti/Users/nicholas/Documents/Development/Cocoa/F-Script Anywhere/Source/Bundle-Info.plist";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D653F605768C8F0054F5D1 = {
+		fRef = E1D653FA05768C960054F5D1;
+		isa = PBXTextBookmark;
+		name = "#import <objc/objc-class.h>\n";
+		rLen = 28;
+		rLoc = 1230;
+		rType = 0;
+		vrLen = 1445;
+		vrLoc = 0;
+	};
+	E1D653FA05768C960054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = "objc-runtime.h";
+		path = "/usr/include/objc/objc-runtime.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D654190576C1480054F5D1 = {
+		fRef = E1D654200576C14A0054F5D1;
+		isa = PBXTextBookmark;
+		name = "(null): 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 838;
+		vrLoc = 0;
+	};
+	E1D6541C0576C1480054F5D1 = {
+		fRef = E1D6541F0576C14A0054F5D1;
+		isa = PBXTextBookmark;
+		name = "(null): 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 838;
+		vrLoc = 0;
+	};
+	E1D6541F0576C14A0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CarbonCore.h;
+		path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/CarbonCore.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D654200576C14A0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CarbonCore.h;
+		path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/CarbonCore.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D654560576C6A60054F5D1 = {
+		fRef = E1D654600576C6BD0054F5D1;
+		isa = PBXTextBookmark;
+		name = "(null): 193";
+		rLen = 0;
+		rLoc = 5883;
+		rType = 0;
+		vrLen = 1242;
+		vrLoc = 4641;
+	};
+	E1D654600576C6BD0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = error.h;
+		path = /usr/include/mach/error.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D654770576D6EC0054F5D1 = {
+		fRef = E1D6547D0576D6EE0054F5D1;
+		isa = PBXTextBookmark;
+		name = "OBJC_EXPORT id objc_getClass(const char *name);\n";
+		rLen = 48;
+		rLoc = 1857;
+		rType = 0;
+		vrLen = 1314;
+		vrLoc = 1572;
+	};
+	E1D654780576D6EC0054F5D1 = {
+		fRef = E1D654800576D6EE0054F5D1;
+		isa = PBXTextBookmark;
+		name = "(null): 125";
+		rLen = 0;
+		rLoc = 5879;
+		rType = 0;
+		vrLen = 1750;
+		vrLoc = 5033;
+	};
+	E1D654790576D6EC0054F5D1 = {
+		fRef = E1D6547E0576D6EE0054F5D1;
+		isa = PBXTextBookmark;
+		name = "(null): 131";
+		rLen = 0;
+		rLoc = 4438;
+		rType = 0;
+		vrLen = 1278;
+		vrLoc = 3804;
+	};
+	E1D6547D0576D6EE0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = "objc-runtime.h";
+		path = "/usr/include/objc/objc-runtime.h";
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D6547E0576D6EE0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFRunLoop.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFRunLoop.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D654800576D6EE0054F5D1 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFString.h;
+		path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D6B28A05A306D9003838B0 = {
+		fRef = E1E4AA2F05A28F4E0097D040;
+		isa = PBXTextBookmark;
+		name = "CoreServices.h: 4";
+		rLen = 0;
+		rLoc = 51;
+		rType = 0;
+		vrLen = 686;
+		vrLoc = 154;
+	};
+	E1D6B59305A31C70003838B0 = {
+		fRef = E1D6B59F05A31C71003838B0;
+		isa = PBXTextBookmark;
+		name = "(null): 1276";
+		rLen = 0;
+		rLoc = 42478;
+		rType = 0;
+		vrLen = 1558;
+		vrLoc = 42217;
+	};
+	E1D6B59F05A31C71003838B0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CarbonEventsCore.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/CarbonEventsCore.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D6B5AB05A31D60003838B0 = {
+		fRef = E1E4A92105A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchContext.cpp: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1093;
+		vrLoc = 0;
+	};
+	E1D6B5B305A31D60003838B0 = {
+		fRef = E1EE98BD0575626E00F2D92C;
+		isa = PBXTextBookmark;
+		name = "mach_inject.h: 74";
+		rLen = 0;
+		rLoc = 2651;
+		rType = 0;
+		vrLen = 1304;
+		vrLoc = 0;
+	};
+	E1D6B5B405A31D60003838B0 = {
+		fRef = E1E4A92105A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchContext.cpp: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1093;
+		vrLoc = 0;
+	};
+	E1D6B5B605A31D60003838B0 = {
+		fRef = E1E4A92605A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchRecord.cpp: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1005;
+		vrLoc = 0;
+	};
+	E1D6B5B705A31D60003838B0 = {
+		fRef = E1E4A92705A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchRecord.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 629;
+		vrLoc = 0;
+	};
+	E1D6B61D05A3241D003838B0 = {
+		fRef = E1D6B62C05A32453003838B0;
+		isa = PBXTextBookmark;
+		name = "  cfragDupRegistrationErr       = -2805, /* The registration name was already in use.*/\n";
+		rLen = 88;
+		rLoc = 62967;
+		rType = 0;
+		vrLen = 2588;
+		vrLoc = 61970;
+	};
+	E1D6B62C05A32453003838B0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = MacErrors.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/MacErrors.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D6B63305A3259F003838B0 = {
+		fRef = F5EFC2CA020A6CD101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "DeVercruesseProcessManager.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1145;
+		vrLoc = 0;
+	};
+	E1D6B66605A4589E003838B0 = {
+		fRef = E1E4A92605A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchRecord.cpp: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 982;
+		vrLoc = 0;
+	};
+	E1D6B66905A4589E003838B0 = {
+		fRef = E1D6B67505A458CC003838B0;
+		isa = PBXTextBookmark;
+		name = "(null): 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1265;
+		vrLoc = 0;
+	};
+	E1D6B67505A458CC003838B0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = List.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/objc/List.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D6B68B05A45C17003838B0 = {
+		fRef = E1D6B69D05A45C39003838B0;
+		isa = PBXTextBookmark;
+		name = "struct HFSUniStr255 {\n";
+		rLen = 22;
+		rLoc = 1191;
+		rType = 0;
+		vrLen = 1060;
+		vrLoc = 926;
+	};
+	E1D6B69D05A45C39003838B0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = Files.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers/Files.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D6B6A205A4AA54003838B0 = {
+		fRef = E1E4A92205A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchContext.h: 9";
+		rLen = 0;
+		rLoc = 133;
+		rType = 0;
+		vrLen = 985;
+		vrLoc = 0;
+	};
+	E1D6B6A805A4AA54003838B0 = {
+		fRef = E1E4A92205A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchContext.h: 9";
+		rLen = 0;
+		rLoc = 133;
+		rType = 0;
+		vrLen = 985;
+		vrLoc = 0;
+	};
+	E1D6B6AF05A4AA55003838B0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = Processes.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/Headers/Processes.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1D6B7E705A4AACE003838B0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 779}}";
+			sepNavSelRange = "{331, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 372}}";
+			sepNavWindowFrame = "{{153, 199}, {750, 502}}";
+		};
+	};
+	E1E114CB057717CA004FA8D9 = {
+		fRef = E1E114D3057717D5004FA8D9;
+		isa = PBXTextBookmark;
+		name = "typedef struct _opaque_pthread_t { long sig; struct _pthread_handler_rec  *cleanup_stack; char opaque[__PTHREAD_SIZE__];} *pthread_t;\n";
+		rLen = 134;
+		rLoc = 7048;
+		rType = 0;
+		vrLen = 1465;
+		vrLoc = 6490;
+	};
+	E1E114CC057717CA004FA8D9 = {
+		fRef = E1E114D1057717D5004FA8D9;
+		isa = PBXTextBookmark;
+		name = "(null): 247";
+		rLen = 0;
+		rLoc = 8005;
+		rType = 0;
+		vrLen = 2085;
+		vrLoc = 6962;
+	};
+	E1E114D1057717D5004FA8D9 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = pthread.h;
+		path = /usr/include/pthread.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1E114D3057717D5004FA8D9 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = types.h;
+		path = /usr/include/sys/types.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1E4A91805A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 464}}";
+			sepNavSelRange = "{311, 33}";
+			sepNavVisRect = "{{0, 0}, {709, 464}}";
+			sepNavWindowFrame = "{{506, 77}, {750, 502}}";
+		};
+	};
+	E1E4A91905A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {712, 5267}}";
+			sepNavSelRange = "{9318, 21}";
+			sepNavVisRect = "{{0, 3540}, {712, 372}}";
+			sepNavWindowFrame = "{{38, 304}, {750, 502}}";
+		};
+	};
+	E1E4A91A05A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {712, 1152}}";
+			sepNavSelRange = "{2217, 13}";
+			sepNavVisRect = "{{0, 606}, {712, 372}}";
+		};
+	};
+	E1E4A91B05A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {674, 579}}";
+			sepNavSelRange = "{935, 0}";
+			sepNavVisRect = "{{0, 0}, {674, 579}}";
+		};
+	};
+	E1E4A91C05A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 504}}";
+			sepNavSelRange = "{14, 27}";
+			sepNavVisRect = "{{0, 0}, {688, 388}}";
+		};
+	};
+	E1E4A91E05A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 827}}";
+			sepNavSelRange = "{1549, 15}";
+			sepNavVisRect = "{{0, 384}, {688, 372}}";
+			sepNavWindowFrame = "{{146, 49}, {750, 502}}";
+		};
+	};
+	E1E4A91F05A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 443}}";
+			sepNavSelRange = "{343, 0}";
+			sepNavVisRect = "{{0, 26}, {688, 417}}";
+		};
+	};
+	E1E4A92105A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {687, 1283}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {687, 437}}";
+		};
+	};
+	E1E4A92205A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 756}}";
+			sepNavSelRange = "{133, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 437}}";
+			sepNavWindowFrame = "{{268, 94}, {750, 502}}";
+		};
+	};
+	E1E4A92305A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {674, 6720}}";
+			sepNavSelRange = "{10769, 0}";
+			sepNavVisRect = "{{0, 3989}, {674, 579}}";
+			sepNavWindowFrame = "{{130, 220}, {750, 502}}";
+		};
+	};
+	E1E4A92405A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {650, 1020}}";
+			sepNavSelRange = "{273, 7}";
+			sepNavVisRect = "{{0, 0}, {650, 582}}";
+			sepNavWindowFrame = "{{245, 115}, {750, 502}}";
+		};
+	};
+	E1E4A92505A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {650, 2976}}";
+			sepNavSelRange = "{205, 0}";
+			sepNavVisRect = "{{0, 0}, {650, 582}}";
+			sepNavWindowFrame = "{{61, 283}, {750, 502}}";
+		};
+	};
+	E1E4A92605A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {663, 695}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {663, 437}}";
+		};
+	};
+	E1E4A92705A25F440097D040 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 417}}";
+			sepNavSelRange = "{62, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 417}}";
+		};
+	};
+	E1E4A97205A282A50097D040 = {
+		fRef = 29B97316FDCFA39411CA2CEA;
+		isa = PBXTextBookmark;
+		name = "main.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 110;
+		vrLoc = 0;
+	};
+	E1E4AA0205A28C300097D040 = {
+		fRef = E1E4A91B05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchPrivate.c: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 935;
+		vrLoc = 0;
+	};
+	E1E4AA0405A28C300097D040 = {
+		fRef = E1E4A91805A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchCommon.h: 13";
+		rLen = 0;
+		rLoc = 531;
+		rType = 0;
+		vrLen = 248;
+		vrLoc = 0;
+	};
+	E1E4AA0F05A28CB90097D040 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSActionCell.h;
+		path = /Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSActionCell.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1E4AA1505A28F4D0097D040 = {
+		fRef = E1E4AA0F05A28CB90097D040;
+		isa = PBXTextBookmark;
+		name = "}
+";
+		rLen = 2;
+		rLoc = 313;
+		rType = 0;
+		vrLen = 881;
+		vrLoc = 0;
+	};
+	E1E4AA1705A28F4D0097D040 = {
+		fRef = E1E4AA3005A28F4E0097D040;
+		isa = PBXTextBookmark;
+		name = "(null): 12";
+		rLen = 0;
+		rLoc = 393;
+		rType = 0;
+		vrLen = 1094;
+		vrLoc = 0;
+	};
+	E1E4AA2505A28F4D0097D040 = {
+		fRef = E1E4AA0F05A28CB90097D040;
+		isa = PBXTextBookmark;
+		name = "}
+";
+		rLen = 2;
+		rLoc = 313;
+		rType = 0;
+		vrLen = 881;
+		vrLoc = 0;
+	};
+	E1E4AA2705A28F4D0097D040 = {
+		fRef = E1E4AA3205A28F4E0097D040;
+		isa = PBXTextBookmark;
+		name = "(null): 12";
+		rLen = 0;
+		rLoc = 393;
+		rType = 0;
+		vrLen = 1094;
+		vrLoc = 0;
+	};
+	E1E4AA2F05A28F4E0097D040 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CoreServices.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Headers/CoreServices.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1E4AA3005A28F4E0097D040 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = AppKit.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/AppKit.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1E4AA3205A28F4E0097D040 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = AppKit.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/AppKit.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1EE98BC0575626E00F2D92C = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 2424}}";
+			sepNavSelRange = "{360, 0}";
+			sepNavVisRect = "{{0, 192}, {688, 388}}";
+			sepNavWindowFrame = "{{15, 325}, {750, 502}}";
+		};
+	};
+	E1EE98BD0575626E00F2D92C = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 984}}";
+			sepNavSelRange = "{443, 0}";
+			sepNavVisRect = "{{0, 594}, {688, 388}}";
+			sepNavWindowFrame = "{{38, 304}, {750, 502}}";
+		};
+	};
+	E1EE98F40575684200F2D92C = {
+		fRef = 089C165DFE840E0CC02AAC07;
+		isa = PBXTextBookmark;
+		name = "English: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 251;
+		vrLoc = 0;
+	};
+	E1EE997B0575715D00F2D92C = {
+		fRef = E1EE99D30575717D00F2D92C;
+		isa = PBXTextBookmark;
+		name = "@interface PatchController : NSObject\n";
+		rLen = 38;
+		rLoc = 374;
+		rType = 0;
+		vrLen = 1358;
+		vrLoc = 0;
+	};
+	E1EE997D0575715D00F2D92C = {
+		fRef = E1EE99D40575717D00F2D92C;
+		isa = PBXTextBookmark;
+		name = "- (void)performSelector:(SEL)aSelector target:(id)target argument:(id)arg order:(unsigned)order modes:(NSArray *)modes;\n";
+		rLen = 120;
+		rLoc = 1648;
+		rType = 0;
+		vrLen = 1263;
+		vrLoc = 711;
+	};
+	E1EE997E0575715D00F2D92C = {
+		fRef = E1EE99D50575717D00F2D92C;
+		isa = PBXTextBookmark;
+		name = "(null): 178";
+		rLen = 0;
+		rLoc = 6288;
+		rType = 0;
+		vrLen = 1821;
+		vrLoc = 5118;
+	};
+	E1EE99860575715D00F2D92C = {
+		fRef = F574ADD6020AC10F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NJRScrollView.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 285;
+		vrLoc = 0;
+	};
+	E1EE998E0575715D00F2D92C = {
+		fRef = F5EFC2E1020A6FD501AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NJRLabeledImageCell.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1223;
+		vrLoc = 0;
+	};
+	E1EE998F0575715D00F2D92C = {
+		fRef = F5EFC2DD020A6EB901AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSString-NJRExtensions.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 324;
+		vrLoc = 0;
+	};
+	E1EE99900575715D00F2D92C = {
+		fRef = F53A0D8302750B1F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSTableView-NJRExtensions.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 347;
+		vrLoc = 0;
+	};
+	E1EE99950575715D00F2D92C = {
+		fRef = F574ADDA020ACAC801AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAController.h: 47";
+		rLen = 0;
+		rLoc = 1400;
+		rType = 0;
+		vrLen = 1301;
+		vrLoc = 98;
+	};
+	E1EE999E0575715D00F2D92C = {
+		fRef = F5FD7889034828E101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "FSAWindowManager.h: separator";
+		rLen = 0;
+		rLoc = 315;
+		rType = 0;
+		vrLen = 590;
+		vrLoc = 0;
+	};
+	E1EE99A20575715D00F2D92C = {
+		fRef = F5EFC2E7020A8F7F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "libMatch.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 230;
+		vrLoc = 0;
+	};
+	E1EE99B30575715D00F2D92C = {
+		fRef = F53A0D8302750B1F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSTableView-NJRExtensions.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 347;
+		vrLoc = 0;
+	};
+	E1EE99B80575715D00F2D92C = {
+		fRef = F574ADD5020AC10F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NJRScrollView.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 934;
+		vrLoc = 0;
+	};
+	E1EE99BF0575715D00F2D92C = {
+		fRef = F5EFC2E1020A6FD501AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NJRLabeledImageCell.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1223;
+		vrLoc = 0;
+	};
+	E1EE99C00575715D00F2D92C = {
+		fRef = F5EFC2E0020A6FD501AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NJRLabeledImageCell.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1203;
+		vrLoc = 0;
+	};
+	E1EE99C10575715D00F2D92C = {
+		fRef = F574ADD6020AC10F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NJRScrollView.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 285;
+		vrLoc = 0;
+	};
+	E1EE99C40575715D00F2D92C = {
+		fRef = F5EFC2DD020A6EB901AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSString-NJRExtensions.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 324;
+		vrLoc = 0;
+	};
+	E1EE99D30575717D00F2D92C = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = PatchCocoa.h;
+		path = /Volumes/Ti/usr/local/include/PatchCocoa.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1EE99D40575717D00F2D92C = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSRunLoop.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSRunLoop.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1EE99D50575717D00F2D92C = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSApplication.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSApplication.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1EE99EE057574EC00F2D92C = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSBundle.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSBundle.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1EE9A010575769600F2D92C = {
 		activeExec = 0;
 		executables = (
-			F59279F301FEA34701AEEC37,
+			E1EE9A310575769600F2D92C,
 		);
 	};
-	F5184FB202DF90C801AEEDB1 = {
-		fileReference = F5EFC2CA020A6CD101AEEDB1;
-		isa = PBXFileBreakpoint;
-		lineNumber = 162;
-		state = 2;
-	};
-	F574ADDB020ACAC801AEEDB1 = {
-		uiCtxt = {
-			sepNavWindowFrame = "{{15, 671}, {750, 502}}";
-		};
-	};
-	F57D63130318A6D601AEEDB1 = {
-		isa = PBXSymbolicBreakpoint;
-		state = 1;
-		symbolName = CFLog;
-	};
-	F59279F301FEA34701AEEC37 = {
+	E1EE9A2F0575769600F2D92C = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 407}}";
+			sepNavSelRange = "{840, 0}";
+			sepNavVisRect = "{{0, 35}, {688, 372}}";
+			sepNavWindowFrame = "{{84, 262}, {750, 502}}";
+		};
+	};
+	E1EE9A310575769600F2D92C = {
 		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
 		argumentStrings = (
 		);
+		configStateDict = {
+		};
 		debuggerPlugin = GDBDebugging;
 		dylibVariantSuffix = "";
 		enableDebugStr = 1;
 		environmentEntries = (
-			{
-				active = YES;
-				name = NSZombieEnabled;
-				value = YES;
-			},
 		);
 		isa = PBXExecutable;
@@ -722,13 +3104,719 @@
 		);
 	};
+	E1EE9A4E057576A700F2D92C = {
+		activeExec = 0;
+	};
+	E1EE9AD5057596D100F2D92C = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSURL.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSURL.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DF7C0579164100E952A5 = {
+		fRef = E1F3DF8B0579166500E952A5;
+		isa = PBXTextBookmark;
+		name = "(null): 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 889;
+		vrLoc = 0;
+	};
+	E1F3DF820579164100E952A5 = {
+		anchor = platformsettings;
+		fRef = E1F3DF8D0579166500E952A5;
+		glyphRangeLength = 0;
+		glyphRangeLocation = 0;
+		isa = PBXDocBookmark;
+		name = "Xcode Build Settings Release Note";
+	};
+	E1F3DF860579164100E952A5 = {
+		anchor = platformsettings;
+		fRef = E1F3DF8A0579166500E952A5;
+		glyphRangeLength = 0;
+		glyphRangeLocation = 0;
+		isa = PBXDocBookmark;
+		name = "Xcode Build Settings Release Note";
+	};
+	E1F3DF8A0579166500E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = text.html.documentation;
+		name = XcodeBuildSettings.html;
+		path = /Volumes/Ti/Developer/Documentation/ReleaseNotes/Xcode/XcodeBuildSettings.html;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DF8B0579166500E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = Notification.h;
+		path = /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Notification.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DF8C0579166500E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSWorkspace.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSWorkspace.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DF8D0579166500E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = text.html.documentation;
+		name = XcodeBuildSettings.html;
+		path = /Volumes/Ti/Developer/Documentation/ReleaseNotes/Xcode/XcodeBuildSettings.html;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DF910579172A00E952A5 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 372}}";
+			sepNavSelRange = "{707, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 372}}";
+		};
+	};
+	E1F3DFCE0579C32900E952A5 = {
+		fRef = E1F3DFDD0579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = "typedef\tint32_t\t\tpid_t;\t\t/* process id */\n";
+		rLen = 42;
+		rLoc = 4351;
+		rType = 0;
+		vrLen = 1388;
+		vrLoc = 3589;
+	};
+	E1F3DFCF0579C32900E952A5 = {
+		fRef = E1F3DFE10579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = pid_t;
+		rLen = 5;
+		rLoc = 4779;
+		rType = 0;
+		vrLen = 1368;
+		vrLoc = 4059;
+	};
+	E1F3DFD10579C32900E952A5 = {
+		fRef = E1F3DFE40579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = "(null): 33";
+		rLen = 0;
+		rLoc = 1605;
+		rType = 0;
+		vrLen = 1837;
+		vrLoc = 593;
+	};
+	E1F3DFD20579C32900E952A5 = {
+		fRef = E1F3DFE20579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = "(null): 35";
+		rLen = 0;
+		rLoc = 2302;
+		rType = 0;
+		vrLen = 2285;
+		vrLoc = 781;
+	};
+	E1F3DFD40579C32900E952A5 = {
+		fRef = E1F3DFE30579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = "typedef\tint\t\tkern_return_t;\n";
+		rLen = 28;
+		rLoc = 4099;
+		rType = 0;
+		vrLen = 1256;
+		vrLoc = 2932;
+	};
+	E1F3DFD60579C32900E952A5 = {
+		fRef = E1F3DFE50579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = kCFNumberIntType;
+		rLen = 16;
+		rLoc = 811;
+		rType = 0;
+		vrLen = 926;
+		vrLoc = 73;
+	};
+	E1F3DFDD0579C34900E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = types.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/sys/types.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DFDE0579C34900E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = error.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/mach/error.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DFE10579C34900E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = unistd.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/unistd.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DFE20579C34900E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSDistributedNotificationCenter.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSDistributedNotificationCenter.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DFE30579C34900E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = kern_return.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/usr/include/mach/ppc/kern_return.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DFE40579C34900E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFNotificationCenter.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFNotificationCenter.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3DFE50579C34900E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFNumber.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFNumber.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3E021057A53D100E952A5 = {
+		fRef = E1F3E02C057A53D800E952A5;
+		isa = PBXTextBookmark;
+		name = "CFDictionaryRef CFDictionaryCreate(CFAllocatorRef allocator, const void **keys, const void **values, CFIndex numValues, const CFDictionaryKeyCallBacks *keyCallBacks, const CFDictionaryValueCallBacks *valueCallBacks);\n";
+		rLen = 217;
+		rLoc = 13626;
+		rType = 0;
+		vrLen = 2225;
+		vrLoc = 12575;
+	};
+	E1F3E02C057A53D800E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFDictionary.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFDictionary.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3E033057A580C00E952A5 = {
+		fRef = E1F3E047057A581B00E952A5;
+		isa = PBXTextBookmark;
+		name = "typedef const struct __CFString * CFStringRef;\n";
+		rLen = 47;
+		rLoc = 3007;
+		rType = 0;
+		vrLen = 1127;
+		vrLoc = 2493;
+	};
+	E1F3E046057A581B00E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFString.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1F3E047057A581B00E952A5 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = CFBase.h;
+		path = /Volumes/Ti/Developer/SDKs/MacOSX10.2.7.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFBase.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E1FD00C705B90A64001DABE0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 464}}";
+			sepNavSelRange = "{608, 0}";
+			sepNavVisRect = "{{0, 0}, {709, 464}}";
+			sepNavWindowFrame = "{{824, 16}, {750, 502}}";
+		};
+	};
+	E1FD00D105B90B80001DABE0 = {
+		fRef = E1E4A91A05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = HandleMessage;
+		rLen = 13;
+		rLoc = 2217;
+		rType = 0;
+		vrLen = 1180;
+		vrLoc = 1480;
+	};
+	E1FD00DC05B90C38001DABE0 = {
+		fRef = 103DFC20016C16E20C000109;
+		isa = PBXTextBookmark;
+		name = "FSABundle.mm: 71";
+		rLen = 0;
+		rLoc = 2459;
+		rType = 0;
+		vrLen = 1154;
+		vrLoc = 1494;
+	};
+	E1FD00DF05B90C38001DABE0 = {
+		fRef = 103DFC20016C16E20C000109;
+		isa = PBXTextBookmark;
+		name = "FSABundle.mm: 71";
+		rLen = 0;
+		rLoc = 2459;
+		rType = 0;
+		vrLen = 1154;
+		vrLoc = 1494;
+	};
+	E1FD00E505B90C9C001DABE0 = {
+		fRef = E1E4A91905A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "\treturn (void *)err;\n";
+		rLen = 21;
+		rLoc = 9318;
+		rType = 0;
+		vrLen = 953;
+		vrLoc = 8852;
+	};
+	E1FD00E805B90C9C001DABE0 = {
+		fRef = F5694E2702E96FFE01AEEDB1;
+		isa = PBXBookmark;
+	};
+	E1FD00EA05B90C9C001DABE0 = {
+		fRef = E1E4A91905A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "\treturn (void *)err;\n";
+		rLen = 21;
+		rLoc = 9318;
+		rType = 0;
+		vrLen = 953;
+		vrLoc = 8852;
+	};
+	E1FD00F805B911A8001DABE0 = {
+		fRef = F535E67D020CD95201AEEC37;
+		isa = PBXBookmark;
+	};
+	E1FD00FB05B911A8001DABE0 = {
+		fRef = E1FD00C705B90A64001DABE0;
+		isa = PBXTextBookmark;
+		name = "SCPatchMessages.h: 14";
+		rLen = 0;
+		rLoc = 370;
+		rType = 0;
+		vrLen = 826;
+		vrLoc = 0;
+	};
+	E1FD00FC05B911A8001DABE0 = {
+		fRef = 103DFC17016C12D80C000109;
+		isa = PBXTextBookmark;
+		name = "FSAPatchController::ReceiveMessage";
+		rLen = 34;
+		rLoc = 3146;
+		rType = 0;
+		vrLen = 785;
+		vrLoc = 10922;
+	};
+	E1FD00FD05B911A8001DABE0 = {
+		fRef = E1E4A91E05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = kSCPatchSuccess;
+		rLen = 15;
+		rLoc = 1549;
+		rType = 0;
+		vrLen = 1187;
+		vrLoc = 817;
+	};
+	E1FD010605B911A8001DABE0 = {
+		fRef = E1FD00C705B90A64001DABE0;
+		isa = PBXTextBookmark;
+		name = "SCPatchMessages.h: 14";
+		rLen = 0;
+		rLoc = 370;
+		rType = 0;
+		vrLen = 826;
+		vrLoc = 0;
+	};
+	E1FD010805B911A8001DABE0 = {
+		fRef = E1E4A91E05A25F440097D040;
+		isa = PBXTextBookmark;
+		name = kSCPatchSuccess;
+		rLen = 15;
+		rLoc = 1549;
+		rType = 0;
+		vrLen = 1187;
+		vrLoc = 817;
+	};
+	E1FD011305B9121E001DABE0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 372}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 372}}";
+			sepNavWindowFrame = "{{199, 157}, {750, 502}}";
+		};
+	};
+	E1FD011E05B912F0001DABE0 = {
+		fRef = E1D6B7E705A4AACE003838B0;
+		isa = PBXTextBookmark;
+		name = "English: 9";
+		rLen = 0;
+		rLoc = 331;
+		rType = 0;
+		vrLen = 1464;
+		vrLoc = 0;
+	};
+	E1FD011F05B912F0001DABE0 = {
+		fRef = E1FD011305B9121E001DABE0;
+		isa = PBXTextBookmark;
+		name = "English: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 0;
+		vrLoc = 0;
+	};
+	E1FD012005B912F0001DABE0 = {
+		fRef = E1EE9A2F0575769600F2D92C;
+		isa = PBXTextBookmark;
+		name = "Info-Application.plist: 25";
+		rLen = 0;
+		rLoc = 840;
+		rType = 0;
+		vrLen = 875;
+		vrLoc = 151;
+	};
+	E1FD012105B912F0001DABE0 = {
+		fRef = E1F3DF910579172A00E952A5;
+		isa = PBXTextBookmark;
+		name = "English: 12";
+		rLen = 0;
+		rLoc = 707;
+		rType = 0;
+		vrLen = 707;
+		vrLoc = 0;
+	};
+	E1FD012205B912F0001DABE0 = {
+		fRef = F523EA2E020CF15B01AEEC37;
+		isa = PBXTextBookmark;
+		name = "FSAnywhere.m: FSA_FScriptMinimumVersion";
+		rLen = 0;
+		rLoc = 319;
+		rType = 0;
+		vrLen = 321;
+		vrLoc = 0;
+	};
+	E1FD012305B912F0001DABE0 = {
+		fRef = F523EA2B020CF06A01AEEC37;
+		isa = PBXTextBookmark;
+		name = "FSAnywhere.h: FSA_FSCRIPT_MIN_VERSION";
+		rLen = 0;
+		rLoc = 191;
+		rType = 0;
+		vrLen = 652;
+		vrLoc = 0;
+	};
+	E1FD012405B912F0001DABE0 = {
+		fRef = 089C165DFE840E0CC02AAC07;
+		isa = PBXTextBookmark;
+		name = "English: 7";
+		rLen = 0;
+		rLoc = 254;
+		rType = 0;
+		vrLen = 254;
+		vrLoc = 0;
+	};
+	E1FD012605B912F0001DABE0 = {
+		fRef = E1FD011305B9121E001DABE0;
+		isa = PBXTextBookmark;
+		name = "English: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 0;
+		vrLoc = 0;
+	};
+	E1FD015805B91B83001DABE0 = {
+		fRef = E1F3DFDE0579C34900E952A5;
+		isa = PBXTextBookmark;
+		name = "#define\terr_system(x)\t\t(((x)&0x3f)<<26)\n";
+		rLen = 40;
+		rLoc = 4808;
+		rType = 0;
+		vrLen = 1368;
+		vrLoc = 4515;
+	};
+	E1FD015905B91B83001DABE0 = {
+		fRef = E14C1ECE05A8DB19000D4AF3;
+		isa = PBXBookmark;
+	};
+	E1FD015A05B91B83001DABE0 = {
+		fRef = F53A0D8202750B1F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSTableView-NJRExtensions.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 262;
+		vrLoc = 0;
+	};
+	E1FD015B05B91B83001DABE0 = {
+		fRef = E1E4A91805A25F440097D040;
+		isa = PBXTextBookmark;
+		name = err_couldnt_load_main_bundle;
+		rLen = 28;
+		rLoc = 258;
+		rType = 0;
+		vrLen = 531;
+		vrLoc = 0;
+	};
+	E1FD015C05B91B83001DABE0 = {
+		fRef = E1E4A92505A25F440097D040;
+		isa = PBXTextBookmark;
+		name = "SCPatchLoader.c: err_couldnt_load_main_bundle";
+		rLen = 0;
+		rLoc = 205;
+		rType = 0;
+		vrLen = 1715;
+		vrLoc = 0;
+	};
+	E1FD015D05B91B83001DABE0 = {
+		fRef = E1E4A92405A25F440097D040;
+		isa = PBXTextBookmark;
+		name = mac_err;
+		rLen = 7;
+		rLoc = 273;
+		rType = 0;
+		vrLen = 1848;
+		vrLoc = 0;
+	};
+	E1FD015F05B91B83001DABE0 = {
+		fRef = E14C1ECE05A8DB19000D4AF3;
+		isa = PBXBookmark;
+	};
+	E1FD016005B91B83001DABE0 = {
+		fRef = F53A0D8202750B1F01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "NSTableView-NJRExtensions.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 262;
+		vrLoc = 0;
+	};
+	E1FD016305B91B83001DABE0 = {
+		fRef = E1E4A92305A25F440097D040;
+		isa = PBXTextBookmark;
+		name = mach_error_t;
+		rLen = 12;
+		rLoc = 9349;
+		rType = 0;
+		vrLen = 1789;
+		vrLoc = 9163;
+	};
+	E1FD016505B91B83001DABE0 = {
+		fRef = E1E4A92405A25F440097D040;
+		isa = PBXTextBookmark;
+		name = InstallPatchesInProcess;
+		rLen = 23;
+		rLoc = 3082;
+		rType = 0;
+		vrLen = 2349;
+		vrLoc = 980;
+	};
+	F5184FB202DF90C801AEEDB1 = {
+		fileReference = F5EFC2CA020A6CD101AEEDB1;
+		isa = PBXFileBreakpoint;
+		lineNumber = 162;
+		state = 2;
+	};
+	F523EA2B020CF06A01AEEC37 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 372}}";
+			sepNavSelRange = "{191, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 372}}";
+			sepNavWindowFrame = "{{199, 157}, {750, 502}}";
+		};
+	};
+	F523EA2E020CF15B01AEEC37 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 372}}";
+			sepNavSelRange = "{319, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 372}}";
+			sepNavWindowFrame = "{{199, 157}, {750, 502}}";
+		};
+	};
+	F53A0D8202750B1F01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {650, 582}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {650, 582}}";
+		};
+	};
+	F53A0D8302750B1F01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {620, 511}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {620, 511}}";
+		};
+	};
+	F5680F7F020D35ED01AEEC37 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {625, 3240}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {625, 515}}";
+			sepNavWindowFrame = "{{38, 304}, {750, 502}}";
+		};
+	};
+	F574ADD5020AC10F01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {712, 564}}";
+			sepNavSelRange = "{212, 38}";
+			sepNavVisRect = "{{0, 0}, {712, 388}}";
+		};
+	};
+	F574ADD6020AC10F01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {620, 511}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {620, 511}}";
+		};
+	};
+	F574ADDA020ACAC801AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {589, 599}}";
+			sepNavSelRange = "{937, 0}";
+			sepNavVisRect = "{{0, 158}, {589, 441}}";
+		};
+	};
+	F574ADDB020ACAC801AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 2879}}";
+			sepNavSelRange = "{6213, 7}";
+			sepNavVisRect = "{{0, 1374}, {688, 388}}";
+			sepNavWindowFrame = "{{15, 325}, {750, 502}}";
+		};
+	};
+	F57D63130318A6D601AEEDB1 = {
+		isa = PBXSymbolicBreakpoint;
+		state = 1;
+		symbolName = CFLog;
+	};
+	F5EFC2C9020A6CD101AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 4703}}";
+			sepNavSelRange = "{2708, 3}";
+			sepNavVisRect = "{{0, 1108}, {688, 388}}";
+			sepNavWindowFrame = "{{245, 115}, {750, 502}}";
+		};
+	};
 	F5EFC2CA020A6CD101AEEDB1 = {
 		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {663, 3947}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {663, 437}}";
 			sepNavWindowFrame = "{{61, 629}, {750, 502}}";
 		};
 	};
+	F5EFC2CB020A6CD101AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 1043}}";
+			sepNavSelRange = "{1596, 3}";
+			sepNavVisRect = "{{0, 578}, {688, 417}}";
+		};
+	};
+	F5EFC2D6020A6E0E01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 588}}";
+			sepNavSelRange = "{157, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 388}}";
+		};
+	};
+	F5EFC2D7020A6E0E01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 5207}}";
+			sepNavSelRange = "{3730, 0}";
+			sepNavVisRect = "{{0, 1168}, {688, 388}}";
+			sepNavWindowFrame = "{{199, 157}, {750, 502}}";
+		};
+	};
+	F5EFC2DC020A6EB901AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 539}}";
+			sepNavSelRange = "{945, 0}";
+			sepNavVisRect = "{{0, 140}, {688, 388}}";
+		};
+	};
+	F5EFC2DD020A6EB901AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {620, 511}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {620, 511}}";
+		};
+	};
+	F5EFC2E0020A6FD501AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {712, 2363}}";
+			sepNavSelRange = "{2926, 69}";
+			sepNavVisRect = "{{0, 1950}, {712, 388}}";
+		};
+	};
+	F5EFC2E1020A6FD501AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {620, 636}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {620, 511}}";
+		};
+	};
 	F5EFC2E7020A8F7F01AEEDB1 = {
 		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 388}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {688, 388}}";
 			sepNavWindowFrame = "{{107, 587}, {750, 502}}";
 		};
 	};
+	F5EFC2E8020A8F7F01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 10152}}";
+			sepNavSelRange = "{3361, 3}";
+			sepNavVisRect = "{{0, 1144}, {688, 388}}";
+		};
+	};
+	F5FD7889034828E101AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {620, 503}}";
+			sepNavSelRange = "{315, 0}";
+			sepNavVisRect = "{{0, 0}, {620, 503}}";
+		};
+	};
+	F5FD788A034828E101AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 3300}}";
+			sepNavSelRange = "{2148, 0}";
+			sepNavVisRect = "{{0, 580}, {688, 388}}";
+		};
+	};
+	F5FF50BC02E53B9E01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 659}}";
+			sepNavSelRange = "{1325, 0}";
+			sepNavVisRect = "{{0, 260}, {688, 388}}";
+		};
+	};
+	F5FF50BD02E53B9E01AEEDB1 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {688, 3528}}";
+			sepNavSelRange = "{1068, 0}";
+			sepNavVisRect = "{{0, 423}, {688, 417}}";
+			sepNavWindowFrame = "{{130, 220}, {750, 502}}";
+		};
+	};
 }
Index: trunk/Cocoa/F-Script Anywhere/Source/F-Script Anywhere.pbproj/project.pbxproj
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/F-Script Anywhere.pbproj/project.pbxproj	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/F-Script Anywhere.pbproj/project.pbxproj	(revision 153)
@@ -4,12 +4,6 @@
 	classes = {
 	};
-	objectVersion = 38;
+	objectVersion = 39;
 	objects = {
-		080E96DCFE201CFB7F000001 = {
-			fileRef = 29B97318FDCFA39411CA2CEA;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
 		089C165CFE840E0CC02AAC07 = {
 			children = (
@@ -19,17 +13,14 @@
 			name = InfoPlist.strings;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		089C165DFE840E0CC02AAC07 = {
 			fileEncoding = 10;
 			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
 			name = English;
 			path = English.lproj/InfoPlist.strings;
 			refType = 4;
-		};
-		089C165EFE840E0CC02AAC07 = {
-			fileRef = 089C165CFE840E0CC02AAC07;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 //080
@@ -44,148 +35,38 @@
 //104
 		103DFC16016C12D80C000109 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = FSAApp.h;
 			refType = 2;
+			sourceTree = SOURCE_ROOT;
 		};
 		103DFC17016C12D80C000109 = {
+			fileEncoding = 30;
 			indentWidth = 4;
 			isa = PBXFileReference;
-			path = FSAApp.m;
+			lastKnownFileType = sourcecode.cpp.objcpp;
+			path = FSAApp.mm;
 			refType = 2;
+			sourceTree = SOURCE_ROOT;
 			tabWidth = 8;
 			usesTabs = 0;
 		};
-		103DFC18016C12D80C000109 = {
-			fileRef = 103DFC16016C12D80C000109;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		103DFC19016C12D80C000109 = {
-			fileRef = 103DFC17016C12D80C000109;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		103DFC1A016C16650C000109 = {
-			isa = PBXLibraryReference;
-			path = "F-Script Anywhere";
-			refType = 3;
-		};
-		103DFC1B016C16650C000109 = {
-			buildPhases = (
-				103DFC1C016C16650C000109,
-				103DFC1D016C16650C000109,
-				103DFC1E016C16650C000109,
-				103DFC1F016C16650C000109,
-			);
-			buildSettings = {
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				LIBRARY_STYLE = BUNDLE;
-				OTHER_CFLAGS = "";
-				OTHER_LDFLAGS = "";
-				OTHER_LIBTOOL_FLAGS = "";
-				OTHER_REZFLAGS = "";
-				PREBINDING = NO;
-				PRODUCT_NAME = "F-Script Anywhere";
-				REZ_EXECUTABLE = YES;
-				SECTORDER_FLAGS = "";
-				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
-			};
-			isa = PBXLibraryTarget;
-			name = Library;
-			productInstallPath = /usr/local/lib;
-			productName = TestPatch;
-			productReference = 103DFC1A016C16650C000109;
-			shouldUseHeadermap = 0;
-		};
-		103DFC1C016C16650C000109 = {
-			buildActionMask = 2147483647;
-			files = (
-				F574ADDF020ACCDF01AEEDB1,
-				F523EA2C020CF06A01AEEC37,
-				F5FF50BE02E53B9E01AEEDB1,
-				F5FD788B034828E101AEEDB1,
-			);
-			isa = PBXHeadersBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		103DFC1D016C16650C000109 = {
-			buildActionMask = 2147483647;
-			files = (
-				103DFC26016C17070C000109,
-				F574ADE0020ACCDF01AEEDB1,
-				F523EA2F020CF15B01AEEC37,
-				F5FF50BF02E53B9E01AEEDB1,
-				F5FD788C034828E101AEEDB1,
-			);
-			isa = PBXSourcesBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		103DFC1E016C16650C000109 = {
-			buildActionMask = 2147483647;
-			files = (
-				F59279FA01FED09A01AEEC37,
-				F5EFC2C4020A6C2601AEEDB1,
-			);
-			isa = PBXFrameworksBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		103DFC1F016C16650C000109 = {
-			buildActionMask = 2147483647;
-			files = (
-			);
-			isa = PBXRezBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 		103DFC20016C16E20C000109 = {
-			isa = PBXFileReference;
-			path = FSABundle.m;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.cpp.objcpp;
+			path = FSABundle.mm;
 			refType = 2;
-		};
-		103DFC26016C17070C000109 = {
-			fileRef = 103DFC20016C16E20C000109;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		103DFC28016C17A00C000109 = {
-			buildActionMask = 2147483647;
-			dstPath = "";
-			dstSubfolderSpec = 7;
-			files = (
-				F535E680020CDD4601AEEC37,
-			);
-			isa = PBXCopyFilesBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
+			sourceTree = SOURCE_ROOT;
 		};
 		1058C7A1FEA54F0111CA2CBB = {
+			fallbackIsa = PBXFileReference;
 			isa = PBXFrameworkReference;
+			lastKnownFileType = wrapper.framework;
 			name = Cocoa.framework;
 			path = /System/Library/Frameworks/Cocoa.framework;
 			refType = 0;
-		};
-		1058C7A3FEA54F0111CA2CBB = {
-			fileRef = 1058C7A1FEA54F0111CA2CBB;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		108927070180B1F40C000084 = {
-			isa = PBXFileReference;
-			name = libPatchCocoa.a;
-			path = /usr/local/lib/libPatchCocoa.a;
-			refType = 0;
-		};
-		108927080180B1F40C000084 = {
-			fileRef = 108927070180B1F40C000084;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		108927090180B2600C000084 = {
-			isa = PBXTargetDependency;
-			target = 103DFC1B016C16650C000109;
+			sourceTree = "<absolute>";
 		};
 //100
@@ -194,19 +75,4 @@
 //103
 //104
-//170
-//171
-//172
-//173
-//174
-		17587328FF379C6511CA2CBB = {
-			isa = PBXApplicationReference;
-			path = "F-Script Anywhere.app";
-			refType = 3;
-		};
-//170
-//171
-//172
-//173
-//174
 //190
 //191
@@ -216,10 +82,12 @@
 		19C28FACFE9D520D11CA2CBB = {
 			children = (
-				17587328FF379C6511CA2CBB,
-				103DFC1A016C16650C000109,
+				E1EE9A300575769600F2D92C,
+				E1EE9A4F057576A700F2D92C,
+				E1D652040575B3D50054F5D1,
 			);
 			isa = PBXGroup;
 			name = Products;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 //190
@@ -234,14 +102,20 @@
 //294
 		29B97313FDCFA39411CA2CEA = {
+			buildSettings = {
+				MACOSX_DEPLOYMENT_TARGET = 10.2;
+				SDKROOT = /Developer/SDKs/MacOSX10.2.7.sdk;
+			};
 			buildStyles = (
 				4A9504CCFFE6A4B311CA0CBA,
 				4A9504CDFFE6A4B311CA0CBA,
 			);
+			hasScannedForEncodings = 1;
 			isa = PBXProject;
 			mainGroup = 29B97314FDCFA39411CA2CEA;
 			projectDirPath = "";
 			targets = (
-				29B97326FDCFA39411CA2CEA,
-				103DFC1B016C16650C000109,
+				E1EE9A010575769600F2D92C,
+				E1EE9A4E057576A700F2D92C,
+				E1D651FA0575B3D50054F5D1,
 			);
 		};
@@ -250,4 +124,5 @@
 				F523EA31020CF1C701AEEC37,
 				29B97315FDCFA39411CA2CEA,
+				E1E4A9C205A285140097D040,
 				F5EFC2DB020A6E4301AEEDB1,
 				F5EFC2D8020A6E0E01AEEDB1,
@@ -260,7 +135,9 @@
 			path = "";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		29B97315FDCFA39411CA2CEA = {
 			children = (
+				E1E4A91D05A25F440097D040,
 				103DFC20016C16E20C000109,
 				F574ADDA020ACAC801AEEDB1,
@@ -272,12 +149,16 @@
 			);
 			isa = PBXGroup;
-			name = "Library sources";
+			name = "Bundle sources";
 			path = "";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		29B97316FDCFA39411CA2CEA = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = main.m;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		29B97317FDCFA39411CA2CEA = {
@@ -286,7 +167,14 @@
 				F5680F7A020D0D0401AEEC37,
 				F5FF50C002E53EE101AEEDB1,
+				E1EE9A2F0575769600F2D92C,
 				089C165CFE840E0CC02AAC07,
+				E1D6B7E905A4AAE2003838B0,
+				E1FD011505B91232001DABE0,
+				E1F3DF900579172A00E952A5,
+				E1D652A40575B55B0054F5D1,
+				E1D652A90575B5750054F5D1,
 				F535E67D020CD95201AEEC37,
 				F5694E2702E96FFE01AEEDB1,
+				E14C1ECE05A8DB19000D4AF3,
 				F57D63160319B6CA01AEEDB1,
 				F523EA29020CEF5001AEEC37,
@@ -299,4 +187,5 @@
 			path = "";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		29B97318FDCFA39411CA2CEA = {
@@ -308,10 +197,13 @@
 			path = "";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		29B97319FDCFA39411CA2CEA = {
 			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
 			name = English;
 			path = English.lproj/MainMenu.nib;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		29B97323FDCFA39411CA2CEA = {
@@ -319,5 +211,4 @@
 				F59279FB01FED0C901AEEC37,
 				1058C7A1FEA54F0111CA2CBB,
-				108927070180B1F40C000084,
 				F5EFC2C3020A6C2601AEEDB1,
 			);
@@ -326,139 +217,5 @@
 			path = "";
 			refType = 4;
-		};
-		29B97326FDCFA39411CA2CEA = {
-			buildPhases = (
-				29B97327FDCFA39411CA2CEA,
-				29B97328FDCFA39411CA2CEA,
-				29B9732BFDCFA39411CA2CEA,
-				29B9732DFDCFA39411CA2CEA,
-				103DFC28016C17A00C000109,
-				F52D400302D2C7A201AEEDB1,
-				F5680F81020D365601AEEC37,
-			);
-			buildSettings = {
-				FRAMEWORK_SEARCH_PATHS = "\"$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"";
-				HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../Darwin source/Commands/Apple/cctools/include\"";
-				INSTALL_PATH = /;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../Darwin source/Commands/Apple/cctools/libstuff\"";
-				OTHER_LDFLAGS = "-multiply_defined suppress -lstuff";
-				PREBINDING = NO;
-				PRODUCT_NAME = "F-Script Anywhere";
-				SECTORDER_FLAGS = "";
-				WARNING_CFLAGS = "-Wno-long-double -Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
-				WRAPPER_EXTENSION = app;
-			};
-			dependencies = (
-				108927090180B2600C000084,
-			);
-			isa = PBXApplicationTarget;
-			name = Application;
-			productInstallPath = /;
-			productName = PatchTest;
-			productReference = 17587328FF379C6511CA2CBB;
-			productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
-<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
-<plist version=\"1.0\">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>F-Script Anywhere</string>
-	<key>CFBundleGetInfoString</key>
-	<string>F-Script Anywhere 1.1.6d1, © 2002 Nicholas Riley</string>
-	<key>CFBundleIconFile</key>
-	<string>Application icon</string>
-	<key>CFBundleIdentifier</key>
-	<string>net.sabi.FScriptAnywhereApp</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>F-Script Anywhere</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.1.6d1</string>
-	<key>CFBundleSignature</key>
-	<string>FSAn</string>
-	<key>CFBundleVersion</key>
-	<string>1.1.6d1</string>
-	<key>NSMainNibFile</key>
-	<string>MainMenu</string>
-	<key>NSPrincipalClass</key>
-	<string>FSAApp</string>
-</dict>
-</plist>
-";
-			shouldUseHeadermap = 1;
-		};
-		29B97327FDCFA39411CA2CEA = {
-			buildActionMask = 2147483647;
-			files = (
-				103DFC18016C12D80C000109,
-				F5EFC2CD020A6CD101AEEDB1,
-				F5EFC2CE020A6CD101AEEDB1,
-				F5EFC2D2020A6CEC01AEEDB1,
-				F5EFC2D9020A6E0E01AEEDB1,
-				F5EFC2DE020A6EB901AEEDB1,
-				F5EFC2E2020A6FD501AEEDB1,
-				F5EFC2E9020A8F7F01AEEDB1,
-				F574ADD7020AC10F01AEEDB1,
-				F523EA2D020CF06A01AEEC37,
-				F53A0D8402750B1F01AEEDB1,
-			);
-			isa = PBXHeadersBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		29B97328FDCFA39411CA2CEA = {
-			buildActionMask = 2147483647;
-			files = (
-				080E96DCFE201CFB7F000001,
-				089C165EFE840E0CC02AAC07,
-				F535E67E020CD95201AEEC37,
-				F523EA2A020CEF5001AEEC37,
-				F5680F7C020D0D0401AEEC37,
-				F5FF50C202E5418F01AEEDB1,
-				F5694E2802E96FFE01AEEDB1,
-				F57D63170319B6CA01AEEDB1,
-			);
-			isa = PBXResourcesBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		29B9732BFDCFA39411CA2CEA = {
-			buildActionMask = 2147483647;
-			files = (
-				29B9732CFDCFA39411CA2CEA,
-				103DFC19016C12D80C000109,
-				F5EFC2CF020A6CD101AEEDB1,
-				F5EFC2D0020A6CD101AEEDB1,
-				F5EFC2DA020A6E0E01AEEDB1,
-				F5EFC2DF020A6EB901AEEDB1,
-				F5EFC2E3020A6FD501AEEDB1,
-				F5EFC2EA020A8F7F01AEEDB1,
-				F5EFC2EC020A90DF01AEEDB1,
-				F574ADD8020AC10F01AEEDB1,
-				F523EA30020CF15B01AEEC37,
-				F53A0D8502750B1F01AEEDB1,
-			);
-			isa = PBXSourcesBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		29B9732CFDCFA39411CA2CEA = {
-			fileRef = 29B97316FDCFA39411CA2CEA;
-			isa = PBXBuildFile;
-			settings = {
-				ATTRIBUTES = (
-				);
-			};
-		};
-		29B9732DFDCFA39411CA2CEA = {
-			buildActionMask = 2147483647;
-			files = (
-				1058C7A3FEA54F0111CA2CBB,
-				108927080180B1F40C000084,
-				F5EFC2D5020A6D3701AEEDB1,
-			);
-			isa = PBXFrameworksBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
+			sourceTree = "<group>";
 		};
 //290
@@ -477,5 +234,10 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
 				OPTIMIZATION_CFLAGS = "-O0";
+				ZERO_LINK = NO;
 			};
 			isa = PBXBuildStyle;
@@ -487,5 +249,7 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				OTHER_CFLAGS = "-DFSA_DEBUG=0";
+				ZERO_LINK = NO;
 			};
 			isa = PBXBuildStyle;
@@ -497,4 +261,1168 @@
 //4A3
 //4A4
+//E10
+//E11
+//E12
+//E13
+//E14
+		E14C18BD05A4DE25000D4AF3 = {
+			fileRef = F5680F7A020D0D0401AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E14C18BE05A4DE29000D4AF3 = {
+			fileRef = F5FF50C002E53EE101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E14C18BF05A4F013000D4AF3 = {
+			fileRef = F5694E2702E96FFE01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E14C1ECE05A8DB19000D4AF3 = {
+			isa = PBXFileReference;
+			lastKnownFileType = image.tiff;
+			path = Ellipsis.tiff;
+			refType = 2;
+			sourceTree = SOURCE_ROOT;
+		};
+		E14C1ECF05A8DB19000D4AF3 = {
+			fileRef = E14C1ECE05A8DB19000D4AF3;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D651FA0575B3D50054F5D1 = {
+			buildPhases = (
+				E1D651FB0575B3D50054F5D1,
+				E1D651FD0575B3D50054F5D1,
+				E1D651FE0575B3D50054F5D1,
+				E1D652010575B3D50054F5D1,
+			);
+			buildRules = (
+			);
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SDKROOT)/$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+				GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+				GCC_WARN_UNKNOWN_PRAGMAS = NO;
+				INFOPLIST_FILE = "Bundle Loader-Info.plist";
+				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
+				OTHER_CFLAGS = "";
+				PRODUCT_NAME = SCPatchLoader;
+				WARNING_CFLAGS = "-Wmost";
+			};
+			dependencies = (
+			);
+			isa = PBXNativeTarget;
+			name = "Bundle Loader";
+			productName = Bundle;
+			productReference = E1D652040575B3D50054F5D1;
+			productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
+<plist version=\"1.0\">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>Bundle</string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.MySoftwareCompany.Bundle</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string></string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0.0d1</string>
+</dict>
+</plist>
+";
+			productType = "com.apple.product-type.bundle";
+		};
+		E1D651FB0575B3D50054F5D1 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1D6B5A105A31C84003838B0,
+				E1FD00CA05B90A64001DABE0,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1D651FD0575B3D50054F5D1 = {
+			buildActionMask = 2147483647;
+			files = (
+			);
+			isa = PBXResourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1D651FE0575B3D50054F5D1 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1E4A9D405A2852E0097D040,
+				E1D6B5A005A31C82003838B0,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1D652010575B3D50054F5D1 = {
+			buildActionMask = 2147483647;
+			files = (
+				E1D6B58C05A31C56003838B0,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1D652040575B3D50054F5D1 = {
+			explicitFileType = wrapper.cfbundle;
+			includeInIndex = 0;
+			isa = PBXFileReference;
+			path = SCPatchLoader.bundle;
+			refType = 3;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		E1D652050575B4870054F5D1 = {
+			fileRef = F574ADDA020ACAC801AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D652060575B4870054F5D1 = {
+			fileRef = F574ADDB020ACAC801AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D652070575B4890054F5D1 = {
+			fileRef = F5FF50BC02E53B9E01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D652080575B4890054F5D1 = {
+			fileRef = F5FF50BD02E53B9E01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D652090575B48A0054F5D1 = {
+			fileRef = F5FD7889034828E101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6520A0575B48B0054F5D1 = {
+			fileRef = F5FD788A034828E101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D652A40575B55B0054F5D1 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.xml;
+			path = "Bundle-Info.plist";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1D652A90575B5750054F5D1 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.xml;
+			path = "Bundle Loader-Info.plist";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1D652AA0575B5F10054F5D1 = {
+			fileRef = E1D652040575B3D50054F5D1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D652BB057666690054F5D1 = {
+			containerPortal = 29B97313FDCFA39411CA2CEA;
+			isa = PBXContainerItemProxy;
+			proxyType = 1;
+			remoteGlobalIDString = E1D651FA0575B3D50054F5D1;
+			remoteInfo = "Stub Bundle";
+		};
+		E1D652BC057666690054F5D1 = {
+			isa = PBXTargetDependency;
+			target = E1D651FA0575B3D50054F5D1;
+			targetProxy = E1D652BB057666690054F5D1;
+		};
+		E1D6B58C05A31C56003838B0 = {
+			fileRef = F59279FB01FED0C901AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5A005A31C82003838B0 = {
+			fileRef = E1E4A91B05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5A105A31C84003838B0 = {
+			fileRef = E1E4A91C05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5A205A31C94003838B0 = {
+			fileRef = E1EE98BD0575626E00F2D92C;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5A305A31CA1003838B0 = {
+			fileRef = E1E4A92105A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5A405A31CA2003838B0 = {
+			fileRef = E1E4A92205A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5A505A31CA4003838B0 = {
+			fileRef = E1E4A92605A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5A605A31CA5003838B0 = {
+			fileRef = E1E4A92705A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5FD05A32226003838B0 = {
+			fileRef = E1E4A91905A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B5FE05A3222D003838B0 = {
+			fileRef = E1E4A91A05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B69F05A45CBF003838B0 = {
+			fileRef = E1E4A91B05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B6A005A45CC0003838B0 = {
+			fileRef = E1E4A91C05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1D6B7E705A4AACE003838B0 = {
+			fileEncoding = 10;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
+			name = English;
+			path = English.lproj/Localizable.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1D6B7E905A4AAE2003838B0 = {
+			children = (
+				E1D6B7E705A4AACE003838B0,
+			);
+			isa = PBXVariantGroup;
+			name = Localizable.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1D6B7EA05A4AAE2003838B0 = {
+			fileRef = E1D6B7E905A4AAE2003838B0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4A91705A25F440097D040 = {
+			children = (
+				E1E4A91805A25F440097D040,
+				E1FD00C705B90A64001DABE0,
+				E1E4A91905A25F440097D040,
+				E1E4A91A05A25F440097D040,
+				E1E4A91B05A25F440097D040,
+				E1E4A91C05A25F440097D040,
+			);
+			isa = PBXGroup;
+			name = "SCPatch Common";
+			path = SCPatch/Common;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1E4A91805A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchCommon.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A91905A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.cpp.cpp;
+			path = SCPatchMessenger.cp;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A91A05A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchMessenger.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A91B05A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
+			path = SCPatchPrivate.c;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A91C05A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchPrivate.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A91D05A25F440097D040 = {
+			children = (
+				E1E4A91E05A25F440097D040,
+				E1E4A91F05A25F440097D040,
+			);
+			isa = PBXGroup;
+			name = SCPatchClient;
+			path = SCPatch/SCPatchClient;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1E4A91E05A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.cpp.cpp;
+			path = SCPatchClient.cpp;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A91F05A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchClient.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A92005A25F440097D040 = {
+			children = (
+				E1E4A92105A25F440097D040,
+				E1E4A92205A25F440097D040,
+				E1E4A92305A25F440097D040,
+				E1E4A92405A25F440097D040,
+				E1E4A92605A25F440097D040,
+				E1E4A92705A25F440097D040,
+			);
+			isa = PBXGroup;
+			name = SCPatchController;
+			path = SCPatch/SCPatchController;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1E4A92105A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.cpp.cpp;
+			path = SCPatchContext.cpp;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A92205A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchContext.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A92305A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.cpp.cpp;
+			path = SCPatchController.cpp;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A92405A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchController.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A92505A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
+			name = SCPatchLoader.c;
+			path = SCPatch/SCPatchController/SCPatchLoader.c;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A92605A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.cpp.cpp;
+			path = SCPatchRecord.cpp;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A92705A25F440097D040 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchRecord.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1E4A96305A261630097D040 = {
+			fileRef = E1E4A92305A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4A96405A261640097D040 = {
+			fileRef = E1E4A92405A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4A9C205A285140097D040 = {
+			children = (
+				E1E4A92505A25F440097D040,
+			);
+			isa = PBXGroup;
+			name = "Loader sources";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1E4A9D405A2852E0097D040 = {
+			fileRef = E1E4A92505A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4A9E405A28B210097D040 = {
+			fileRef = 103DFC20016C16E20C000109;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4A9F605A28BF80097D040 = {
+			fileRef = E1E4A91C05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4A9F705A28BFA0097D040 = {
+			fileRef = E1E4A91805A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4AA0905A28C860097D040 = {
+			fileRef = E1E4A91905A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4AA0A05A28C880097D040 = {
+			fileRef = E1E4A91A05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4AA0B05A28C930097D040 = {
+			fileRef = E1E4A91E05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4AA0C05A28C940097D040 = {
+			fileRef = E1E4A91F05A25F440097D040;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1E4AA1305A28EEB0097D040 = {
+			fileRef = F59279FB01FED0C901AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE98BB0575626E00F2D92C = {
+			children = (
+				E1EE98BC0575626E00F2D92C,
+				E1EE98BD0575626E00F2D92C,
+			);
+			isa = PBXGroup;
+			path = mach_inject;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1EE98BC0575626E00F2D92C = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
+			path = mach_inject.c;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1EE98BD0575626E00F2D92C = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = mach_inject.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1EE9A010575769600F2D92C = {
+			buildPhases = (
+				E1EE9A030575769600F2D92C,
+				E1EE9A0F0575769600F2D92C,
+				E1EE9A180575769600F2D92C,
+				E1EE9A260575769600F2D92C,
+				E1EE9A2B0575769600F2D92C,
+				E1EE9A2D0575769600F2D92C,
+			);
+			buildRules = (
+			);
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks";
+				HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../Darwin source/Commands/Apple/cctools/include\"";
+				INFOPLIST_FILE = "Info-Application.plist";
+				INSTALL_PATH = /;
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../Darwin source/Commands/Apple/cctools/libstuff\"";
+				OTHER_LDFLAGS = "-multiply_defined suppress -lstuff";
+				PREBINDING = YES;
+				PRODUCT_NAME = "F-Script Anywhere";
+				SECTORDER_FLAGS = "";
+				WARNING_CFLAGS = "-Wno-long-double -Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+				WRAPPER_EXTENSION = app;
+				ZERO_LINK = NO;
+			};
+			dependencies = (
+				E1EE9AA60575939700F2D92C,
+				E1D652BC057666690054F5D1,
+			);
+			isa = PBXNativeTarget;
+			name = Application;
+			productInstallPath = /;
+			productName = PatchTest;
+			productReference = E1EE9A300575769600F2D92C;
+			productType = "com.apple.product-type.application";
+		};
+		E1EE9A030575769600F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1EE9A040575769600F2D92C,
+				E1EE9A050575769600F2D92C,
+				E1EE9A060575769600F2D92C,
+				E1EE9A070575769600F2D92C,
+				E1EE9A080575769600F2D92C,
+				E1EE9A090575769600F2D92C,
+				E1EE9A0A0575769600F2D92C,
+				E1EE9A0B0575769600F2D92C,
+				E1EE9A0C0575769600F2D92C,
+				E1EE9A0D0575769600F2D92C,
+				E1EE9A0E0575769600F2D92C,
+				E1E4A96405A261640097D040,
+				E1D6B5A205A31C94003838B0,
+				E1D6B5A405A31CA2003838B0,
+				E1D6B5A605A31CA5003838B0,
+				E1D6B5FE05A3222D003838B0,
+				E1D6B6A005A45CC0003838B0,
+				E1FD00C805B90A64001DABE0,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A040575769600F2D92C = {
+			fileRef = 103DFC16016C12D80C000109;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A050575769600F2D92C = {
+			fileRef = F5EFC2CB020A6CD101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A060575769600F2D92C = {
+			fileRef = F5EFC2CC020A6CD101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A070575769600F2D92C = {
+			fileRef = F5EFC2D1020A6CEC01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A080575769600F2D92C = {
+			fileRef = F5EFC2D6020A6E0E01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A090575769600F2D92C = {
+			fileRef = F5EFC2DD020A6EB901AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A0A0575769600F2D92C = {
+			fileRef = F5EFC2E1020A6FD501AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A0B0575769600F2D92C = {
+			fileRef = F5EFC2E7020A8F7F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A0C0575769600F2D92C = {
+			fileRef = F574ADD6020AC10F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A0D0575769600F2D92C = {
+			fileRef = F523EA2B020CF06A01AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A0E0575769600F2D92C = {
+			fileRef = F53A0D8202750B1F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A0F0575769600F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1D652AA0575B5F10054F5D1,
+				E1EE9AA90575945300F2D92C,
+				E1EE9A100575769600F2D92C,
+				E1EE9A110575769600F2D92C,
+				E1EE9A120575769600F2D92C,
+				E1EE9A130575769600F2D92C,
+				E1EE9A170575769600F2D92C,
+				E1D6B7EA05A4AAE2003838B0,
+				E14C1ECF05A8DB19000D4AF3,
+				E1FD011605B91232001DABE0,
+			);
+			isa = PBXResourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A100575769600F2D92C = {
+			fileRef = 29B97318FDCFA39411CA2CEA;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A110575769600F2D92C = {
+			fileRef = 089C165CFE840E0CC02AAC07;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A120575769600F2D92C = {
+			fileRef = F535E67D020CD95201AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A130575769600F2D92C = {
+			fileRef = F523EA29020CEF5001AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A170575769600F2D92C = {
+			fileRef = F57D63160319B6CA01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A180575769600F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1EE9A190575769600F2D92C,
+				E1EE9A1A0575769600F2D92C,
+				E1EE9A1B0575769600F2D92C,
+				E1EE9A1C0575769600F2D92C,
+				E1EE9A1D0575769600F2D92C,
+				E1EE9A1E0575769600F2D92C,
+				E1EE9A1F0575769600F2D92C,
+				E1EE9A200575769600F2D92C,
+				E1EE9A210575769600F2D92C,
+				E1EE9A220575769600F2D92C,
+				E1EE9A230575769600F2D92C,
+				E1EE9A240575769600F2D92C,
+				E1EE9A250575769600F2D92C,
+				E1E4A96305A261630097D040,
+				E1D6B5A305A31CA1003838B0,
+				E1D6B5A505A31CA4003838B0,
+				E1D6B5FD05A32226003838B0,
+				E1D6B69F05A45CBF003838B0,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A190575769600F2D92C = {
+			fileRef = 29B97316FDCFA39411CA2CEA;
+			isa = PBXBuildFile;
+			settings = {
+				ATTRIBUTES = (
+				);
+			};
+		};
+		E1EE9A1A0575769600F2D92C = {
+			fileRef = 103DFC17016C12D80C000109;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A1B0575769600F2D92C = {
+			fileRef = F5EFC2C9020A6CD101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A1C0575769600F2D92C = {
+			fileRef = F5EFC2CA020A6CD101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A1D0575769600F2D92C = {
+			fileRef = F5EFC2D7020A6E0E01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A1E0575769600F2D92C = {
+			fileRef = F5EFC2DC020A6EB901AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A1F0575769600F2D92C = {
+			fileRef = F5EFC2E0020A6FD501AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A200575769600F2D92C = {
+			fileRef = F5EFC2E8020A8F7F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A210575769600F2D92C = {
+			fileRef = F5EFC2EB020A90DF01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A220575769600F2D92C = {
+			fileRef = F574ADD5020AC10F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A230575769600F2D92C = {
+			fileRef = F523EA2E020CF15B01AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A240575769600F2D92C = {
+			fileRef = F53A0D8302750B1F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A250575769600F2D92C = {
+			fileRef = E1EE98BC0575626E00F2D92C;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A260575769600F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1EE9A270575769600F2D92C,
+				E1EE9A280575769600F2D92C,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A270575769600F2D92C = {
+			fileRef = 1058C7A1FEA54F0111CA2CBB;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A280575769600F2D92C = {
+			fileRef = F59279FB01FED0C901AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A2B0575769600F2D92C = {
+			buildActionMask = 12;
+			dstPath = "${DSTROOT}";
+			dstSubfolderSpec = 0;
+			files = (
+				E1EE9A2C0575769600F2D92C,
+			);
+			isa = PBXCopyFilesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A2C0575769600F2D92C = {
+			fileRef = F5680F83020D369A01AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A2D0575769600F2D92C = {
+			buildActionMask = 8;
+			files = (
+			);
+			isa = PBXShellScriptBuildPhase;
+			runOnlyForDeploymentPostprocessing = 1;
+			shellPath = /bin/sh;
+			shellScript = "# Copy various README files into DSTROOT if building a root\n\nif [ z\"${DSTROOT}\" != z\"\" ] ; then\n    rm -f \"${DSTROOT}/Read Me\"\n    tr '\\n' '\\r' < \"Read Me\" > \"${DSTROOT}/Read Me\"\n    cp \"Read Me.rsrc\" \"${DSTROOT}/Read Me/..namedfork/rsrc\"\n    /Developer/Tools/SetFile -t 'ttro' -c 'ttxt' \"${DSTROOT}/Read Me\"\n        \n    # Create Darwin source directory\n    mkdir \"${DSTROOT}/Darwin source\"\n    \n    # Fix permissions so ditto doesn't lock people out\n    chmod -R a+rX,u+w \"${DSTROOT}\"\nfi";
+		};
+		E1EE9A2F0575769600F2D92C = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.xml;
+			path = "Info-Application.plist";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1EE9A300575769600F2D92C = {
+			explicitFileType = wrapper.application;
+			includeInIndex = 0;
+			isa = PBXFileReference;
+			path = "F-Script Anywhere.app";
+			refType = 3;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		E1EE9A4A057576A700F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1EE9A7B0575778900F2D92C,
+				E1D652050575B4870054F5D1,
+				E1D652070575B4890054F5D1,
+				E1D652090575B48A0054F5D1,
+				E1E4A9F605A28BF80097D040,
+				E1E4A9F705A28BFA0097D040,
+				E1E4AA0A05A28C880097D040,
+				E1E4AA0C05A28C940097D040,
+				E1FD00C905B90A64001DABE0,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A4B057576A700F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1F3DF920579172A00E952A5,
+				E14C18BD05A4DE25000D4AF3,
+				E14C18BE05A4DE29000D4AF3,
+				E14C18BF05A4F013000D4AF3,
+			);
+			isa = PBXResourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A4C057576A700F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1EE9A7C0575778900F2D92C,
+				E1D652060575B4870054F5D1,
+				E1D652080575B4890054F5D1,
+				E1D6520A0575B48B0054F5D1,
+				E1E4A9E405A28B210097D040,
+				E1E4AA0905A28C860097D040,
+				E1E4AA0B05A28C930097D040,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A4D057576A700F2D92C = {
+			buildActionMask = 2147483647;
+			files = (
+				E1EE9A7A0575776700F2D92C,
+				E1EE9A790575776300F2D92C,
+				E1E4AA1305A28EEB0097D040,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E1EE9A4E057576A700F2D92C = {
+			buildPhases = (
+				E1EE9A4A057576A700F2D92C,
+				E1EE9A4B057576A700F2D92C,
+				E1EE9A4C057576A700F2D92C,
+				E1EE9A4D057576A700F2D92C,
+			);
+			buildRules = (
+			);
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = /Volumes/Ti/Library/Frameworks;
+				GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+				GCC_WARN_UNKNOWN_PRAGMAS = NO;
+				INFOPLIST_FILE = "Bundle-Info.plist";
+				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
+				OTHER_CFLAGS = "";
+				PRODUCT_NAME = "F-Script Anywhere";
+				SECTORDER_FLAGS = "";
+			};
+			dependencies = (
+			);
+			isa = PBXNativeTarget;
+			name = Bundle;
+			productName = Bundle;
+			productReference = E1EE9A4F057576A700F2D92C;
+			productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
+<plist version=\"1.0\">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>Bundle</string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.MySoftwareCompany.Bundle</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string></string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0.0d1</string>
+</dict>
+</plist>
+";
+			productType = "com.apple.product-type.bundle";
+		};
+		E1EE9A4F057576A700F2D92C = {
+			explicitFileType = wrapper.cfbundle;
+			includeInIndex = 0;
+			isa = PBXFileReference;
+			path = "F-Script Anywhere.bundle";
+			refType = 3;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		E1EE9A790575776300F2D92C = {
+			fileRef = F5EFC2C3020A6C2601AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A7A0575776700F2D92C = {
+			fileRef = 1058C7A1FEA54F0111CA2CBB;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A7B0575778900F2D92C = {
+			fileRef = F523EA2B020CF06A01AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9A7C0575778900F2D92C = {
+			fileRef = F523EA2E020CF15B01AEEC37;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1EE9AA50575939700F2D92C = {
+			containerPortal = 29B97313FDCFA39411CA2CEA;
+			isa = PBXContainerItemProxy;
+			proxyType = 1;
+			remoteGlobalIDString = E1EE9A4E057576A700F2D92C;
+			remoteInfo = Bundle;
+		};
+		E1EE9AA60575939700F2D92C = {
+			isa = PBXTargetDependency;
+			target = E1EE9A4E057576A700F2D92C;
+			targetProxy = E1EE9AA50575939700F2D92C;
+		};
+		E1EE9AA90575945300F2D92C = {
+			fileRef = E1EE9A4F057576A700F2D92C;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1F3DF900579172A00E952A5 = {
+			children = (
+				E1F3DF910579172A00E952A5,
+			);
+			isa = PBXVariantGroup;
+			name = FSA.strings;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1F3DF910579172A00E952A5 = {
+			fileEncoding = 10;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
+			name = English;
+			path = English.lproj/FSA.strings;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1F3DF920579172A00E952A5 = {
+			fileRef = E1F3DF900579172A00E952A5;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1FD00C705B90A64001DABE0 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = SCPatchMessages.h;
+			refType = 4;
+			sourceTree = "<group>";
+			tabWidth = 4;
+			usesTabs = 1;
+		};
+		E1FD00C805B90A64001DABE0 = {
+			fileRef = E1FD00C705B90A64001DABE0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1FD00C905B90A64001DABE0 = {
+			fileRef = E1FD00C705B90A64001DABE0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1FD00CA05B90A64001DABE0 = {
+			fileRef = E1FD00C705B90A64001DABE0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E1FD011305B9121E001DABE0 = {
+			fileEncoding = 10;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist.strings;
+			name = English;
+			path = "English.lproj/mach_error descriptions.strings";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1FD011505B91232001DABE0 = {
+			children = (
+				E1FD011305B9121E001DABE0,
+			);
+			isa = PBXVariantGroup;
+			name = "mach_error descriptions.strings";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E1FD011605B91232001DABE0 = {
+			fileRef = E1FD011505B91232001DABE0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+//E10
+//E11
+//E12
+//E13
+//E14
 //F50
 //F51
@@ -504,7 +1432,9 @@
 		F523EA27020CEB5701AEEC37 = {
 			isa = PBXFileReference;
+			lastKnownFileType = text.rtf;
 			name = English;
 			path = English.lproj/Credits.rtf;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F523EA29020CEF5001AEEC37 = {
@@ -515,47 +1445,25 @@
 			name = Credits.rtf;
 			refType = 4;
-		};
-		F523EA2A020CEF5001AEEC37 = {
-			fileRef = F523EA29020CEF5001AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F523EA2B020CF06A01AEEC37 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = FSAnywhere.h;
 			refType = 4;
-		};
-		F523EA2C020CF06A01AEEC37 = {
-			fileRef = F523EA2B020CF06A01AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F523EA2D020CF06A01AEEC37 = {
-			fileRef = F523EA2B020CF06A01AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F523EA2E020CF15B01AEEC37 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = FSAnywhere.m;
 			refType = 4;
-		};
-		F523EA2F020CF15B01AEEC37 = {
-			fileRef = F523EA2E020CF15B01AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F523EA30020CF15B01AEEC37 = {
-			fileRef = F523EA2E020CF15B01AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F523EA31020CF1C701AEEC37 = {
 			children = (
+				E1E4A91705A25F440097D040,
 				F523EA2B020CF06A01AEEC37,
 				F523EA2E020CF15B01AEEC37,
@@ -565,59 +1473,28 @@
 			path = "";
 			refType = 4;
-		};
-		F52D400302D2C7A201AEEDB1 = {
-			buildActionMask = 12;
-			dstPath = "${DSTROOT}";
-			dstSubfolderSpec = 0;
-			files = (
-				F52D400402D2C7A501AEEDB1,
-			);
-			isa = PBXCopyFilesBuildPhase;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		F52D400402D2C7A501AEEDB1 = {
-			fileRef = F5680F83020D369A01AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F535E67D020CD95201AEEC37 = {
 			isa = PBXFileReference;
+			lastKnownFileType = image.icns;
 			path = "Application icon.icns";
 			refType = 4;
-		};
-		F535E67E020CD95201AEEC37 = {
-			fileRef = F535E67D020CD95201AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F535E680020CDD4601AEEC37 = {
-			fileRef = 103DFC1A016C16650C000109;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F53A0D8202750B1F01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = "NSTableView-NJRExtensions.h";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F53A0D8302750B1F01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = "NSTableView-NJRExtensions.m";
 			refType = 4;
-		};
-		F53A0D8402750B1F01AEEDB1 = {
-			fileRef = F53A0D8202750B1F01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F53A0D8502750B1F01AEEDB1 = {
-			fileRef = F53A0D8302750B1F01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5680F7A020D0D0401AEEC37 = {
@@ -629,206 +1506,157 @@
 			path = "";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5680F7B020D0D0401AEEC37 = {
 			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
 			name = English;
 			path = English.lproj/FSAInterpreterPanel.nib;
 			refType = 4;
-		};
-		F5680F7C020D0D0401AEEC37 = {
-			fileRef = F5680F7A020D0D0401AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5680F7F020D35ED01AEEC37 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text;
 			path = "Read Me";
 			refType = 4;
-		};
-		F5680F81020D365601AEEC37 = {
-			buildActionMask = 8;
-			files = (
-			);
-			generatedFileNames = (
-			);
-			isa = PBXShellScriptBuildPhase;
-			neededFileNames = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-			shellPath = /bin/sh;
-			shellScript = "# Copy various README files into DSTROOT if building a root\n\nif [ z\"${DSTROOT}\" != z\"\" ] ; then\n    rm -f \"${DSTROOT}/Read Me\"\n    tr '\\n' '\\r' < \"Read Me\" > \"${DSTROOT}/Read Me\"\n    cp \"Read Me.rsrc\" \"${DSTROOT}/Read Me/..namedfork/rsrc\"\n    /Developer/Tools/SetFile -t 'ttro' -c 'ttxt' \"${DSTROOT}/Read Me\"\n        \n    # Create Darwin source directory\n    mkdir \"${DSTROOT}/Darwin source\"\n    \n    # Fix permissions so ditto doesn't lock people out\n    chmod -R a+rX,u+w \"${DSTROOT}\"\nfi";
+			sourceTree = "<group>";
 		};
 		F5680F83020D369A01AEEC37 = {
 			isa = PBXFileReference;
+			lastKnownFileType = text.rtf;
 			name = LICENSE.rtf;
 			path = ../LICENSE.rtf;
 			refType = 2;
+			sourceTree = SOURCE_ROOT;
 		};
 		F5694E2702E96FFE01AEEDB1 = {
 			isa = PBXFileReference;
+			lastKnownFileType = image.tiff;
 			path = "Bullseye menu cursor.tiff";
 			refType = 4;
-		};
-		F5694E2802E96FFE01AEEDB1 = {
-			fileRef = F5694E2702E96FFE01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F574ADD5020AC10F01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = NJRScrollView.m;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F574ADD6020AC10F01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = NJRScrollView.h;
 			refType = 4;
-		};
-		F574ADD7020AC10F01AEEDB1 = {
-			fileRef = F574ADD6020AC10F01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F574ADD8020AC10F01AEEDB1 = {
-			fileRef = F574ADD5020AC10F01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F574ADDA020ACAC801AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = FSAController.h;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F574ADDB020ACAC801AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = FSAController.m;
 			refType = 4;
-		};
-		F574ADDF020ACCDF01AEEDB1 = {
-			fileRef = F574ADDA020ACAC801AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F574ADE0020ACCDF01AEEDB1 = {
-			fileRef = F574ADDB020ACAC801AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F57D63160319B6CA01AEEDB1 = {
 			isa = PBXFileReference;
+			lastKnownFileType = image.tiff;
 			path = "Fallback checkmark.tiff";
 			refType = 4;
-		};
-		F57D63170319B6CA01AEEDB1 = {
-			fileRef = F57D63160319B6CA01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F59279FA01FED09A01AEEC37 = {
-			fileRef = 1058C7A1FEA54F0111CA2CBB;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F59279FB01FED0C901AEEC37 = {
+			fallbackIsa = PBXFileReference;
 			isa = PBXFrameworkReference;
+			lastKnownFileType = wrapper.framework;
 			name = Carbon.framework;
 			path = /System/Library/Frameworks/Carbon.framework;
 			refType = 0;
+			sourceTree = "<absolute>";
 		};
 		F5B11ED902E67DB101AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = text;
 			path = VERSION;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2C3020A6C2601AEEDB1 = {
+			fallbackIsa = PBXFileReference;
 			isa = PBXFrameworkReference;
+			lastKnownFileType = wrapper.framework;
 			name = FScript.framework;
 			path = /Library/Frameworks/FScript.framework;
 			refType = 0;
-		};
-		F5EFC2C4020A6C2601AEEDB1 = {
-			fileRef = F5EFC2C3020A6C2601AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<absolute>";
 		};
 		F5EFC2C9020A6CD101AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = DeVercruesseProcess.m;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2CA020A6CD101AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = DeVercruesseProcessManager.m;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2CB020A6CD101AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = DeVercruesseProcess.h;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2CC020A6CD101AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = DeVercruesseProcessManager.h;
 			refType = 4;
-		};
-		F5EFC2CD020A6CD101AEEDB1 = {
-			fileRef = F5EFC2CB020A6CD101AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2CE020A6CD101AEEDB1 = {
-			fileRef = F5EFC2CC020A6CD101AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2CF020A6CD101AEEDB1 = {
-			fileRef = F5EFC2C9020A6CD101AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2D0020A6CD101AEEDB1 = {
-			fileRef = F5EFC2CA020A6CD101AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5EFC2D1020A6CEC01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = CPS.h;
 			refType = 4;
-		};
-		F5EFC2D2020A6CEC01AEEDB1 = {
-			fileRef = F5EFC2D1020A6CEC01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2D5020A6D3701AEEDB1 = {
-			fileRef = F59279FB01FED0C901AEEC37;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5EFC2D6020A6E0E01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = FSAAppList.h;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2D7020A6E0E01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = FSAAppList.m;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2D8020A6E0E01AEEDB1 = {
@@ -844,19 +1672,10 @@
 			path = "";
 			refType = 4;
-		};
-		F5EFC2D9020A6E0E01AEEDB1 = {
-			fileRef = F5EFC2D6020A6E0E01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2DA020A6E0E01AEEDB1 = {
-			fileRef = F5EFC2D7020A6E0E01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5EFC2DB020A6E4301AEEDB1 = {
 			children = (
+				E1EE98BB0575626E00F2D92C,
+				E1E4A92005A25F440097D040,
 				29B97316FDCFA39411CA2CEA,
 				103DFC16016C12D80C000109,
@@ -880,125 +1699,93 @@
 			path = "";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2DC020A6EB901AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = "NSString-NJRExtensions.m";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2DD020A6EB901AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = "NSString-NJRExtensions.h";
 			refType = 4;
-		};
-		F5EFC2DE020A6EB901AEEDB1 = {
-			fileRef = F5EFC2DD020A6EB901AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2DF020A6EB901AEEDB1 = {
-			fileRef = F5EFC2DC020A6EB901AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5EFC2E0020A6FD501AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = NJRLabeledImageCell.m;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2E1020A6FD501AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = NJRLabeledImageCell.h;
 			refType = 4;
-		};
-		F5EFC2E2020A6FD501AEEDB1 = {
-			fileRef = F5EFC2E1020A6FD501AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2E3020A6FD501AEEDB1 = {
-			fileRef = F5EFC2E0020A6FD501AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5EFC2E7020A8F7F01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = libMatch.h;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5EFC2E8020A8F7F01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
 			path = libMatch.c;
 			refType = 4;
-		};
-		F5EFC2E9020A8F7F01AEEDB1 = {
-			fileRef = F5EFC2E7020A8F7F01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5EFC2EA020A8F7F01AEEDB1 = {
-			fileRef = F5EFC2E8020A8F7F01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5EFC2EB020A90DF01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.c;
 			path = bytesex.c;
 			refType = 4;
-		};
-		F5EFC2EC020A90DF01AEEDB1 = {
-			fileRef = F5EFC2EB020A90DF01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5FD7889034828E101AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = FSAWindowManager.h;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5FD788A034828E101AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = FSAWindowManager.m;
 			refType = 4;
-		};
-		F5FD788B034828E101AEEDB1 = {
-			fileRef = F5FD7889034828E101AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5FD788C034828E101AEEDB1 = {
-			fileRef = F5FD788A034828E101AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5FF50BC02E53B9E01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
 			path = FSAViewAssociationController.h;
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5FF50BD02E53B9E01AEEDB1 = {
-			isa = PBXFileReference;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
 			path = FSAViewAssociationController.m;
 			refType = 4;
-		};
-		F5FF50BE02E53B9E01AEEDB1 = {
-			fileRef = F5FF50BC02E53B9E01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
-		};
-		F5FF50BF02E53B9E01AEEDB1 = {
-			fileRef = F5FF50BD02E53B9E01AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 		F5FF50C002E53EE101AEEDB1 = {
@@ -1010,16 +1797,13 @@
 			path = "";
 			refType = 4;
+			sourceTree = "<group>";
 		};
 		F5FF50C102E53EE101AEEDB1 = {
 			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
 			name = English;
 			path = English.lproj/FSAViewAssociationPanel.nib;
 			refType = 4;
-		};
-		F5FF50C202E5418F01AEEDB1 = {
-			fileRef = F5FF50C002E53EE101AEEDB1;
-			isa = PBXBuildFile;
-			settings = {
-			};
+			sourceTree = "<group>";
 		};
 	};
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAApp.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAApp.h	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAApp.h	(revision 153)
@@ -28,20 +28,31 @@
 #import "FSAAppList.h"
 
+#include "SCPatchController.h"
+
+@class FSAApp;
+
+class FSAPatchController : public SCPatchController {
+public:
+    FSAPatchController(FSAApp *fsaApp);
+    void PatchNotification(ProcessSerialNumber *inPSN,
+                           OSType inCreator, OSType type,
+                           CFStringRef name, UInt32 flags);
+    void ReceiveMessage(const AppleEvent *theAE);
+private:
+    FSAApp *mApp;
+};
+
 @interface FSAApp : NSApplication
 {
-    IBOutlet NSPanel *appListPanel;
+    IBOutlet NSWindow *appListWindow;
     IBOutlet FSAAppList *appList;
+    FSAPatchController *patchController;
 }
 
-- (void) finishLaunching;
+- (IBAction)installBundleInSelectedApp:(id)sender;
 
-- (IBAction)installBundleInSelectedApp:(id)sender;
-- (void)unloadBundles:(id)sender;
 @end
 
-@interface FSAApp (PatchControllerDelegate)
-
-- (void) notifyProcessLaunch:(pid_t)pid info:(NSDictionary*)info;
-- (void) notifyProcessDeath:(pid_t)pid info:(NSDictionary*)info;
-
+@interface FSAApp (FSAPatchControllerDelegate)
+- (void)controllerIsPatchingApplicationWithProcessID:(pid_t)pid;
 @end
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAApp.mm
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAApp.mm	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAApp.mm	(revision 153)
@@ -0,0 +1,286 @@
+//
+//  FSAApp.m
+//  F-Script Anywhere
+//
+//  Created by Nicholas Riley on Fri Feb 01 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+/*
+
+ F-Script Anywhere is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ F-Script Anywhere is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with F-Script Anywhere; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*/
+
+#import "FSAApp.h"
+#import "FSAnywhere.h"
+
+NSString * const PatchBundleIdentifier = @"net.sabi.FScriptAnywhere";
+NSString * const PatchBundleName = @"F-Script Anywhere.bundle";
+
+typedef struct {
+    OSStatus err;
+    NSString * const desc;
+} errRec, errList[];
+
+// These are just educated guesses based on the errors I've seen; I haven't seen these documented anywhere!
+static errList ERRS = { // XXX change for mach_inject/SCPatch
+    { 5, @"F-Script Anywhere must be installed in a Cocoa application running as the current user.\n\nYou may be attempting to install in a setuid application, which is not supported" },
+    { 11, @"F-Script Anywhere cannot be installed in itself.\n\nIf you wish to install F-Script Anywhere in itself, make a copy of the F-Script Anywhere application and install one copy into the other" },
+    { smUnExBusErr, @"a bus error occurred.\n\nTry switching to the application first then using F-Script AnywhereÕs dock menu to install" },
+    { fnfErr, @"F-Script Anywhere was unable to locate its component to install in the application.  Please try reinstalling F-Script Anywhere" },
+    { cfragDupRegistrationErr, @"another running copy of F-Script Anywhere is already installed in the application"},
+    { 0, nil }
+};
+
+NSMutableDictionary *FSA_errors;
+
+NSString * FSA_descriptionForOSStatus(OSStatus err)
+{
+    NSString *desc = nil;
+    
+    if (FSA_errors != nil)
+        desc = [FSA_errors objectForKey: [NSNumber numberWithLong: err]];
+    
+    if (desc != nil)
+        return desc;
+    
+    return [NSString stringWithFormat: NSLocalizedString(@"an error of type %ld occurred", "Unknown error message used after 'XXX happened because'"), err];
+}
+
+FSAPatchController::FSAPatchController(FSAApp *fsaApp)
+{
+    mApp = fsaApp;
+}
+
+void FSAPatchController::PatchNotification(ProcessSerialNumber *inPSN, OSType inCreator, OSType type, CFStringRef name, UInt32 flags) {
+    pid_t pid;
+    OSStatus err = GetProcessPID(inPSN, &pid);
+    
+    NSCAssert3(err == noErr, @"PatchNotification can't get PID for PSN %ld.%ld: error %ld", inPSN->highLongOfPSN, inPSN->lowLongOfPSN, err);
+    
+    FSALog(@"Got patch notification for %@ (pid %d)", (NSString *)name, pid);
+    [mApp controllerIsPatchingApplicationWithProcessID: pid];
+}
+
+// XXX should remove?
+void FSAPatchController::ReceiveMessage(const AppleEvent *theAE) {
+    OSErr err = noErr;
+    Size actualSize;
+    DescType actualType;
+    OSType eventClass, eventID;
+    
+    if ((err = AEGetAttributePtr(theAE, keyEventClassAttr, typeType, &actualType, &eventClass, sizeof(OSType), &actualSize)) != noErr)
+        return;
+    if (eventClass != kSCMessageClass)
+        return;
+
+    if ((err = AEGetAttributePtr(theAE, keyEventIDAttr, typeType, &actualType, &eventID, sizeof(OSType), &actualSize)) != noErr)
+        return;
+    
+    if (eventID == kSCLoadResult) {
+        OSStatus 
+        (err = AEGetParamPtr(theAE, keyError, typeInteger, &actualType, &error, sizeof(long), &actualSize)) == noErr &&
+        (err = AEGetParamPtr(theAE, keyBundleID, typeText, &actualType, bundleID, sizeof(bundleID), &actualSize)) == noErr)
+        bundleID[actualSize] = 0;
+        printf("patch bundle %s loaded with error status %d\n", bundleID, error);
+    }
+    
+
+}
+
+
+@implementation FSAApp
+
++ (void)initialize;
+{
+    errRec *rec;
+
+    FSA_errors = [[NSMutableDictionary alloc] init];
+    for (rec = &(ERRS[0]) ; rec->err != 0 ; rec++)
+        [FSA_errors setObject: rec->desc forKey: [NSNumber numberWithLong: rec->err]];
+}
+
+- (BOOL)_shouldContinueAfterFrameworkErrorPanelReturnedWithResult:(int)result;
+{
+    switch (result) {
+        case NSAlertOtherReturn:
+            return true;
+        case NSAlertAlternateReturn:
+            [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: FSA_FScriptURL]];
+        case NSAlertDefaultReturn:
+        default:
+            [self terminate: self];
+            return false;
+    }
+}
+
+- (void)finishLaunching
+{
+    patchController = new FSAPatchController(self);
+    patchController->AddPatch((CFStringRef)PatchBundleIdentifier, CFSTR("Contents/Resources/"),
+                              (CFStringRef)PatchBundleName);
+    
+    NSEnumerator *e = [[appList cocoaAppProcessIDs] objectEnumerator];
+    pid_t pid;
+    ProcessSerialNumber psn;
+    OSStatus err;
+    
+    while ( (pid = [[e nextObject] longValue]) != 0) {
+        err = GetProcessForPID(pid, &psn);
+        
+        if (err != noErr) {
+            NSLog(@"Can't get PSN for PID %ld", pid);
+            [appList applicationQuitWithProcessID: pid];
+        } else if (patchController->IsProcessPatched(&psn)) {
+            [appList didPatchProcessID: pid];
+        }
+    }
+
+    // yes, someone could move the framework while the app is running, but they deserve what they get.
+    NSFileManager *fileMgr = [NSFileManager defaultManager];
+    NSArray *libraryDirectories =
+        NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSAllDomainsMask, TRUE);
+    NSString *libPath;
+    NSString *frameworkPath;
+    CFBundleRef frameworkBundle = NULL;
+    BOOL isDirectory;
+
+    e = [libraryDirectories objectEnumerator];
+    while ( (libPath = [e nextObject]) != nil) {
+        frameworkPath = [[libPath stringByAppendingPathComponent: @"Frameworks"]
+            stringByAppendingPathComponent: @"FScript.framework"];
+        if ([fileMgr fileExistsAtPath: frameworkPath isDirectory: &isDirectory] && isDirectory) {
+            frameworkBundle = CFBundleCreate(kCFAllocatorDefault, (CFURLRef)[NSURL fileURLWithPath: frameworkPath]);
+            [(id)frameworkBundle autorelease];
+            break;
+        }
+    }
+    FSALog(@"Framework bundle");
+    FSAShow(frameworkBundle);
+    [super finishLaunching];
+    if (frameworkBundle == NULL) {
+        int result = NSRunInformationalAlertPanel(
+            NSLocalizedString(@"F-Script Framework Not Found", "Framework not found alert title"),
+            NSLocalizedString(@"F-Script Anywhere requires the F-Script framework be installed in a Frameworks directory, such as ~/Library/Frameworks or /Library/Frameworks.\n\nTo download F-Script, please visit its Web site\n%@.\n\nIf you believe this message is in error, click '%@'.",
+                              "Framework not found alert message, F-Script Web site URL parameter, 'Continue' button parameter"),
+            NSLocalizedString(@"Quit", "Quit button title"),
+            NSLocalizedString(@"Get F-Script", "'Get F-Script' button title"),
+            NSLocalizedString(@"Continue", "Continue button title"),
+            FSA_FScriptURL, NSLocalizedString(@"Continue", ""));
+        if (![self _shouldContinueAfterFrameworkErrorPanelReturnedWithResult: result]) return;
+    } else {
+        UInt32 version = CFBundleGetVersionNumber(frameworkBundle);
+        FSALog(@"Framework version 0x%x", version);
+        if (version < FSA_FSCRIPT_MIN_VERSION) {
+            NSString *frameworkVersion = (NSString *)CFBundleGetValueForInfoDictionaryKey(frameworkBundle, kCFBundleVersionKey);
+            if (frameworkVersion == nil)
+                frameworkVersion = NSLocalizedString(@"unavailable", "Framework too old 'unavailable' version");
+            int result = NSRunInformationalAlertPanel(
+		NSLocalizedString(@"F-Script Framework Too Old", "Framework too old alert title"),
+		NSLocalizedString(@"F-Script Anywhere %s requires version %@ or later of the F-Script framework be installed in a Frameworks directory, such as ~/Library/Frameworks or /Library/Frameworks. The installed version is %@.\n\nTo upgrade F-Script, please visit its Web site\n%@.\n\nTo use this version of F-Script regardless of the problems you may experience, click '%@'.",
+                                  "Framework too old alert message, FSA version parameter, minimum F-Script version parameter, current F-Script version parameter, F-Script Web site URL parameter, 'Continue' button parameter"),
+		NSLocalizedString(@"Quit", "Quit button title"),
+                NSLocalizedString(@"Get F-Script", "'Get F-Script' button title"),
+                NSLocalizedString(@"Continue", "Continue button title"),
+                FSA_VERSION, FSA_FScriptMinimumVersion, frameworkVersion,
+                FSA_FScriptURL, NSLocalizedString(@"Continue", ""));
+            if (![self _shouldContinueAfterFrameworkErrorPanelReturnedWithResult: result]) return;
+        }
+    }
+
+    NSNotificationCenter *workspaceNotificationCenter = [[NSWorkspace sharedWorkspace] notificationCenter];
+    [workspaceNotificationCenter
+        addObserver: self
+           selector: @selector(applicationDidLaunch:)
+               name: NSWorkspaceWillLaunchApplicationNotification
+             object: nil];
+    [workspaceNotificationCenter
+        addObserver: self
+           selector: @selector(applicationDidTerminate:)
+               name: NSWorkspaceDidTerminateApplicationNotification
+             object: nil];
+    
+    [appListWindow makeKeyAndOrderFront: self];
+}
+
+- (void)installationError:(OSStatus)err inAppWithPID:(pid_t)pid;
+{
+    NSBeginAlertSheet(NSLocalizedString(@"Installation failed", "Unable to install alert title"),
+                      nil, nil, nil, appListWindow, self, nil, nil, nil,
+                      NSLocalizedString(@"F-Script Anywhere was unable to install itself in the selected application (process ID %d), because %@.\n\nThe application may have crashed; restart it if needed.", "Unable to install alert message, PID parameter, 'XXX happened because' explanation parameter"),
+                      pid, FSA_descriptionForOSStatus(err));
+}
+
+- (void)installBundleInAppWithPID:(pid_t)pid;
+{
+    if (pid == -1) return;
+        
+    ProcessSerialNumber psn;
+    OSStatus err = GetProcessForPID(pid, &psn);
+    
+    if (err == noErr)
+        err = patchController->PatchProcess(&psn);
+    
+    if (err != noErr)
+        [self installationError: err inAppWithPID: pid];
+}
+
+- (void)loaderBundleMessage:(NSNotification *)notification;
+{
+    /*
+    if (error) {
+        [self installationError: error inAppWithPID: pid];
+    } else {
+        [appList didPatchProcessID: pid];
+    } */
+}
+
+- (IBAction)installBundleInSelectedApp:(id)sender;
+{
+    [self installBundleInAppWithPID: [appList selectedProcessID]];
+}
+
+// from dock menu only!
+- (IBAction)installBundleInFrontmostApp:(id)sender;
+{
+    NSAssert1([sender tag] > 0, @"Unable to determine frontmost application from %@", sender);
+    [self installBundleInAppWithPID: (pid_t)[sender tag]];
+}
+
+@end
+
+@implementation FSAApp (FSAPatchControllerDelegate)
+
+- (void)controllerIsPatchingApplicationWithProcessID:(pid_t)pid;
+{
+    [appList isPatchingProcessID: pid];
+}
+
+@end
+
+@implementation FSAApp (NSWorkspaceNotifications)
+
+- (void)applicationDidLaunch:(NSNotification *)notification;
+{
+    [appList applicationLaunchedWithProcessID: [[[notification userInfo] objectForKey: @"NSApplicationProcessIdentifier"] intValue]];
+}
+
+- (void)applicationDidTerminate:(NSNotification *)notification;
+{
+    [appList applicationQuitWithProcessID: [[[notification userInfo] objectForKey: @"NSApplicationProcessIdentifier"] intValue]];
+}
+
+@end
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAAppList.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAAppList.h	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAAppList.h	(revision 153)
@@ -34,4 +34,5 @@
     NSMutableDictionary *appsByPID;
     NSMutableSet *patchedApps;
+    NSMutableSet *patchingApps;    
     IBOutlet NSButton *installButton;
     IBOutlet NSTableView *tableView;
@@ -39,8 +40,10 @@
 
 - (pid_t)selectedProcessID;
+- (void)isPatchingProcessID:(pid_t)pid;
 - (void)didPatchProcessID:(pid_t)pid;
 - (void)applicationLaunchedWithProcessID:(pid_t)pid;
 - (void)applicationQuitWithProcessID:(pid_t)pid;
 - (void)update;
+- (NSArray *)cocoaAppProcessIDs;
 
 @end
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAAppList.m
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAAppList.m	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAAppList.m	(revision 153)
@@ -25,7 +25,6 @@
 */
 
+#import "FSAAppList.h"
 #import "FSAnywhere.h"
-#import "FSAAppList.h"
-#import "FSAApp.h"
 #import "libMatch.h"
 #import "DeVercruesseProcessManager.h"
@@ -43,4 +42,7 @@
 NSString *FSACheckMarkCharacter;
 NSImage *FSACheckMarkImage;
+
+NSString *FSAEllipsisCharacter;
+NSImage *FSAEllipsisImage;
 
 static const char *FSACocoaFrameworks[] = {
@@ -65,4 +67,10 @@
         FSALog(@"Falling back to checkmark image from bundle: %@", FSACheckMarkImage);
     }
+    FSAEllipsisCharacter = [[NSString alloc] initWithCharacters: (const unichar *)"\x20\x26" length: 1];
+    FSAEllipsisImage = [[NSImage alloc] initByReferencingFile: [[NSBundle mainBundle] pathForResource: @"Ellipsis" ofType: @"tiff"]];
+    if (FSAEllipsisImage != nil && ![FSAEllipsisImage isValid]) {
+        [FSAEllipsisImage release];
+        FSAEllipsisImage = nil;
+    }
 }
 
@@ -74,4 +82,5 @@
     cocoaApps = [[NSMutableArray alloc] init];
     patchedApps = [[NSMutableSet alloc] init];
+    patchingApps = [[NSMutableSet alloc] init];
     appsByPID = [[NSMutableDictionary alloc] init];
 
@@ -85,5 +94,4 @@
     [self update];
     [window makeFirstResponder: tableView];
-    [window makeKeyAndOrderFront: self];
 }
 
@@ -105,9 +113,27 @@
 }
 
+- (void)_processStatusChanged;
+{
+    [tableView reloadData];
+    [self tableView: tableView shouldSelectRow: [tableView selectedRow]];
+}
+
+- (DeVercruesseProcess *)_applicationForPID:(pid_t)pid;
+{
+    return [appsByPID objectForKey: [NSNumber numberWithInt: pid]];
+}
+
 - (void)didPatchProcessID:(pid_t)pid;
 {
-    [patchedApps addObject: [appsByPID objectForKey: [NSNumber numberWithInt: pid]]];
-    [tableView reloadData];
-    [installButton setEnabled: NO];
+    DeVercruesseProcess *app = [self _applicationForPID: pid];
+    [patchingApps removeObject: app];
+    [patchedApps addObject: app];
+    [self _processStatusChanged];
+}
+
+- (void)isPatchingProcessID:(pid_t)pid;
+{
+    [patchingApps addObject: [self _applicationForPID: pid]];
+    [self _processStatusChanged];
 }
 
@@ -201,5 +227,5 @@
     [cocoaApps removeAllObjects];
     [appsByPID removeAllObjects];
-    // [processManager update]; // [processManager processes] sends update
+    // [processManager update] unneeded: [processManager processes] sends update
 
     allApps = [processManager processes];
@@ -211,15 +237,21 @@
 
     [tableView noteNumberOfRowsChanged];
-    [tableView reloadData];
-    // XXX this is broken, it doesn't update properly
-    [self tableView: tableView shouldSelectRow: [tableView selectedRow]];
+    [self _processStatusChanged];
+}
+
+- (NSArray *)cocoaAppProcessIDs;
+{
+    NSEnumerator *e = [cocoaApps objectEnumerator];
+    NSMutableArray *pids = [NSMutableArray arrayWithCapacity: [cocoaApps count]];
+    DeVercruesseProcess *app;
+    while ( (app = [e nextObject]) != nil) {
+        [pids addObject: [NSNumber numberWithInt: [app pid]]];
+    }
+    return pids;
 }
 
 - (void)applicationLaunchedWithProcessID:(pid_t)pid;
 {
-    NSNumber *pidNum = [NSNumber numberWithInt: pid];
-    DeVercruesseProcess *app = [appsByPID objectForKey: pidNum];
-
-    if (app == nil) {
+    if ([self _applicationForPID: pid] == nil) {
         [self update];
     }
@@ -228,14 +260,14 @@
 - (void)applicationQuitWithProcessID:(pid_t)pid;
 {
-    NSNumber *pidNum = [NSNumber numberWithInt: pid];
-    DeVercruesseProcess *app = [appsByPID objectForKey: pidNum];
+    DeVercruesseProcess *app = [self _applicationForPID: pid];
 
     if (app != nil) {
         [cocoaApps removeObject: app];
-        [appsByPID removeObjectForKey: pidNum];
+        [appsByPID removeObjectForKey: [NSNumber numberWithLong: pid]];
         [patchedApps removeObject: app];
     }
 
-    [tableView reloadData];
+    [tableView noteNumberOfRowsChanged];
+    [self _processStatusChanged];
 }
 
@@ -260,5 +292,7 @@
 
     if (row != -1) {
-        canInstall = ![patchedApps containsObject: [cocoaApps objectAtIndex: row]];
+        DeVercruesseProcess *app = [cocoaApps objectAtIndex: row];
+        canInstall = !([patchedApps containsObject: app] ||
+                       [patchingApps containsObject: app]);
     }
 
@@ -286,9 +320,17 @@
         return [(DeVercruesseProcess *)[cocoaApps objectAtIndex: rowIndex] name];
     } else if ([columnIdentifier isEqualToString: FSATableColumnIdentifier_checkMark]) {
-        BOOL isPatched = [patchedApps containsObject: [cocoaApps objectAtIndex: rowIndex]];
-        if (FSACheckMarkImage == nil)
-            return isPatched ? FSACheckMarkCharacter : @"";
-        else
-            return isPatched ? FSACheckMarkImage : nil;
+        DeVercruesseProcess *app = [cocoaApps objectAtIndex: rowIndex];
+        if ([patchedApps containsObject: app]) {
+            if (FSACheckMarkImage == nil)
+                return FSACheckMarkCharacter;
+            else
+                return FSACheckMarkImage;
+        }
+        if ([patchingApps containsObject: app]) {
+            if (FSAEllipsisImage == nil)
+                return FSAEllipsisCharacter;
+            else
+                return FSAEllipsisImage;
+        }
     }
     return nil;
@@ -327,29 +369,4 @@
 }
 
-- (BOOL)windowShouldClose:(id)sender;
-{
-    if ([patchedApps count] != 0) {
-        NSMutableString *message =  [@"F-Script Anywhere is installed in the following applications:\n\n" mutableCopy];
-        NSEnumerator *e = [patchedApps objectEnumerator];
-        DeVercruesseProcess *app;
-        int retval;
-
-        while ( (app = [e nextObject]) != nil) {
-            [message appendFormat: @"    ¥ %@\n", [app name]];
-        }
-
-        [message appendString: @"\nIf F-Script Anywhere quits now, these applications will be forced to quit, and any changes you have made in them will be lost.\n\nPlease quit these applications before quitting F-Script Anywhere, or click Force Quit to continue."];
-
-        retval = NSRunAlertPanel(@"Force applications to quit?", message, @"DonÕt Quit", @"Force Quit", nil);
-        if (retval != NSAlertAlternateReturn) {
-            return NO;
-        }
-
-        [(FSAApp *)NSApp unloadBundles: self];
-    }
-
-    return YES;
-}
-
 @end
 
@@ -359,5 +376,5 @@
 {
     static NSMenu *dockMenu = nil;
-    NSMenuItem *menuItem;
+    id<NSMenuItem> menuItem;
     DeVercruesseProcess *frontApp = [processManager frontProcess];
     NSString *appName = [frontApp name];
@@ -375,14 +392,14 @@
     }
 
-    NSAssert(frontApp != nil && appName != nil, @"CanÕt obtain information on the frontmost application");
+    NSAssert(frontApp != nil && appName != nil, @"Can't obtain information on the frontmost application");
 
     if ([patchedApps containsObject: frontApp]) {
-        status = [NSString stringWithFormat: @"Installed in Ò%@Ó", appName];
+        status = [NSString stringWithFormat: NSLocalizedString(@"Installed in '%@'", "Dock menu disabled item displayed when FSA already installed, app name parameter"), appName];
     } else if (![cocoaApps containsObject: frontApp]) {
-        status = [NSString stringWithFormat: @"CanÕt install because Ò%@Ó is not a Cocoa application", appName];
+        status = [NSString stringWithFormat: NSLocalizedString(@"Can't install because '%@' is not a Cocoa application", "Dock menu disabled item displayed when frontmost app not Cocoa, app name parameter"), appName];
     }
 
     if (status == nil) {
-        menuItem = [dockMenu addItemWithTitle: [NSString stringWithFormat: @"Install in Ò%@Ó", appName]
+        menuItem = [dockMenu addItemWithTitle: [NSString stringWithFormat: NSLocalizedString(@"Install in '%@'", "Dock menu item to install FSA in frontmost app"), appName]
                                        action: @selector(invoke)
                                 keyEquivalent: @""];
@@ -406,8 +423,3 @@
 }
 
-- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
-{
-    return ([self windowShouldClose: self] ? NSTerminateNow : NSTerminateCancel);
-}
-
 @end
Index: trunk/Cocoa/F-Script Anywhere/Source/FSABundle.mm
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSABundle.mm	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSABundle.mm	(revision 153)
@@ -0,0 +1,77 @@
+//
+//  FSABundle.mm
+//  F-Script Anywhere
+//
+//  Created by Nicholas Riley on Fri Feb 01 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+/*
+
+ F-Script Anywhere is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ F-Script Anywhere is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with F-Script Anywhere; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*/
+
+#include <Carbon/Carbon.h>
+#include "SCPatchClient.h"
+#include "SCPatchPrivate.h"
+#include <stdio.h>
+#import "FSAnywhere.h"
+#import "FSAController.h"
+
+class FSAPatchClient : public SCPatchClient
+{
+public:
+    virtual OSErr Initialize(CFStringRef /* clientBundleID */, 
+                             CFStringRef /* controllerBundleID */, 
+                             pid_t /* pid */);
+    virtual void ReceiveMessage(const AppleEvent * /* theAE */);
+};
+
+OSErr FSAPatchClient::Initialize(CFStringRef clientBundleID,
+                                 CFStringRef controllerBundleID, 
+                                 pid_t pid)
+{
+    FSALog(@"client = %@", (NSString *)clientBundleID);
+    FSALog(@"controller = %@", (NSString *)controllerBundleID);
+    [FSAController installMenu];
+    return noErr;
+}
+
+void FSAPatchClient::ReceiveMessage(const AppleEvent *theAE)
+{
+    OSErr err = noErr;
+    Size actualSize;
+    DescType actualType;
+    OSType eventClass, eventID;
+    
+    // XXX is this implementation even necessary?
+    if ( (err = AEGetAttributePtr(theAE, keyEventIDAttr, typeType, &actualType, &eventID,
+                                  sizeof(OSType), &actualSize)) != noErr)
+        return;
+    
+    if ( (err = AEGetAttributePtr(theAE, keyEventClassAttr, typeType, &actualType,
+                                  &eventClass, sizeof(OSType), &actualSize)) != noErr)
+        return;
+    
+    if (eventClass == kSCMessageClass && eventID == kSCPing) {
+        fprintf(stderr, "client received ping: sending reply...\n");
+        SendMessage(mControllerBundleID, NULL, kSCMessageClass, kSCPing, "");
+        fprintf(stderr, "reply sent\n");
+    }
+}
+
+FSAPatchClient FSAPatchClientInstance;
+SCPatchClient *SCPatchClient::sGlobalPatchClientInstance = &FSAPatchClientInstance;
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAController.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAController.h	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAController.h	(revision 153)
@@ -45,3 +45,5 @@
 - (System *)system;
 
++ (void)installMenu;
+
 @end
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAController.m
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAController.m	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAController.m	(revision 153)
@@ -52,7 +52,7 @@
     if (!alreadyInstalled && ((mainMenu = [NSApp mainMenu]) != nil)) {
         NSMenu *insertIntoMenu = nil;
-        NSMenuItem *item;
+        id<NSMenuItem> item;
         unsigned insertLoc = NSNotFound;
-        NSBundle *bundle = [NSBundle bundleForClass:self];
+        NSBundle *bundle = [NSBundle bundleForClass: self];
         NSMenu * beforeSubmenu = [NSApp windowsMenu];
         // Succeed or fail, we do not try again.
@@ -106,5 +106,5 @@
             [fsaMenu addItemWithTitle: NSLocalizedStringFromTableInBundle(@"Associate With Interface", @"FSA", bundle, @"Title of Associate with Interface menu item") action: @selector(FSA_associateWithInterface:) keyEquivalent: @""];
             [fsaMenu addItem: [NSMenuItem separatorItem]];
-            item = [fsaMenu addItemWithTitle: NSLocalizedStringFromTableInBundle(@"About F-Script AnywhereÉ", @"FSA", bundle, @"Title of Info Panel menu item") action:@selector(showInfo:) keyEquivalent: @""];
+            item = [fsaMenu addItemWithTitle: NSLocalizedStringFromTableInBundle(@"About F-Script Anywhere...", @"FSA", bundle, @"Title of Info Panel menu item") action:@selector(showInfo:) keyEquivalent: @""];
             [item setTarget: self];
             [[FSAWindowManager sharedManager] setWindowMenu: fsaMenu];
@@ -137,9 +137,4 @@
 }
 
-+ (void)load;
-{
-    [self installMenu];
-}
-
 - (id)init {
     self = [super initWithWindowNibName: @"FSAInterpreterPanel"];
@@ -150,5 +145,5 @@
         static unsigned numInterpWindows = 0;
 
-        NSAssert(window != nil, @"CanÕt get interpreter window!");
+        NSAssert(window != nil, @"Can't get interpreter window!");
         if (interpreterNum == 0) interpreterNum = ++numInterpWindows;
         if ( (label = [self interpreterLabel]) != nil) {
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAViewAssociationController.m
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAViewAssociationController.m	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAViewAssociationController.m	(revision 153)
@@ -31,9 +31,4 @@
 #import <FScript/FSInterpreter.h>
 #import <FScript/System.h>
-
-// XXX workaround for lack of identifier validation; should go away when F-Script adds (promised) direct support for this
-@interface Compiler
-+ (BOOL)isValidIndentifier:(NSString *)str;
-@end
 
 @implementation FSAViewAssociationController
@@ -77,5 +72,5 @@
     [statusField setStringValue: @""];
     if ([variableName length] != 0) {
-        if (![Compiler isValidIndentifier: variableName]) {
+        if (![FSInterpreter validateSyntaxForIdentifier: variableName]) {
             [statusField setStringValue: @"Invalid name: contains spaces, punctuation or non-ASCII characters"];
         } else if (selectedElement != nil) {
@@ -102,8 +97,8 @@
 }
 
-- (void)_addElement:(id)element withLabel:(NSString *)label toSubmenuForItem:(NSMenuItem *)item;
+- (void)_addElement:(id)element withLabel:(NSString *)label toSubmenuForItem:(id<NSMenuItem>)item;
 {
     NSMenu *submenu = [item submenu];
-    NSMenuItem *subItem;
+    id<NSMenuItem> subItem;
     if (submenu == nil) {
         id superElement = [item representedObject];
@@ -127,5 +122,5 @@
 }
 
-- (void)_addValueForSelector:(SEL)sel withLabel:(NSString *)label toSubmenuForItem:(NSMenuItem *)item;
+- (void)_addValueForSelector:(SEL)sel withLabel:(NSString *)label toSubmenuForItem:(id<NSMenuItem>)item;
 {
     id obj = [item representedObject];
@@ -139,5 +134,5 @@
 - (void)_addElementToMenu:(id)element;
 {
-    NSMenuItem *item;
+    id<NSMenuItem> item;
     if (element == nil) return;
     item = [viewHierarchyMenu addItemWithTitle: [@"  "
@@ -271,5 +266,4 @@
 - (IBAction)defineVariable:(id)sender;
 {
-#warning this should change when F-Script supports a public API for identifier validation
     NS_DURING
         NSString *variableName = [variableNameField stringValue];
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAWindowManager.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAWindowManager.h	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAWindowManager.h	(revision 153)
@@ -12,5 +12,5 @@
     NSMenu *menu;
     NSMutableDictionary *records;
-    NSMenuItem *separator, *label;
+    id<NSMenuItem> separator, label;
 }
 
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAnywhere.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAnywhere.h	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAnywhere.h	(revision 153)
@@ -7,9 +7,20 @@
  *
  */
-#import <Foundation/Foundation.h>
 
-#define FSA_DEBUG 0
-#define FSA_VERSION "1.1.5"
+#define FSA_VERSION "1.2b1"
+#define FSA_FSCRIPT_MIN_VERSION 0x1252001 /* 1.2.5d1 */
+#define FSA_DEBUG
 
-extern void FSALog(NSString *fmt, ...);
-extern NSString * FSA_FScriptURL;
+#ifdef FSA_DEBUG
+    #define FSALog(...) NSLog(@"F-Script Anywhere: %@", [NSString stringWithFormat: __VA_ARGS__]);
+    #define FSAShow(obj) CFShow(obj);
+#else
+    #define FSALog(...) ;
+    #define FSAShow(obj) ;
+#endif
+
+#ifdef OBJC_EXPORT
+    extern NSString * FSA_FScriptURL;
+    /* should match FSA_FSCRIPT_MIN_VERSION above */
+    extern NSString * FSA_FScriptMinimumVersion;
+#endif
Index: trunk/Cocoa/F-Script Anywhere/Source/FSAnywhere.m
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/FSAnywhere.m	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/FSAnywhere.m	(revision 153)
@@ -7,16 +7,7 @@
 //
 
+#import <Foundation/Foundation.h>
 #import "FSAnywhere.h"
 
-// wish we could #define out completely, but it seems impossible to use varargs #defines on OS X's cpp
-
-void FSALog(NSString *fmt, ...) {
-#if FSA_DEBUG
-    va_list ap;
-    va_start(ap, fmt);
-    NSLogv([NSString stringWithFormat: @"F-Script Anywhere: %@", fmt], ap);
-#endif
-}
-
-// XXX put this in a .strings file instead
 NSString * FSA_FScriptURL = @"http://www.fscript.org/";
+NSString * FSA_FScriptMinimumVersion = @"1.2.5";
Index: trunk/Cocoa/F-Script Anywhere/Source/Info-Application.plist
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/Info-Application.plist	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/Info-Application.plist	(revision 153)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>F-Script Anywhere</string>
+	<key>CFBundleGetInfoString</key>
+	<string>F-Script Anywhere 1.2b1,
+© 2002–04 Nicholas Riley</string>
+	<key>CFBundleIconFile</key>
+	<string>Application icon</string>
+	<key>CFBundleIdentifier</key>
+	<string>net.sabi.FScriptAnywhereApp</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>F-Script Anywhere</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.2b1</string>
+	<key>CFBundleSignature</key>
+	<string>FSAn</string>
+	<key>CFBundleVersion</key>
+	<string>1.2b1</string>
+	<key>NSMainNibFile</key>
+	<string>MainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>FSAApp</string>
+</dict>
+</plist>
Index: trunk/Cocoa/F-Script Anywhere/Source/NJRScrollView.m
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/NJRScrollView.m	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/NJRScrollView.m	(revision 153)
@@ -9,4 +9,7 @@
 #import "NJRScrollView.h"
 
+#ifndef NSAppKitVersionNumber10_2
+#define NSAppKitVersionNumber10_2 663
+#endif
 
 @implementation NJRScrollView
@@ -14,4 +17,7 @@
 - (BOOL)needsDisplay;
 {
+    // Mac OS X 10.3 and later have support for external focus rings
+    if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_2)
+        return [super needsDisplay];
     NSResponder *resp = nil;
     if ([[self window] isKeyWindow]) {
@@ -30,4 +36,7 @@
 - (void)drawRect:(NSRect)rect {
     [super drawRect: rect];
+    // Mac OS X 10.3 and later have support for external focus rings
+    if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_2)
+        return;
     if (shouldDrawFocusRing) {
         NSSetFocusRingStyle(NSFocusRingOnly);
Index: trunk/Cocoa/F-Script Anywhere/Source/NSString-NJRExtensions.m
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/NSString-NJRExtensions.m	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/NSString-NJRExtensions.m	(revision 153)
@@ -14,4 +14,8 @@
 #import "NSString-NJRExtensions.h"
 
+#ifndef NSAppKitVersionNumber10_2
+#define NSAppKitVersionNumber10_2 663
+#endif
+
 @implementation NSString (NJRExtensions)
 
@@ -20,28 +24,14 @@
     NSAttributedString *s = [NSAttributedString alloc];
     NSMutableParagraphStyle *ps = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
-    OSStatus err;
-    /*
-    NSString *fs;
-    Str255 font;
-    SInt16 size; // label font is 10, pushbutton font 13, views font is 12!
-    err = GetThemeFont(kThemeViewsFont, smUnicodeScript, font, &size, NULL);
-    fs = CFStringCreateWithPascalString(kCFAllocatorDefault, font, CFStringGetSystemEncoding());
-    NSLog(@"Theme font: %@ %d", fs, size);
-    */
-    err = TruncateThemeText((CFMutableStringRef) text, kThemeViewsFont,
-                            kThemeStateActive, width, truncMiddle, NULL);
-    /* // There's a workaround for a 10.1 bug in Connections' awakeFromNib: the initial
-       // column size is wrong, until you resize the window.  Here's how to demonstrate the bug:
-    {   static float lastWidth = 0; // XXX debug
-        if (lastWidth != width) {
-            lastWidth = width;
-            NSLog(@"Got width %f", width);
-        }
+    if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_2) {
+        [ps setLineBreakMode: NSLineBreakByTruncatingMiddle];
+    } else {
+        // Mac OS X versions earlier than 10.3 don't implement NSLineBreakByTruncatingMiddle; fake it
+        OSStatus err;
+        err = TruncateThemeText((CFMutableStringRef) text, kThemeViewsFont,
+                                kThemeStateActive, width, truncMiddle, NULL);
+        if (err != noErr) FSALog(@"-[NSString asAttributedStringTruncatedToWidth:]: TruncateThemeText failed with error %d", err);
+        [ps setLineBreakMode: NSLineBreakByClipping];
     }
-    */
-    if (err != noErr) FSALog(@"-[NSString asAttributedStringTruncatedToWidth:]: TruncateThemeText failed with error %d", err);
-    // XXX Should be able to skip the above by using NSLineBreakByTruncatingMiddle,
-    // XXX but OS X 10.1 doesn't implement it yet.
-    [ps setLineBreakMode: NSLineBreakByClipping];
     s = [s initWithString: text attributes:
            [NSDictionary dictionaryWithObjectsAndKeys: ps, NSParagraphStyleAttributeName, nil]];
Index: trunk/Cocoa/F-Script Anywhere/Source/Read Me
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/Read Me	(revision 19)
+++ trunk/Cocoa/F-Script Anywhere/Source/Read Me	(revision 153)
@@ -1,4 +1,4 @@
-F-Script Anywhere 1.1.5 [1 October 2002]
-=======================
+F-Script Anywhere 1.2 [5 January 2004]
+=====================
 
 Add a F-Script interpreter to Cocoa applications dynamically.
@@ -24,8 +24,9 @@
 directory, such as /Library/Frameworks or ~/Library/Frameworks.
 
-F-Script Anywhere 1.1.5 was tested with FScript.framework 1.2.2
-(20020604), Mac OS X 10.1.5 (5S66) and 10.2.1 (6D52).  It may or may
-not work with earlier or later versions, I don't know.  If you are
-using an earlier F-Script version, please upgrade.
+F-Script Anywhere 1.2 was tested with FScript.framework 1.2.5
+(20031020) and Mac OS X 10.3.2 (7D24).  If you are using an earlier
+F-Script version, please upgrade.  F-Script Anywhere 1.2 should also
+work with Mac OS X 10.2.x, but will not work with Mac OS X 10.1 or
+earlier: please use F-Script Anywhere 1.1.5 instead.
 
 
@@ -50,9 +51,8 @@
 explaining the problem.
 
-When you're finished, quit the application before quitting F-Script
-Anywhere, otherwise the application will crash.  This is an inherent
-limitation of the Objective-C runtime, and I can't do anything about
-it.  F-Script Anywhere will warn you if you try to quit it when it's
-still installed in active applications.
+To remove F-Script Anywhere from an application, quit the application.
+Because of limitations in Apple's Objective-C runtime, it is
+impossible to remove F-Script Anywhere while the application is
+running.
 
 
@@ -65,27 +65,5 @@
 1. Install FScript.framework (see above).
 
-2. Install libPatch 1.2.1.
-
-   <http://web.sabi.net/nriley/software/libPatch-1.2.1.tgz>
-
-   I'd suggest you do it this way:
-
-   % cd /
-   % sudo gnutar --preserve-permissions -zxf libPatch-1.2.1.tgz
-   Password:
-     (please don't use StuffIt Expander)
-
-   This installs files in /Developer/Examples and
-   /usr/local/{bin,include,lib}.  If you're paranoid, you may want to
-   check the contents of the directory before installing.
-
-   Please note that the layout of the libPatch distribution has changed
-   since libPatch 1.0; the above instructions will not work for 1.0.
-   
-   I did not write libPatch, but am distributing it for your convenience
-   because it may be unavailable from its original source.  libPatch is
-   unsupported; please do not contact libPatchÕs author for support.
-
-3. Check out the source of 'otool' from the Darwin CVS repository.
+2. Check out the source of 'otool' from the Darwin CVS repository.
    This is required because there's a bug in the function that returns
    the 'flavo(u)r' of an application: Cocoa, Carbon, Classic, etc.
@@ -104,10 +82,11 @@
    jam/pbxbuild).  I _think_ this is all you need.
 
-4. Open 'F-Script Anywhere.pbproj' in Project Builder and build the
-   Application target.  It depends on the Library target, so you don't
-   need to build it separately.  You shouldnÕt see any errors or
-   warnings, and the F-Script Anywhere application (as well as the
-   library, which you can ignore because it is also copied into the
-   application bundle) will appear in the build product directory.
+3. Open 'F-Script Anywhere.pbproj' in Xcode and build the Application
+   target.  This target depends on the Bundle and Bundle Loader
+   targets, so you don't need to build them separately.  You
+   shouldnÕt see any errors or warnings, and the F-Script Anywhere
+   application (as well as two bundles, which you can ignore because
+   they are copied into the application bundle) will appear in the
+   build product directory.
 
 If you have any problems building F-Script Anywhere, please let me
@@ -173,24 +152,6 @@
    element, view it in an object browser or assign it to a variable.
 
-
-Q. F-Script Anywhere fails miserably on Jaguar.
-
-A. It shouldnÕt.  Apple re-added support for libPatch to Jaguar late
-   in the development process, with the result that F-Script Anywhere
-   works.  libPatch nevertheless needs to be replaced with a more
-   robust mechanism, and I am currently working on using the Application
-   Enhancer SDK <http://www.unsanity.com/haxies/ape/sdk/> for a future
-   version of F-Script Anywhere.
-
-
-Q. F-Script Anywhere fails to recognize Spring as a Cocoa application.
-
-A. Yes, I'm aware of the irony: I contributed code to Spring.  Spring
-   uses a unique application launching mechanism which makes it
-   difficult to determine what type of application it is.  The only
-   current workaround is to upgrade to Jaguar, where Spring will be
-   correctly identified.  This problem will be remedied with the move
-   to Application Enhancer, described above, in a future version of
-   F-Script Anywhere.
+   The F-Script object browser now provides a similar feature: click the
+   "Select view" button.
 
 
@@ -218,6 +179,22 @@
 ---------------
 
-1.1.6 -                 - better manage window on startup (only display
-                          when launch complete)
+1.2   - 5 January 2004  - fixed window behavior on startup, delaying
+      	  	  	  display until launch is complete
+			- replaced libPatch with mach_inject and
+                          SCPatch: provides improved compatibility
+                          with Mac OS X 10.3 (doesn't crash randomly
+			  any more!)
+                        - no longer requires F-Script Anywhere
+			  application to be running while installed
+			  in applications
+			- F-Script Anywhere can now be installed in
+			  itself
+			- check for F-Script version on startup
+			- use new, documented F-Script API for
+			  identifier validation in associate window
+			- prepared for localization
+			- enable "Install" button when appropriate at
+			  application startup
+			- fixed focus ring "flicker" on Mac OS X 10.3
 1.1.5 - 1 October 2002  - better identify Cocoa vs. Carbon applications
                           on Jaguar; added hierarchical window list to
@@ -266,4 +243,6 @@
 
 Philippe Mougin, for F-Script
+Jonathan 'Wolf' Rentsch, for mach_inject
+Jon Gotow, for SCPatch and lots of advice
 Mike Ferris, for TextExtras
 Apple, for Darwin
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchCommon.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchCommon.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchCommon.h	(revision 153)
@@ -0,0 +1,18 @@
+#pragma once
+
+typedef struct SCPatchParams
+{
+	short				version;
+	pid_t				parent;
+	HFSUniStr255		parentBundleID;
+	HFSUniStr255		patchBundleID;
+	FSRef				patchRef;
+} SCPatchParams;
+
+typedef	mach_error_t	(*SCPatchEntry)( SCPatchParams *paramBlock );
+
+#define	err_couldnt_load_main_bundle			(err_local|1)
+#define	err_couldnt_find_injection_bundle		(err_local|2)
+#define	err_couldnt_load_injection_bundle		(err_local|3)
+#define	err_couldnt_find_injectedThread_symbol	(err_local|4)
+#define	err_couldnt_find_patch_bundle			(err_local|5)
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessages.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessages.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessages.h	(revision 153)
@@ -0,0 +1,27 @@
+#pragma once
+
+// Messages sent by SCPatch components must all be of type kSCMessageClass.
+// All lowercase message ID's are reserved for internal library use.  Define
+// any messages of your own using upper or mixed case AE ID's.
+#define	kSCMessageClass		'SCmg'
+
+
+// Ping:
+//	controller -> client to test for existence of patch
+#define		kSCPing			'ping'
+//			no params
+
+
+// LoadResult:
+//	loader -> controller to notify of status of patch loading
+#define 	kSCLoadResult	'load'
+#define			keyBundleID	'bndl'	// typeChar - bundleID of patch
+#define			keyError	'err '	// typeInteger - error code (mach_error_t)
+
+
+// PatchSuccess:
+//	client -> controller to notify it of successful patch installation
+//	and initialization.
+#define		kSCPatchSuccess	'p_ok'
+// 				keyBundleID	'bndl'	// typeChar
+#define			keyPSN		'proc'	// typeProcessSerialNumber
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessenger.cp
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessenger.cp	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessenger.cp	(revision 153)
@@ -0,0 +1,430 @@
+#include <Carbon/Carbon.h>
+#include <syslog.h> 
+#include <unistd.h> 
+#include "SCPatchPrivate.h"
+#include "SCPatchMessenger.h"
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchMessenger::SCPatchMessenger(void)
+{
+	mThreaded = false;
+	mMessagePort = NULL;
+	mMessageSource = NULL;
+	pthread_mutex_init(&mMessageQueueMutex, NULL);
+	mMessageRetryInterval = DEFAULT_MESSAGE_RETRY_INTERVAL;
+	mMessageRetryLimit = DEFAULT_MESSAGE_RETRY_LIMIT;
+	
+	mMessageQueueDict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, NULL);
+	mMessageThreadDict = CFDictionaryCreateMutable(NULL, 0, NULL, &kCFTypeDictionaryValueCallBacks);
+}
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchMessenger::~SCPatchMessenger(void)
+{
+	CFRelease(mMessageQueueDict);
+	CFRelease(mMessageThreadDict);
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchMessenger::StartListening(CFStringRef bundleIdentifier, 
+							Boolean isPatch, Boolean threaded)
+{
+	OSErr		 			err = noErr;
+	CFStringRef				messagePortName;
+	CFMessagePortContext	messageContext = { 0 };
+	Boolean					messageShouldFree;
+	EventLoopRef			mainLoop;
+	
+	mThreaded = threaded;
+	
+	// Create a port to receive messages
+	messageContext.info = this;
+	
+	if(isPatch)
+		messagePortName = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@.%ld"), bundleIdentifier, getpid());
+	else
+		messagePortName = CFStringCreateCopy(NULL, bundleIdentifier);
+		
+	if(messagePortName == NULL)
+		return memFullErr;
+
+	if(messagePortName) 
+		mMessagePort = CFMessagePortCreateLocal(NULL, messagePortName, ReceiveCallback, &messageContext, &messageShouldFree);
+
+	CFRelease(messagePortName);
+
+	if(mMessagePort == NULL)
+		return destPortErr;
+		
+	// Set up to receive messages from the controller
+	if((mMessageSource = CFMessagePortCreateRunLoopSource(NULL, mMessagePort, 0)) != NULL &&
+	   (mainLoop = GetMainEventLoop()) != NULL)
+	{
+		OSErr 			err;
+		AEDesc 			desc;
+		OSType 			sig = 'SCPM';
+
+		CFRunLoopAddSource((CFRunLoopRef)GetCFRunLoopFromEventLoop(mainLoop), mMessageSource, kCFRunLoopCommonModes);
+		
+		// Tell the patch code that it has officially been started.
+		err = AEBuildAppleEvent(kEventClassSCPatchMessenger, kEventSCPatchStart,
+								typeApplSignature, &sig, sizeof(sig),
+								kAutoGenerateReturnID, kAnyTransactionID,
+								&desc, NULL, "");
+		ReceiveMessage(&desc);
+	}
+	else
+	{
+		CFRelease(mMessagePort);
+		mMessagePort = NULL;
+	}
+	
+	return err;
+}
+
+//-------------------------------------------------------------------------------------------------------------    						
+OSErr SCPatchMessenger::StopListening(void)
+{
+	EventLoopRef	mainLoop;
+	OSErr 			err;
+	AEDesc 			desc;
+	OSType 			sig = 'SCPM';
+
+	if(mMessageSource && (mainLoop = GetMainEventLoop()) != NULL)
+	{
+		// Tell the patch code that it's about to be stopped.
+		err = AEBuildAppleEvent(kEventClassSCPatchMessenger, kEventSCPatchStop,
+								typeApplSignature, &sig, sizeof(sig),
+								kAutoGenerateReturnID, kAnyTransactionID,
+								&desc, NULL, "");
+		ReceiveMessage(&desc);
+
+		CFRunLoopRemoveSource((CFRunLoopRef)GetCFRunLoopFromEventLoop(mainLoop), mMessageSource, kCFRunLoopCommonModes);
+		CFRelease(mMessageSource);
+		mMessageSource = NULL;
+	}
+	
+	if(mMessagePort)
+	{
+		CFRelease(mMessagePort);
+		mMessagePort = NULL;
+	}
+	return noErr;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchMessenger::SendPing(CFStringRef bundleIdentifier, ProcessSerialNumber *psn)
+{
+	OSErr 			err;
+	AEDesc 			desc;
+	OSType 			sig = 'SCPM';
+
+	err = AEBuildAppleEvent(kSCMessageClass, kSCPing,
+							typeApplSignature, &sig, sizeof(sig),
+							kAutoGenerateReturnID, kAnyTransactionID,
+							&desc, NULL, "");
+
+	if(err == noErr)
+		err = SendMessage(bundleIdentifier, psn, &desc, false);
+
+	return err;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchMessenger::SendMessage(CFStringRef bundleIdentifier,
+						ProcessSerialNumber *psn,
+						AEEventClass evtClass, AEEventID evtID,
+						const char *paramsFmt, ...)
+{
+	OSErr 			err;
+	AEDesc 			desc;
+	va_list			args;
+	OSType 			sig = 'SCPM';
+
+	va_start(args, paramsFmt);
+	// fprintf(stderr, "Sending message %.4s:%.4s\n", &evtClass, &evtID);
+	err = vAEBuildAppleEvent(evtClass, evtID,
+							typeApplSignature, &sig, sizeof(sig),
+							kAutoGenerateReturnID, kAnyTransactionID,
+							&desc, NULL, paramsFmt, args);
+	va_end(args);
+
+	if(err == noErr)
+		err = SendMessage(bundleIdentifier, psn, &desc, mThreaded);
+	
+	return err;
+}
+
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchMessenger::SendMessage(CFStringRef bundleIdentifier, 
+						ProcessSerialNumber *psn, 
+						const AppleEvent *theAE,
+						Boolean threaded)
+{
+	OSErr 				err;
+	pid_t				pid = 0;
+	AEMessageInfo		*info;
+
+	if(psn && (err = GetProcessPID(psn, &pid)) != noErr)
+		return err;
+	
+	// If we don't succeed or get an error, there's not enough memory
+	err = memFullErr;
+	
+	if((info = (AEMessageInfo *)NewPtrClear(sizeof(AEMessageInfo))) != NULL &&
+	   (info->descSize = AEGetDescDataSize(theAE)) > 0 && 
+       (info->descData = NewPtr(info->descSize)) != NULL &&
+       AEGetDescData(theAE, info->descData, info->descSize) == noErr)
+  	{
+   		if(pid)
+			info->portName = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@.%ld"), bundleIdentifier, pid);
+		else
+			info->portName = CFStringCreateCopy(NULL, bundleIdentifier);
+		
+		if(info->portName)
+		{
+			info->threaded = threaded;
+
+			if(!threaded)
+			{
+				err = SendMessage(info);
+				DisposePtr(info->descData);
+				DisposePtr((Ptr)info);
+			}
+			else if((err = QueueMessage(info)) != noErr)
+			{
+				err = queueFull;
+			}
+			
+		}
+	}
+
+	return err;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchMessenger::SendMessage(AEMessageInfo *info)
+{
+	SInt32				result = kCFMessagePortTransportError;
+	OSErr 				err = noErr;
+	CFDataRef			dataRef;
+	CFMessagePortRef	portRef;
+
+	if((dataRef = CFDataCreate(NULL, (unsigned char*)info->descData, info->descSize)) != NULL)
+	{
+	   if((portRef = CFMessagePortCreateRemote(NULL, info->portName)) != NULL)
+		{
+			result = CFMessagePortSendRequest(portRef, kSCMessageClass, dataRef, info->threaded ? 0.01 : 5, 0, NULL, NULL);
+			CFRelease(portRef);
+		}
+		else
+		{
+			err = destPortErr;
+		}
+		CFRelease(dataRef);
+	}
+	else
+	{
+		err = memFullErr;
+	}
+	
+	// If we're not going to retry, if we've retried too many times, if the message was sent successfully, 
+	// or there was some unrecoverable error like destPortErr (no one's listening) give up and let the
+	// error pass to the thread loop so it can clean up.
+	if(!info->threaded  || info->retryCount >= mMessageRetryLimit || 
+	   (err == noErr && result == kCFMessagePortSuccess) || 
+	    err == destPortErr || err == memFullErr)
+	{
+		if(err == noErr && result != kCFMessagePortSuccess)
+			err = (result == kCFMessagePortSendTimeout ? noResponseErr : networkErr);
+#if 0
+		if(err != noErr || result != kCFMessagePortSuccess)
+			syslog(LOG_ALERT, "%d: Message to %s failed (err = %d result = %d)\n", getpid(), CFStringGetCStringPtr(info->portName, kCFStringEncodingMacRoman), err, result);
+		else
+			syslog(LOG_ALERT, "%d: Message sent to %s\n", getpid(), CFStringGetCStringPtr(info->portName, kCFStringEncodingMacRoman));
+			
+#endif
+	}
+	else if(info->threaded)	// drop the sending thread's priority and hang around for mMessageRetryInterval
+	{
+		int					policy;
+		struct sched_param 	param;
+		struct timeval		startTime, endTime;
+		
+		info->retryCount++;
+		pthread_getschedparam(pthread_self(), &policy, &param);
+		param.sched_priority = sched_get_priority_min(policy);
+		pthread_setschedparam(pthread_self(), policy, &param);
+		gettimeofday(&startTime, NULL);
+		for(;;)
+		{
+			gettimeofday(&endTime, NULL);
+			if((endTime.tv_sec - startTime.tv_sec) * 1000000L + (endTime.tv_usec - startTime.tv_usec) > 
+			   mMessageRetryInterval * 1000000)
+			{
+				// syslog(LOG_ALERT, "%d: waiting to resend on %s (%d)\n", 
+					   // getpid(), CFStringGetCStringPtr(info->portName, kCFStringEncodingMacRoman), info->retryCount);
+				break;
+			}
+		}
+		
+		err = channelBusy;
+	}
+	
+	return err;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+void *SCPatchMessenger::SendThreadEntryPoint(void *infoPtr)
+{
+	SCPatchMessenger	*self = (SCPatchMessenger *)infoPtr;
+	AEMessageInfo		*info;
+	OSStatus 			err;
+
+	while((info = self->GetNextMessage(pthread_self())) != NULL)
+	{
+		// This will block for mMessageRetryInterval if the send fails
+		err = self->SendMessage(info);
+		
+		// If we've retried too many times, if the message was sent successfully, or if there
+		//  was some unrecoverable error like destPortErr (no one's listening) give up.
+		if(err == noErr || err == destPortErr || err == memFullErr || err == noResponseErr)
+		{
+			if((info = self->DequeueMessage(pthread_self())) != NULL)
+			{
+				CFRelease(info->portName);
+				DisposePtr(info->descData);
+				DisposePtr((Ptr)info);
+			}
+		}
+	}
+	
+	return (void *)err;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchMessenger::QueueMessage(AEMessageInfo *info)
+{
+	CFMutableArrayRef	queue;
+	OSErr				result = noErr;
+	
+	pthread_mutex_lock(&mMessageQueueMutex);
+	
+	if((queue = (CFMutableArrayRef)CFDictionaryGetValue(mMessageQueueDict, info->portName)) == NULL)
+	{
+		if((queue = CFArrayCreateMutable(NULL, 0, NULL)) != NULL)
+		{
+			pthread_t	messageThread;
+
+			CFDictionaryAddValue(mMessageQueueDict, info->portName, queue);
+			pthread_create(&messageThread, NULL, SendThreadEntryPoint, (void *)this);
+			pthread_detach(messageThread);
+			CFDictionaryAddValue(mMessageThreadDict, messageThread, info->portName);
+		}
+	}
+	
+	if(queue)
+		CFArrayAppendValue(queue, info);
+	else
+		result = queueFull;
+
+	pthread_mutex_unlock(&mMessageQueueMutex);
+	return result;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+AEMessageInfo *SCPatchMessenger::GetNextMessage(pthread_t threadID)
+{
+	CFMutableArrayRef	queue;
+	CFStringRef			queueName;
+	AEMessageInfo		*result = NULL;
+	
+	pthread_mutex_lock(&mMessageQueueMutex);
+
+	if((queueName = (CFStringRef)CFDictionaryGetValue(mMessageThreadDict, threadID)) != NULL)
+		if((queue = (CFMutableArrayRef)CFDictionaryGetValue(mMessageQueueDict, queueName)) != NULL)
+			if(CFArrayGetCount(queue) > 0)
+				result = (AEMessageInfo *)CFArrayGetValueAtIndex(queue, 0);
+
+	pthread_mutex_unlock(&mMessageQueueMutex);
+	
+	return result;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+AEMessageInfo *SCPatchMessenger::DequeueMessage(pthread_t threadID)
+{
+	CFMutableArrayRef	queue;
+	CFStringRef			queueName;
+	Boolean				stopThread = false;
+	AEMessageInfo		*result = NULL;
+	
+	pthread_mutex_lock(&mMessageQueueMutex);
+
+	if((queueName = (CFStringRef)CFDictionaryGetValue(mMessageThreadDict, threadID)) != NULL &&
+	   (queue = (CFMutableArrayRef)CFDictionaryGetValue(mMessageQueueDict, queueName)) != NULL)
+	{
+		if(CFArrayGetCount(queue) > 0)
+		{
+			result = (AEMessageInfo *)CFArrayGetValueAtIndex(queue, 0);
+			CFArrayRemoveValueAtIndex(queue, 0);
+		}
+		if(CFArrayGetCount(queue) == 0)
+		{
+			CFDictionaryRemoveValue(mMessageThreadDict, threadID);
+			CFDictionaryRemoveValue(mMessageQueueDict, queueName);
+			stopThread = true;
+		}
+	}
+
+	pthread_mutex_unlock(&mMessageQueueMutex);
+	
+	if(stopThread)
+		pthread_cancel(threadID);
+	
+	return result;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+CFDataRef SCPatchMessenger::ReceiveCallback(CFMessagePortRef local, 
+						SInt32 message, 
+						CFDataRef dataRef, 
+						void *info)
+{
+	#pragma unused(local)
+	
+	SCPatchMessenger	*self = (SCPatchMessenger *)info;
+	Ptr					descData = NULL;
+	AEDesc				desc;
+	long				length;
+	
+	// fprintf(stderr, "%d: Receiving started\n", getpid());
+	if(message == kSCMessageClass)
+	{
+	    if((length = CFDataGetLength(dataRef)) > 0 && (descData = NewPtr(length)) != NULL)
+	    {
+			CFDataGetBytes(dataRef, CFRangeMake(0, length), (unsigned char *)descData);
+
+			if(AECreateDesc(typeAppleEvent, descData, length, &desc) == noErr)
+			{
+				// fprintf(stderr, "%d: handling message\n", getpid());
+				if (self->HandleMessage(&desc) != noErr)
+					self->ReceiveMessage(&desc);
+				// fprintf(stderr, "%d: done handling message\n", getpid());
+				AEDisposeDesc(&desc);
+			}
+			else
+			{
+				fprintf(stderr, "%d: Error %d building AppleEvent", getpid(), memFullErr);
+			}
+		}
+	}
+
+	if(descData)
+		DisposePtr(descData);
+	
+	// fprintf(stderr, "%d: Receiving finished\n", getpid());
+	return NULL;
+}
+
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessenger.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessenger.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchMessenger.h	(revision 153)
@@ -0,0 +1,96 @@
+#pragma once
+
+extern "C" 
+{
+#include <pthread.h> 
+}
+
+#include <CoreFoundation/CoreFoundation.h> 
+#include "SCPatchCommon.h"
+#include "SCPatchMessages.h"
+
+#define	DEFAULT_MESSAGE_RETRY_LIMIT		100 	// Give up after 5 seconds
+#define	DEFAULT_MESSAGE_RETRY_INTERVAL	.05
+
+// These AppleEvents get sent to ReceiveMessage after StartListening and
+// before StopListening, respectively.
+const OSType	kEventClassSCPatchMessenger = 'SCPm';
+const OSType	kEventSCPatchStart			= 'strt';
+const OSType	kEventSCPatchStop			= 'stop';
+
+typedef struct
+{
+	Boolean				threaded;
+	UInt32				retryCount;
+	Ptr					descData;
+	UInt32				descSize;
+	CFStringRef			portName;
+} AEMessageInfo;
+
+
+class SCPatchMessenger
+{
+
+  public:
+    SCPatchMessenger(void);
+    virtual ~SCPatchMessenger(void);
+    
+    void 				SetMessageRetryInterval(float interval) { mMessageRetryInterval = interval; }
+    float				GetMessageRetryInterval(void) { return mMessageRetryInterval; }
+    
+    void 				SetMessageRetryLimit(UInt32 limit) { mMessageRetryLimit = limit; }
+    UInt32				GetMessageRetryLimit(void) { return mMessageRetryLimit; }
+    
+    // Start listening for messages.  If called from a patch, a PSN must be supplied.
+    // When called from a controller, pass NULL for the PSN.
+    OSErr				StartListening(CFStringRef myBundleIdentifier, 
+							Boolean isPatch, Boolean threaded);
+    OSErr				StopListening(void);
+    
+    // When sending from controller to patch, you have to include the PSN to disambiguate
+    // the bundleID (because the same bundle is loaded into multiple apps), but when 
+    // sending from patch back to controller, the PSN can be null, since there's only one
+    // controller running.
+	OSErr 				SendPing(CFStringRef bundleIdentifier, ProcessSerialNumber *psn);
+
+	OSErr 				SendMessage(CFStringRef bundleIdentifier,
+							ProcessSerialNumber *psn,
+							AEEventClass evtClass, AEEventID evtID,
+							const char *paramsFmt, ...);
+
+	OSErr 				SendMessage(CFStringRef bundleIdentifier, 
+							ProcessSerialNumber *psn, 
+							const AppleEvent *theAE,
+							Boolean threaded);
+							
+	// Override this to receive messages.
+	virtual void		ReceiveMessage(const AppleEvent *theAE) = 0;
+	
+  protected:
+  	virtual OSErr		HandleMessage(const AppleEvent *) { return eventNotHandledErr; }
+  	
+  private:
+  	// Info for the listening port
+	CFMessagePortRef	mMessagePort;
+	CFRunLoopSourceRef	mMessageSource;
+	
+	// Flags for whether we queue outgoing messages, and whether sending is threaded.
+  	Boolean				mThreaded;
+  	
+	// We have named send queues, where the key is the port name.
+	// Each queue is a CFArray of messages.
+	CFMutableDictionaryRef	mMessageQueueDict;
+	CFMutableDictionaryRef	mMessageThreadDict;
+	
+	pthread_mutex_t 	mMessageQueueMutex;
+	float				mMessageRetryInterval;
+	UInt32				mMessageRetryLimit;
+  	
+	OSErr	 			SendMessage(AEMessageInfo *info);
+	static void 		*SendThreadEntryPoint(void *infoPtr);
+	OSErr	 			QueueMessage(AEMessageInfo *info);
+	AEMessageInfo 		*GetNextMessage(pthread_t threadID);
+	AEMessageInfo 		*DequeueMessage(pthread_t threadID);
+	
+	static CFDataRef 	ReceiveCallback(CFMessagePortRef local, SInt32 message, CFDataRef dataRef, void *info);
+};
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchPrivate.c
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchPrivate.c	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchPrivate.c	(revision 153)
@@ -0,0 +1,29 @@
+#include "SCPatchPrivate.h"
+
+//-------------------------------------------------------------------------------------------------------------
+char *SCPatchGetStringPointer(SCPatchLoaderParams *params, short patchNumber)
+{
+	char 	*cp = params->patchData[0].urlData;
+	long	ii;
+	
+	for(ii = 0; ii < patchNumber; ii++)
+	{
+		cp += strlen(cp) + 1 + ((long)params->patchData[0].urlData - (long)&params->patchData[0].bundleID);
+	}
+	return cp;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+HFSUniStr255 *SCPatchGetHFSUniStrPointer(SCPatchLoaderParams *params, short patchNumber)
+{
+	HFSUniStr255 	*hp = &params->patchData[0].bundleID;
+	long	ii;
+	
+	for(ii = 0; ii < patchNumber; ii++)
+	{
+		hp = (HFSUniStr255 *)((long)hp + ((long)params->patchData[0].urlData - (long)&params->patchData[0].bundleID));
+		hp = (HFSUniStr255 *)((long)hp + strlen((char *)hp) + 1);
+	}
+	return hp;
+}
+
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchPrivate.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchPrivate.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/Common/SCPatchPrivate.h	(revision 153)
@@ -0,0 +1,39 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <Carbon/Carbon.h>
+
+typedef struct SCPatchLoaderData
+{
+	// Bundle ID's are unicode < 255 chars
+	HFSUniStr255		bundleID;
+	// urls are just UTF CStrings
+	char				urlData[0];	
+} SCPatchLoaderData;
+
+
+typedef struct SCPatchLoaderParams
+{
+	short				version;
+	size_t				size;
+	ptrdiff_t			codeOffset;
+	pid_t				parent;
+	HFSUniStr255		parentBundleID;
+
+	// patches are just packed one after another (this has to be
+	// one contiguous chunk for injection into the target process).
+	short				patchCount;
+	SCPatchLoaderData	patchData[0];
+	
+} SCPatchLoaderParams;
+
+char *SCPatchGetStringPointer(SCPatchLoaderParams *params, short patchNumber);
+HFSUniStr255 *SCPatchGetHFSUniStrPointer(SCPatchLoaderParams *params, short patchNumber);
+
+#ifdef __cplusplus
+}
+#endif
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchClient/SCPatchClient.cpp
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchClient/SCPatchClient.cpp	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchClient/SCPatchClient.cpp	(revision 153)
@@ -0,0 +1,66 @@
+#include <mach/mach_init.h>
+extern "C" 
+{
+	#include <mach/thread_act.h>
+	#include <pthread.h> 
+	#include <unistd.h> 
+}
+
+#include <Carbon/Carbon.h>
+#include "mach_inject.h"
+#include "SCPatchClient.h"
+
+#ifdef __MWERKS__
+#pragma export on
+#endif
+
+//-------------------------------------------------------------------------------------------------------------
+mach_error_t	SCPatchInit( SCPatchParams *params )
+{
+	ProcessSerialNumber		psn;
+	mach_error_t 			err = err_none;
+	SCPatchClient			*client = SCPatchClient::GetPatchClientPointer();
+	
+	if(client == NULL)
+	{
+		fprintf(stderr, "SCPc: sGlobalPatchClientInstance is not set!\n");
+		return err_sub(EFAULT);
+	}
+	
+	client->mPatchParams = *params;
+	client->mClientBundleID = CFStringCreateWithCharacters(NULL, params->patchBundleID.unicode, params->patchBundleID.length);
+	client->mControllerBundleID = CFStringCreateWithCharacters(NULL, client->mPatchParams.parentBundleID.unicode, client->mPatchParams.parentBundleID.length);
+	
+	// Just in case
+	if(client->mClientBundleID == NULL || client->mControllerBundleID == NULL)
+		return err_sub(ENOMEM);
+
+	if(client->Initialize(client->mClientBundleID, client->mControllerBundleID, getpid()) != noErr)
+		return err_threadEntry_init_failed;
+	
+	// Create a port to receive messages from our patch controller
+	if((err = client->StartListening(client->mClientBundleID, true, true)) != noErr)
+		return err_threadEntry_init_failed;
+	
+	if((err = GetCurrentProcess(&psn)) != noErr ||
+	   (err = client->SendMessage(client->mControllerBundleID, NULL, kSCMessageClass, kSCPatchSuccess, 
+								  "bndl: TEXT(@), proc: psn (@)", 
+								  CFStringGetCStringPtr(client->mClientBundleID, kCFStringEncodingMacRoman),
+								  sizeof(ProcessSerialNumber), &psn)) != noErr)
+		return err_threadEntry_init_failed;
+
+	return noErr; 
+}
+#ifdef __MWERKS__
+#pragma export off
+#endif
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchClient::SCPatchClient(void)
+{
+}
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchClient::~SCPatchClient(void)
+{
+}
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchClient/SCPatchClient.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchClient/SCPatchClient.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchClient/SCPatchClient.h	(revision 153)
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "SCPatchMessenger.h"
+#include "SCPatchCommon.h"
+
+class SCPatchClient : public SCPatchMessenger
+{
+ 	friend mach_error_t	SCPatchInit(SCPatchParams *params);
+ 	friend mach_error_t ThreadEntryPoint(SCPatchParams *params);
+
+ public:
+
+  	SCPatchClient(void);
+  	~SCPatchClient(void);
+
+	static SCPatchClient	*GetPatchClientPointer(void) { return sGlobalPatchClientInstance; }
+	
+	virtual OSErr			Initialize(CFStringRef /* clientBundleID */, 
+									   CFStringRef /* controllerBundleID */, 
+									   pid_t /* pid */) { return noErr; }
+	
+	CFStringRef				GetMyBundleID(void) { return mClientBundleID; }
+	CFStringRef				GetControllerBundleID(void) { return mControllerBundleID; }
+	
+  protected:
+
+	// In your main file, you must allocate a global instance of your
+	// SCPatchClient subclass and initialize this pointer to it:
+	static SCPatchClient	*sGlobalPatchClientInstance;
+	
+	SCPatchParams			mPatchParams;
+	CFStringRef				mClientBundleID, mControllerBundleID;
+};
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchContext.cpp
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchContext.cpp	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchContext.cpp	(revision 153)
@@ -0,0 +1,106 @@
+#include "SCPatchContext.h"
+
+/* --------------------------------------------------------------------------------	*/
+bool operator< (const MacPSN& x, const MacPSN& y)
+{
+	if(x.psn.highLongOfPSN < y.psn.highLongOfPSN)
+		return true;
+	else if(x.psn.highLongOfPSN == y.psn.highLongOfPSN)
+		return (x.psn.lowLongOfPSN < y.psn.lowLongOfPSN);
+	else
+		return false;
+}
+
+/* --------------------------------------------------------------------------------	*/
+bool operator==(const MacPSN& x, const MacPSN& y)
+{
+	return (x.psn.highLongOfPSN == y.psn.highLongOfPSN &&
+	   		x.psn.lowLongOfPSN  == y.psn.lowLongOfPSN);	
+}
+
+/* --------------------------------------------------------------------------------	*/
+SCPatchContext::SCPatchContext(ProcessSerialNumber *inPSN, SInt32 inPID, OSType inCreator)
+{
+	psn = *inPSN;
+	pid = inPID;
+	path = NULL;
+	name = NULL;
+	creator = inCreator;
+	flags = 0;
+}
+
+/* --------------------------------------------------------------------------------	*/
+SCPatchContext::SCPatchContext(const SCPatchContext &toCopy)
+{
+	psn = toCopy.psn;
+	pid = toCopy.pid;
+	flags = toCopy.flags;
+	creator = toCopy.creator;
+	if((path = toCopy.path) != NULL)
+		CFRetain(path);
+	if((name = toCopy.name) != NULL)
+		CFRetain(name);
+}
+
+/* --------------------------------------------------------------------------------	*/
+/* --------------------------------------------------------------------------------	*/
+SCPatchContextList::SCPatchContextList(void) : contexts()
+{
+}
+
+/* --------------------------------------------------------------------------------	*/
+SCPatchContextList::~SCPatchContextList(void)
+{
+}
+
+/* --------------------------------------------------------------------------------	*/
+SCPatchContextRef SCPatchContextList::NewContext(ProcessSerialNumber *inPSN, 
+											 SInt32 inPID, OSType inCreator)
+{
+	SCPatchContextRef		zeroResult = { 0 };
+	SCPatchContextRef		result;
+	
+	try
+	{
+		MacPSN              macPSN(inPSN);
+		SCPatchContext      patchContext(inPSN, inPID, inCreator);
+		SCPatchContextPair	newContext(macPSN, patchContext);
+
+		contexts.insert(newContext);
+		result = *inPSN;
+	}
+	catch(...)
+	{
+		result = zeroResult;
+	}
+	return result;
+}
+
+/* --------------------------------------------------------------------------------	*/
+SCPatchContext *SCPatchContextList::GetContext(ProcessSerialNumber *inPSN)
+{
+	SCPatchContextIterator			iter;
+	
+	iter = contexts.find(MacPSN(inPSN));
+	if(iter != contexts.end())
+		return &(*iter).second;
+	else
+		return NULL;
+}
+
+/* --------------------------------------------------------------------------------	*/
+SCPatchContext *SCPatchContextList::GetContext(OSType inCreator)
+{
+	SCPatchContextIterator			iter;
+	
+	for(iter = contexts.begin(); iter != contexts.end(); iter++)
+		if(iter->second.creator == inCreator)
+			return &(*iter).second;
+	return NULL;
+}
+
+/* --------------------------------------------------------------------------------	*/
+void SCPatchContextList::DeleteContext(ProcessSerialNumber *inPSN)
+{
+	contexts.erase(MacPSN(inPSN));
+}
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchContext.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchContext.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchContext.h	(revision 153)
@@ -0,0 +1,69 @@
+#ifndef _SCPATCHCONTEXT_
+#define _SCPATCHCONTEXT_
+
+#ifdef __MWERKS__
+	#include <utility.h>
+	#include <iterator.h>
+	#include <map.h>
+#else
+	#include <utility>
+	#include <iterator>
+	#include <map>
+#endif
+
+#include <Carbon/Carbon.h>
+
+//-------------------------------------------------------------------------------------------------------------
+class MacPSN
+{
+  public:
+	ProcessSerialNumber	psn;
+
+	MacPSN(ProcessSerialNumber *inPSN) { psn = *inPSN; }
+	~MacPSN(void) { };
+	
+};
+
+//-------------------------------------------------------------------------------------------------------------
+bool operator< (const MacPSN& x, const MacPSN& y);
+bool operator==(const MacPSN& x, const MacPSN& y);
+
+//-------------------------------------------------------------------------------------------------------------
+class SCPatchContext
+{
+  public:
+	ProcessSerialNumber	psn;
+	SInt32				pid;
+	OSType				creator;
+	CFStringRef			path;
+	CFStringRef			name;
+	UInt32				flags;
+	  	
+  	SCPatchContext(ProcessSerialNumber *inPSN, SInt32 inPID, OSType creator);
+  	SCPatchContext(const SCPatchContext &);
+  	~SCPatchContext(void) { }
+};
+
+typedef ProcessSerialNumber								SCPatchContextRef;
+typedef std::multimap<MacPSN, SCPatchContext>::iterator	SCPatchContextIterator;
+typedef std::pair<MacPSN, SCPatchContext>				SCPatchContextPair;
+
+class SCPatchContextList
+{
+  private:
+    std::multimap<MacPSN, SCPatchContext>		contexts;
+	
+  public:
+	SCPatchContextList(void);
+	~SCPatchContextList(void);
+	
+	SCPatchContextRef	NewContext(ProcessSerialNumber *inPSN, SInt32 inPID, OSType inCreator);
+	SCPatchContext		*GetContext(ProcessSerialNumber *inPSN);
+	SCPatchContext		*GetContext(OSType inCreator);
+	void				DeleteContext(ProcessSerialNumber *inPSN);
+	
+	SCPatchContextIterator	begin(void) { return contexts.begin(); }
+	SCPatchContextIterator	end(void) { return contexts.end(); }
+};
+
+#endif
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchController.cpp
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchController.cpp	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchController.cpp	(revision 153)
@@ -0,0 +1,527 @@
+#include <mach-o/dyld.h>
+#include <syslog.h>
+#include <pthread.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include "SCPatchPrivate.h"
+#include "SCPatchCommon.h"
+#include "SCPatchController.h"
+#include "mach_inject.h"
+
+typedef list<SCPatchRecord>::iterator	SCPatchRecordIterator;
+
+//-------------------------------------------------------------------------------------------------------------
+mach_error_t		SCmac_err_FromOSErr(OSErr err) {
+	return err ? (err_mac|err) : err_none;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr				SCOSErrFrom_mac_err(mach_error_t error) {
+	return (error & err_mac) ? (err & ^err_mac) : noErr;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+#pragma mark -
+//-------------------------------------------------------------------------------------------------------------
+SCPatchController::SCPatchController()
+{
+	mBundle = CFBundleGetMainBundle();
+	CFRetain(mBundle);
+	
+	mApplicationBundleIdentifier = CFBundleGetIdentifier(mBundle);
+	CFRetain(mApplicationBundleIdentifier);
+}
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchController::SCPatchController(CFStringRef bundleIdentifier)
+{
+    mBundle = CFBundleGetBundleWithIdentifier(bundleIdentifier);
+	CFRetain(mBundle);
+
+	mApplicationBundleIdentifier = bundleIdentifier;
+	CFRetain(mApplicationBundleIdentifier);
+}
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchController::~SCPatchController(void)
+{
+	if(mApplicationBundleIdentifier)
+		CFRelease(mApplicationBundleIdentifier);
+	
+	if(mBundle)
+		CFRelease(mBundle);
+}
+  	
+//-------------------------------------------------------------------------------------------------------------
+#pragma mark -
+//-------------------------------------------------------------------------------------------------------------
+void SCPatchController::AddPatch(CFStringRef bundleIdentifier,
+								CFStringRef subPath,
+								CFStringRef name)
+{
+	SCPatchRecord	patch(mBundle, bundleIdentifier, subPath, name);
+	
+	mPatchList.push_back(patch);
+}
+
+//-------------------------------------------------------------------------------------------------------------
+// Inject the patches into running applications and start watching app launches   
+OSErr SCPatchController::InstallPatches(void)
+{
+	OSErr 					procErr = noErr, err = noErr;
+	EventTypeSpec			appSpec[]  = { { kEventClassApplication, kEventAppLaunched },
+										   { kEventClassApplication, kEventAppTerminated } };
+	
+	// Start listening for messages from patches
+	SetMessageRetryInterval(0.1);	// Try resending messages to patches every 1/10 second.
+	SetMessageRetryLimit(600);		// Give up after 60 seconds.
+	
+	if((err = StartListening(mApplicationBundleIdentifier, false, true)) != noErr)
+	{
+		printf("SCPC: controller could not open port for listening\n");
+	}
+	
+	if(err == noErr)
+	{
+		InstallApplicationEventHandler(NewEventHandlerUPP(ApplicationEventHandler),  2, appSpec, this, NULL);
+		
+	    ProcessSerialNumber psn = { 0, kNoProcess };
+	    
+	    while(!procErr)
+	    {
+	        if((procErr = GetNextProcess(&psn)) == noErr)
+	        {
+				if(!IsProcessPatched(&psn))
+				{
+	        		InstallPatchesInProcess(&psn);
+				}
+				else
+				{
+					ProcessInfoRec 			info;
+					CFStringRef				str;
+					Str255					pStr;
+					    
+				    info.processInfoLength = sizeof(ProcessInfoRec);
+				    info.processName = pStr;
+				    info.processAppSpec = nil;
+					    
+					if((err = GetProcessInformation(&psn, &info)) == noErr && 
+					   (str = CFStringCreateWithPascalString(NULL, pStr, kCFStringEncodingMacRoman)) != NULL)
+					{
+						PatchNotification(&psn, info.processSignature, info.processType, str, info.processMode);
+						CFRelease(str);
+					}
+
+				}
+			}
+		}
+	}
+	return err;
+}
+
+// Patch a single process (ignoring return value of ShouldPatchProcess)
+mach_error_t SCPatchController::PatchProcess(ProcessSerialNumber *psn)
+{
+	return InstallPatchesInProcess(psn, true);
+}
+
+//-------------------------------------------------------------------------------------------------------------
+// Get info and keep tabs on patched processes
+Boolean SCPatchController::IsProcessPatched(ProcessSerialNumber *inPSN)
+{
+	SCPatchRecordIterator	iter;
+
+	if(mPatchContextList.GetContext(inPSN))
+	{
+		// fprintf(stderr, "Process patched (found context)\n");
+		return true;
+	}
+	
+	for(iter = mPatchList.begin(); iter != mPatchList.end(); iter++)
+	{
+		OSErr	err;
+		
+		err = SendPing(iter->GetIdentifier(), inPSN);
+		
+		// If we get a destPortErr, no one's listening on the desired port.
+		// If we get noErr or noResponseErr, there's someone listening.
+		if(err == noErr || err == noResponseErr)
+		{
+			pid_t			 		pid;
+			ProcessInfoRec 			info;
+			Str255					pStr;
+			    
+		    info.processInfoLength = sizeof(ProcessInfoRec);
+		    info.processName = pStr;
+		    info.processAppSpec = nil;
+			    
+			if((err = GetProcessInformation(inPSN, &info)) == noErr && 
+			   (err = GetProcessPID(inPSN, &pid)) == noErr)
+			{
+				mPatchContextList.NewContext(inPSN, pid, info.processSignature);
+			}
+			// fprintf(stderr, "Process patched (ping succeeded)\n");
+			return true;
+		}
+		else
+		{
+			// fprintf(stderr, "Process not patched (ping failed)\n");
+		}
+	}
+	
+	return false;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+UInt32 SCPatchController::GetPatchFlags(ProcessSerialNumber *inPSN)
+{
+	SCPatchContext	*context = mPatchContextList.GetContext(inPSN);
+	
+	if(context)
+		return context->flags;
+	else
+		return 0;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+void SCPatchController::SetPatchFlags(ProcessSerialNumber *inPSN, UInt32 flags, UInt32 whichFlags)
+{
+	SCPatchContext	*context = mPatchContextList.GetContext(inPSN);
+	
+	if(context)
+		context->flags = (context->flags & ~whichFlags) | flags;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchController::ForEachPatchedProcess(SCPatchIterationProc proc, void *data)
+{
+	SCPatchContextIterator	iter;
+	OSErr					err = noErr;
+	
+	for(iter = mPatchContextList.begin(); iter != mPatchContextList.end(); iter++)
+		if((err = proc(&iter->second.psn, iter->second.creator, iter->second.flags, data)) != noErr)
+			break;
+	return err;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+#pragma mark -
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchController::HandleMessage(const AppleEvent *theAE)
+{
+	OSErr				err = eventNotHandledErr;
+	OSType				eventClass, eventID;
+	Size				actualSize;
+	DescType			actualType;
+	ProcessSerialNumber	psn;
+
+	if((err = AEGetAttributePtr(theAE, keyEventIDAttr, typeType, &actualType, &eventID, sizeof(OSType), &actualSize)) != noErr ||
+	   (err = AEGetAttributePtr(theAE, keyEventClassAttr, typeType, &actualType, &eventClass, sizeof(OSType), &actualSize)) != noErr)
+	{
+		return err;
+	}
+	
+	if(eventClass == kSCMessageClass && eventID == kSCPatchSuccess &&
+	   (err = AEGetParamPtr(theAE, keyPSN, typeProcessSerialNumber, &actualType, &psn, sizeof(ProcessSerialNumber), &actualSize)) == noErr)
+	{
+		RecordPatchAndNotify(&psn, NULL);
+	}
+	
+	// Return eventNotHandledErr even though we've done our 
+	// thing so that the subclass gets a chance at it too.
+	return eventNotHandledErr;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+pascal OSStatus SCPatchController::ApplicationEventHandler(EventHandlerCallRef handlerRef, 
+														   EventRef event, void *userData)
+{
+	#pragma	unused (handlerRef)
+	
+	SCPatchController	*self = (SCPatchController *)userData;
+	UInt32				kind = GetEventKind(event);
+	OSStatus			err;
+	ProcessSerialNumber	psn;
+	
+	err = GetEventParameter(event, kEventParamProcessID, typeProcessSerialNumber, 
+						    NULL, sizeof(ProcessSerialNumber), NULL, &psn);
+	
+    fprintf(stderr, "ApplicationEventHandler called\n");
+	if(err == noErr)
+	{
+		if(kind == kEventAppLaunched)
+		{
+			// fprintf(stderr, "SCPC: App launched\n");
+			if(!self->IsProcessPatched(&psn))
+				self->InstallPatchesInProcess(&psn);
+		}
+		else if(kind == kEventAppTerminated)
+		{
+			pid_t			 		pid;
+			ProcessInfoRec 			info;
+			CFStringRef				str;
+			Str255					pStr;
+			    
+		    info.processInfoLength = sizeof(ProcessInfoRec);
+		    info.processName = pStr;
+		    info.processAppSpec = nil;
+			    
+			if((err = GetProcessInformation(&psn, &info)) == noErr && 
+			   (err = GetProcessPID(&psn, &pid)) == noErr &&
+			   (str = CFStringCreateWithPascalString(NULL, pStr, kCFStringEncodingMacRoman)) != NULL)
+			{
+				self->UnpatchNotification(&psn, info.processSignature, info.processType, str, info.processMode);
+				CFRelease(str);
+			}
+			// fprintf(stderr, "SCPC: App died\n");
+			self->mPatchContextList.DeleteContext(&psn);
+		}
+	}
+	
+	// Always pass the event down
+	return eventNotHandledErr;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+mach_error_t SCPatchController::InstallPatchesInProcess(ProcessSerialNumber *psn, bool onDemand)
+{
+	SCPatchRecordIterator	iter;
+	pid_t			 		pid;
+	ProcessInfoRec 			info;
+	CFStringRef				str;
+	Str255					pStr;
+	OSErr					err = noErr;
+	mach_error_t			error = err_none;
+	SCPatchLoaderParams		*params = NULL;
+	    
+    info.processInfoLength = sizeof(ProcessInfoRec);
+    info.processName = pStr;
+    info.processAppSpec = nil;
+	    
+	if((err = GetProcessInformation(psn, &info)) == noErr && 
+	   (err = GetProcessPID(psn, &pid)) == noErr &&
+	   (str = CFStringCreateWithPascalString(NULL, pStr, kCFStringEncodingMacRoman)) != NULL)
+	{
+		// fprintf(stderr, "SCPC: examining application (sig = %.4s, type = %.4s, flags = 0x%x, name = %s)\n", 
+				// &info.processSignature, &info.processType, info.processMode, 
+				// CFStringGetCStringPtr(str, kCFStringEncodingMacRoman));
+				
+		if((onDemand ||
+			ShouldPatchProcess(psn, info.processSignature, info.processType, str, info.processMode)) &&
+		   (params = (SCPatchLoaderParams *)malloc(sizeof(SCPatchLoaderParams))) != NULL)
+		{
+			// fprintf(stderr, "SCPC: patching application (sig = %.4s, type = %.4s, flags = 0x%x, name = %s)\n", 
+					// &info.processSignature, &info.processType, info.processMode, 
+					// CFStringGetCStringPtr(str, kCFStringEncodingMacRoman));
+			
+			params->version = 1;
+			params->size = sizeof(SCPatchLoaderParams);
+			params->patchCount = 0;
+			
+			for(iter = mPatchList.begin(); iter != mPatchList.end() && err == noErr; iter++)
+				err = AddPatchToParams(iter->GetIdentifier(), iter->GetURL(), &params);
+			
+			if(err == noErr)
+				error = InjectPatches(psn, params);
+			
+			free(params);
+		}
+		CFRelease(str);
+	}
+	if (error != err_none) return error;
+	else return mac_err(err);
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchController::AddPatchToParams(CFStringRef bundleIdentifier, CFURLRef url, SCPatchLoaderParams **params)
+{
+	OSErr		err = err_couldnt_find_patch_bundle;
+	CFStringRef	patchPath = NULL;
+	size_t		newSize;
+	
+	if(bundleIdentifier == NULL || url == NULL || params == NULL)
+		return paramErr;
+	
+#if 0
+	if((patchPath = CFURLGetString(url)) != NULL)
+		err = noErr;
+#else
+	CFBundleRef	patchBundle;
+	CFURLRef	patchURL;
+
+	// Find out where the patch lives
+	if((patchBundle = CFBundleCreate(kCFAllocatorDefault, url)) != NULL &&
+	   (patchURL = CFBundleCopyExecutableURL(patchBundle)) != NULL)
+	{
+		CFURLRef	absoluteURL;
+
+		if((absoluteURL = CFURLCopyAbsoluteURL(patchURL)) != NULL)
+		{
+			CFRelease(patchURL);
+			patchURL = absoluteURL;
+		}
+		
+		if((patchPath = CFURLCopyFileSystemPath(patchURL, kCFURLPOSIXPathStyle)) != NULL)
+			err = noErr;
+
+		CFRelease(patchURL);
+		CFRelease(patchBundle);
+	}
+#endif
+
+	// Increase the size of params.  This allocation may have waste - CFStringGetLength * 2 is the max _possible_ size.
+	if(!err)
+	{
+		newSize = (*params)->size + sizeof(SCPatchLoaderData) + CFStringGetLength(patchPath) * 2;
+		
+		if((*params = (SCPatchLoaderParams *)realloc(*params, newSize)) != NULL)
+			(*params)->size = newSize;
+		else
+			err = ENOMEM;
+	}
+	
+	// Fill in all the params
+	if(!err)
+	{
+		HFSUniStr255	*bundleID = SCPatchGetHFSUniStrPointer(*params, (*params)->patchCount);
+		char			*urlData =SCPatchGetStringPointer(*params, (*params)->patchCount);
+		
+		if((bundleID->length = CFStringGetLength(bundleIdentifier)) > 256)
+		{
+			fprintf(stderr, "SCPC: patch bundleIdentifier is too long.  It must be 256 chars or less.\n");
+			err = err_couldnt_load_injection_bundle;
+		}
+		else
+		{
+			CFStringGetCharacters(bundleIdentifier, CFRangeMake(0, bundleID->length), bundleID->unicode);
+			if(CFStringGetCString(patchPath, urlData, CFStringGetLength(patchPath) * 2, kCFStringEncodingUTF8))
+				(*params)->patchCount++;
+			else
+				err = err_couldnt_load_injection_bundle;
+		}
+	}
+#if 1
+	if(patchPath)
+		CFRelease(patchPath);
+#endif
+
+	return err;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+mach_error_t SCPatchController::InjectPatches(ProcessSerialNumber *psn, SCPatchLoaderParams *params)
+{
+	mach_error_t		err = err_none;
+	
+	//	Convert PSN to PID.
+	pid_t pid;
+	if(!err)
+		err = mac_err(GetProcessPID(psn, &pid));
+	
+	// Fill in all the params
+	if(!err)
+	{
+		// Make copies of the bundle identifiers and set up other params
+		if((params->parentBundleID.length = CFStringGetLength(mApplicationBundleIdentifier)) > 256)
+		{
+			fprintf(stderr, "SCPC: app bundleIdentifier is too long.  It must be 256 chars or less.\n");
+			err = err_couldnt_load_injection_bundle;
+		}
+		else
+		{
+			params->parent = pid;
+			CFStringGetCharacters(mApplicationBundleIdentifier, CFRangeMake(0, params->parentBundleID.length), params->parentBundleID.unicode);
+		}
+	}
+	
+	// Find the loader
+	CFURLRef loaderURL = NULL;
+	if(!err)
+		if((loaderURL = CFBundleCopyResourceURL(mBundle, CFSTR("SCPatchLoader"), CFSTR("bundle"), NULL)) == NULL)
+			err = err_couldnt_find_injection_bundle;
+
+#if 0
+	// If we get "file not found", the user must have moved our application bundle.  Try finding it
+	// with Launch Services and going on that way.
+	if(err == err_couldnt_load_injection_bundle)  // REVISIT
+	{
+		CFURLRef	appURL, patchURL;
+		CFStringRef	patchPath;
+		
+		if(LSFindApplicationForInfo(NULL, sApplicationBundleIdentifier, NULL, NULL, &appURL) == noErr)
+		{
+			if((patchURL = CFURLCreateCopyAppendingPathComponent(NULL, appURL, subPath, false)) != NULL &&
+			   (patchPath = CFURLCopyFileSystemPath(patchURL, kCFURLPOSIXPathStyle)) != NULL)
+			{
+				err = PatchControllerLoadPatchForProcess(pid, bundleID, patchPath, true);
+				CFRelease(patchPath);
+				CFRelease(patchURL);
+			}
+			CFRelease(appURL);
+		}
+	}
+#endif
+
+	//	Create injection bundle instance.
+	CFBundleRef injectionBundle = NULL;
+	if(!err) 
+		if((injectionBundle = CFBundleCreate(kCFAllocatorDefault, loaderURL)) == NULL)
+			err = err_couldnt_load_injection_bundle;
+	
+	//	Load the thread code injection.
+	void *injectionCode = NULL;
+	if(!err) 
+		if((injectionCode = CFBundleGetFunctionPointerForName(injectionBundle, CFSTR(INJECT_ENTRY_SYMBOL))) == NULL)
+			err = err_couldnt_find_injectedThread_symbol;
+
+	//	Inject the code.
+	if(!err)
+	{
+		err = ::mach_inject((mach_inject_entry)injectionCode, params, params->size, pid, 0);
+	}
+	else
+	{
+		fprintf(stderr, "Patcher got error %d\n", err);
+	}
+	
+	//	Clean up.
+	if(loaderURL)
+		CFRelease(loaderURL);
+	if(injectionBundle)
+		CFRelease(injectionBundle);
+	
+	return err;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+OSErr SCPatchController::RecordPatchAndNotify(ProcessSerialNumber *psn, ProcessInfoRec *info)
+{
+	OSErr					err = noErr;
+	ProcessInfoRec 			localInfo;
+	Str255					pStr;
+	CFStringRef				str;
+	pid_t			 		pid;
+	
+	// Make sure we haven't already added this process
+	if(mPatchContextList.GetContext(psn))
+		return noErr;
+
+	// If no info was given, get it ourselves
+	if(!info)
+	{
+		info = &localInfo;
+	    info->processInfoLength = sizeof(ProcessInfoRec);
+	    info->processName = pStr;
+	    info->processAppSpec = nil;
+		err = GetProcessInformation(psn, info);
+	}
+
+	// Now add it to our context list and let the subclass know	
+	if(err == noErr && (err = GetProcessPID(psn, &pid)) == noErr &&
+	   (str = CFStringCreateWithPascalString(NULL, info->processName, kCFStringEncodingMacRoman)) != NULL)
+	{
+		mPatchContextList.NewContext(psn, pid, info->processSignature);
+		PatchNotification(psn, info->processSignature, info->processType, str, info->processMode);
+		CFRelease(str);
+	}
+	return err;
+}
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchController.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchController.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchController.h	(revision 153)
@@ -0,0 +1,83 @@
+#pragma once
+
+#include <Carbon/Carbon.h>
+#include <list.h>
+
+#include "SCPatchPrivate.h"
+#include "SCPatchContext.h"
+#include "SCPatchRecord.h"
+#include "SCPatchMessenger.h"
+
+//	Mac to Mach error morphing.
+#define err_mac			err_system(0xf)	/* Mac (Carbon) errors */
+#define	mac_err(CODE)	SCmac_err_FromOSErr((CODE))
+#define oserr(CODE)		SCOSErrFrom_mac_err((CODE))
+mach_error_t SCmac_err_FromOSErr(OSErr err);
+OSErr SCOSErrFrom_mac_err(mach_error_t error);
+
+typedef OSErr	(*SCPatchIterationProc)(ProcessSerialNumber *inPSN, OSType inCreator, UInt32 inFlags, void *data);
+
+class SCPatchController : public SCPatchMessenger
+{
+  public:
+  
+	SCPatchController(void);
+  	SCPatchController(CFStringRef bundleIdentifier);
+  	~SCPatchController(void);
+  	
+  	// Use these to tell the controller where to find the patches
+  	void					AddPatch(CFStringRef patchBundleIdentifier,
+  									 CFStringRef subPath,
+  									 CFStringRef name);
+  											   
+  	// Inject the patches into running applications and start watching app launches   
+  	OSErr					InstallPatches(void);
+	
+	// Patch a single process (ignoring return value of ShouldPatchProcess)
+	mach_error_t			PatchProcess(ProcessSerialNumber *psn);
+  	
+  	// Overload these to customize patch loading and notification (note that 
+  	// UnpatchNotification is only called when the process dies, since the patches
+  	// are not removable).
+  	virtual Boolean			ShouldPatchProcess(ProcessSerialNumber * /* inPSN */,
+  									OSType /* inCreator */, OSType /* type */,
+  									CFStringRef /* name */, UInt32 /* flags */) { return false; }
+  	virtual void			PatchNotification(ProcessSerialNumber * /* inPSN */,
+  									OSType /* inCreator */, OSType /* type */,
+  									CFStringRef /* name */, UInt32 /* flags */) {}
+  	virtual void			UnpatchNotification(ProcessSerialNumber * /* inPSN */,
+  									OSType /* inCreator */, OSType /* type */,
+  									CFStringRef /* name */, UInt32 /* flags */) {}
+  		
+    // You must also overload this method in SCPatchMessenger to receive messages.
+	// virtual void		ReceiveMessage(const AppleEvent *theAE) = 0;
+
+  	// Get info and keep tabs on patched processes
+  	Boolean					IsProcessPatched(ProcessSerialNumber *inPSN);
+  	UInt32					GetPatchFlags(ProcessSerialNumber *inPSN);
+  	void					SetPatchFlags(ProcessSerialNumber *inPSN, UInt32 flags, UInt32 whichFlags);
+  	
+  	// Loop through each patched process and execute a function.  Note that this will 
+  	// not recognize patched processes until after you've called IsProcessPatched() on  
+  	// them or called InstallPatches() (which calls IsProcessPatched on every process).
+	OSErr					ForEachPatchedProcess(SCPatchIterationProc proc, void *data);
+
+  private:
+	CFBundleRef				mBundle;
+	CFStringRef				mApplicationBundleIdentifier;
+	
+  private:
+	list<SCPatchRecord>		mPatchList;
+	SCPatchContextList		mPatchContextList;
+
+	
+	OSErr					HandleMessage(const AppleEvent *theAE);
+	static pascal OSStatus 	ApplicationEventHandler(EventHandlerCallRef handlerRef, 
+													EventRef event, void *userData);
+						
+	mach_error_t 			InstallPatchesInProcess(ProcessSerialNumber *psn, bool onDemand=false);
+	OSErr 					AddPatchToParams(CFStringRef bundleID, CFURLRef url, SCPatchLoaderParams **params);
+	mach_error_t 			InjectPatches(ProcessSerialNumber *psn, SCPatchLoaderParams *params);
+	OSErr					RecordPatchAndNotify(ProcessSerialNumber *psn, ProcessInfoRec *info);
+
+};
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchLoader.c
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchLoader.c	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchLoader.c	(revision 153)
@@ -0,0 +1,231 @@
+#include <syslog.h>
+#include <pthread.h>
+#include <mach/thread_act.h>
+#include <mach-o/dyld.h>
+#include "mach_inject.h"
+#include "SCPatchPrivate.h"
+#include "SCPatchCommon.h"
+#include "SCPatchMessages.h"
+
+#undef USE_CFBUNDLE
+#undef USE_CFRUNLOOP
+#undef CHECK_SYMBOL_REFERENCES
+#define SCPL_DEBUG_LOG
+
+#ifdef SCPL_DEBUG_LOG
+	#define SCPLLog(...) syslog(LOG_ALERT, "SCPL: "__VA_ARGS__);
+#else
+	#define SCPLLog(...) ;
+#endif
+
+//-------------------------------------------------------------------------------------------------------------
+static void SendError(HFSUniStr255 *uniBundleID, HFSUniStr255 *uniControllerBundleID, mach_error_t err)
+{
+	SInt32				result = kCFMessagePortTransportError;
+	CFStringRef			clientBundleID, controllerBundleID;
+	OSType 				sig = 'SCPM';
+	long				descSize;
+	Ptr					descData;
+	CFDataRef			dataRef;
+	CFMessagePortRef	portRef;
+	AEDesc				desc;
+
+	
+	if((clientBundleID = CFStringCreateWithCharacters(NULL, uniBundleID->unicode, uniBundleID->length)) != NULL &&
+	   (controllerBundleID = CFStringCreateWithCharacters(NULL, uniControllerBundleID->unicode, uniControllerBundleID->length)) != NULL &&
+	   AEBuildAppleEvent(kSCMessageClass, kSCLoadResult, typeApplSignature, &sig, sizeof(sig),
+						 kAutoGenerateReturnID, kAnyTransactionID, &desc, NULL, "bndl:TEXT(@), err :long(@)", 
+						 CFStringGetCStringPtr(clientBundleID, kCFStringEncodingMacRoman), err) == noErr &&
+	   (descSize = AEGetDescDataSize(&desc)) > 0 && (descData = NewPtr(descSize)) != NULL &&
+       AEGetDescData(&desc, descData, descSize) == noErr &&
+	   (dataRef = CFDataCreate(NULL, (unsigned char*)descData, descSize)) != NULL)
+	{
+	   if((portRef = CFMessagePortCreateRemote(NULL, controllerBundleID)) != NULL)
+		{
+			result = CFMessagePortSendRequest(portRef, kSCMessageClass, dataRef, 5, 0, NULL, NULL);
+			CFRelease(portRef);
+		}
+		CFRelease(dataRef);
+		CFRelease(clientBundleID);
+		CFRelease(controllerBundleID);
+		DisposePtr(descData);
+	}
+	else
+	{
+		syslog(LOG_ALERT, "SCPL: unable to send notification of patch loading error %d\n", err);
+	}
+}
+
+//-------------------------------------------------------------------------------------------------------------
+// Yes, this is ugly, but it avoids runtime dyld errors caused by loading Cocoa code into a Carbon-only app,
+// and other such messes.
+static Boolean CanLoadImage(NSObjectFileImage image)
+{
+#ifdef CHECK_SYMBOL_REFERENCES
+	UInt32	ii, symbolCount = NSSymbolReferenceCountInObjectFileImage(image);
+	
+	for(ii = 0; ii < symbolCount; ii++)
+	{
+		if(!NSIsSymbolNameDefined(NSSymbolReferenceNameInObjectFileImage(image, ii, NULL)))
+		{
+			SCPLLog("failed to find %s\n", NSSymbolReferenceNameInObjectFileImage(image, ii, NULL));
+			return false;
+		}
+	}
+#endif
+	return true;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+#ifdef USE_CFRUNLOOP
+	void SCPatchObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *paramBlock)
+#else
+	pascal void SCPatchTimerHandler(EventLoopTimerRef inTimer, void *paramBlock)
+#endif
+{
+	SCPatchLoaderParams		*params = (SCPatchLoaderParams *)paramBlock;
+	mach_error_t 			err = err_none;
+	short					ii;
+	
+	SCPLLog("loading patches in thread %x\n", pthread_self());
+
+#ifdef USE_CFRUNLOOP
+	CFRunLoopObserverInvalidate(observer);
+#endif
+	
+	for(ii = 0; ii < params->patchCount; ii++)
+	{
+		SCPatchParams			patchParams;
+		SCPatchEntry	 		patchCode = NULL;
+		HFSUniStr255			*bundleID = SCPatchGetHFSUniStrPointer(params, ii);
+		char					*urlData = SCPatchGetStringPointer(params, ii);
+
+#ifdef USE_CFBUNDLE
+		CFURLRef				url = NULL;
+		CFBundleRef				bundle = NULL;
+		CFStringRef				urlString = NULL;
+		
+		if((urlString = CFStringCreateWithCString(NULL, urlData, kCFStringEncodingUTF8)) != NULL &&
+		   (url = CFURLCreateWithString(NULL, urlString, NULL)) != NULL &&
+		   (bundle = CFBundleCreate(NULL, url)) != NULL &&
+		   CFBundleLoadExecutable(bundle))
+		{
+			if((patchCode = (SCPatchEntry)CFBundleGetFunctionPointerForName(bundle, CFSTR("SCPatchInit"))) == NULL)
+				patchCode = (SCPatchEntry)CFBundleGetFunctionPointerForName(bundle, CFSTR("_Z11SCPatchInitP13SCPatchParams"));
+			if(patchCode)
+				err = err_none;
+			else
+				err = err_couldnt_find_injectedThread_symbol;
+		}
+		else
+		{
+			err = err_couldnt_load_injection_bundle;
+		}
+#else
+		NSObjectFileImage 		image;
+		NSModule				module;
+		NSSymbol				symbol;
+
+		if(NSCreateObjectFileImageFromFile(urlData, &image) == NSObjectFileImageSuccess && CanLoadImage(image) &&
+		   (module = NSLinkModule(image, urlData, NSLINKMODULE_OPTION_BINDNOW | NSLINKMODULE_OPTION_PRIVATE | NSLINKMODULE_OPTION_RETURN_ON_ERROR)) != NULL)
+		{
+			if((symbol = NSLookupSymbolInModule(module, "_SCPatchInit")) == NULL)
+				symbol = NSLookupSymbolInModule(module, "__Z11SCPatchInitP13SCPatchParams");
+			if(symbol)
+				patchCode = (SCPatchEntry)NSAddressOfSymbol(symbol);
+			if(patchCode)
+				err = err_none;
+			else
+				err = err_couldnt_find_injectedThread_symbol;
+		}
+		else
+		{
+			err = err_couldnt_load_injection_bundle;
+		}
+#endif
+		
+		// Run the startup code
+		if(!err)
+		{
+			// Make copies of the params for the patch code
+			patchParams.version = 0;
+			patchParams.parent = params->parent;
+			patchParams.parentBundleID = params->parentBundleID;
+			patchParams.patchBundleID = *bundleID;
+			// CFURLGetFSRef(url, &patchParams.patchRef);
+			SCPLLog("calling patch init code\n");
+			err = patchCode(&patchParams);
+		}
+		else
+		{
+			char	*name = rindex(urlData, '/');
+			SCPLLog("error 0x%x loading patch \"%s\"\n", err, name ? name + 1 : urlData);
+		}
+#ifdef USE_CFBUNDLE
+		if(url)
+			CFRelease(url);
+		if(urlString);
+			CFRelease(urlString);
+#endif
+		SendError(bundleID, &params->parentBundleID, err);
+	}
+}
+
+//-------------------------------------------------------------------------------------------------------------
+void *SCPatchThreadEntry( void *paramBlock )
+{
+	// Now that we've got a pthread, we have to hop onto the main event loop to do our code loading so that 
+	// we don't screw up dyld or Cocoa apps that don't have multithreading turned on.
+#ifdef USE_CFRUNLOOP
+	CFRunLoopObserverContext	context = { 0 };
+	CFRunLoopObserverRef		observer;
+	CFRunLoopRef				runLoop;
+	
+	if((runLoop = (CFRunLoopRef)GetCFRunLoopFromEventLoop(GetMainEventLoop())) != NULL)
+	{
+		context.info = paramBlock;
+		observer = CFRunLoopObserverCreate (kCFAllocatorDefault, kCFRunLoopAllActivities, false, 0, 
+                                            SCPatchObserver + ((SCPatchLoaderParams *)paramBlock)->codeOffset,
+                                            &context);
+		CFRunLoopAddObserver(runLoop, observer, kCFRunLoopCommonModes);
+	}
+#else
+	InstallEventLoopTimer(GetMainEventLoop(), 0, 0, 
+                          NewEventLoopTimerUPP(SCPatchTimerHandler + ((SCPatchLoaderParams *)paramBlock)->codeOffset), 
+                          paramBlock, NULL);
+#endif
+	return 0;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+mach_error_t INJECT_ENTRY( ptrdiff_t codeOffset, void *paramBlock, size_t paramSize )
+{
+	pthread_t			thread;
+	pthread_attr_t		attr;
+	struct sched_param	sched;
+	int					policy;
+	
+    // We need to fix up function addresses in gcc code, but not for code generated by CW.
+#ifdef __MWERKS__
+    codeOffset = 0;
+#endif
+    // Stash the code offset where we can get at it later.
+    ((SCPatchLoaderParams *)paramBlock)->codeOffset = codeOffset;
+    
+	// OK, first we need a pthread so that CoreFoundation will work correctly 
+	// (it uses pthread tokens to make itself thread-safe).
+	pthread_attr_init(&attr); 
+	pthread_attr_getschedpolicy(&attr, &policy);
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+	pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
+	sched.sched_priority = sched_get_priority_max(policy);
+	pthread_attr_setschedparam(&attr, &sched);
+
+	pthread_create(&thread, &attr, SCPatchThreadEntry + codeOffset, (void *)paramBlock);
+
+	pthread_attr_destroy(&attr);
+
+	thread_terminate(mach_thread_self());
+    
+	return err_none;
+}
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchRecord.cpp
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchRecord.cpp	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchRecord.cpp	(revision 153)
@@ -0,0 +1,53 @@
+#include "SCPatchRecord.h"
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchRecord::SCPatchRecord(CFBundleRef ownerBundle, CFStringRef bundleIdentifier, CFStringRef subPath, CFStringRef name)
+{
+	CFRetain(bundleIdentifier);
+	mBundleIdentifier = bundleIdentifier;
+	
+	CFRetain(subPath);
+	mSubPath = subPath;
+	
+	CFRetain(name);
+	mName = name;
+
+	mURL = CFBundleCopyResourceURL(ownerBundle, name, NULL, NULL);
+	mPath = CFURLCopyFileSystemPath(mURL, kCFURLPOSIXPathStyle);
+}
+  	
+//-------------------------------------------------------------------------------------------------------------
+SCPatchRecord::SCPatchRecord(SCPatchRecord const &copyMe)
+{
+	CFRetain(copyMe.mBundleIdentifier);
+	mBundleIdentifier = copyMe.mBundleIdentifier;
+	
+	CFRetain(copyMe.mSubPath);
+	mSubPath = copyMe.mSubPath;
+	
+	CFRetain(copyMe.mName);
+	mName = copyMe.mName;
+
+	CFRetain(copyMe.mPath);
+	mPath = copyMe.mPath;
+
+	CFRetain(copyMe.mURL);
+	mURL = copyMe.mURL;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+SCPatchRecord::~SCPatchRecord(void)
+{
+	if(mBundleIdentifier)
+		CFRelease(mBundleIdentifier);
+	mBundleIdentifier = NULL;
+	if(mSubPath)
+		CFRelease(mSubPath);
+	mSubPath = NULL;
+	if(mName)
+		CFRelease(mName);
+	mName = NULL;
+	if(mPath)
+		CFRelease(mPath);
+	mPath = NULL;
+}
Index: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchRecord.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchRecord.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchRecord.h	(revision 153)
@@ -0,0 +1,24 @@
+#pragma once
+#include <Carbon/Carbon.h>
+
+class SCPatchRecord
+{
+  public:
+  	SCPatchRecord(CFBundleRef ownerBundle, CFStringRef bundleIdentifier, CFStringRef subPath, CFStringRef name);
+  	SCPatchRecord(SCPatchRecord const &copyMe);
+  	~SCPatchRecord(void);
+  	
+  	CFStringRef				GetIdentifier(void)  { return mBundleIdentifier; }
+  	CFStringRef				GetName(void)		 { return mName; }
+  	CFStringRef				GetPath(void)		 { return mPath; }
+  	CFURLRef				GetURL(void)		 { return mURL; }
+  	
+  private:
+	CFStringRef				mBundleIdentifier;
+	CFStringRef				mSubPath;
+	CFStringRef				mName;
+	CFStringRef				mPath;
+	CFURLRef				mURL;
+  
+};
+
Index: trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Entries
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Entries	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Entries	(revision 153)
@@ -0,0 +1,3 @@
+/mach_inject.c/1.1.1.1/Tue Jun 17 16:03:28 2003//
+/mach_inject.h/1.1.1.1/Tue Jun 17 16:03:28 2003//
+D
Index: trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Repository
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Repository	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Repository	(revision 153)
@@ -0,0 +1,1 @@
+/cvsroot/extendamac/code/mach_inject
Index: trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Root
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Root	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/mach_inject/CVS/Root	(revision 153)
@@ -0,0 +1,1 @@
+:pserver:anonymous@cvs.sourceforge.net:/cvsroot/extendamac
Index: trunk/Cocoa/F-Script Anywhere/Source/mach_inject/mach_inject.c
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/mach_inject/mach_inject.c	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/mach_inject/mach_inject.c	(revision 153)
@@ -0,0 +1,202 @@
+/****************************************************************************************
+	mach_inject.c $Revision: 1.1.1.1 $
+	
+	Copyright (c) 2003 Red Shed Software. All rights reserved.
+	by Jonathan 'Wolf' Rentzsch (jon * redshed * net)
+	
+	************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include	"mach_inject.h"
+
+#include	<mach-o/dyld.h>
+#include	<mach-o/getsect.h>
+#include	<mach/message.h>
+#include	<mach/mach.h>
+#include	<sys/stat.h>
+#include	<assert.h>
+#include	<stdio.h>
+#include	<errno.h>
+
+/* doesn't show up, for some reason */
+void       bzero(void *, size_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifndef	COMPILE_TIME_ASSERT
+	#define COMPILE_TIME_ASSERT( exp ) { switch (0) { case 0: case (exp):; } }
+#endif
+#define ASSERT_CAST( CAST_TO, CAST_FROM )	COMPILE_TIME_ASSERT( sizeof(CAST_TO)==sizeof(CAST_FROM) )
+
+/****************************************************************************************
+*	
+*	Interface
+*	
+****************************************************************************************/
+#pragma mark	-
+#pragma mark	(Interface)
+
+	mach_error_t
+mach_inject(
+		const mach_inject_entry	threadEntry,
+		const void				*paramBlock,
+		size_t					paramSize,
+		pid_t					targetProcess,
+		vm_size_t				stackSize ) {
+	;//assertCodePtr( threadEntry );
+	;//assertPtrIfNotNull( paramBlock );
+	;//assertPositive( targetProcess );
+	;//assertIsTrue( stackSize == 0 || stackSize > 1024 );
+	
+	//	Find the image.
+	const void		*image;
+	unsigned long	imageSize;
+	mach_error_t	err = machImageForPointer( threadEntry, &image, &imageSize );
+	
+	//	Initialize stackSize to default if requested.
+	if( stackSize == 0 )
+		/** @bug We only want an 8K default, fix the plop-in-the-middle code below. */
+		stackSize = 16 * 1024;
+	
+	//	Convert PID to Mach Task ref.
+	mach_port_t	remoteTask = 0;
+	if( !err )
+		err = task_for_pid( mach_task_self(), targetProcess, &remoteTask );
+	
+	/** @todo	Would be nice to just allocate one block for both the remote stack
+				*and* the remoteCode (including the parameter data block once that's
+				written.
+	*/
+	
+	//	Allocate the remoteStack.
+	vm_address_t remoteStack = NULL;
+	if( !err )
+		err = vm_allocate( remoteTask, &remoteStack, stackSize, 1 );
+	
+	//	Allocate the code.
+	vm_address_t remoteCode = NULL;
+	if( !err )
+		err = vm_allocate( remoteTask, &remoteCode, imageSize, 1 );
+	if( !err ) {
+		ASSERT_CAST( pointer_t, image );
+		err = vm_write( remoteTask, remoteCode, (pointer_t) image, imageSize );
+	}
+	
+	//	Allocate the paramBlock if specified.
+	vm_address_t remoteParamBlock = NULL;
+	if( !err && paramBlock != NULL && paramSize ) {
+		err = vm_allocate( remoteTask, &remoteParamBlock, paramSize, 1 );
+		if( !err ) {
+			ASSERT_CAST( pointer_t, paramBlock );
+			err = vm_write( remoteTask, remoteParamBlock, (pointer_t) paramBlock, paramSize );
+		}
+	}
+	
+	//	Calculate offsets.
+	ptrdiff_t	threadEntryOffset, imageOffset;
+	if( !err ) {
+		;//assertIsWithinRange( threadEntry, image, image+imageSize );
+		ASSERT_CAST( void*, threadEntry );
+		threadEntryOffset = ((long) threadEntry) - (long) image;
+		
+		ASSERT_CAST( void*, remoteCode );
+		imageOffset = ((long) remoteCode) - (long) image;
+	}
+	
+	//	Allocate the thread.
+	thread_act_t remoteThread;
+	if( !err ) {
+		ppc_thread_state_t remoteThreadState;
+		
+		/** @bug Stack math should be more sophisticated than this (ala redzone). */
+		remoteStack += stackSize / 2;
+		
+		bzero( &remoteThreadState, sizeof(remoteThreadState) );
+		
+		ASSERT_CAST( unsigned int, remoteCode );
+		remoteThreadState.srr0 = (unsigned int) remoteCode;
+		remoteThreadState.srr0 += threadEntryOffset;
+		assert( remoteThreadState.srr0 < (remoteCode + imageSize) );
+		
+		ASSERT_CAST( unsigned int, remoteStack );
+		remoteThreadState.r1 = (unsigned int) remoteStack;
+		
+		ASSERT_CAST( unsigned int, imageOffset );
+		remoteThreadState.r3 = (unsigned int) imageOffset;
+		
+		ASSERT_CAST( unsigned int, remoteParamBlock );
+		remoteThreadState.r4 = (unsigned int) remoteParamBlock;
+		
+		ASSERT_CAST( unsigned int, paramSize );
+		remoteThreadState.r5 = (unsigned int) paramSize;
+		
+		ASSERT_CAST( unsigned int, 0xDEADBEEF );
+		remoteThreadState.lr = (unsigned int) 0xDEADBEEF;
+		
+		printf( "remoteCode start: %p\n", (void*) remoteCode );
+		printf( "remoteCode size: %ld\n", imageSize );
+		printf( "remoteCode pc: %p\n", (void*) remoteThreadState.srr0 );
+		printf( "remoteCode end: %p\n", (void*) (((char*)remoteCode)+imageSize) );
+		fflush(0);
+		
+		err = thread_create_running( remoteTask, PPC_THREAD_STATE,
+				(thread_state_t) &remoteThreadState, PPC_THREAD_STATE_COUNT,
+				&remoteThread );
+	}
+	
+	if( err ) {
+		if( remoteParamBlock )
+			vm_deallocate( remoteTask, remoteParamBlock, paramSize );
+		if( remoteCode )
+			vm_deallocate( remoteTask, remoteCode, imageSize );
+		if( remoteStack )
+			vm_deallocate( remoteTask, remoteStack, stackSize );
+	}
+	
+	return err;
+}
+
+	mach_error_t
+machImageForPointer(
+		const void *pointer,
+		const void **image,
+		unsigned long *size ) {
+	;//assertCodePtr( pointer );
+	;//assertPtr( image );
+	;//assertPtr( size );
+	
+	unsigned long p = (unsigned long) pointer;
+	
+	unsigned long imageIndex, imageCount = _dyld_image_count();
+	for( imageIndex = 0; imageIndex < imageCount; imageIndex++ ) {
+		struct mach_header *header = _dyld_get_image_header( imageIndex );
+		const struct section *section = getsectbynamefromheader( header, SEG_TEXT, SECT_TEXT );
+		long start = section->addr + _dyld_get_image_vmaddr_slide( imageIndex );
+		long stop = start + section->size;
+		if( p >= start && p <= stop ) {
+			//	It is truly insane we have to stat() the file system in order to
+			//	discover the size of an in-memory data structure.
+			char *imageName = _dyld_get_image_name( imageIndex );
+			;//assertPath( imageName );
+			struct stat sb;
+			if( stat( imageName, &sb ) )
+				return unix_err( errno );
+			if( image ) {
+				ASSERT_CAST( void*, header );
+				*image = (void*) header;
+			}
+			if( size ) {
+				;//assertUInt32( st_size );
+				*size = sb.st_size;
+			}
+			return err_none;
+		}
+	}
+	
+	return err_threadEntry_image_not_found;
+}
Index: trunk/Cocoa/F-Script Anywhere/Source/mach_inject/mach_inject.h
===================================================================
--- trunk/Cocoa/F-Script Anywhere/Source/mach_inject/mach_inject.h	(revision 153)
+++ trunk/Cocoa/F-Script Anywhere/Source/mach_inject/mach_inject.h	(revision 153)
@@ -0,0 +1,82 @@
+/****************************************************************************************
+	mach_inject.h $Revision: 1.1.1.1 $
+	
+	Copyright (c) 2003 Red Shed Software. All rights reserved.
+	by Jonathan 'Wolf' Rentzsch (jon * redshed * net)
+	
+	************************************************************************************/
+	
+/************************************************************************************/ /**
+	@mainpage	mach_inject
+	@author		Jonathan 'Wolf' Rentzsch (jon * redshed * net)
+	
+	This package, coded in C to the Mach API, allows you to "inject" code into an
+	arbitrary process. "Injection" means both 1) copying over the necessary code into the
+	target's address space and 2) remotely creating a new thread to execute the code.
+
+	************************************************************************************/
+
+#ifndef		_mach_inject_
+#define		_mach_inject_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+#include <mach/error.h>
+#include <mach/vm_types.h>
+#include <stddef.h>
+
+#define	err_threadEntry_image_not_found			(err_local|1)
+#define	err_threadEntry_init_failed				(err_local|2)
+
+#define	INJECT_ENTRY		injectEntry
+#define	INJECT_ENTRY_SYMBOL	"injectEntry"
+
+typedef	void	(*mach_inject_entry)( ptrdiff_t codeOffset, void *paramBlock, size_t paramSize );
+	
+/************************************************************************************//**
+	Starts executing threadEntry in a new thread in the process specified by
+	targetProcess.
+	
+	@param	threadEntry		->	Required pointer to injected thread's entry point.
+	@param	paramBlock		->	Optional pointer to block of memory to pass to the
+								injected thread.
+	@param	paramSize		->	Optional size of paramBlock.
+	@param	targetProcess	->	Required target process ID.
+	@param	stackSize		->	Optional stack size of threadEntry's thread. Set to zero
+								for default (currently 8K usable).
+	@result					<-	mach_error_t
+
+	************************************************************************************/
+
+	mach_error_t
+mach_inject(
+		const mach_inject_entry	threadEntry,
+		const void				*paramBlock,
+		size_t					paramSize,
+		pid_t					targetProcess,
+		vm_size_t				stackSize );
+
+/************************************************************************************//**
+	Given a pointer, returns its Mach-O image and image size.
+	
+	@param	pointer	->	Required pointer.
+	@param	image	<-	Optional returned pointer to image (really a mach_header).
+	@param	size	<-	Optional returned size of the image.
+	@result			<-	mach_error_t
+	
+	************************************************************************************/
+
+	mach_error_t
+machImageForPointer(
+		const void *pointer,
+		const void **image,
+		unsigned long *size );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	//	_mach_inject_
