Index: releases/Pester/1.0/Source/English.lproj/Alarms.nib/classes.nib
===================================================================
--- releases/Pester/1.0/Source/English.lproj/Alarms.nib/classes.nib	(revision 29)
+++ releases/Pester/1.0/Source/English.lproj/Alarms.nib/classes.nib	(revision 29)
@@ -0,0 +1,14 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {CLASS = NJRScrollView; LANGUAGE = ObjC; SUPERCLASS = NSScrollView; }, 
+        {
+            ACTIONS = {remove = id; }; 
+            CLASS = PSAlarmsController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {removeButton = NSButton; tableView = NSTableView; }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/Pester/1.0/Source/English.lproj/Alarms.nib/info.nib
===================================================================
--- releases/Pester/1.0/Source/English.lproj/Alarms.nib/info.nib	(revision 29)
+++ releases/Pester/1.0/Source/English.lproj/Alarms.nib/info.nib	(revision 29)
@@ -0,0 +1,16 @@
+<?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>IBDocumentLocation</key>
+	<string>579 27 356 240 0 0 1600 1178 </string>
+	<key>IBFramework Version</key>
+	<string>286.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>8</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>6D52</string>
+</dict>
+</plist>
Index: releases/Pester/1.0/Source/English.lproj/Credits.html
===================================================================
--- releases/Pester/1.0/Source/English.lproj/Credits.html	(revision 29)
+++ releases/Pester/1.0/Source/English.lproj/Credits.html	(revision 29)
@@ -0,0 +1,2 @@
+<font face="Lucida Grande" size="-1"><b>Icon by</b> <a href="mailto:excellence@global.co.za">Diederik Vemer</a></font>.<br>
+<font face="Lucida Grande" size="-1"><b>Thanks to</b> <a href="mailto:ryanwilcox@mac.com">Ryan Wilcox</a></font>.
Index: releases/Pester/1.0/Source/English.lproj/MainMenu.nib/classes.nib
===================================================================
--- releases/Pester/1.0/Source/English.lproj/MainMenu.nib/classes.nib	(revision 29)
+++ releases/Pester/1.0/Source/English.lproj/MainMenu.nib/classes.nib	(revision 29)
@@ -0,0 +1,44 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {CLASS = NJRDateFormatter; LANGUAGE = ObjC; SUPERCLASS = NSDateFormatter; }, 
+        {
+            ACTIONS = {clearAllEntries = id; removeEntry = id; }; 
+            CLASS = NJRHistoryTrackingComboBox; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSComboBox; 
+        }, 
+        {CLASS = NJRIntegerFilter; LANGUAGE = ObjC; SUPERCLASS = NSNumberFormatter; }, 
+        {
+            ACTIONS = {dateCompleted = id; inAtChanged = id; setAlarm = id; update = id; }; 
+            CLASS = PSAlarmSetController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {
+                inAtMatrix = NSMatrix; 
+                messageField = NSTextField; 
+                setButton = NSButton; 
+                timeDate = NSTextField; 
+                timeDateCompletions = NSPopUpButton; 
+                timeInterval = NSTextField; 
+                timeIntervalUnits = NSPopUpButton; 
+                timeOfDay = NSTextField; 
+                timeSummary = NSTextField; 
+            }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {
+            CLASS = PSAlarmsController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {tableView = NSTableView; }; 
+            SUPERCLASS = NSWindowController; 
+        }, 
+        {
+            ACTIONS = {orderFrontAlarmsPanel = id; }; 
+            CLASS = PSApplication; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {alarmSetController = PSAlarmSetController; }; 
+            SUPERCLASS = NSApplication; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/Pester/1.0/Source/English.lproj/MainMenu.nib/info.nib
===================================================================
--- releases/Pester/1.0/Source/English.lproj/MainMenu.nib/info.nib	(revision 29)
+++ releases/Pester/1.0/Source/English.lproj/MainMenu.nib/info.nib	(revision 29)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>21 12 356 240 0 0 1280 832 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>25 266 273 44 0 0 1280 832 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>263.2</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>29</integer>
+		<integer>21</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>5S66</string>
+</dict>
+</plist>
Index: releases/Pester/1.0/Source/English.lproj/Notifier.nib/classes.nib
===================================================================
--- releases/Pester/1.0/Source/English.lproj/Notifier.nib/classes.nib	(revision 29)
+++ releases/Pester/1.0/Source/English.lproj/Notifier.nib/classes.nib	(revision 29)
@@ -0,0 +1,13 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {close = id; }; 
+            CLASS = PSAlarmNotifierController; 
+            LANGUAGE = ObjC; 
+            OUTLETS = {dateField = NSTextField; messageField = NSTextField; }; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: releases/Pester/1.0/Source/English.lproj/Notifier.nib/info.nib
===================================================================
--- releases/Pester/1.0/Source/English.lproj/Notifier.nib/info.nib	(revision 29)
+++ releases/Pester/1.0/Source/English.lproj/Notifier.nib/info.nib	(revision 29)
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>424 83 356 240 0 0 1280 832 </string>
+	<key>IBFramework Version</key>
+	<string>263.2</string>
+	<key>IBSystem Version</key>
+	<string>5S66</string>
+</dict>
+</plist>
Index: releases/Pester/1.0/Source/NJRDateFormatter.h
===================================================================
--- releases/Pester/1.0/Source/NJRDateFormatter.h	(revision 29)
+++ releases/Pester/1.0/Source/NJRDateFormatter.h	(revision 29)
@@ -0,0 +1,16 @@
+//
+//  NJRDateFormatter.h
+//  Pester
+//
+//  Created by Nicholas Riley on Wed Oct 09 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface NJRDateFormatter : NSDateFormatter {
+
+}
+
+@end
Index: releases/Pester/1.0/Source/NJRDateFormatter.m
===================================================================
--- releases/Pester/1.0/Source/NJRDateFormatter.m	(revision 29)
+++ releases/Pester/1.0/Source/NJRDateFormatter.m	(revision 29)
@@ -0,0 +1,53 @@
+//
+//  NJRDateFormatter.m
+//  Pester
+//
+//  Created by Nicholas Riley on Wed Oct 09 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "NJRDateFormatter.h"
+
+
+@implementation NJRDateFormatter
+
+// workaround for bug in Jaguar (and earlier?) NSCalendarDate dateWithNaturalLanguageString:
+NSString * stringByRemovingSurroundingWhitespace(NSString *string) {
+    static NSCharacterSet *nonWhitespace = nil;
+    NSRange firstValidCharacter, lastValidCharacter;
+
+    if (!nonWhitespace) {
+        nonWhitespace = [[[NSCharacterSet characterSetWithCharactersInString:
+            @" \t\r\n"] invertedSet] retain];
+    }
+
+    firstValidCharacter = [string rangeOfCharacterFromSet:nonWhitespace];
+    if (firstValidCharacter.length == 0)
+        return @"";
+    lastValidCharacter = [string rangeOfCharacterFromSet:nonWhitespace options:NSBackwardsSearch];
+
+    if (firstValidCharacter.location == 0 && lastValidCharacter.location == [string length] - 1)
+        return string;
+    else
+        return [string substringWithRange:NSUnionRange(firstValidCharacter, lastValidCharacter)];
+}
+
+
+- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error
+{
+    NSCalendarDate *date;
+    if (![self allowsNaturalLanguage])
+        return [super getObjectValue: anObject forString: string errorDescription: error];
+    if (string == nil) return nil;
+    NS_DURING // dateWithNaturalLanguageString: can throw an exception
+        date = [NSCalendarDate dateWithNaturalLanguageString: stringByRemovingSurroundingWhitespace(string)];
+    NS_HANDLER
+        if (error != nil) *error = [localException reason];
+        NS_VALUERETURN(NO, BOOL);
+    NS_ENDHANDLER
+    if (date == nil) return [super getObjectValue: anObject forString: string errorDescription: error];
+    *anObject = date;
+    return YES;
+}
+
+@end
Index: releases/Pester/1.0/Source/NJRHistoryTrackingComboBox.h
===================================================================
--- releases/Pester/1.0/Source/NJRHistoryTrackingComboBox.h	(revision 29)
+++ releases/Pester/1.0/Source/NJRHistoryTrackingComboBox.h	(revision 29)
@@ -0,0 +1,19 @@
+//
+//  NJRHistoryTrackingComboBox.h
+//  DockCam
+//
+//  Created by Nicholas Riley on Fri Jun 28 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface NJRHistoryTrackingComboBox : NSComboBox {
+
+}
+
+- (IBAction)removeEntry:(id)sender;
+- (IBAction)clearAllEntries:(id)sender;
+
+@end
Index: releases/Pester/1.0/Source/NJRHistoryTrackingComboBox.m
===================================================================
--- releases/Pester/1.0/Source/NJRHistoryTrackingComboBox.m	(revision 29)
+++ releases/Pester/1.0/Source/NJRHistoryTrackingComboBox.m	(revision 29)
@@ -0,0 +1,75 @@
+//
+//  NJRHistoryTrackingComboBox.m
+//  DockCam
+//
+//  Created by Nicholas Riley on Fri Jun 28 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "NJRHistoryTrackingComboBox.h"
+
+#define NJRHistoryTrackingComboBoxMaxItems 10
+
+@implementation NJRHistoryTrackingComboBox
+
+- (NSString *)_defaultKey;
+{
+    NSAssert([self tag] != 0, @"CanÕt track history for combo box with tag 0: please set a tag");
+    return [NSString stringWithFormat: @"NJRHistoryTrackingComboBox tag %d", [self tag]];
+}
+
+- (void)awakeFromNib;
+{
+    NSAssert([self tag] != 0, @"CanÕt track history for combo box with tag 0: please set a tag");
+    [[NSNotificationCenter defaultCenter] addObserver: self
+                                             selector: @selector(textDidEndEditing:)
+                                                 name: NSTextDidEndEditingNotification
+                                               object: self];
+    [self removeAllItems];
+    [self addItemsWithObjectValues: [[NSUserDefaults standardUserDefaults] stringArrayForKey: [self _defaultKey]]];
+    [self setItemHeight: [self itemHeight] + 2];
+}
+
+- (void)_writeHistory;
+{
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+    [defaults setObject: [self objectValues] forKey: [self _defaultKey]];
+    [defaults synchronize];
+}
+
+- (IBAction)removeEntry:(id)sender;
+{
+    int idx = [self indexOfSelectedItem];
+    if (idx == -1) {
+        [self selectItemWithObjectValue: [self stringValue]];
+        idx = [self indexOfSelectedItem];
+    }
+    if (idx != -1) [self removeItemAtIndex: idx];
+    [self setStringValue: @""];
+    [self _writeHistory];
+}
+
+- (IBAction)clearAllEntries:(id)sender;
+{
+    [self removeAllItems];
+    [self setStringValue: @""];
+    [self _writeHistory];
+}
+
+- (BOOL)textShouldEndEditing:(NSText *)textObject;
+{
+    NSString *newValue = [self stringValue];
+    int oldIndex = [self indexOfItemWithObjectValue: newValue];
+    [self removeItemWithObjectValue: newValue];
+    [self insertItemWithObjectValue: newValue atIndex: 0];
+    if (oldIndex == NSNotFound) {
+        int numItems = [self numberOfItems];
+        while (numItems-- > NJRHistoryTrackingComboBoxMaxItems) {
+            [self removeItemAtIndex: numItems - 1];
+        }
+    }
+    [self _writeHistory];
+    return YES;
+}
+
+@end
Index: releases/Pester/1.0/Source/NJRIntegerFilter.h
===================================================================
--- releases/Pester/1.0/Source/NJRIntegerFilter.h	(revision 29)
+++ releases/Pester/1.0/Source/NJRIntegerFilter.h	(revision 29)
@@ -0,0 +1,16 @@
+//
+//  NJRIntegerFilter.h
+//  HostLauncher
+//
+//  Created by Nicholas Riley on Tue Dec 18 2001.
+//  Copyright (c) 2001 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface NJRIntegerFilter : NSNumberFormatter {
+
+}
+
+@end
Index: releases/Pester/1.0/Source/NJRIntegerFilter.m
===================================================================
--- releases/Pester/1.0/Source/NJRIntegerFilter.m	(revision 29)
+++ releases/Pester/1.0/Source/NJRIntegerFilter.m	(revision 29)
@@ -0,0 +1,35 @@
+//
+//  NJRIntegerFilter.m
+//  HostLauncher
+//
+//  Created by Nicholas Riley on Tue Dec 18 2001.
+//  Copyright (c) 2001 Nicholas Riley. All rights reserved.
+//
+
+// based on MyIntegerFilter
+// Copyright © 2001 Bill Cheeseman. All rights reserved.
+
+#import "NJRIntegerFilter.h"
+
+@implementation NJRIntegerFilter
+
+// Input filter
+
+- (BOOL)isPartialStringValid:(NSString **)partialStringPtr proposedSelectedRange:(NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString **)error {
+
+    // Override method to enable NSControl delegate method control:didFailToValidatePartialString:errorDescription: to
+    // reject invalid keypresses. Filters out keyboard input characters other than "1" .. "9".
+    if ([[*partialStringPtr substringWithRange:NSMakeRange(origSelRange.location, (*proposedSelRangePtr).location - origSelRange.location)] rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet] options:NSLiteralSearch].location != NSNotFound) {
+        *error = NSLocalizedString(@"Input is not an integer", @"Presented when user value not a numeric digit");
+        return NO; // Reject *partialStringPtr as typed, invoke delegate method
+    }
+
+    if ([*partialStringPtr length] == 0) {
+        // Work around NSFormatter issue in Mac OS X 10.0.
+        [[[NSApp keyWindow] fieldEditor:NO forObject:nil] setSelectedRange:*proposedSelRangePtr];
+    }
+
+    return YES; // Accept *partialStringPtr as typed
+}
+
+@end
Index: releases/Pester/1.0/Source/NJRScrollView.h
===================================================================
--- releases/Pester/1.0/Source/NJRScrollView.h	(revision 29)
+++ releases/Pester/1.0/Source/NJRScrollView.h	(revision 29)
@@ -0,0 +1,17 @@
+//
+//  NJRScrollView.h
+//  HostLauncher
+//
+//  Created by nicholas on Tue Oct 30 2001.
+//  Copyright (c) 2001 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface NJRScrollView : NSScrollView {
+    BOOL shouldDrawFocusRing;
+    NSResponder *lastResp;
+}
+
+@end
Index: releases/Pester/1.0/Source/NJRScrollView.m
===================================================================
--- releases/Pester/1.0/Source/NJRScrollView.m	(revision 29)
+++ releases/Pester/1.0/Source/NJRScrollView.m	(revision 29)
@@ -0,0 +1,38 @@
+//
+//  NJRScrollView.m
+//  HostLauncher
+//
+//  Created by nicholas on Tue Oct 30 2001.
+//  Copyright (c) 2001 Nicholas Riley. All rights reserved.
+//
+
+#import "NJRScrollView.h"
+
+
+@implementation NJRScrollView
+
+- (BOOL)needsDisplay;
+{
+    NSResponder *resp = nil;
+    if ([[self window] isKeyWindow]) {
+        resp = [[self window] firstResponder];
+        if (resp == lastResp) return [super needsDisplay];
+    } else if (lastResp == nil) {
+        return [super needsDisplay];
+    }
+    shouldDrawFocusRing = (resp != nil && [resp isKindOfClass: [NSView class]] &&
+                           [(NSView *)resp isDescendantOf: self]); // [sic]
+    lastResp = resp;
+    [self setKeyboardFocusRingNeedsDisplayInRect: [self bounds]];
+    return YES;
+}
+
+- (void)drawRect:(NSRect)rect {
+    [super drawRect: rect];
+    if (shouldDrawFocusRing) {
+        NSSetFocusRingStyle(NSFocusRingOnly);
+        NSRectFill([self bounds]);
+    }
+}
+
+@end
Index: releases/Pester/1.0/Source/NSTableView-NJRExtensions.h
===================================================================
--- releases/Pester/1.0/Source/NSTableView-NJRExtensions.h	(revision 29)
+++ releases/Pester/1.0/Source/NSTableView-NJRExtensions.h	(revision 29)
@@ -0,0 +1,16 @@
+//
+//  NSTableView-NJRExtensions.h
+//  HostLauncher
+//
+//  Created by Nicholas Riley on Mon Apr 22 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface NSTableView (NJRExtensions)
+
+- (float)cellHeight;
+
+@end
Index: releases/Pester/1.0/Source/NSTableView-NJRExtensions.m
===================================================================
--- releases/Pester/1.0/Source/NSTableView-NJRExtensions.m	(revision 29)
+++ releases/Pester/1.0/Source/NSTableView-NJRExtensions.m	(revision 29)
@@ -0,0 +1,25 @@
+//
+//  NSTableView-NJRExtensions.m
+//  HostLauncher
+//
+//  Created by Nicholas Riley on Mon Apr 22 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "NSTableView-NJRExtensions.h"
+
+
+@implementation NSTableView (NJRExtensions)
+
+- (float)cellHeight;
+{
+    return [self rowHeight] + [self intercellSpacing].height;
+}
+
+// causes NSTableView to get keyboard focus (with thanks to Pierre-Olivier Latour)
+- (BOOL)needsPanelToBecomeKey
+{
+    return YES;
+}
+
+@end
Index: releases/Pester/1.0/Source/PSAlarm.h
===================================================================
--- releases/Pester/1.0/Source/PSAlarm.h	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarm.h	(revision 29)
@@ -0,0 +1,48 @@
+//
+//  PSAlarm.h
+//  Pester
+//
+//  Created by Nicholas Riley on Wed Oct 09 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+typedef enum {
+    PSAlarmInvalid, PSAlarmInterval, PSAlarmDate, PSAlarmSet
+} PSAlarmType;
+
+extern NSString * const PSAlarmTimerSetNotification;
+extern NSString * const PSAlarmTimerExpiredNotification;
+
+@interface PSAlarm : NSObject <NSCoding> {
+    PSAlarmType alarmType;
+    NSCalendarDate *alarmDate;
+    NSTimeInterval alarmInterval;
+    NSString *alarmMessage;
+    NSString *invalidMessage;
+    NSTimer *timer;
+}
+
+- (void)setInterval:(NSTimeInterval)anInterval;
+- (void)setForDateAtTime:(NSCalendarDate *)dateTime;
+- (void)setForDate:(NSDate *)date atTime:(NSDate *)time;
+- (void)setMessage:(NSString *)aMessage;
+
+- (NSCalendarDate *)date;
+- (NSTimeInterval)interval;
+- (NSString *)message;
+
+- (NSString *)shortDateString;
+- (NSString *)timeString;
+- (NSString *)timeRemainingString;
+
+- (BOOL)isValid;
+- (NSString *)invalidMessage;
+
+- (NSComparisonResult)compare:(PSAlarm *)otherAlarm;
+
+- (BOOL)setTimer;
+- (void)cancel;
+
+@end
Index: releases/Pester/1.0/Source/PSAlarm.m
===================================================================
--- releases/Pester/1.0/Source/PSAlarm.m	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarm.m	(revision 29)
@@ -0,0 +1,282 @@
+//
+//  PSAlarm.m
+//  Pester
+//
+//  Created by Nicholas Riley on Wed Oct 09 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "PSAlarm.h"
+
+NSString * const PSAlarmTimerSetNotification = @"PSAlarmTimerSetNotification";
+NSString * const PSAlarmTimerExpiredNotification = @"PSAlarmTimerExpiredNotification";
+
+@implementation PSAlarm
+
+- (void)dealloc;
+{
+    // NSLog(@"DEALLOC %@", self);
+    alarmType = PSAlarmInvalid;
+    [alarmDate release]; alarmDate = nil;
+    [alarmMessage release]; alarmMessage = nil;
+    [invalidMessage release]; invalidMessage = nil;
+    [timer invalidate]; [timer release]; timer = nil;
+    [super dealloc];
+}
+
+- (void)_setAlarmDate:(NSCalendarDate *)aDate;
+{
+    if (alarmDate != aDate) {
+        [alarmDate release];
+        alarmDate = nil;
+        alarmDate = [aDate retain];
+    }
+}
+
+- (void)_invalidate:(NSString *)aMessage;
+{
+    alarmType = PSAlarmInvalid;
+    if (aMessage != invalidMessage) {
+        [invalidMessage release];
+        invalidMessage = nil;
+        [self _setAlarmDate: nil];
+        alarmInterval = 0;
+        invalidMessage = [aMessage retain];
+    }
+}
+
+- (void)_validateForType:(PSAlarmType)type;
+{
+    if (alarmType == PSAlarmSet) return; // already valid
+    [invalidMessage release];
+    invalidMessage = nil;
+    alarmType = type;
+}
+
+- (void)_setDateFromInterval;
+{
+    [alarmDate release]; alarmDate = nil;
+    alarmDate = [NSCalendarDate dateWithTimeIntervalSinceNow: alarmInterval];
+    [alarmDate retain];
+    [self _validateForType: PSAlarmInterval];
+}
+
+- (void)setInterval:(NSTimeInterval)anInterval;
+{
+    alarmInterval = anInterval;
+    if (alarmInterval <= 0) {
+        [self _invalidate: @"Please specify an alarm interval."]; return;
+    }
+    [self _setDateFromInterval];
+}
+
+- (void)_setIntervalFromDate;
+{
+    alarmInterval = [alarmDate timeIntervalSinceNow] + 1;
+    if (alarmInterval <= 0) {
+        [self _invalidate: @"Please specify an alarm time in the future."];
+        return;
+    }
+    [self _validateForType: PSAlarmDate];
+}
+
+- (void)setForDateAtTime:(NSCalendarDate *)dateTime;
+{
+    [self _setAlarmDate: dateTime];
+    [self _setIntervalFromDate];
+}
+
+- (void)setForDate:(NSDate *)date atTime:(NSDate *)time;
+{
+    NSCalendarDate *calTime, *calDate;
+    if (time == nil && date == nil) {
+        [self _invalidate: @"Please specify an alarm date and time."]; return;
+    }
+    if (time == nil) {
+        [self _invalidate: @"Please specify an alarm time."]; return;
+    }
+    if (date == nil) {
+        [self _invalidate: @"Please specify an alarm date."]; return;
+    }
+    // XXX if calTime's date is different from the default date, complain
+    calTime = [NSCalendarDate dateWithTimeIntervalSinceReferenceDate: [time timeIntervalSinceReferenceDate]];
+    calDate = [NSCalendarDate dateWithTimeIntervalSinceReferenceDate: [date timeIntervalSinceReferenceDate]];
+    if (calTime == nil || calDate == nil) {
+        [self _invalidate: @"Please specify a reasonable date and time."];
+    }
+    [self setForDateAtTime:
+        [[[NSCalendarDate alloc] initWithYear: [calDate yearOfCommonEra]
+                                        month: [calDate monthOfYear]
+                                          day: [calDate dayOfMonth]
+                                         hour: [calTime hourOfDay]
+                                       minute: [calTime minuteOfHour]
+                                       second: [calTime secondOfMinute]
+                                     timeZone: nil] autorelease]];
+}
+
+- (BOOL)isValid;
+{
+    if (alarmType == PSAlarmDate) [self _setIntervalFromDate];
+    return (alarmType != PSAlarmInvalid);
+}
+
+- (void)setMessage:(NSString *)aMessage;
+{
+    if (aMessage != alarmMessage) {
+        [alarmMessage release];
+        alarmMessage = nil;
+        alarmMessage = [aMessage retain];
+    }
+}
+
+- (NSString *)message;
+{
+    if (alarmMessage == nil || [alarmMessage isEqualToString: @""])
+        return @"Alarm!";
+    return alarmMessage;    
+}
+
+- (NSString *)invalidMessage;
+{
+    if (invalidMessage == nil) return @"";
+    return invalidMessage;
+}
+
+- (NSCalendarDate *)date;
+{
+    if (alarmType == PSAlarmInterval) [self _setDateFromInterval];
+    return alarmDate;
+}
+
+- (NSString *)shortDateString;
+{
+    return [[self date] descriptionWithCalendarFormat: [[NSUserDefaults standardUserDefaults] stringForKey: NSShortDateFormatString]];
+}
+
+- (NSString *)timeString;
+{
+    return [[self date] descriptionWithCalendarFormat: @"%1I:%M:%S %p"]; // XXX regular format doesn't work
+}
+
+- (NSString *)timeRemainingString;
+{
+    static const unsigned long long minute = 60, hour = minute * 60, day = hour * 24, year = day * 365.26;
+    unsigned long long interval = [self interval];
+    // +[NSString stringWithFormat:] in 10.1 does not support long longs: work around it by converting to unsigned ints or longs for display
+    if (interval == 0) return @"ÇexpiredÈ";
+    if (interval < minute) return [NSString stringWithFormat: @"%us", (unsigned)interval];
+    if (interval < day) return [NSString stringWithFormat: @"%uh %um", (unsigned)(interval / hour), (unsigned)((interval % hour) / minute)];
+    if (interval < year) return [NSString stringWithFormat: @"%u days", (unsigned)(interval / day)];
+    if (interval < 2 * year) return @"One year";
+    return [NSString stringWithFormat: @"%lu years", (unsigned long)(interval / year)];
+}
+
+- (NSTimeInterval)interval;
+{
+    if (alarmType == PSAlarmSet || alarmType == PSAlarmDate) [self _setIntervalFromDate];
+    return alarmInterval;
+}
+
+- (BOOL)setTimer;
+{
+    switch (alarmType) {
+        case PSAlarmDate: if (![self isValid]) return NO;
+        case PSAlarmInterval:
+            timer = [NSTimer scheduledTimerWithTimeInterval: alarmInterval
+                                                     target: self
+                                                   selector: @selector(_timerExpired:)
+                                                   userInfo: nil
+                                                    repeats: NO];
+            if (timer != nil) {
+                [timer retain];
+                alarmType = PSAlarmSet;
+                [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmTimerSetNotification object: self];
+                return YES;
+            }
+        default:
+            return NO;
+    }
+}
+
+- (void)cancel;
+{
+    [timer invalidate]; [timer release]; timer = nil;
+}
+
+- (void)_timerExpired:(NSTimer *)aTimer;
+{
+    [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmTimerExpiredNotification object: self];
+    [timer release]; timer = nil;
+}
+
+- (NSString *)_alarmTypeString;
+{
+    switch (alarmType) {
+        case PSAlarmDate: return @"PSAlarmDate";
+        case PSAlarmInterval: return @"PSAlarmInterval";
+        case PSAlarmSet: return @"PSAlarmSet";
+        case PSAlarmInvalid: return @"PSAlarmInvalid";
+        default: return [NSString stringWithFormat: @"<unknown: %u>", alarmType];
+    }
+}
+
+- (NSComparisonResult)compare:(PSAlarm *)otherAlarm;
+{
+    return [[self date] compare: [otherAlarm date]];
+}
+
+- (NSString *)description;
+{
+    return [NSString stringWithFormat: @"%@: type %@ date %@ interval %.1f%@",
+        [super description], [self _alarmTypeString], alarmDate, alarmInterval,
+        (alarmType == PSAlarmInvalid ?
+         [NSString stringWithFormat: @"\ninvalid message: %@", invalidMessage]
+        : (alarmType == PSAlarmSet ?
+           [NSString stringWithFormat: @"\ntimer: %@", timer] : @""))];
+}
+
+- (void)encodeWithCoder:(NSCoder *)coder;
+{
+    if (![self isValid]) return;
+    [coder encodeValueOfObjCType: @encode(PSAlarmType) at: &alarmType];
+    switch (alarmType) {
+        case PSAlarmDate:
+        case PSAlarmSet:
+            [coder encodeObject: alarmDate];
+            break;
+        case PSAlarmInterval:
+            [coder encodeValueOfObjCType: @encode(NSTimeInterval) at: &alarmInterval];
+            break;
+        default:
+            break;
+    }
+    [coder encodeObject: alarmMessage];
+    // NSLog(@"encoded: %@", self); // XXX happening twice, gdb refuses to show proper backtrace, grr
+    return;
+}
+
+- (id)initWithCoder:(NSCoder *)coder;
+{
+    if ( (self = [super init]) != nil) {
+        [coder decodeValueOfObjCType: @encode(PSAlarmType) at: &alarmType];
+        switch (alarmType) {
+            case PSAlarmDate:
+            case PSAlarmSet:
+                [self _setAlarmDate: [coder decodeObject]];
+                break;
+            case PSAlarmInterval:
+                [coder decodeValueOfObjCType: @encode(NSTimeInterval) at: &alarmInterval];
+                break;
+            default:
+                break;
+        }
+        [self setMessage: [coder decodeObject]];
+        if (alarmType == PSAlarmSet) {
+            alarmType = PSAlarmDate;
+            [self setTimer];
+        }
+    }
+    return self;
+}
+
+@end
Index: releases/Pester/1.0/Source/PSAlarmNotifierController.h
===================================================================
--- releases/Pester/1.0/Source/PSAlarmNotifierController.h	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarmNotifierController.h	(revision 29)
@@ -0,0 +1,24 @@
+//
+//  PSAlarmNotifierController.h
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Oct 08 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+@class PSAlarm;
+
+@interface PSAlarmNotifierController : NSWindowController {
+    IBOutlet NSTextField *messageField;
+    IBOutlet NSTextField *dateField;
+}
+
++ (PSAlarmNotifierController *)controllerWithTimerExpiredNotification:(NSNotification *)notification;
+
+- (id)initWithAlarm:(PSAlarm *)alarm;
+
+- (IBAction)close:(NSButton *)sender;
+
+@end
Index: releases/Pester/1.0/Source/PSAlarmNotifierController.m
===================================================================
--- releases/Pester/1.0/Source/PSAlarmNotifierController.m	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarmNotifierController.m	(revision 29)
@@ -0,0 +1,42 @@
+//
+//  PSAlarmNotifierController.m
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Oct 08 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "PSAlarmNotifierController.h"
+#import "PSAlarm.h"
+
+@implementation PSAlarmNotifierController
+
+// XXX should use NSNonactivatingPanelMask on 10.2
+
++ (PSAlarmNotifierController *)controllerWithTimerExpiredNotification:(NSNotification *)notification;
+{
+    return [[self alloc] initWithAlarm: [notification object]];
+}
+
+- (id)initWithAlarm:(PSAlarm *)alarm;
+{
+    if ([self initWithWindowNibName: @"Notifier"]) {
+        [[self window] center];
+        [messageField setStringValue: [alarm message]];
+        [dateField setObjectValue: [alarm date]];
+        [NSApp requestUserAttention: NSInformationalRequest];
+        [NSApp activateIgnoringOtherApps: YES];
+        [[self window] makeKeyAndOrderFront: nil];
+        [[self window] orderFrontRegardless];
+        [NSApp cancelUserAttentionRequest: NSInformationalRequest];
+        NSBeep();
+    }
+    return self;
+}
+
+- (IBAction)close:(id)sender;
+{
+    [self close];
+}
+
+@end
Index: releases/Pester/1.0/Source/PSAlarmSetController.h
===================================================================
--- releases/Pester/1.0/Source/PSAlarmSetController.h	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarmSetController.h	(revision 29)
@@ -0,0 +1,33 @@
+//
+//  PSAlarmSetController.h
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Oct 08 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+#import "PSAlarm.h"
+
+@interface PSAlarmSetController : NSWindowController {
+    IBOutlet NSTextField *messageField;
+    IBOutlet NSMatrix *inAtMatrix;
+    IBOutlet NSTextField *timeInterval;
+    IBOutlet NSPopUpButton *timeIntervalUnits;
+    IBOutlet NSTextField *timeOfDay;
+    IBOutlet NSTextField *timeDate;
+    IBOutlet NSPopUpButton *timeDateCompletions; // XXX should go away when bug preventing both formatters and popup menus from existing is fixed
+    IBOutlet NSTextField *timeSummary;
+    IBOutlet NSButton *setButton;
+    NSString *status;
+    NSTimer *updateTimer;
+    PSAlarm *alarm;
+    BOOL isInterval;
+}
+
+- (IBAction)update:(id)sender;
+- (IBAction)dateCompleted:(NSPopUpButton *)sender;
+- (IBAction)inAtChanged:(id)sender;
+- (IBAction)setAlarm:(NSButton *)sender;
+
+@end
Index: releases/Pester/1.0/Source/PSAlarmSetController.m
===================================================================
--- releases/Pester/1.0/Source/PSAlarmSetController.m	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarmSetController.m	(revision 29)
@@ -0,0 +1,223 @@
+//
+//  PSAlarmSetController.m
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Oct 08 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "PSAlarmSetController.h"
+#import "PSAlarmNotifierController.h"
+#import "NJRDateFormatter.h"
+
+/* Bugs to file:
+
+¥ any trailing spaces: -> exception for +[NSCalendarDate dateWithNaturalLanguageString]:
+ > NSCalendarDate dateWithNaturalLanguageString: '12 '
+  format error: internal error
+
+¥ NSDate natural language stuff in NSCalendarDate (why?), misspelled category name
+¥ NSCalendarDate natural language stuff behaves differently from NSDateFormatter (AM/PM has no effect, shouldn't they share code?)
+¥ NSDateFormatter doc class description gives two examples for natural language that are incorrect, no link to NSDate doc that describes exactly how natural language dates are parsed
+¥ NSTimeFormatString does not include %p when it should, meaning that AM/PM is stripped yet 12-hour time is still used
+¥ NSNextDayDesignations, NSNextNextDayDesignations are noted as 'a string' in NSUserDefaults docs, but maybe they are actually an array, or either an array or a string, given their names?
+¥ "Setting the Format for Dates" does not document how to get 1:15 AM, the answer is %1I - strftime has no exact equivalent; the closest is %l.  strftime does not permit numeric prefixes.  It also refers to "NSCalendar" when no such class exists.
+¥ none of many mentions of NSAMPMDesignation indicates that they include the leading spaces (" AM", " PM").  In "Setting the Format for Dates", needs to mention that the leading spaces are not included in %p with strftime.  But if you use the NSCalendarDate stuff, it appears %p doesn't include the space.
+¥ descriptions for %X and %x are reversed (time zone is in %X, not %x)
+¥ too hard to implement date-only or time-only formatters
+¥ should be able to specify that natural language favors date or time (10 = 10th of month, not 10am)
+¥ please expose the iCal controls!
+
+*/
+
+@interface PSAlarmSetController (Private)
+
+- (void)_stopUpdateTimer;
+
+@end
+
+@implementation PSAlarmSetController
+
+- (void)awakeFromNib;
+{
+    // XXX bugs prevent this code from working properly on Jaguar
+    /* NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+    [timeOfDay setFormatter: [[NJRDateFormatter alloc] initWithDateFormat: [defaults objectForKey: NSTimeFormatString] allowNaturalLanguage: YES]];
+    [timeDate setFormatter: [[NJRDateFormatter alloc] initWithDateFormat: [defaults objectForKey: NSShortDateFormatString] allowNaturalLanguage: YES]]; */
+    alarm = [[PSAlarm alloc] init];
+    [[self window] center];
+    [self inAtChanged: nil];
+    [[self window] makeKeyAndOrderFront: nil];
+}
+
+- (void)setStatus:(NSString *)aString;
+{
+    // NSLog(@"%@", alarm);
+    if (aString != status) {
+        [status release]; status = nil;
+        status = [aString retain];
+        [timeSummary setStringValue: status];
+    }
+}
+
+- (id)objectValueForTextField:(NSTextField *)field whileEditing:(id)sender;
+{
+    if (sender == field) {
+        NSString *stringValue = [[[self window] fieldEditor: NO forObject: field] string];
+        id obj = nil;
+        [[field formatter] getObjectValue: &obj forString: stringValue errorDescription: NULL];
+        // NSLog(@"from field editor: %@", obj);
+        return obj;
+    } else {
+        // NSLog(@"from field: %@", [field objectValue]);
+        return [field objectValue];
+    }
+}
+
+- (void)setAlarmDateAndInterval:(id)sender;
+{
+    if (isInterval) {
+        [alarm setInterval:
+            [[self objectValueForTextField: timeInterval whileEditing: sender] intValue] *
+                [timeIntervalUnits selectedTag]];
+    } else {
+        [alarm setForDate: [self objectValueForTextField: timeDate whileEditing: sender]
+                   atTime: [self objectValueForTextField: timeOfDay whileEditing: sender]];
+    }
+}
+
+- (void)_stopUpdateTimer;
+{
+    [updateTimer invalidate]; [updateTimer release]; updateTimer = nil;
+}
+
+// XXX use OACalendar?
+
+- (IBAction)updateDateDisplay:(id)sender;
+{
+    // NSLog(@"updateDateDisplay: %@", sender);
+    if ([alarm isValid]) {
+        [self setStatus: [[alarm date] descriptionWithCalendarFormat: @"Alarm will be set for %X on %x" timeZone: nil locale: nil]];
+        [setButton setEnabled: YES];
+        if (updateTimer == nil || ![updateTimer isValid]) {
+            // XXX this logic (and the timer) should really go into PSAlarm, to send notifications for status updates instead.  Timer starts when people are watching, stops when people aren't.
+            // NSLog(@"setting timer");
+            if (isInterval) {
+                updateTimer = [NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector(updateDateDisplay:) userInfo: nil repeats: YES];
+            } else {
+                updateTimer = [NSTimer scheduledTimerWithTimeInterval: [alarm interval] target: self selector: @selector(updateDateDisplay:) userInfo: nil repeats: NO];
+            }
+            [updateTimer retain];
+        }
+    } else {
+        [setButton setEnabled: NO];
+        [self setStatus: [alarm invalidMessage]];
+        [self _stopUpdateTimer];
+    }
+}
+
+// Be careful not to hook up any of the text fields' actions to update: because we handle them in controlTextDidChange: instead.  If we could get the active text field somehow via public API (guess we could use controlTextDidBegin/controlTextDidEndEditing) then we'd not need to overload the update sender for this purpose.  Or, I guess, we could use another method other than update.  It should not be this hard to implement what is essentially standard behavior.  Sigh.
+
+- (IBAction)update:(id)sender;
+{
+    // NSLog(@"update: %@", sender);
+    [self setAlarmDateAndInterval: sender];
+    [self updateDateDisplay: sender];
+}
+
+- (IBAction)inAtChanged:(id)sender;
+{
+    isInterval = ([inAtMatrix selectedTag] == 0);
+    [timeInterval setEnabled: isInterval];
+    [timeIntervalUnits setEnabled: isInterval];
+    [timeOfDay setEnabled: !isInterval];
+    [timeDate setEnabled: !isInterval];
+    [timeDateCompletions setEnabled: !isInterval];
+    if (sender != nil)
+        [[self window] makeFirstResponder: isInterval ? timeInterval : timeOfDay];
+    // NSLog(@"UPDATING FROM inAtChanged");
+    [self update: nil];
+}
+
+- (IBAction)dateCompleted:(NSPopUpButton *)sender;
+{
+    [timeDate setStringValue: [sender titleOfSelectedItem]];
+    [self update: sender];
+}
+
+// to ensure proper updating of interval, this should be the only method by which the window is shown (e.g. from the Alarm menu)
+- (IBAction)showWindow:(id)sender;
+{
+    if (![[self window] isVisible]) {
+        [self update: self];
+        // XXX otherwise, first responder appears to alternate every time the window is shown?!  And if you set the initial first responder, you can't tab in the window. :(
+        [[self window] makeFirstResponder: [[self window] initialFirstResponder]];
+    }
+    [super showWindow: sender];
+}
+
+- (IBAction)setAlarm:(NSButton *)sender;
+{
+    PSAlarmNotifierController *notifier = [PSAlarmNotifierController alloc];
+    if (notifier == nil) {
+        [self setStatus: @"Unable to set alarm."];
+        return;
+    }
+    [self setAlarmDateAndInterval: sender];
+    [alarm setMessage: [messageField stringValue]];
+    if (![alarm setTimer]) {
+        [self setStatus: [@"Unable to set alarm.  " stringByAppendingString: [alarm invalidMessage]]];
+        return;
+    }
+    [self setStatus: [[alarm date] descriptionWithCalendarFormat: @"Alarm set for %x at %X" timeZone: nil locale: nil]];
+    [[self window] close];
+    [alarm release];
+    alarm = [[PSAlarm alloc] init];
+}
+
+@end
+
+@implementation PSAlarmSetController (NSControlSubclassDelegate)
+
+- (void)control:(NSControl *)control didFailToValidatePartialString:(NSString *)string errorDescription:(NSString *)error;
+{
+    unichar c;
+    int tag;
+    unsigned length = [string length];
+    if (control != timeInterval || length == 0) return;
+    c = [string characterAtIndex: length - 1];
+    switch (c) {
+        case 's': case 'S': tag = 1; break;
+        case 'm': case 'M': tag = 60; break;
+        case 'h': case 'H': tag = 60 * 60; break;
+        default: return;
+    }
+    [timeIntervalUnits selectItemAtIndex:
+        [timeIntervalUnits indexOfItemWithTag: tag]];
+    // NSLog(@"UPDATING FROM validation");
+    [self update: timeInterval]; // make sure we still examine the field editor, otherwise if the existing numeric string is invalid, it'll be cleared
+}
+
+@end
+
+@implementation PSAlarmSetController (NSWindowNotifications)
+
+- (void)windowWillClose:(NSNotification *)notification;
+{
+    // NSLog(@"stopping update timer");
+    [self _stopUpdateTimer];
+}
+
+@end
+
+@implementation PSAlarmSetController (NSControlSubclassNotifications)
+
+// called because we're the delegate
+
+- (void)controlTextDidChange:(NSNotification *)notification;
+{
+    // NSLog(@"UPDATING FROM controlTextDidChange");
+    [self update: [notification object]];
+}
+
+@end
Index: releases/Pester/1.0/Source/PSAlarms.h
===================================================================
--- releases/Pester/1.0/Source/PSAlarms.h	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarms.h	(revision 29)
@@ -0,0 +1,30 @@
+//
+//  PSAlarms.h
+//  Pester
+//
+//  Created by Nicholas Riley on Fri Oct 11 2002.
+//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+extern NSString * const PSAlarmsDidChangeNotification;
+extern NSString * const PSAlarmsNextAlarmDidChangeNotification;
+
+@class PSAlarm;
+
+@interface PSAlarms : NSObject {
+    NSMutableArray *alarms;
+    PSAlarm *nextAlarm;
+}
+
++ (void)setUp;
++ (PSAlarms *)allAlarms;
+
+- (PSAlarm *)nextAlarm;
+- (int)alarmCount;
+- (PSAlarm *)alarmAtIndex:(int)index;
+- (void)removeAlarmAtIndex:(int)index;
+- (void)removeAlarmsAtIndices:(NSArray *)indices;
+
+@end
Index: releases/Pester/1.0/Source/PSAlarms.m
===================================================================
--- releases/Pester/1.0/Source/PSAlarms.m	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarms.m	(revision 29)
@@ -0,0 +1,166 @@
+//
+//  PSAlarms.m
+//  Pester
+//
+//  Created by Nicholas Riley on Fri Oct 11 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "PSAlarms.h"
+#import "PSAlarm.h"
+
+NSString * const PSAlarmsDidChangeNotification = @"PSAlarmsDidChangeNotification";
+NSString * const PSAlarmsNextAlarmDidChangeNotification = @"PSAlarmsNextAlarmDidChangeNotification";
+
+static NSString * const PSPendingAlarms = @"Pester pending alarms"; // NSUserDefaults key
+
+static PSAlarms *PSAlarmsAllAlarms = nil;
+
+@interface PSAlarms (Private)
+
+- (void)_updateNextAlarm;
+
+@end
+
+@implementation PSAlarms
+
++ (void)setUp;
+{
+    if (PSAlarmsAllAlarms == nil) {
+        PSAlarmsAllAlarms = [[self alloc] init];
+        [PSAlarmsAllAlarms _updateNextAlarm]; // only generate notifications after singleton established
+    }
+}
+
++ (PSAlarms *)allAlarms;
+{
+    NSAssert(PSAlarmsAllAlarms != nil, @"Attempt to use +[PSAlarms allAlarms] before setup complete");
+    return PSAlarmsAllAlarms;
+}
+
+- (void)_updateNextAlarm;
+{
+    NSEnumerator *e;
+    PSAlarm *alarm, *oldNextAlarm = nextAlarm;
+    [nextAlarm release];
+    nextAlarm = nil;
+    // sort alarms so earliest is first
+    [alarms sortUsingSelector: @selector(compare:)];
+    // find first un-expired alarm
+    e = [alarms objectEnumerator];
+    while ( (alarm = [e nextObject]) != nil) {
+        if ([alarm isValid]) {
+            nextAlarm = [alarm retain];
+            break;
+        }
+    }
+    if (oldNextAlarm != nextAlarm)
+        [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmsNextAlarmDidChangeNotification object: nextAlarm];
+}
+
+- (id)init;
+{
+    if ( (self = [super init]) != nil) {
+        alarms = [[NSMutableArray alloc] init];
+        NS_DURING
+            NSArray *alarmsData = [[NSUserDefaults standardUserDefaults] arrayForKey: PSPendingAlarms];
+            NSEnumerator *e = [alarmsData objectEnumerator];
+            NSData *alarmData;
+            PSAlarm *alarm;
+            while ( (alarmData = [e nextObject]) != nil) {
+                alarm = [NSUnarchiver unarchiveObjectWithData: alarmData];
+                if (alarm != nil)
+                    [alarms addObject: alarm];
+            }
+        NS_HANDLER
+            // XXX need better error handling here, don't stomp on data
+            NSLog(@"An error occurred while attempting to restore the alarm list: %@", localException);
+        NS_ENDHANDLER
+        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerSet:) name: PSAlarmTimerSetNotification object: nil];
+        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerExpired:) name: PSAlarmTimerExpiredNotification object: nil];
+    }
+    return self;
+}
+
+- (void)dealloc;
+{
+    [alarms release];
+    [[NSNotificationCenter defaultCenter] removeObserver: self];
+    [super dealloc];
+}
+
+- (void)_changed;
+{
+    NSMutableArray *alarmsData = [[NSMutableArray alloc] init];
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+    NSEnumerator *e;
+    PSAlarm *alarm;
+    [self _updateNextAlarm];
+    // NSLog(@"PSAlarms _changed:\n%@", alarms);
+    // archive
+    e = [alarms objectEnumerator];
+    while ( (alarm = [e nextObject]) != nil) {
+        [alarmsData addObject: [NSArchiver archivedDataWithRootObject: alarm]];
+    }
+    [defaults setObject: alarmsData forKey: PSPendingAlarms];
+    [defaults synchronize];
+    [alarmsData release];
+    [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmsDidChangeNotification object: self];
+}
+
+- (void)_alarmTimerExpired:(NSNotification *)notification;
+{
+    [alarms removeObject: [notification object]];
+    [self _changed];
+}
+
+- (void)_alarmTimerSet:(NSNotification *)notification;
+{
+    [alarms addObject: [notification object]];
+    [self _changed];
+}
+
+- (PSAlarm *)nextAlarm;
+{
+    return nextAlarm;
+}
+
+- (int)alarmCount;
+{
+    return [alarms count];
+}
+
+- (PSAlarm *)alarmAtIndex:(int)index;
+{
+    return [alarms objectAtIndex: index];
+}
+
+- (void)removeAlarmAtIndex:(int)index;
+{
+    [(PSAlarm *)[alarms objectAtIndex: index] cancel];
+    [alarms removeObjectAtIndex: index];
+}
+
+- (void)removeAlarmsAtIndices:(NSArray *)indices;
+{
+    NSEnumerator *e = [indices objectEnumerator];
+    NSNumber *n;
+    int indexCount = [indices count], i = 0, alarmIndex;
+    int *indexArray = (int *)malloc(indexCount * sizeof(int));
+    NS_DURING
+        while ( (n = [e nextObject]) != nil) {
+            alarmIndex = [n intValue];
+            [(PSAlarm *)[alarms objectAtIndex: alarmIndex] cancel];
+            indexArray[i] = alarmIndex;
+            i++;
+        }
+        [alarms removeObjectsFromIndices: indexArray numIndices: indexCount];
+        [self _changed];
+    NS_HANDLER
+        free(indexArray);
+        [self _changed];
+        [localException raise];
+    NS_ENDHANDLER
+}
+
+@end
Index: releases/Pester/1.0/Source/PSAlarmsController.h
===================================================================
--- releases/Pester/1.0/Source/PSAlarmsController.h	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarmsController.h	(revision 29)
@@ -0,0 +1,20 @@
+//
+//  PSAlarmsController.h
+//  Pester
+//
+//  Created by Nicholas Riley on Fri Oct 11 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+#import "PSAlarms.h"
+
+@interface PSAlarmsController : NSWindowController {
+    IBOutlet NSTableView *tableView;
+    IBOutlet NSButton *removeButton;
+    PSAlarms *alarms;
+}
+
+- (IBAction)remove:(id)sender;
+
+@end
Index: releases/Pester/1.0/Source/PSAlarmsController.m
===================================================================
--- releases/Pester/1.0/Source/PSAlarmsController.m	(revision 29)
+++ releases/Pester/1.0/Source/PSAlarmsController.m	(revision 29)
@@ -0,0 +1,124 @@
+//
+//  PSAlarmsController.m
+//  Pester
+//
+//  Created by Nicholas Riley on Fri Oct 11 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "PSAlarmsController.h"
+#import "PSAlarm.h"
+#import "NSTableView-NJRExtensions.h"
+
+
+@implementation PSAlarmsController
+
+- (id)init;
+{
+    if ( (self = [super initWithWindowNibName: @"Alarms"]) != nil) {
+        alarms = [PSAlarms allAlarms];
+        // XXX workaround for bug in 10.2.1, 10.1.5: autosave name set in IB doesn't show up
+        [self setWindowFrameAutosaveName: @"Pester alarm list"];
+        // Apple documents the NSUserDefaults key, so we can rely on it hopefully.
+        if (nil == [[NSUserDefaults standardUserDefaults] objectForKey:
+            [@"NSWindow Frame " stringByAppendingString: [[self window] frameAutosaveName]]])
+        {
+            [[self window] center];
+        }
+        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(alarmsChanged) name: PSAlarmsDidChangeNotification object: alarms];
+        [tableView setAutosaveName: @"Alarm list"];
+        [tableView setAutosaveTableColumns: YES];
+        [tableView noteNumberOfRowsChanged];
+        [[self window] makeFirstResponder: tableView];
+    }
+    return self;
+}
+
+- (void)alarmsChanged; // XXX fix autoselection to be more reasonable, see whatever I did in that _Learning Cocoa_ project I think
+{
+    [tableView reloadData];
+    [tableView deselectAll: self];
+}
+
+- (IBAction)remove:(id)sender;
+{
+    [alarms removeAlarmsAtIndices: [[tableView selectedRowEnumerator] allObjects]];
+}
+
+@end
+
+@implementation PSAlarmsController (NSTableDataSource)
+
+- (int)numberOfRowsInTableView:(NSTableView *)tableView;
+{
+    return [alarms alarmCount];
+}
+
+- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row;
+{
+    PSAlarm *alarm = [alarms alarmAtIndex: row];
+
+    if ([[tableColumn identifier] isEqualToString: @"message"]) return [alarm message];
+    else {
+        NSCalendarDate *date = [alarm date];
+        if ([[tableColumn identifier] isEqualToString: @"date"]) return [alarm shortDateString];
+        if ([[tableColumn identifier] isEqualToString: @"time"]) {
+            if (date == nil) return @"ÇexpiredÈ";
+            return [alarm timeString];
+        }
+    }
+    return nil;
+}
+@end
+
+@implementation PSAlarmsController (NSTableViewNotifications)
+
+- (void)tableViewSelectionDidChange:(NSNotification *)aNotification;
+{
+    [removeButton setEnabled: ([tableView numberOfSelectedRows] != 0)];
+}
+
+@end
+
+@implementation PSAlarmsController (NSWindowDelegate)
+
+// XXX workaround for bug in 10.1.5, 10.2.1 (and earlier?): no autosave on window move
+- (void)windowDidMove:(NSNotification *)aNotification
+{
+    NSString *autosaveName = [[self window] frameAutosaveName];
+    // on initial display, we get a notification inside -[NSWindow setFrameAutosaveName]!
+    if (autosaveName != nil) {
+        [[self window] saveFrameUsingName: autosaveName];
+    }
+}
+
+- (NSRect)windowWillUseStandardFrame:(NSWindow *)sender defaultFrame:(NSRect)defaultFrame;
+{
+    NSWindow *window = [tableView window];
+    NSRect frame = [window frame];
+    NSScrollView *scrollView = [tableView enclosingScrollView];
+    float displayedHeight = [[scrollView contentView] bounds].size.height;
+    float heightChange = [[scrollView documentView] bounds].size.height - displayedHeight;
+    float heightExcess;
+
+    if (heightChange >= 0 && heightChange <= 1) {
+        // either the window is already optimal size, or it's too big
+        float rowHeight = [tableView cellHeight];
+        heightChange = (rowHeight * [tableView numberOfRows]) - displayedHeight;
+    }
+
+    frame.size.height += heightChange;
+
+    if ( (heightExcess = [window minSize].height - frame.size.height) > 1 ||
+         (heightExcess = [window maxSize].height - frame.size.height) < 1) {
+        heightChange += heightExcess;
+        frame.size.height += heightExcess;
+    }
+
+    frame.origin.y -= heightChange;
+
+    return frame;
+}
+
+@end
+
Index: releases/Pester/1.0/Source/PSApplication.h
===================================================================
--- releases/Pester/1.0/Source/PSApplication.h	(revision 29)
+++ releases/Pester/1.0/Source/PSApplication.h	(revision 29)
@@ -0,0 +1,25 @@
+//
+//  PSApplication.h
+//  Pester
+//
+//  Created by Nicholas Riley on Fri Oct 11 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+@class PSAlarmsController;
+@class PSAlarmSetController;
+
+@interface PSApplication : NSApplication {
+    PSAlarmsController *alarmsController;
+    IBOutlet PSAlarmSetController *alarmSetController;
+    NSTimer *dockUpdateTimer;
+    NSTimeInterval dockUpdateInterval;
+    NSImage *appIconImage;
+}
+
+- (IBAction)orderFrontSetAlarmPanel:(id)sender;
+- (IBAction)orderFrontAlarmsPanel:(id)sender;
+
+@end
Index: releases/Pester/1.0/Source/PSApplication.m
===================================================================
--- releases/Pester/1.0/Source/PSApplication.m	(revision 29)
+++ releases/Pester/1.0/Source/PSApplication.m	(revision 29)
@@ -0,0 +1,184 @@
+//
+//  PSApplication.m
+//  Pester
+//
+//  Created by Nicholas Riley on Fri Oct 11 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import "PSApplication.h"
+#import "PSAlarmSetController.h"
+#import "PSAlarmNotifierController.h"
+#import "PSAlarmsController.h"
+#import "PSAlarm.h"
+#import "PSAlarms.h"
+
+@implementation PSApplication
+
+- (void)finishLaunching;
+{
+    appIconImage = [[NSImage imageNamed: @"NSApplicationIcon"] retain];
+    [[NSNotificationCenter defaultCenter] addObserver: [PSAlarmNotifierController class] selector: @selector(controllerWithTimerExpiredNotification:) name: PSAlarmTimerExpiredNotification object: nil];
+    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(nextAlarmDidChange:) name: PSAlarmsNextAlarmDidChangeNotification object: nil];
+    [PSAlarms setUp];
+    [self setDelegate: self];
+    [super finishLaunching];
+}
+
+- (IBAction)showHelp:(id)sender;
+{
+    [[NSWorkspace sharedWorkspace] openFile: [[NSBundle mainBundle] pathForResource: @"Read Me" ofType: @"rtfd"]];
+}
+
+- (IBAction)orderFrontSetAlarmPanel:(id)sender;
+{
+    [NSApp activateIgnoringOtherApps: YES];
+    [alarmSetController showWindow: self];
+}
+
+- (IBAction)orderFrontAlarmsPanel:(id)sender;
+{
+    [NSApp activateIgnoringOtherApps: YES];
+    if (alarmsController == nil) {
+        alarmsController = [[PSAlarmsController alloc] init];
+    }
+    [alarmsController showWindow: self];
+}
+
+- (void)_resetUpdateTimer;
+{
+    if (dockUpdateTimer != nil) {
+        [dockUpdateTimer invalidate];
+        [dockUpdateTimer release];
+        dockUpdateInterval = 0;
+        dockUpdateTimer = nil;
+    }
+}
+
+- (void)_setUpdateTimerForInterval:(NSTimeInterval)interval alarm:(PSAlarm *)alarm repeats:(BOOL)repeats;
+{
+    dockUpdateTimer = [NSTimer scheduledTimerWithTimeInterval: interval target: self selector: @selector(_updateDockTile:) userInfo: alarm repeats: repeats];
+    [dockUpdateTimer retain];
+    dockUpdateInterval = interval; // because [timer timeInterval] always returns 0 once set
+}
+
+- (void)_updateDockTile:(NSTimer *)timer;
+{
+    PSAlarm *alarm = [timer userInfo];
+    NSTimeInterval alarmInterval;
+    NSString *tileString;
+    if (timer == nil) alarm = [[PSAlarms allAlarms] nextAlarm];
+    if (alarm == nil) return;
+    tileString = [alarm timeRemainingString];
+    {
+        NSMutableDictionary *atts = [NSMutableDictionary dictionary];
+        NSSize imageSize = [appIconImage size];
+        NSImage *tile = [[NSImage alloc] initWithSize: imageSize];
+        NSSize textSize;
+        NSPoint textOrigin;
+        NSRect frameRect;
+        float fontSize = 37;
+        
+        do {
+            fontSize -= 1;
+            [atts setObject: [NSFont boldSystemFontOfSize: fontSize] forKey: NSFontAttributeName];
+            textSize = [tileString sizeWithAttributes: atts];
+        } while (textSize.width > imageSize.width - 8);
+
+        textOrigin = NSMakePoint(imageSize.width / 2 - textSize.width / 2,
+                                 imageSize.height / 2 - textSize.height / 2);
+        frameRect = NSInsetRect(NSMakeRect(textOrigin.x, textOrigin.y, textSize.width, textSize.height),
+                                -4, -2);
+        
+        [tile lockFocus];
+        // draw the grayed-out app icon
+        [appIconImage dissolveToPoint: NSZeroPoint fraction: 0.5];
+        // draw the frame
+        [[NSColor colorWithCalibratedWhite: 0.1 alpha: 0.5] set];
+        NSRectFill(frameRect);
+        // draw a gray two-pixel text shadow
+        [atts setObject: [NSColor grayColor] forKey: NSForegroundColorAttributeName];
+        textOrigin.x++; textOrigin.y--;
+        [tileString drawAtPoint: textOrigin withAttributes: atts];
+        textOrigin.x++; textOrigin.y--;
+        [tileString drawAtPoint: textOrigin withAttributes: atts];
+        // draw white text
+        textOrigin.x -= 2; textOrigin.y += 2;
+        [atts setObject: [NSColor whiteColor] forKey: NSForegroundColorAttributeName];
+        [tileString drawAtPoint: textOrigin withAttributes: atts];
+        
+        [tile unlockFocus];
+        [NSApp setApplicationIconImage: tile];
+        [tile release];
+    }
+    alarmInterval = [alarm interval];
+    // NSLog(@"_updateDockTile > time remaining %@ (%.0lf), last time interval %.0lf", tileString, alarmInterval, dockUpdateInterval);
+    if (alarmInterval > 61) {
+        NSTimeInterval nextUpdate = ((unsigned long long)alarmInterval) % 60;
+        if (nextUpdate <= 1) nextUpdate = 60;
+        [self _resetUpdateTimer];
+        [self _setUpdateTimerForInterval: nextUpdate alarm: alarm repeats: NO];
+        // NSLog(@"_updateDockTile > set timer for %.0lf seconds", nextUpdate);
+    } else if (timer == nil || dockUpdateInterval > 1) {
+        [self _resetUpdateTimer];
+        [self _setUpdateTimerForInterval: 1 alarm: alarm repeats: YES];
+        // NSLog(@"_updateDockTile > set timer for 1 second");
+    } else if (alarmInterval < 2) {
+        [self _resetUpdateTimer];
+    }
+}
+
+- (void)nextAlarmDidChange:(NSNotification *)notification;
+{
+    PSAlarm *nextAlarm = [notification object];
+    // NSLog(@"nextAlarmDidChange: %@", nextAlarm);
+    [self _resetUpdateTimer];
+    if (nextAlarm == nil) {
+        [NSApp setApplicationIconImage: appIconImage];
+    } else {
+        [self _updateDockTile: nil];
+    }
+}
+
+@end
+
+@implementation PSApplication (NSApplicationDelegate)
+
+- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag;
+{
+    if (!flag) [alarmSetController showWindow: self];
+    return YES;
+}
+
+- (NSMenu *)applicationDockMenu:(NSApplication *)sender;
+{
+    NSMenu *dockMenu = [[NSMenu alloc] initWithTitle: @""];
+    PSAlarms *alarms = [PSAlarms allAlarms];
+    PSAlarm *nextAlarm = [alarms nextAlarm];
+    NSMenuItem *item;
+    if (nextAlarm == nil) {
+        [dockMenu addItemWithTitle: @"No Pending Alarms" action: nil keyEquivalent: @""];
+    } else {
+        [dockMenu addItemWithTitle: @"Next Alarm" action: nil keyEquivalent: @""];
+        [dockMenu addItemWithTitle: [NSString stringWithFormat: @"   %@", [nextAlarm message]] action: nil keyEquivalent: @""];
+        [dockMenu addItemWithTitle: [NSString stringWithFormat: @"   %@ %@", [nextAlarm shortDateString], [nextAlarm timeString]] action: nil keyEquivalent: @""];
+        [dockMenu addItemWithTitle: [NSString stringWithFormat: @"   Remaining: %@", [nextAlarm timeRemainingString]] action: nil keyEquivalent: @""];
+    }
+    [dockMenu addItem: [NSMenuItem separatorItem]];
+    item = [dockMenu addItemWithTitle: @"Set AlarmÉ" action: @selector(orderFrontSetAlarmPanel:) keyEquivalent: @""];
+    [item setTarget: self];
+    item = [dockMenu addItemWithTitle: [NSString stringWithFormat: @"All Alarms (%d)É", [alarms alarmCount]] action: @selector(orderFrontAlarmsPanel:) keyEquivalent: @""];
+    [item setTarget: self];
+    return [dockMenu autorelease];
+}
+
+@end
+
+@implementation PSApplication (NSApplicationNotifications)
+
+- (void)applicationWillTerminate:(NSNotification *)notification;
+{
+    [NSApp setApplicationIconImage: appIconImage];
+}
+
+@end
Index: releases/Pester/1.0/Source/Pester.pbproj/nicholas.pbxuser
===================================================================
--- releases/Pester/1.0/Source/Pester.pbproj/nicholas.pbxuser	(revision 29)
+++ releases/Pester/1.0/Source/Pester.pbproj/nicholas.pbxuser	(revision 29)
@@ -0,0 +1,2738 @@
+// !$*UTF8*$!
+{
+	29B97313FDCFA39411CA2CEA = {
+		activeBuildStyle = 4A9504CDFFE6A4B311CA0CBA;
+		activeExecutable = F59B967103538BE201154278;
+		activeTarget = 29B97326FDCFA39411CA2CEA;
+		addToTargets = (
+		);
+		breakpoints = (
+			F596730D0355CFA301407038,
+			F500E5370359719B01AEEDB1,
+		);
+		executables = (
+			F59B967103538BE201154278,
+		);
+		perUserDictionary = {
+			PBXPerProjectTemplateStateSaveDate = 56272636;
+			"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,
+											48.80299,
+											Value,
+											71.07401,
+											Summary,
+											93.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}}";
+						Split0 = {
+							Frame = "{{0, 0}, {200, 270}}";
+							TargetTreeTableConfiguration = (
+								ActiveTarget,
+								16,
+								TargetName,
+								168,
+							);
+						};
+						Split1 = {
+							BuildStyleTreeTableConfiguration = (
+								IsActive,
+								16,
+								Name,
+								169,
+							);
+							Frame = "{{0, 279}, {200, 278}}";
+						};
+						SplitCount = 2;
+					};
+					Tab4 = {
+						ExecutableTreeTableConfiguration = (
+							ActiveExecutable,
+							16,
+							ExecutableName,
+							217,
+						);
+						Frame = "{{0, 0}, {250, 100}}";
+					};
+					Tab5 = {
+						BreakpointsTreeTableConfiguration = (
+							breakpointColumn,
+							197,
+							enabledColumn,
+							31,
+						);
+						Frame = "{{0, 0}, {250, 100}}";
+					};
+					TabCount = 6;
+					TabsVisible = NO;
+				};
+				StatusViewVisible = NO;
+				Template = F5CA7ECB015C094F0DCA290F;
+				ToolbarVisible = NO;
+				WindowLocation = "{48, 189}";
+			};
+			PBXWorkspaceContents = (
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavContent0 = {
+									bookmark = F589C9DE035AAAAB0155F4B2;
+									history = (
+										F5C8B260035A217B01935D7C,
+										F5C8B261035A217B01935D7C,
+										F5C8B263035A217B01935D7C,
+										F519A888035A4D4201F8C15E,
+										F519A889035A4D4201F8C15E,
+										F519A88B035A4D4201F8C15E,
+										F519A88C035A4D4201F8C15E,
+										F519A88D035A4D4201F8C15E,
+										F519A88E035A4D4201F8C15E,
+										F519A88F035A4D4201F8C15E,
+										F519A890035A4D4201F8C15E,
+										F519A891035A4D4201F8C15E,
+										F519A893035A4D4201F8C15E,
+										F519A895035A4D4201F8C15E,
+										F519A896035A4D4201F8C15E,
+										F519A898035A4D4201F8C15E,
+										F519A899035A4D4201F8C15E,
+										F519A89A035A4D4201F8C15E,
+										F519A89B035A4D4201F8C15E,
+										F519A89C035A4D4201F8C15E,
+										F519A89D035A4D4201F8C15E,
+										F519A8FA035A4F7C01F8C15E,
+										F59163CE035A8E270118C656,
+										F59163CF035A8E270118C656,
+										F59163D1035A8E270118C656,
+										F59163D2035A8E270118C656,
+										F59163D3035A8E270118C656,
+										F589C9C8035AA4FF0155F4B2,
+										F589C9C9035AA4FF0155F4B2,
+										F589C9CA035AA4FF0155F4B2,
+										F589C9CB035AA4FF0155F4B2,
+										F589C9D8035AAAAB0155F4B2,
+										F589C9D9035AAAAB0155F4B2,
+										F589C9DA035AAAAB0155F4B2,
+									);
+									prevStack = (
+										F5C8B267035A217B01935D7C,
+										F5C8B268035A217B01935D7C,
+										F5C8B26A035A217B01935D7C,
+										F5C8B26B035A217B01935D7C,
+										F5C8B26C035A217B01935D7C,
+										F5C8B26D035A217B01935D7C,
+										F5C8B26E035A217B01935D7C,
+										F5C8B26F035A217B01935D7C,
+										F5C8B270035A217B01935D7C,
+										F5C8B271035A217B01935D7C,
+										F5C8B272035A217B01935D7C,
+										F5C8B273035A217B01935D7C,
+										F5C8B274035A217B01935D7C,
+										F5C8B275035A217B01935D7C,
+										F5C8B276035A217B01935D7C,
+										F5C8B277035A217B01935D7C,
+										F5C8B278035A217B01935D7C,
+										F5C8B279035A217B01935D7C,
+										F5C8B27A035A217B01935D7C,
+										F5C8B27B035A217B01935D7C,
+										F5C8B27C035A217B01935D7C,
+										F5C8B27D035A217B01935D7C,
+										F5C8B27E035A217B01935D7C,
+										F5C8B27F035A217B01935D7C,
+										F5C8B280035A217B01935D7C,
+										F5C8B281035A217B01935D7C,
+										F519A89F035A4D4201F8C15E,
+										F519A8A0035A4D4201F8C15E,
+										F519A8A1035A4D4201F8C15E,
+										F519A8A2035A4D4201F8C15E,
+										F519A8A3035A4D4201F8C15E,
+										F519A8A4035A4D4201F8C15E,
+										F519A8A5035A4D4201F8C15E,
+										F519A8A6035A4D4201F8C15E,
+										F519A8A7035A4D4201F8C15E,
+										F519A8A8035A4D4201F8C15E,
+										F519A8A9035A4D4201F8C15E,
+										F519A8AA035A4D4201F8C15E,
+										F519A8AB035A4D4201F8C15E,
+										F519A8AC035A4D4201F8C15E,
+										F519A8AD035A4D4201F8C15E,
+										F519A8AE035A4D4201F8C15E,
+										F519A8AF035A4D4201F8C15E,
+										F519A8B0035A4D4201F8C15E,
+										F519A8B1035A4D4201F8C15E,
+										F519A8B2035A4D4201F8C15E,
+										F519A8B3035A4D4201F8C15E,
+										F519A8B4035A4D4201F8C15E,
+										F519A8B5035A4D4201F8C15E,
+										F519A8B6035A4D4201F8C15E,
+										F519A8B7035A4D4201F8C15E,
+										F519A8B8035A4D4201F8C15E,
+										F519A8B9035A4D4201F8C15E,
+										F519A8BA035A4D4201F8C15E,
+										F519A8BB035A4D4201F8C15E,
+										F519A8BC035A4D4201F8C15E,
+										F519A8BD035A4D4201F8C15E,
+										F519A8BE035A4D4201F8C15E,
+										F519A8BF035A4D4201F8C15E,
+										F519A8C0035A4D4201F8C15E,
+										F519A8C1035A4D4201F8C15E,
+										F519A8C2035A4D4201F8C15E,
+										F519A8C3035A4D4201F8C15E,
+										F519A8C4035A4D4201F8C15E,
+										F519A8C5035A4D4201F8C15E,
+										F519A8C6035A4D4201F8C15E,
+										F519A8C7035A4D4201F8C15E,
+										F519A8C8035A4D4201F8C15E,
+										F519A8C9035A4D4201F8C15E,
+										F519A8CA035A4D4201F8C15E,
+										F519A8CB035A4D4201F8C15E,
+										F519A8CC035A4D4201F8C15E,
+										F519A8CD035A4D4201F8C15E,
+										F519A8CE035A4D4201F8C15E,
+										F519A8CF035A4D4201F8C15E,
+										F519A8D0035A4D4201F8C15E,
+										F519A8D1035A4D4201F8C15E,
+										F519A8D2035A4D4201F8C15E,
+										F519A8D3035A4D4201F8C15E,
+										F519A8D4035A4D4201F8C15E,
+										F519A8D5035A4D4201F8C15E,
+										F519A8D6035A4D4201F8C15E,
+										F519A8D7035A4D4201F8C15E,
+										F519A8D8035A4D4201F8C15E,
+										F519A8D9035A4D4201F8C15E,
+										F519A8DA035A4D4201F8C15E,
+										F519A8DB035A4D4201F8C15E,
+										F519A8DC035A4D4201F8C15E,
+										F519A8DD035A4D4201F8C15E,
+										F519A8FF035A4F7C01F8C15E,
+										F519A901035A4F7C01F8C15E,
+										F519A903035A4F7C01F8C15E,
+										F519A904035A4F7C01F8C15E,
+										F519A914035A890101F8C15E,
+										F59163D4035A8E270118C656,
+										F59163D5035A8E270118C656,
+										F59163D6035A8E270118C656,
+										F59163D7035A8E270118C656,
+										F59163D8035A8E270118C656,
+										F59163D9035A8E270118C656,
+										F59163DA035A8E270118C656,
+										F59163DB035A8E270118C656,
+										F59163DC035A8E270118C656,
+										F589C9CD035AA4FF0155F4B2,
+										F589C9DB035AAAAB0155F4B2,
+										F589C9DC035AAAAB0155F4B2,
+										F589C9DD035AAAAB0155F4B2,
+									);
+								};
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {675, 558}}";
+									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";
+						};
+						Tab3 = {
+							SplitCount = 2;
+						};
+						TabCount = 6;
+					};
+				},
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {654, 150}}";
+									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";
+						};
+						Tab3 = {
+							SplitCount = 2;
+						};
+						TabCount = 6;
+					};
+				},
+				{
+					LeftSlideOut = {
+						Split0 = {
+							Split0 = {
+								NavCount = 1;
+								NavGeometry0 = {
+									Frame = "{{0, 0}, {981, 150}}";
+									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";
+						};
+						Tab3 = {
+							SplitCount = 2;
+						};
+						TabCount = 6;
+					};
+				},
+			);
+			PBXWorkspaceGeometries = (
+				{
+					ContentSize = "{959, 581}";
+					LeftSlideOut = {
+						ActiveTab = 0;
+						Collapsed = NO;
+						Frame = "{{0, 23}, {959, 558}}";
+						Split0 = {
+							Collapsed = NO;
+							Frame = "{{284, 0}, {675, 558}}";
+							Split0 = {
+								Frame = "{{0, 0}, {675, 558}}";
+							};
+							SplitCount = 1;
+							Tab0 = {
+								Debugger = {
+									Collapsed = NO;
+									Frame = "{{0, 0}, {681, 289}}";
+									Split0 = {
+										Frame = "{{0, 24}, {681, 265}}";
+										Split0 = {
+											Frame = "{{0, 0}, {333, 265}}";
+										};
+										Split1 = {
+											DebugVariablesTableConfiguration = (
+												Name,
+												82.80298,
+												Value,
+												104.074,
+												Summary,
+												126.123,
+											);
+											Frame = "{{342, 0}, {339, 265}}";
+										};
+										SplitCount = 2;
+									};
+									SplitCount = 1;
+									Tab0 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									Tab1 = {
+										Frame = "{{0, 0}, {100, 50}}";
+									};
+									TabCount = 2;
+									TabsVisible = YES;
+								};
+								Frame = "{{0, 0}, {681, 289}}";
+								LauncherConfigVersion = 7;
+							};
+							Tab1 = {
+								Frame = "{{0, 0}, {681, 120}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {681, 120}}";
+								};
+							};
+							Tab2 = {
+								BuildMessageFrame = "{{0, 0}, {683, 127}}";
+								BuildTranscriptFrame = "{{0, 136}, {683, 100}}";
+								Frame = "{{0, 0}, {681, 234}}";
+							};
+							Tab3 = {
+								Frame = "{{0, 0}, {681, 238}}";
+							};
+							TabCount = 4;
+							TabsVisible = NO;
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {260, 558}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								227,
+							);
+						};
+						Tab1 = {
+							ClassesFrame = "{{0, 0}, {250, 333}}";
+							ClassesTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXClassColumnIdentifier,
+								207,
+							);
+							Frame = "{{0, 0}, {248, 554}}";
+							MembersFrame = "{{0, 342}, {250, 212}}";
+							MembersTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXMethodColumnIdentifier,
+								206,
+							);
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {217, 548}}";
+						};
+						Tab3 = {
+							Frame = "{{0, 0}, {239, 554}}";
+							Split0 = {
+								Frame = "{{0, 0}, {239, 268}}";
+								TargetTreeTableConfiguration = (
+									ActiveTarget,
+									16,
+									TargetName,
+									207,
+								);
+							};
+							Split1 = {
+								BuildStyleTreeTableConfiguration = (
+									IsActive,
+									16,
+									Name,
+									208,
+								);
+								Frame = "{{0, 277}, {239, 277}}";
+							};
+							SplitCount = 2;
+						};
+						Tab4 = {
+							ExecutableTreeTableConfiguration = (
+								ActiveExecutable,
+								16,
+								ExecutableName,
+								217,
+							);
+							Frame = "{{0, 0}, {250, 554}}";
+						};
+						Tab5 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 554}}";
+						};
+						TabCount = 6;
+						TabsVisible = YES;
+					};
+					StatusViewVisible = YES;
+					Template = 64ABBB4501FA494900185B06;
+					ToolbarVisible = YES;
+					WindowLocation = "{21, 184}";
+				},
+				{
+					ContentSize = "{654, 265}";
+					LeftSlideOut = {
+						Collapsed = NO;
+						Frame = "{{0, 23}, {654, 242}}";
+						Split0 = {
+							ActiveTab = 2;
+							Collapsed = YES;
+							Frame = "{{0, 0}, {654, 242}}";
+							Split0 = {
+								Frame = "{{1e+06, 1e+06}, {654, 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}, {656, 124}}";
+								BuildTranscriptFrame = "{{0, 133}, {656, 105}}";
+								Frame = "{{0, 0}, {654, 236}}";
+							};
+							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}, {200, 100}}";
+							Split0 = {
+								Frame = "{{0, 0}, {200, 45}}";
+								TargetTreeTableConfiguration = (
+									ActiveTarget,
+									16,
+									TargetName,
+									168,
+								);
+							};
+							Split1 = {
+								BuildStyleTreeTableConfiguration = (
+									IsActive,
+									16,
+									Name,
+									169,
+								);
+								Frame = "{{0, 54}, {200, 46}}";
+							};
+							SplitCount = 2;
+						};
+						Tab4 = {
+							ExecutableTreeTableConfiguration = (
+								ActiveExecutable,
+								16,
+								ExecutableName,
+								217,
+							);
+							Frame = "{{0, 0}, {250, 100}}";
+						};
+						Tab5 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 100}}";
+						};
+						TabCount = 6;
+						TabsVisible = NO;
+					};
+					StatusViewVisible = YES;
+					Template = F5314676015831810DCA290F;
+					ToolbarVisible = YES;
+					WindowLocation = "{657, 181}";
+				},
+				{
+					ContentSize = "{981, 229}";
+					LeftSlideOut = {
+						Collapsed = NO;
+						Frame = "{{0, 23}, {981, 206}}";
+						Split0 = {
+							ActiveTab = 1;
+							Collapsed = YES;
+							Frame = "{{0, 0}, {981, 206}}";
+							Split0 = {
+								Frame = "{{1e+06, 1e+06}, {981, 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,
+												102.803,
+												Value,
+												125.074,
+												Summary,
+												147.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}, {981, 200}}";
+								LauncherConfigVersion = 3;
+								Runner = {
+									Frame = "{{0, 0}, {981, 200}}";
+								};
+							};
+							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;
+						};
+						SplitCount = 1;
+						Tab0 = {
+							Frame = "{{0, 0}, {300, 533}}";
+							GroupTreeTableConfiguration = (
+								TargetStatusColumn,
+								18,
+								MainColumn,
+								267,
+							);
+						};
+						Tab1 = {
+							ClassesFrame = "{{0, 0}, {280, 398}}";
+							ClassesTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXClassColumnIdentifier,
+								237,
+							);
+							Frame = "{{0, 0}, {278, 659}}";
+							MembersFrame = "{{0, 407}, {280, 252}}";
+							MembersTreeTableConfiguration = (
+								PBXBookColumnIdentifier,
+								20,
+								PBXMethodColumnIdentifier,
+								236,
+							);
+						};
+						Tab2 = {
+							Frame = "{{0, 0}, {200, 100}}";
+						};
+						Tab3 = {
+							Frame = "{{0, 0}, {200, 386}}";
+							Split0 = {
+								Frame = "{{0, 0}, {200, 186}}";
+								TargetTreeTableConfiguration = (
+									ActiveTarget,
+									16,
+									TargetName,
+									168,
+								);
+							};
+							Split1 = {
+								BuildStyleTreeTableConfiguration = (
+									IsActive,
+									16,
+									Name,
+									169,
+								);
+								Frame = "{{0, 195}, {200, 191}}";
+							};
+							SplitCount = 2;
+						};
+						Tab4 = {
+							ExecutableTreeTableConfiguration = (
+								ActiveExecutable,
+								16,
+								ExecutableName,
+								217,
+							);
+							Frame = "{{0, 0}, {250, 386}}";
+						};
+						Tab5 = {
+							BreakpointsTreeTableConfiguration = (
+								breakpointColumn,
+								197,
+								enabledColumn,
+								31,
+							);
+							Frame = "{{0, 0}, {250, 100}}";
+						};
+						TabCount = 6;
+						TabsVisible = NO;
+					};
+					StatusViewVisible = YES;
+					Template = F5534CB2020F3F8A0DCA290F;
+					ToolbarVisible = YES;
+					WindowLocation = "{34, 99}";
+				},
+			);
+			PBXWorkspaceStateSaveDate = 56272636;
+		};
+		perUserProjectItems = {
+			F519A888035A4D4201F8C15E = F519A888035A4D4201F8C15E;
+			F519A889035A4D4201F8C15E = F519A889035A4D4201F8C15E;
+			F519A88B035A4D4201F8C15E = F519A88B035A4D4201F8C15E;
+			F519A88C035A4D4201F8C15E = F519A88C035A4D4201F8C15E;
+			F519A88D035A4D4201F8C15E = F519A88D035A4D4201F8C15E;
+			F519A88E035A4D4201F8C15E = F519A88E035A4D4201F8C15E;
+			F519A88F035A4D4201F8C15E = F519A88F035A4D4201F8C15E;
+			F519A890035A4D4201F8C15E = F519A890035A4D4201F8C15E;
+			F519A891035A4D4201F8C15E = F519A891035A4D4201F8C15E;
+			F519A893035A4D4201F8C15E = F519A893035A4D4201F8C15E;
+			F519A895035A4D4201F8C15E = F519A895035A4D4201F8C15E;
+			F519A896035A4D4201F8C15E = F519A896035A4D4201F8C15E;
+			F519A898035A4D4201F8C15E = F519A898035A4D4201F8C15E;
+			F519A899035A4D4201F8C15E = F519A899035A4D4201F8C15E;
+			F519A89A035A4D4201F8C15E = F519A89A035A4D4201F8C15E;
+			F519A89B035A4D4201F8C15E = F519A89B035A4D4201F8C15E;
+			F519A89C035A4D4201F8C15E = F519A89C035A4D4201F8C15E;
+			F519A89D035A4D4201F8C15E = F519A89D035A4D4201F8C15E;
+			F519A89F035A4D4201F8C15E = F519A89F035A4D4201F8C15E;
+			F519A8A0035A4D4201F8C15E = F519A8A0035A4D4201F8C15E;
+			F519A8A1035A4D4201F8C15E = F519A8A1035A4D4201F8C15E;
+			F519A8A2035A4D4201F8C15E = F519A8A2035A4D4201F8C15E;
+			F519A8A3035A4D4201F8C15E = F519A8A3035A4D4201F8C15E;
+			F519A8A4035A4D4201F8C15E = F519A8A4035A4D4201F8C15E;
+			F519A8A5035A4D4201F8C15E = F519A8A5035A4D4201F8C15E;
+			F519A8A6035A4D4201F8C15E = F519A8A6035A4D4201F8C15E;
+			F519A8A7035A4D4201F8C15E = F519A8A7035A4D4201F8C15E;
+			F519A8A8035A4D4201F8C15E = F519A8A8035A4D4201F8C15E;
+			F519A8A9035A4D4201F8C15E = F519A8A9035A4D4201F8C15E;
+			F519A8AA035A4D4201F8C15E = F519A8AA035A4D4201F8C15E;
+			F519A8AB035A4D4201F8C15E = F519A8AB035A4D4201F8C15E;
+			F519A8AC035A4D4201F8C15E = F519A8AC035A4D4201F8C15E;
+			F519A8AD035A4D4201F8C15E = F519A8AD035A4D4201F8C15E;
+			F519A8AE035A4D4201F8C15E = F519A8AE035A4D4201F8C15E;
+			F519A8AF035A4D4201F8C15E = F519A8AF035A4D4201F8C15E;
+			F519A8B0035A4D4201F8C15E = F519A8B0035A4D4201F8C15E;
+			F519A8B1035A4D4201F8C15E = F519A8B1035A4D4201F8C15E;
+			F519A8B2035A4D4201F8C15E = F519A8B2035A4D4201F8C15E;
+			F519A8B3035A4D4201F8C15E = F519A8B3035A4D4201F8C15E;
+			F519A8B4035A4D4201F8C15E = F519A8B4035A4D4201F8C15E;
+			F519A8B5035A4D4201F8C15E = F519A8B5035A4D4201F8C15E;
+			F519A8B6035A4D4201F8C15E = F519A8B6035A4D4201F8C15E;
+			F519A8B7035A4D4201F8C15E = F519A8B7035A4D4201F8C15E;
+			F519A8B8035A4D4201F8C15E = F519A8B8035A4D4201F8C15E;
+			F519A8B9035A4D4201F8C15E = F519A8B9035A4D4201F8C15E;
+			F519A8BA035A4D4201F8C15E = F519A8BA035A4D4201F8C15E;
+			F519A8BB035A4D4201F8C15E = F519A8BB035A4D4201F8C15E;
+			F519A8BC035A4D4201F8C15E = F519A8BC035A4D4201F8C15E;
+			F519A8BD035A4D4201F8C15E = F519A8BD035A4D4201F8C15E;
+			F519A8BE035A4D4201F8C15E = F519A8BE035A4D4201F8C15E;
+			F519A8BF035A4D4201F8C15E = F519A8BF035A4D4201F8C15E;
+			F519A8C0035A4D4201F8C15E = F519A8C0035A4D4201F8C15E;
+			F519A8C1035A4D4201F8C15E = F519A8C1035A4D4201F8C15E;
+			F519A8C2035A4D4201F8C15E = F519A8C2035A4D4201F8C15E;
+			F519A8C3035A4D4201F8C15E = F519A8C3035A4D4201F8C15E;
+			F519A8C4035A4D4201F8C15E = F519A8C4035A4D4201F8C15E;
+			F519A8C5035A4D4201F8C15E = F519A8C5035A4D4201F8C15E;
+			F519A8C6035A4D4201F8C15E = F519A8C6035A4D4201F8C15E;
+			F519A8C7035A4D4201F8C15E = F519A8C7035A4D4201F8C15E;
+			F519A8C8035A4D4201F8C15E = F519A8C8035A4D4201F8C15E;
+			F519A8C9035A4D4201F8C15E = F519A8C9035A4D4201F8C15E;
+			F519A8CA035A4D4201F8C15E = F519A8CA035A4D4201F8C15E;
+			F519A8CB035A4D4201F8C15E = F519A8CB035A4D4201F8C15E;
+			F519A8CC035A4D4201F8C15E = F519A8CC035A4D4201F8C15E;
+			F519A8CD035A4D4201F8C15E = F519A8CD035A4D4201F8C15E;
+			F519A8CE035A4D4201F8C15E = F519A8CE035A4D4201F8C15E;
+			F519A8CF035A4D4201F8C15E = F519A8CF035A4D4201F8C15E;
+			F519A8D0035A4D4201F8C15E = F519A8D0035A4D4201F8C15E;
+			F519A8D1035A4D4201F8C15E = F519A8D1035A4D4201F8C15E;
+			F519A8D2035A4D4201F8C15E = F519A8D2035A4D4201F8C15E;
+			F519A8D3035A4D4201F8C15E = F519A8D3035A4D4201F8C15E;
+			F519A8D4035A4D4201F8C15E = F519A8D4035A4D4201F8C15E;
+			F519A8D5035A4D4201F8C15E = F519A8D5035A4D4201F8C15E;
+			F519A8D6035A4D4201F8C15E = F519A8D6035A4D4201F8C15E;
+			F519A8D7035A4D4201F8C15E = F519A8D7035A4D4201F8C15E;
+			F519A8D8035A4D4201F8C15E = F519A8D8035A4D4201F8C15E;
+			F519A8D9035A4D4201F8C15E = F519A8D9035A4D4201F8C15E;
+			F519A8DA035A4D4201F8C15E = F519A8DA035A4D4201F8C15E;
+			F519A8DB035A4D4201F8C15E = F519A8DB035A4D4201F8C15E;
+			F519A8DC035A4D4201F8C15E = F519A8DC035A4D4201F8C15E;
+			F519A8DD035A4D4201F8C15E = F519A8DD035A4D4201F8C15E;
+			F519A8FA035A4F7C01F8C15E = F519A8FA035A4F7C01F8C15E;
+			F519A8FF035A4F7C01F8C15E = F519A8FF035A4F7C01F8C15E;
+			F519A901035A4F7C01F8C15E = F519A901035A4F7C01F8C15E;
+			F519A903035A4F7C01F8C15E = F519A903035A4F7C01F8C15E;
+			F519A904035A4F7C01F8C15E = F519A904035A4F7C01F8C15E;
+			F519A914035A890101F8C15E = F519A914035A890101F8C15E;
+			F589C9C8035AA4FF0155F4B2 = F589C9C8035AA4FF0155F4B2;
+			F589C9C9035AA4FF0155F4B2 = F589C9C9035AA4FF0155F4B2;
+			F589C9CA035AA4FF0155F4B2 = F589C9CA035AA4FF0155F4B2;
+			F589C9CB035AA4FF0155F4B2 = F589C9CB035AA4FF0155F4B2;
+			F589C9CD035AA4FF0155F4B2 = F589C9CD035AA4FF0155F4B2;
+			F589C9D8035AAAAB0155F4B2 = F589C9D8035AAAAB0155F4B2;
+			F589C9D9035AAAAB0155F4B2 = F589C9D9035AAAAB0155F4B2;
+			F589C9DA035AAAAB0155F4B2 = F589C9DA035AAAAB0155F4B2;
+			F589C9DB035AAAAB0155F4B2 = F589C9DB035AAAAB0155F4B2;
+			F589C9DC035AAAAB0155F4B2 = F589C9DC035AAAAB0155F4B2;
+			F589C9DD035AAAAB0155F4B2 = F589C9DD035AAAAB0155F4B2;
+			F589C9DE035AAAAB0155F4B2 = F589C9DE035AAAAB0155F4B2;
+			F59163CE035A8E270118C656 = F59163CE035A8E270118C656;
+			F59163CF035A8E270118C656 = F59163CF035A8E270118C656;
+			F59163D1035A8E270118C656 = F59163D1035A8E270118C656;
+			F59163D2035A8E270118C656 = F59163D2035A8E270118C656;
+			F59163D3035A8E270118C656 = F59163D3035A8E270118C656;
+			F59163D4035A8E270118C656 = F59163D4035A8E270118C656;
+			F59163D5035A8E270118C656 = F59163D5035A8E270118C656;
+			F59163D6035A8E270118C656 = F59163D6035A8E270118C656;
+			F59163D7035A8E270118C656 = F59163D7035A8E270118C656;
+			F59163D8035A8E270118C656 = F59163D8035A8E270118C656;
+			F59163D9035A8E270118C656 = F59163D9035A8E270118C656;
+			F59163DA035A8E270118C656 = F59163DA035A8E270118C656;
+			F59163DB035A8E270118C656 = F59163DB035A8E270118C656;
+			F59163DC035A8E270118C656 = F59163DC035A8E270118C656;
+			F5C8B260035A217B01935D7C = F5C8B260035A217B01935D7C;
+			F5C8B261035A217B01935D7C = F5C8B261035A217B01935D7C;
+			F5C8B263035A217B01935D7C = F5C8B263035A217B01935D7C;
+			F5C8B267035A217B01935D7C = F5C8B267035A217B01935D7C;
+			F5C8B268035A217B01935D7C = F5C8B268035A217B01935D7C;
+			F5C8B26A035A217B01935D7C = F5C8B26A035A217B01935D7C;
+			F5C8B26B035A217B01935D7C = F5C8B26B035A217B01935D7C;
+			F5C8B26C035A217B01935D7C = F5C8B26C035A217B01935D7C;
+			F5C8B26D035A217B01935D7C = F5C8B26D035A217B01935D7C;
+			F5C8B26E035A217B01935D7C = F5C8B26E035A217B01935D7C;
+			F5C8B26F035A217B01935D7C = F5C8B26F035A217B01935D7C;
+			F5C8B270035A217B01935D7C = F5C8B270035A217B01935D7C;
+			F5C8B271035A217B01935D7C = F5C8B271035A217B01935D7C;
+			F5C8B272035A217B01935D7C = F5C8B272035A217B01935D7C;
+			F5C8B273035A217B01935D7C = F5C8B273035A217B01935D7C;
+			F5C8B274035A217B01935D7C = F5C8B274035A217B01935D7C;
+			F5C8B275035A217B01935D7C = F5C8B275035A217B01935D7C;
+			F5C8B276035A217B01935D7C = F5C8B276035A217B01935D7C;
+			F5C8B277035A217B01935D7C = F5C8B277035A217B01935D7C;
+			F5C8B278035A217B01935D7C = F5C8B278035A217B01935D7C;
+			F5C8B279035A217B01935D7C = F5C8B279035A217B01935D7C;
+			F5C8B27A035A217B01935D7C = F5C8B27A035A217B01935D7C;
+			F5C8B27B035A217B01935D7C = F5C8B27B035A217B01935D7C;
+			F5C8B27C035A217B01935D7C = F5C8B27C035A217B01935D7C;
+			F5C8B27D035A217B01935D7C = F5C8B27D035A217B01935D7C;
+			F5C8B27E035A217B01935D7C = F5C8B27E035A217B01935D7C;
+			F5C8B27F035A217B01935D7C = F5C8B27F035A217B01935D7C;
+			F5C8B280035A217B01935D7C = F5C8B280035A217B01935D7C;
+			F5C8B281035A217B01935D7C = F5C8B281035A217B01935D7C;
+		};
+		projectwideBuildSettings = {
+		};
+		userBookmarkGroup = F59DC6D20353C43201AEEDB1;
+		wantsIndex = 1;
+		wantsSCM = -1;
+	};
+	29B97326FDCFA39411CA2CEA = {
+		activeExec = 0;
+		executables = (
+			F59B967103538BE201154278,
+		);
+	};
+	F500E5370359719B01AEEDB1 = {
+		isa = PBXSymbolicBreakpoint;
+		state = 1;
+		symbolName = szone_error;
+	};
+	F517D63D0356AC88016D68B9 = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: scheduledTimerWithTarget:selector:";
+		rLen = 0;
+		rLoc = 6280;
+		rType = 0;
+		vrLen = 822;
+		vrLoc = 4232;
+	};
+	F519A888035A4D4201F8C15E = {
+		fRef = F59F6CB40354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.h: 47";
+		rLen = 0;
+		rLoc = 1106;
+		rType = 0;
+		vrLen = 933;
+		vrLoc = 179;
+	};
+	F519A889035A4D4201F8C15E = {
+		fRef = F59DC6D30353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 971;
+		vrLoc = 0;
+	};
+	F519A88B035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: PSAlarmsAllAlarms";
+		rLen = 1;
+		rLoc = 476;
+		rType = 0;
+		vrLen = 975;
+		vrLoc = 0;
+	};
+	F519A88C035A4D4201F8C15E = {
+		fRef = F519A8EF035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSString.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1079;
+		vrLoc = 0;
+	};
+	F519A88D035A4D4201F8C15E = {
+		fRef = F519A8F0035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSAttributedString.h: 16";
+		rLen = 0;
+		rLoc = 415;
+		rType = 0;
+		vrLen = 1326;
+		vrLoc = 0;
+	};
+	F519A88E035A4D4201F8C15E = {
+		fRef = F519A8F6035A4D4201F8C15E;
+		isa = PBXBookmark;
+	};
+	F519A88F035A4D4201F8C15E = {
+		fRef = F519A8F7035A4D4201F8C15E;
+		isa = PBXBookmark;
+	};
+	F519A890035A4D4201F8C15E = {
+		fRef = F519A8E9035A4D4201F8C15E;
+		isa = PBXBookmark;
+	};
+	F519A891035A4D4201F8C15E = {
+		fRef = F519A8EA035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "CGGeometry.h: 189";
+		rLen = 72;
+		rLoc = 4937;
+		rType = 0;
+		vrLen = 1039;
+		vrLoc = 4227;
+	};
+	F519A893035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: init";
+		rLen = 0;
+		rLoc = 821;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A895035A4D4201F8C15E = {
+		fRef = F519A8EB035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSAttributedString.h: 19";
+		rLen = 30;
+		rLoc = 723;
+		rType = 0;
+		vrLen = 2018;
+		vrLoc = 466;
+	};
+	F519A896035A4D4201F8C15E = {
+		fRef = F519A8EC035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSDictionary.h: 54";
+		rLen = 0;
+		rLoc = 1970;
+		rType = 0;
+		vrLen = 1159;
+		vrLoc = 1574;
+	};
+	F519A898035A4D4201F8C15E = {
+		fRef = F519A8ED035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSStringDrawing.h: 12";
+		rLen = 239;
+		rLoc = 242;
+		rType = 0;
+		vrLen = 621;
+		vrLoc = 0;
+	};
+	F519A899035A4D4201F8C15E = {
+		fRef = F519A8F4035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSImage.h: 71";
+		rLen = 0;
+		rLoc = 2349;
+		rType = 0;
+		vrLen = 1042;
+		vrLoc = 0;
+	};
+	F519A89A035A4D4201F8C15E = {
+		fRef = F519A8EE035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSGeometry.h: 62";
+		rLen = 0;
+		rLoc = 1255;
+		rType = 0;
+		vrLen = 1234;
+		vrLoc = 2696;
+	};
+	F519A89B035A4D4201F8C15E = {
+		fRef = F519A8F5035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSFont.h: 76";
+		rLen = 83;
+		rLoc = 2324;
+		rType = 0;
+		vrLen = 1548;
+		vrLoc = 1607;
+	};
+	F519A89C035A4D4201F8C15E = {
+		fRef = F519A8F1035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSColor.h: 214";
+		rLen = 0;
+		rLoc = 11837;
+		rType = 0;
+		vrLen = 1521;
+		vrLoc = 2035;
+	};
+	F519A89D035A4D4201F8C15E = {
+		fRef = F519A8F2035A4D4201F8C15E;
+		isa = PBXTextBookmark;
+		name = "NSGraphics.h: 118";
+		rLen = 0;
+		rLoc = 5341;
+		rType = 0;
+		vrLen = 1912;
+		vrLoc = 3188;
+	};
+	F519A89F035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: nextAlarmDidChange:";
+		rLen = 0;
+		rLoc = 5249;
+		rType = 0;
+		vrLen = 1437;
+		vrLoc = 1958;
+	};
+	F519A8A0035A4D4201F8C15E = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: setAlarm:";
+		rLen = 41;
+		rLoc = 6943;
+		rType = 0;
+		vrLen = 1366;
+		vrLoc = 6331;
+	};
+	F519A8A1035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: interval";
+		rLen = 0;
+		rLoc = 5435;
+		rType = 0;
+		vrLen = 1588;
+		vrLoc = 4345;
+	};
+	F519A8A2035A4D4201F8C15E = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: dateCompleted:";
+		rLen = 0;
+		rLoc = 6411;
+		rType = 0;
+		vrLen = 1386;
+		vrLoc = 6103;
+	};
+	F519A8A3035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: removeAlarmsAtIndices:";
+		rLen = 0;
+		rLoc = 4489;
+		rType = 0;
+		vrLen = 1048;
+		vrLoc = 3729;
+	};
+	F519A8A4035A4D4201F8C15E = {
+		fRef = F59F6CB40354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.h: 47";
+		rLen = 0;
+		rLoc = 1106;
+		rType = 0;
+		vrLen = 933;
+		vrLoc = 179;
+	};
+	F519A8A5035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: dealloc";
+		rLen = 0;
+		rLoc = 660;
+		rType = 0;
+		vrLen = 998;
+		vrLoc = 486;
+	};
+	F519A8A6035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: allAlarms";
+		rLen = 0;
+		rLoc = 4126;
+		rType = 0;
+		vrLen = 991;
+		vrLoc = 3706;
+	};
+	F519A8A7035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 2284;
+		rType = 0;
+		vrLen = 1498;
+		vrLoc = 1339;
+	};
+	F519A8A8035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: timeRemainingString";
+		rLen = 0;
+		rLoc = 4857;
+		rType = 0;
+		vrLen = 1207;
+		vrLoc = 4055;
+	};
+	F519A8A9035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 4150;
+		rType = 0;
+		vrLen = 1517;
+		vrLoc = 1339;
+	};
+	F519A8AA035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 18";
+		rLen = 18;
+		rLoc = 424;
+		rType = 0;
+		vrLen = 547;
+		vrLoc = 0;
+	};
+	F519A8AB035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 4434;
+		rType = 0;
+		vrLen = 1626;
+		vrLoc = 1567;
+	};
+	F519A8AC035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: _updateNextAlarm";
+		rLen = 0;
+		rLoc = 1417;
+		rType = 0;
+		vrLen = 1617;
+		vrLoc = 992;
+	};
+	F519A8AD035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: init";
+		rLen = 0;
+		rLoc = 514;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A8AE035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 18";
+		rLen = 18;
+		rLoc = 424;
+		rType = 0;
+		vrLen = 547;
+		vrLoc = 0;
+	};
+	F519A8AF035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: finishLaunching";
+		rLen = 160;
+		rLoc = 653;
+		rType = 0;
+		vrLen = 1129;
+		vrLoc = 0;
+	};
+	F519A8B0035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: init";
+		rLen = 0;
+		rLoc = 1612;
+		rType = 0;
+		vrLen = 1314;
+		vrLoc = 706;
+	};
+	F519A8B1035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 18";
+		rLen = 18;
+		rLoc = 424;
+		rType = 0;
+		vrLen = 547;
+		vrLoc = 0;
+	};
+	F519A8B2035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: nextAlarmDidChange:";
+		rLen = 59;
+		rLoc = 4954;
+		rType = 0;
+		vrLen = 1489;
+		vrLoc = 1875;
+	};
+	F519A8B3035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: _updateNextAlarm";
+		rLen = 0;
+		rLoc = 1593;
+		rType = 0;
+		vrLen = 1395;
+		vrLoc = 973;
+	};
+	F519A8B4035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 4265;
+		rType = 0;
+		vrLen = 1506;
+		vrLoc = 1875;
+	};
+	F519A8B5035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: initWithCoder:";
+		rLen = 0;
+		rLoc = 8761;
+		rType = 0;
+		vrLen = 1130;
+		vrLoc = 7325;
+	};
+	F519A8B6035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: __PTRDIFF_TYPE__";
+		rLen = 0;
+		rLoc = 113;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A8B7035A4D4201F8C15E = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: setAlarm:";
+		rLen = 0;
+		rLoc = 7560;
+		rType = 0;
+		vrLen = 1297;
+		vrLoc = 6472;
+	};
+	F519A8B8035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: finishLaunching";
+		rLen = 0;
+		rLoc = 652;
+		rType = 0;
+		vrLen = 1129;
+		vrLoc = 0;
+	};
+	F519A8B9035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: alarm";
+		rLen = 0;
+		rLoc = 3046;
+		rType = 0;
+		vrLen = 1363;
+		vrLoc = 2173;
+	};
+	F519A8BA035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: initWithCoder:";
+		rLen = 0;
+		rLoc = 8761;
+		rType = 0;
+		vrLen = 1273;
+		vrLoc = 7280;
+	};
+	F519A8BB035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: alarm";
+		rLen = 0;
+		rLoc = 3046;
+		rType = 0;
+		vrLen = 1377;
+		vrLoc = 2159;
+	};
+	F519A8BC035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: encodeWithCoder:";
+		rLen = 0;
+		rLoc = 8102;
+		rType = 0;
+		vrLen = 1110;
+		vrLoc = 7550;
+	};
+	F519A8BD035A4D4201F8C15E = {
+		fRef = F59DC6D30353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 971;
+		vrLoc = 0;
+	};
+	F519A8BE035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: init";
+		rLen = 0;
+		rLoc = 1221;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A8BF035A4D4201F8C15E = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: showWindow:";
+		rLen = 0;
+		rLoc = 6830;
+		rType = 0;
+		vrLen = 1324;
+		vrLoc = 6445;
+	};
+	F519A8C0035A4D4201F8C15E = {
+		fRef = F59DC6D30353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 971;
+		vrLoc = 0;
+	};
+	F519A8C1035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: timeRemainingString";
+		rLen = 0;
+		rLoc = 4838;
+		rType = 0;
+		vrLen = 1337;
+		vrLoc = 4012;
+	};
+	F519A8C2035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 4847;
+		rType = 0;
+		vrLen = 1412;
+		vrLoc = 2197;
+	};
+	F519A8C3035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: init";
+		rLen = 0;
+		rLoc = 1221;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A8C4035A4D4201F8C15E = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: showWindow:";
+		rLen = 0;
+		rLoc = 6830;
+		rType = 0;
+		vrLen = 1323;
+		vrLoc = 6445;
+	};
+	F519A8C5035A4D4201F8C15E = {
+		fRef = F59DC6DC0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.m: __VERSION__";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 961;
+		vrLoc = 0;
+	};
+	F519A8C6035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: interval";
+		rLen = 0;
+		rLoc = 5374;
+		rType = 0;
+		vrLen = 1709;
+		vrLoc = 4406;
+	};
+	F519A8C7035A4D4201F8C15E = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: 23";
+		rLen = 0;
+		rLoc = 994;
+		rType = 0;
+		vrLen = 1976;
+		vrLoc = 0;
+	};
+	F519A8C8035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: finishLaunching";
+		rLen = 0;
+		rLoc = 835;
+		rType = 0;
+		vrLen = 1092;
+		vrLoc = 0;
+	};
+	F519A8C9035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 0;
+		rLoc = 470;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F519A8CA035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 4420;
+		rType = 0;
+		vrLen = 1426;
+		vrLoc = 1959;
+	};
+	F519A8CB035A4D4201F8C15E = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: PSAlarmsAllAlarms";
+		rLen = 1;
+		rLoc = 476;
+		rType = 0;
+		vrLen = 975;
+		vrLoc = 0;
+	};
+	F519A8CC035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: timeRemainingString";
+		rLen = 0;
+		rLoc = 4857;
+		rType = 0;
+		vrLen = 1489;
+		vrLoc = 4238;
+	};
+	F519A8CD035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 4127;
+		rType = 0;
+		vrLen = 1567;
+		vrLoc = 1590;
+	};
+	F519A8CE035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 0;
+		rLoc = 470;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F519A8CF035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: nextUpdate";
+		rLen = 0;
+		rLoc = 4128;
+		rType = 0;
+		vrLen = 1501;
+		vrLoc = 1590;
+	};
+	F519A8D0035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 12;
+		rLoc = 457;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F519A8D1035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 2284;
+		rType = 0;
+		vrLen = 1733;
+		vrLoc = 1567;
+	};
+	F519A8D2035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 12;
+		rLoc = 457;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F519A8D3035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 2284;
+		rType = 0;
+		vrLen = 1625;
+		vrLoc = 1339;
+	};
+	F519A8D4035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: init";
+		rLen = 0;
+		rLoc = 1221;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A8D5035A4D4201F8C15E = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: 23";
+		rLen = 0;
+		rLoc = 994;
+		rType = 0;
+		vrLen = 1976;
+		vrLoc = 0;
+	};
+	F519A8D6035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: init";
+		rLen = 0;
+		rLoc = 821;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A8D7035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: nextUpdate";
+		rLen = 0;
+		rLoc = 4407;
+		rType = 0;
+		vrLen = 1843;
+		vrLoc = 1592;
+	};
+	F519A8D8035A4D4201F8C15E = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: init";
+		rLen = 0;
+		rLoc = 821;
+		rType = 0;
+		vrLen = 1379;
+		vrLoc = 0;
+	};
+	F519A8D9035A4D4201F8C15E = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: _setIntervalFromDate";
+		rLen = 0;
+		rLoc = 1861;
+		rType = 0;
+		vrLen = 961;
+		vrLoc = 358;
+	};
+	F519A8DA035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: textSize";
+		rLen = 0;
+		rLoc = 2526;
+		rType = 0;
+		vrLen = 1844;
+		vrLoc = 1484;
+	};
+	F519A8DB035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 12;
+		rLoc = 457;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F519A8DC035A4D4201F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: textSize";
+		rLen = 0;
+		rLoc = 2526;
+		rType = 0;
+		vrLen = 1807;
+		vrLoc = 1483;
+	};
+	F519A8DD035A4D4201F8C15E = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 12;
+		rLoc = 457;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F519A8E9035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSAttributedString.html;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Resources/English.lproj/Documentation/Reference/ObjC_classic/Classes/NSAttributedString.html;
+		refType = 0;
+	};
+	F519A8EA035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = CGGeometry.h;
+		path = /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/Headers/CGGeometry.h;
+		refType = 0;
+	};
+	F519A8EB035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSAttributedString.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSAttributedString.h;
+		refType = 0;
+	};
+	F519A8EC035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSDictionary.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSDictionary.h;
+		refType = 0;
+	};
+	F519A8ED035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSStringDrawing.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSStringDrawing.h;
+		refType = 0;
+	};
+	F519A8EE035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSGeometry.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSGeometry.h;
+		refType = 0;
+	};
+	F519A8EF035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSString.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSString.h;
+		refType = 0;
+	};
+	F519A8F0035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSAttributedString.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSAttributedString.h;
+		refType = 0;
+	};
+	F519A8F1035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSColor.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSColor.h;
+		refType = 0;
+	};
+	F519A8F2035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSGraphics.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSGraphics.h;
+		refType = 0;
+	};
+	F519A8F4035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSImage.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSImage.h;
+		refType = 0;
+	};
+	F519A8F5035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSFont.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSFont.h;
+		refType = 0;
+	};
+	F519A8F6035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = NSStringAdditions.html;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Resources/English.lproj/Documentation/Reference/ObjC_classic/Classes/NSStringAdditions.html;
+		refType = 0;
+	};
+	F519A8F7035A4D4201F8C15E = {
+		isa = PBXFileReference;
+		name = index.html;
+		path = /Developer/Documentation/Cocoa/TasksAndConcepts/ProgrammingTopics/AttributedStrings/index.html;
+		refType = 0;
+	};
+	F519A8FA035A4F7C01F8C15E = {
+		fRef = F59DD4500358ABF4017318D0;
+		isa = PBXTextBookmark;
+		name = "English: 2";
+		rLen = 0;
+		rLoc = 225;
+		rType = 0;
+		vrLen = 237;
+		vrLoc = 0;
+	};
+	F519A8FF035A4F7C01F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 3185;
+		rType = 0;
+		vrLen = 1786;
+		vrLoc = 2159;
+	};
+	F519A901035A4F7C01F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 2619;
+		rType = 0;
+		vrLen = 1786;
+		vrLoc = 2159;
+	};
+	F519A903035A4F7C01F8C15E = {
+		fRef = 089C165DFE840E0CC02AAC07;
+		isa = PBXTextBookmark;
+		name = "English: 5";
+		rLen = 0;
+		rLoc = 141;
+		rType = 0;
+		vrLen = 223;
+		vrLoc = 0;
+	};
+	F519A904035A4F7C01F8C15E = {
+		fRef = F59DD4500358ABF4017318D0;
+		isa = PBXTextBookmark;
+		name = "English: 2";
+		rLen = 0;
+		rLoc = 225;
+		rType = 0;
+		vrLen = 237;
+		vrLoc = 0;
+	};
+	F519A914035A890101F8C15E = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: _updateDockTile:";
+		rLen = 0;
+		rLoc = 2619;
+		rType = 0;
+		vrLen = 1786;
+		vrLoc = 2159;
+	};
+	F560E2F5035750C101A4E466 = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 16";
+		rLen = 0;
+		rLoc = 1426;
+		rType = 0;
+		vrLen = 296;
+		vrLoc = 0;
+	};
+	F560E2F80357779E01A4E466 = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: allAlarms";
+		rLen = 0;
+		rLoc = 943;
+		rType = 0;
+		vrLen = 916;
+		vrLoc = 0;
+	};
+	F560E2FB035786FE01A4E466 = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: numberOfRowsInTableView:";
+		rLen = 0;
+		rLoc = 1720;
+		rType = 0;
+		vrLen = 1085;
+		vrLoc = 0;
+	};
+	F589C9C8035AA4FF0155F4B2 = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: __OBJC__";
+		rLen = 0;
+		rLoc = 213;
+		rType = 0;
+		vrLen = 1976;
+		vrLoc = 0;
+	};
+	F589C9C9035AA4FF0155F4B2 = {
+		fRef = F589C9D0035AA4FF0155F4B2;
+		isa = PBXTextBookmark;
+		name = "NSHelpManager.h: 53";
+		rLen = 89;
+		rLoc = 1328;
+		rType = 0;
+		vrLen = 1039;
+		vrLoc = 638;
+	};
+	F589C9CA035AA4FF0155F4B2 = {
+		fRef = F589C9D1035AA4FF0155F4B2;
+		isa = PBXTextBookmark;
+		name = "NSBundle.h: 23";
+		rLen = 10;
+		rLoc = 548;
+		rType = 0;
+		vrLen = 1615;
+		vrLoc = 872;
+	};
+	F589C9CB035AA4FF0155F4B2 = {
+		fRef = F589C9D3035AA4FF0155F4B2;
+		isa = PBXTextBookmark;
+		name = "NSWorkspace.h: 29";
+		rLen = 0;
+		rLoc = 709;
+		rType = 0;
+		vrLen = 1124;
+		vrLoc = 0;
+	};
+	F589C9CD035AA4FF0155F4B2 = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: __OBJC__";
+		rLen = 0;
+		rLoc = 213;
+		rType = 0;
+		vrLen = 1976;
+		vrLoc = 0;
+	};
+	F589C9D0035AA4FF0155F4B2 = {
+		isa = PBXFileReference;
+		name = NSHelpManager.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSHelpManager.h;
+		refType = 0;
+	};
+	F589C9D1035AA4FF0155F4B2 = {
+		isa = PBXFileReference;
+		name = NSBundle.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSBundle.h;
+		refType = 0;
+	};
+	F589C9D3035AA4FF0155F4B2 = {
+		isa = PBXFileReference;
+		name = NSWorkspace.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSWorkspace.h;
+		refType = 0;
+	};
+	F589C9D8035AAAAB0155F4B2 = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 7";
+		rLen = 0;
+		rLoc = 149;
+		rType = 0;
+		vrLen = 1144;
+		vrLoc = 0;
+	};
+	F589C9D9035AAAAB0155F4B2 = {
+		fRef = 089C165DFE840E0CC02AAC07;
+		isa = PBXTextBookmark;
+		name = "English: 5";
+		rLen = 0;
+		rLoc = 141;
+		rType = 0;
+		vrLen = 219;
+		vrLoc = 0;
+	};
+	F589C9DA035AAAAB0155F4B2 = {
+		isa = PBXTargetBookmark;
+		trg = 29B97326FDCFA39411CA2CEA;
+		uiCtxt = {
+			buildPhasesExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+			);
+			buildPhasesVisRect = "{{0, 316}, {660, 507}}";
+			buildSettingsExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+				5,
+				8,
+			);
+			buildSettingsVisRect = "{{0, 0}, {660, 507}}";
+			expertProductSettingsVisRect = "{{0, 0}, {464, 403}}";
+			guiProductSettingsExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+				5,
+				6,
+			);
+			guiProductSettingsVisRect = "{{0, 0}, {2000, 1428}}";
+			productSettingsIsSimple = YES;
+			selectedTab = buildPhases;
+		};
+	};
+	F589C9DB035AAAAB0155F4B2 = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 7";
+		rLen = 0;
+		rLoc = 149;
+		rType = 0;
+		vrLen = 1144;
+		vrLoc = 0;
+	};
+	F589C9DC035AAAAB0155F4B2 = {
+		isa = PBXTargetBookmark;
+		trg = 29B97326FDCFA39411CA2CEA;
+		uiCtxt = {
+			buildPhasesExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+			);
+			buildPhasesVisRect = "{{0, 316}, {660, 507}}";
+			buildSettingsExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+				5,
+				8,
+			);
+			buildSettingsVisRect = "{{0, 0}, {660, 507}}";
+			expertProductSettingsVisRect = "{{0, 0}, {464, 403}}";
+			guiProductSettingsExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+				5,
+				6,
+			);
+			guiProductSettingsVisRect = "{{0, 0}, {2000, 1428}}";
+			productSettingsIsSimple = YES;
+			selectedTab = buildPhases;
+		};
+	};
+	F589C9DD035AAAAB0155F4B2 = {
+		fRef = 089C165DFE840E0CC02AAC07;
+		isa = PBXTextBookmark;
+		name = "English: 5";
+		rLen = 0;
+		rLoc = 141;
+		rType = 0;
+		vrLen = 219;
+		vrLoc = 0;
+	};
+	F589C9DE035AAAAB0155F4B2 = {
+		isa = PBXTargetBookmark;
+		trg = 29B97326FDCFA39411CA2CEA;
+		uiCtxt = {
+			buildPhasesExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+			);
+			buildPhasesVisRect = "{{0, 208}, {660, 507}}";
+			buildSettingsExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+				5,
+				8,
+			);
+			buildSettingsVisRect = "{{0, 0}, {660, 507}}";
+			expertProductSettingsVisRect = "{{0, 0}, {464, 403}}";
+			guiProductSettingsExpandedSubviews = (
+				0,
+				1,
+				2,
+				3,
+				4,
+				5,
+				6,
+			);
+			guiProductSettingsVisRect = "{{0, 797}, {660, 476}}";
+			productSettingsIsSimple = YES;
+			selectedTab = buildPhases;
+		};
+	};
+	F59163CE035A8E270118C656 = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: 163";
+		rLen = 4;
+		rLoc = 4607;
+		rType = 0;
+		vrLen = 1406;
+		vrLoc = 4117;
+	};
+	F59163CF035A8E270118C656 = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 12;
+		rLoc = 457;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F59163D1035A8E270118C656 = {
+		fRef = F59DC6DB0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 533;
+		vrLoc = 0;
+	};
+	F59163D2035A8E270118C656 = {
+		fRef = F59163DE035A8E270118C656;
+		isa = PBXTextBookmark;
+		name = "NSApplication.h: 127";
+		rLen = 49;
+		rLoc = 4000;
+		rType = 0;
+		vrLen = 1569;
+		vrLoc = 3308;
+	};
+	F59163D3035A8E270118C656 = {
+		fRef = F59DC6DC0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.m: initWithAlarm:";
+		rLen = 0;
+		rLoc = 781;
+		rType = 0;
+		vrLen = 1056;
+		vrLoc = 35;
+	};
+	F59163D4035A8E270118C656 = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: 163";
+		rLen = 4;
+		rLoc = 4607;
+		rType = 0;
+		vrLen = 1406;
+		vrLoc = 4117;
+	};
+	F59163D5035A8E270118C656 = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 58";
+		rLen = 0;
+		rLoc = 2027;
+		rType = 0;
+		vrLen = 1584;
+		vrLoc = 1750;
+	};
+	F59163D6035A8E270118C656 = {
+		fRef = F59DC6DB0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 533;
+		vrLoc = 0;
+	};
+	F59163D7035A8E270118C656 = {
+		fRef = F59DC6DC0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.m: initWithAlarm:";
+		rLen = 0;
+		rLoc = 520;
+		rType = 0;
+		vrLen = 997;
+		vrLoc = 99;
+	};
+	F59163D8035A8E270118C656 = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 176";
+		rLen = 0;
+		rLoc = 7027;
+		rType = 0;
+		vrLen = 1129;
+		vrLoc = 0;
+	};
+	F59163D9035A8E270118C656 = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 19";
+		rLen = 12;
+		rLoc = 457;
+		rType = 0;
+		vrLen = 574;
+		vrLoc = 0;
+	};
+	F59163DA035A8E270118C656 = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: applicationWillTerminate:";
+		rLen = 0;
+		rLoc = 6976;
+		rType = 0;
+		vrLen = 1522;
+		vrLoc = 5361;
+	};
+	F59163DB035A8E270118C656 = {
+		fRef = F59DC6DB0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 533;
+		vrLoc = 0;
+	};
+	F59163DC035A8E270118C656 = {
+		fRef = F59DC6DC0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.m: initWithAlarm:";
+		rLen = 0;
+		rLoc = 781;
+		rType = 0;
+		vrLen = 1056;
+		vrLoc = 35;
+	};
+	F59163DE035A8E270118C656 = {
+		isa = PBXFileReference;
+		name = NSApplication.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSApplication.h;
+		refType = 0;
+	};
+	F596730D0355CFA301407038 = {
+		isa = PBXSymbolicBreakpoint;
+		state = 1;
+		symbolName = "-[_NSZombie methodSignatureForSelector:]";
+	};
+	F59B967103538BE201154278 = {
+		activeArgIndex = 2147483647;
+		argumentStrings = (
+		);
+		debuggerPlugin = GDBDebugging;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+			{
+				active = YES;
+				name = NSZombieEnabled;
+				value = YES;
+			},
+		);
+		isa = PBXExecutable;
+		name = Pester;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	F59DC6D20353C43201AEEDB1 = {
+		children = (
+			F59DC6D70353CA6401AEEDB1,
+			F59DC6D90353D35201AEEDB1,
+			F59DC6DA0353D72901AEEDB1,
+			F59DC6E20353E0EB01AEEDB1,
+			F517D63D0356AC88016D68B9,
+			F560E2F5035750C101A4E466,
+			F560E2F80357779E01A4E466,
+			F560E2FB035786FE01A4E466,
+		);
+		isa = PBXBookmarkGroup;
+		name = Root;
+	};
+	F59DC6D70353CA6401AEEDB1 = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: 16";
+		rLen = 0;
+		rLoc = 2700;
+		rType = 0;
+		vrLen = 291;
+		vrLoc = 0;
+	};
+	F59DC6D90353D35201AEEDB1 = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: inAtChanged:";
+		rLen = 36;
+		rLoc = 5781;
+		rType = 0;
+		vrLen = 478;
+		vrLoc = 416;
+	};
+	F59DC6DA0353D72901AEEDB1 = {
+		fRef = F59DC6D30353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.h: 25";
+		rLen = 0;
+		rLoc = 805;
+		rType = 0;
+		vrLen = 758;
+		vrLoc = 0;
+	};
+	F59DC6E20353E0EB01AEEDB1 = {
+		fRef = F59DC6D30353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.h: 31";
+		rLen = 0;
+		rLoc = 965;
+		rType = 0;
+		vrLen = 826;
+		vrLoc = 0;
+	};
+	F5C8B260035A217B01935D7C = {
+		fRef = F517D6430356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.h: 15";
+		rLen = 0;
+		rLoc = 310;
+		rType = 0;
+		vrLen = 615;
+		vrLoc = 0;
+	};
+	F5C8B261035A217B01935D7C = {
+		fRef = F5C8B2A2035A217B01935D7C;
+		isa = PBXBookmark;
+	};
+	F5C8B263035A217B01935D7C = {
+		fRef = F5C8B2A1035A217B01935D7C;
+		isa = PBXTextBookmark;
+		name = "NSTimer.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 832;
+		vrLoc = 0;
+	};
+	F5C8B267035A217B01935D7C = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: 20";
+		rLen = 0;
+		rLoc = 484;
+		rType = 0;
+		vrLen = 1220;
+		vrLoc = 28;
+	};
+	F5C8B268035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 70";
+		rLen = 0;
+		rLoc = 4359;
+		rType = 0;
+		vrLen = 1514;
+		vrLoc = 1276;
+	};
+	F5C8B26A035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 70";
+		rLen = 0;
+		rLoc = 4359;
+		rType = 0;
+		vrLen = 1454;
+		vrLoc = 1276;
+	};
+	F5C8B26B035A217B01935D7C = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 508;
+		vrLoc = 0;
+	};
+	F5C8B26C035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: finishLaunching";
+		rLen = 0;
+		rLoc = 746;
+		rType = 0;
+		vrLen = 1083;
+		vrLoc = 0;
+	};
+	F5C8B26D035A217B01935D7C = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: 21";
+		rLen = 0;
+		rLoc = 514;
+		rType = 0;
+		vrLen = 1245;
+		vrLoc = 3;
+	};
+	F5C8B26E035A217B01935D7C = {
+		fRef = F517D6430356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.h: 15";
+		rLen = 0;
+		rLoc = 310;
+		rType = 0;
+		vrLen = 615;
+		vrLoc = 0;
+	};
+	F5C8B26F035A217B01935D7C = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: init";
+		rLen = 0;
+		rLoc = 1653;
+		rType = 0;
+		vrLen = 1554;
+		vrLoc = 1019;
+	};
+	F5C8B270035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: finishLaunching";
+		rLen = 0;
+		rLoc = 657;
+		rType = 0;
+		vrLen = 1086;
+		vrLoc = 0;
+	};
+	F5C8B271035A217B01935D7C = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: allAlarms";
+		rLen = 0;
+		rLoc = 823;
+		rType = 0;
+		vrLen = 1043;
+		vrLoc = 533;
+	};
+	F5C8B272035A217B01935D7C = {
+		fRef = F517D63E0356B80C016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarmsController.m: 21";
+		rLen = 0;
+		rLoc = 514;
+		rType = 0;
+		vrLen = 1244;
+		vrLoc = 3;
+	};
+	F5C8B273035A217B01935D7C = {
+		fRef = F59DC6DC0353DE5101AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmNotifierController.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 958;
+		vrLoc = 0;
+	};
+	F5C8B274035A217B01935D7C = {
+		fRef = F59DC6D40353C9E601AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarmSetController.m: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1895;
+		vrLoc = 0;
+	};
+	F5C8B275035A217B01935D7C = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: dealloc";
+		rLen = 7;
+		rLoc = 2745;
+		rType = 0;
+		vrLen = 1296;
+		vrLoc = 1986;
+	};
+	F5C8B276035A217B01935D7C = {
+		fRef = F517D6430356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.h: 15";
+		rLen = 0;
+		rLoc = 310;
+		rType = 0;
+		vrLen = 615;
+		vrLoc = 0;
+	};
+	F5C8B277035A217B01935D7C = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: dealloc";
+		rLen = 0;
+		rLoc = 2760;
+		rType = 0;
+		vrLen = 1270;
+		vrLoc = 1986;
+	};
+	F5C8B278035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 53";
+		rLen = 0;
+		rLoc = 1636;
+		rType = 0;
+		vrLen = 1086;
+		vrLoc = 0;
+	};
+	F5C8B279035A217B01935D7C = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: _changed";
+		rLen = 1;
+		rLoc = 3532;
+		rType = 0;
+		vrLen = 1018;
+		vrLoc = 2735;
+	};
+	F5C8B27A035A217B01935D7C = {
+		fRef = F5C8B2A0035A217B01935D7C;
+		isa = PBXBookmark;
+	};
+	F5C8B27B035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: 58";
+		rLen = 0;
+		rLoc = 2026;
+		rType = 0;
+		vrLen = 1354;
+		vrLoc = 1276;
+	};
+	F5C8B27C035A217B01935D7C = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: _changed";
+		rLen = 1;
+		rLoc = 3532;
+		rType = 0;
+		vrLen = 1018;
+		vrLoc = 2735;
+	};
+	F5C8B27D035A217B01935D7C = {
+		fRef = F59F6CB50354E7DA01AEEDB1;
+		isa = PBXTextBookmark;
+		name = "PSAlarm.m: interval";
+		rLen = 0;
+		rLoc = 5435;
+		rType = 0;
+		vrLen = 1660;
+		vrLoc = 4345;
+	};
+	F5C8B27E035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: applicationDockMenu:";
+		rLen = 0;
+		rLoc = 6840;
+		rType = 0;
+		vrLen = 1520;
+		vrLoc = 3282;
+	};
+	F5C8B27F035A217B01935D7C = {
+		fRef = F517D6420356B8CC016D68B9;
+		isa = PBXTextBookmark;
+		name = "PSAlarms.m: removeAlarmsAtIndices:";
+		rLen = 0;
+		rLoc = 4126;
+		rType = 0;
+		vrLen = 875;
+		vrLoc = 3751;
+	};
+	F5C8B280035A217B01935D7C = {
+		fRef = F560E2F10357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.m: __VERSION__";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 1129;
+		vrLoc = 0;
+	};
+	F5C8B281035A217B01935D7C = {
+		fRef = F560E2F20357506401A4E466;
+		isa = PBXTextBookmark;
+		name = "PSApplication.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 508;
+		vrLoc = 0;
+	};
+	F5C8B2A0035A217B01935D7C = {
+		isa = PBXFileReference;
+		name = NSTimer.html;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Resources/English.lproj/Documentation/Reference/ObjC_classic/Classes/NSTimer.html;
+		refType = 0;
+	};
+	F5C8B2A1035A217B01935D7C = {
+		isa = PBXFileReference;
+		name = NSTimer.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSTimer.h;
+		refType = 0;
+	};
+	F5C8B2A2035A217B01935D7C = {
+		isa = PBXFileReference;
+		name = NSTimer.html;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Resources/English.lproj/Documentation/Reference/ObjC_classic/Classes/NSTimer.html;
+		refType = 0;
+	};
+}
Index: releases/Pester/1.0/Source/Pester.pbproj/project.pbxproj
===================================================================
--- releases/Pester/1.0/Source/Pester.pbproj/project.pbxproj	(revision 29)
+++ releases/Pester/1.0/Source/Pester.pbproj/project.pbxproj	(revision 29)
@@ -0,0 +1,762 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 38;
+	objects = {
+		080E96DDFE201D6D7F000001 = {
+			children = (
+				F560E2F20357506401A4E466,
+				F560E2F10357506401A4E466,
+				F560E311035787D501A4E466,
+				F560E314035787F901A4E466,
+				F560E312035787E001A4E466,
+				F560E313035787ED01A4E466,
+			);
+			isa = PBXGroup;
+			name = Classes;
+			refType = 4;
+		};
+		089C165CFE840E0CC02AAC07 = {
+			children = (
+				089C165DFE840E0CC02AAC07,
+			);
+			isa = PBXVariantGroup;
+			name = InfoPlist.strings;
+			refType = 4;
+		};
+		089C165DFE840E0CC02AAC07 = {
+			fileEncoding = 10;
+			isa = PBXFileReference;
+			name = English;
+			path = English.lproj/InfoPlist.strings;
+			refType = 4;
+		};
+//080
+//081
+//082
+//083
+//084
+//100
+//101
+//102
+//103
+//104
+		1058C7A0FEA54F0111CA2CBB = {
+			children = (
+				1058C7A1FEA54F0111CA2CBB,
+			);
+			isa = PBXGroup;
+			name = "Linked Frameworks";
+			refType = 4;
+		};
+		1058C7A1FEA54F0111CA2CBB = {
+			isa = PBXFrameworkReference;
+			name = Cocoa.framework;
+			path = /System/Library/Frameworks/Cocoa.framework;
+			refType = 0;
+		};
+		1058C7A2FEA54F0111CA2CBB = {
+			children = (
+				29B97325FDCFA39411CA2CEA,
+				29B97324FDCFA39411CA2CEA,
+			);
+			isa = PBXGroup;
+			name = "Other Frameworks";
+			refType = 4;
+		};
+		1058C7A3FEA54F0111CA2CBB = {
+			fileRef = 1058C7A1FEA54F0111CA2CBB;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+//100
+//101
+//102
+//103
+//104
+//170
+//171
+//172
+//173
+//174
+		17587328FF379C6511CA2CBB = {
+			isa = PBXApplicationReference;
+			path = Pester.app;
+			refType = 3;
+		};
+//170
+//171
+//172
+//173
+//174
+//190
+//191
+//192
+//193
+//194
+		19C28FACFE9D520D11CA2CBB = {
+			children = (
+				17587328FF379C6511CA2CBB,
+			);
+			isa = PBXGroup;
+			name = Products;
+			refType = 4;
+		};
+//190
+//191
+//192
+//193
+//194
+//290
+//291
+//292
+//293
+//294
+		29B97313FDCFA39411CA2CEA = {
+			buildStyles = (
+				4A9504CCFFE6A4B311CA0CBA,
+				4A9504CDFFE6A4B311CA0CBA,
+			);
+			isa = PBXProject;
+			mainGroup = 29B97314FDCFA39411CA2CEA;
+			projectDirPath = "";
+			targets = (
+				29B97326FDCFA39411CA2CEA,
+			);
+		};
+		29B97314FDCFA39411CA2CEA = {
+			children = (
+				080E96DDFE201D6D7F000001,
+				29B97315FDCFA39411CA2CEA,
+				29B97317FDCFA39411CA2CEA,
+				29B97323FDCFA39411CA2CEA,
+				19C28FACFE9D520D11CA2CBB,
+			);
+			isa = PBXGroup;
+			name = Pester;
+			path = "";
+			refType = 4;
+		};
+		29B97315FDCFA39411CA2CEA = {
+			children = (
+				29B97316FDCFA39411CA2CEA,
+			);
+			isa = PBXGroup;
+			name = "Other Sources";
+			path = "";
+			refType = 4;
+		};
+		29B97316FDCFA39411CA2CEA = {
+			isa = PBXFileReference;
+			path = main.m;
+			refType = 4;
+		};
+		29B97317FDCFA39411CA2CEA = {
+			children = (
+				29B97318FDCFA39411CA2CEA,
+				F560E2EE03574F8A01A4E466,
+				F59DC6DF0353DF5E01AEEDB1,
+				089C165CFE840E0CC02AAC07,
+				F59DD44F0358ABF4017318D0,
+				F589C9C6035AA12B0155F4B2,
+				F59DC6E30353ED1201AEEDB1,
+			);
+			isa = PBXGroup;
+			name = Resources;
+			path = "";
+			refType = 4;
+		};
+		29B97318FDCFA39411CA2CEA = {
+			children = (
+				29B97319FDCFA39411CA2CEA,
+			);
+			isa = PBXVariantGroup;
+			name = MainMenu.nib;
+			path = "";
+			refType = 4;
+		};
+		29B97319FDCFA39411CA2CEA = {
+			isa = PBXFileReference;
+			name = English;
+			path = English.lproj/MainMenu.nib;
+			refType = 4;
+		};
+		29B97323FDCFA39411CA2CEA = {
+			children = (
+				1058C7A0FEA54F0111CA2CBB,
+				1058C7A2FEA54F0111CA2CBB,
+			);
+			isa = PBXGroup;
+			name = Frameworks;
+			path = "";
+			refType = 4;
+		};
+		29B97324FDCFA39411CA2CEA = {
+			isa = PBXFrameworkReference;
+			name = AppKit.framework;
+			path = /System/Library/Frameworks/AppKit.framework;
+			refType = 0;
+		};
+		29B97325FDCFA39411CA2CEA = {
+			isa = PBXFrameworkReference;
+			name = Foundation.framework;
+			path = /System/Library/Frameworks/Foundation.framework;
+			refType = 0;
+		};
+		29B97326FDCFA39411CA2CEA = {
+			buildPhases = (
+				29B97327FDCFA39411CA2CEA,
+				29B97328FDCFA39411CA2CEA,
+				29B9732BFDCFA39411CA2CEA,
+				29B9732DFDCFA39411CA2CEA,
+			);
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = "";
+				HEADER_SEARCH_PATHS = "";
+				INSTALL_PATH = /;
+				LIBRARY_SEARCH_PATHS = "";
+				OTHER_CFLAGS = "";
+				PRODUCT_NAME = Pester;
+				SECTORDER_FLAGS = "";
+				USE_GCC3_PFE_SUPPORT = YES;
+				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+				WRAPPER_EXTENSION = app;
+			};
+			dependencies = (
+			);
+			isa = PBXApplicationTarget;
+			name = Pester;
+			productInstallPath = /;
+			productName = Pester;
+			productReference = 17587328FF379C6511CA2CBB;
+			productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">
+<plist version=\"0.9\">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>Pester</string>
+	<key>CFBundleGetInfoString</key>
+	<string>Pester 1.0, © 2002 Nicholas Riley</string>
+	<key>CFBundleIconFile</key>
+	<string>Application icon</string>
+	<key>CFBundleIdentifier</key>
+	<string>net.sabi.Pester</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>Pester</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>Pstr</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>NSMainNibFile</key>
+	<string>MainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>PSApplication</string>
+</dict>
+</plist>
+";
+			shouldUseHeadermap = 1;
+		};
+		29B97327FDCFA39411CA2CEA = {
+			buildActionMask = 2147483647;
+			files = (
+				F59DC6D50353C9E601AEEDB1,
+				F59DC6DD0353DE5101AEEDB1,
+				F59DC6EB0353F58B01AEEDB1,
+				F59DC6FE0354188F01AEEDB1,
+				F59F6CB60354E7DA01AEEDB1,
+				F517D6410356B80C016D68B9,
+				F517D6450356B8CC016D68B9,
+				F560E2F40357506501A4E466,
+				F560E310035787BC01A4E466,
+				F560E3170357895001A4E466,
+				F552A8AD0358E8B201AEEDB1,
+			);
+			isa = PBXHeadersBuildPhase;
+		};
+		29B97328FDCFA39411CA2CEA = {
+			buildActionMask = 2147483647;
+			files = (
+				F59DC6E10353DF5E01AEEDB1,
+				F59DC6E40353ED1201AEEDB1,
+				F560E2F003574F8A01A4E466,
+				F560E2F6035766F101A4E466,
+				F560E2F7035766F201A4E466,
+				F59DD4510358ABF7017318D0,
+				F589C9C7035AA12E0155F4B2,
+			);
+			isa = PBXResourcesBuildPhase;
+		};
+		29B9732BFDCFA39411CA2CEA = {
+			buildActionMask = 2147483647;
+			files = (
+				29B9732CFDCFA39411CA2CEA,
+				F59DC6D60353C9E601AEEDB1,
+				F59DC6DE0353DE5101AEEDB1,
+				F59DC6EA0353F58B01AEEDB1,
+				F59DC6FF0354188F01AEEDB1,
+				F59F6CB70354E7DA01AEEDB1,
+				F517D6400356B80C016D68B9,
+				F517D6440356B8CC016D68B9,
+				F560E2F30357506401A4E466,
+				F560E30F035787BC01A4E466,
+				F560E3180357895001A4E466,
+				F552A8AE0358E8B201AEEDB1,
+			);
+			isa = PBXSourcesBuildPhase;
+		};
+		29B9732CFDCFA39411CA2CEA = {
+			fileRef = 29B97316FDCFA39411CA2CEA;
+			isa = PBXBuildFile;
+			settings = {
+				ATTRIBUTES = (
+				);
+			};
+		};
+		29B9732DFDCFA39411CA2CEA = {
+			buildActionMask = 2147483647;
+			files = (
+				1058C7A3FEA54F0111CA2CBB,
+			);
+			isa = PBXFrameworksBuildPhase;
+		};
+//290
+//291
+//292
+//293
+//294
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+		4A9504CCFFE6A4B311CA0CBA = {
+			buildRules = (
+			);
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				OPTIMIZATION_CFLAGS = "-O0";
+			};
+			isa = PBXBuildStyle;
+			name = Development;
+		};
+		4A9504CDFFE6A4B311CA0CBA = {
+			buildRules = (
+			);
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+			};
+			isa = PBXBuildStyle;
+			name = Deployment;
+		};
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+//F50
+//F51
+//F52
+//F53
+//F54
+		F517D63E0356B80C016D68B9 = {
+			isa = PBXFileReference;
+			path = PSAlarmsController.m;
+			refType = 4;
+		};
+		F517D63F0356B80C016D68B9 = {
+			isa = PBXFileReference;
+			path = PSAlarmsController.h;
+			refType = 4;
+		};
+		F517D6400356B80C016D68B9 = {
+			fileRef = F517D63E0356B80C016D68B9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F517D6410356B80C016D68B9 = {
+			fileRef = F517D63F0356B80C016D68B9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F517D6420356B8CC016D68B9 = {
+			isa = PBXFileReference;
+			path = PSAlarms.m;
+			refType = 4;
+		};
+		F517D6430356B8CC016D68B9 = {
+			isa = PBXFileReference;
+			path = PSAlarms.h;
+			refType = 4;
+		};
+		F517D6440356B8CC016D68B9 = {
+			fileRef = F517D6420356B8CC016D68B9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F517D6450356B8CC016D68B9 = {
+			fileRef = F517D6430356B8CC016D68B9;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F552A8AB0358E8B201AEEDB1 = {
+			isa = PBXFileReference;
+			path = NJRScrollView.h;
+			refType = 4;
+		};
+		F552A8AC0358E8B201AEEDB1 = {
+			isa = PBXFileReference;
+			path = NJRScrollView.m;
+			refType = 4;
+		};
+		F552A8AD0358E8B201AEEDB1 = {
+			fileRef = F552A8AB0358E8B201AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F552A8AE0358E8B201AEEDB1 = {
+			fileRef = F552A8AC0358E8B201AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E2EE03574F8A01A4E466 = {
+			children = (
+				F560E2EF03574F8A01A4E466,
+			);
+			isa = PBXVariantGroup;
+			name = Alarms.nib;
+			path = "";
+			refType = 4;
+		};
+		F560E2EF03574F8A01A4E466 = {
+			isa = PBXFileReference;
+			name = English;
+			path = English.lproj/Alarms.nib;
+			refType = 4;
+		};
+		F560E2F003574F8A01A4E466 = {
+			fileRef = F560E2EE03574F8A01A4E466;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E2F10357506401A4E466 = {
+			isa = PBXFileReference;
+			path = PSApplication.m;
+			refType = 4;
+		};
+		F560E2F20357506401A4E466 = {
+			isa = PBXFileReference;
+			path = PSApplication.h;
+			refType = 4;
+		};
+		F560E2F30357506401A4E466 = {
+			fileRef = F560E2F10357506401A4E466;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E2F40357506501A4E466 = {
+			fileRef = F560E2F20357506401A4E466;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E2F6035766F101A4E466 = {
+			fileRef = 29B97318FDCFA39411CA2CEA;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E2F7035766F201A4E466 = {
+			fileRef = 089C165CFE840E0CC02AAC07;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E30D035787BB01A4E466 = {
+			isa = PBXFileReference;
+			path = "NSTableView-NJRExtensions.m";
+			refType = 4;
+		};
+		F560E30E035787BC01A4E466 = {
+			isa = PBXFileReference;
+			path = "NSTableView-NJRExtensions.h";
+			refType = 4;
+		};
+		F560E30F035787BC01A4E466 = {
+			fileRef = F560E30D035787BB01A4E466;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E310035787BC01A4E466 = {
+			fileRef = F560E30E035787BC01A4E466;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E311035787D501A4E466 = {
+			children = (
+				F517D63F0356B80C016D68B9,
+				F517D63E0356B80C016D68B9,
+				F59DC6D30353C9E601AEEDB1,
+				F59DC6D40353C9E601AEEDB1,
+				F59DC6DB0353DE5101AEEDB1,
+				F59DC6DC0353DE5101AEEDB1,
+			);
+			isa = PBXGroup;
+			name = Controllers;
+			refType = 4;
+		};
+		F560E312035787E001A4E466 = {
+			children = (
+				F59F6CB40354E7DA01AEEDB1,
+				F59F6CB50354E7DA01AEEDB1,
+				F517D6430356B8CC016D68B9,
+				F517D6420356B8CC016D68B9,
+			);
+			isa = PBXGroup;
+			name = Models;
+			refType = 4;
+		};
+		F560E313035787ED01A4E466 = {
+			children = (
+				F59DC6E90353F58B01AEEDB1,
+				F59DC6E80353F58B01AEEDB1,
+				F59DC6FC0354188F01AEEDB1,
+				F59DC6FD0354188F01AEEDB1,
+			);
+			isa = PBXGroup;
+			name = Utilities;
+			refType = 4;
+		};
+		F560E314035787F901A4E466 = {
+			children = (
+				F560E30E035787BC01A4E466,
+				F560E30D035787BB01A4E466,
+				F552A8AB0358E8B201AEEDB1,
+				F552A8AC0358E8B201AEEDB1,
+				F560E3150357895001A4E466,
+				F560E3160357895001A4E466,
+			);
+			isa = PBXGroup;
+			name = Views;
+			path = "";
+			refType = 4;
+		};
+		F560E3150357895001A4E466 = {
+			isa = PBXFileReference;
+			path = NJRHistoryTrackingComboBox.h;
+			refType = 4;
+		};
+		F560E3160357895001A4E466 = {
+			isa = PBXFileReference;
+			path = NJRHistoryTrackingComboBox.m;
+			refType = 4;
+		};
+		F560E3170357895001A4E466 = {
+			fileRef = F560E3150357895001A4E466;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F560E3180357895001A4E466 = {
+			fileRef = F560E3160357895001A4E466;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F589C9C6035AA12B0155F4B2 = {
+			isa = PBXFileReference;
+			path = "Read Me.rtfd";
+			refType = 4;
+		};
+		F589C9C7035AA12E0155F4B2 = {
+			fileRef = F589C9C6035AA12B0155F4B2;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6D30353C9E601AEEDB1 = {
+			isa = PBXFileReference;
+			path = PSAlarmSetController.h;
+			refType = 4;
+		};
+		F59DC6D40353C9E601AEEDB1 = {
+			isa = PBXFileReference;
+			path = PSAlarmSetController.m;
+			refType = 4;
+		};
+		F59DC6D50353C9E601AEEDB1 = {
+			fileRef = F59DC6D30353C9E601AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6D60353C9E601AEEDB1 = {
+			fileRef = F59DC6D40353C9E601AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6DB0353DE5101AEEDB1 = {
+			isa = PBXFileReference;
+			path = PSAlarmNotifierController.h;
+			refType = 4;
+		};
+		F59DC6DC0353DE5101AEEDB1 = {
+			isa = PBXFileReference;
+			path = PSAlarmNotifierController.m;
+			refType = 4;
+		};
+		F59DC6DD0353DE5101AEEDB1 = {
+			fileRef = F59DC6DB0353DE5101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6DE0353DE5101AEEDB1 = {
+			fileRef = F59DC6DC0353DE5101AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6DF0353DF5E01AEEDB1 = {
+			children = (
+				F59DC6E00353DF5E01AEEDB1,
+			);
+			isa = PBXVariantGroup;
+			name = Notifier.nib;
+			path = "";
+			refType = 4;
+		};
+		F59DC6E00353DF5E01AEEDB1 = {
+			isa = PBXFileReference;
+			name = English;
+			path = English.lproj/Notifier.nib;
+			refType = 4;
+		};
+		F59DC6E10353DF5E01AEEDB1 = {
+			fileRef = F59DC6DF0353DF5E01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6E30353ED1201AEEDB1 = {
+			isa = PBXFileReference;
+			path = "Application icon.icns";
+			refType = 4;
+		};
+		F59DC6E40353ED1201AEEDB1 = {
+			fileRef = F59DC6E30353ED1201AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6E80353F58B01AEEDB1 = {
+			isa = PBXFileReference;
+			path = NJRIntegerFilter.m;
+			refType = 4;
+		};
+		F59DC6E90353F58B01AEEDB1 = {
+			isa = PBXFileReference;
+			path = NJRIntegerFilter.h;
+			refType = 4;
+		};
+		F59DC6EA0353F58B01AEEDB1 = {
+			fileRef = F59DC6E80353F58B01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6EB0353F58B01AEEDB1 = {
+			fileRef = F59DC6E90353F58B01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6FC0354188F01AEEDB1 = {
+			isa = PBXFileReference;
+			path = NJRDateFormatter.h;
+			refType = 4;
+		};
+		F59DC6FD0354188F01AEEDB1 = {
+			isa = PBXFileReference;
+			path = NJRDateFormatter.m;
+			refType = 4;
+		};
+		F59DC6FE0354188F01AEEDB1 = {
+			fileRef = F59DC6FC0354188F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DC6FF0354188F01AEEDB1 = {
+			fileRef = F59DC6FD0354188F01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59DD44F0358ABF4017318D0 = {
+			children = (
+				F59DD4500358ABF4017318D0,
+			);
+			isa = PBXVariantGroup;
+			name = Credits.html;
+			path = "";
+			refType = 4;
+		};
+		F59DD4500358ABF4017318D0 = {
+			isa = PBXFileReference;
+			name = English;
+			path = English.lproj/Credits.html;
+			refType = 4;
+		};
+		F59DD4510358ABF7017318D0 = {
+			fileRef = F59DD44F0358ABF4017318D0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59F6CB40354E7DA01AEEDB1 = {
+			isa = PBXFileReference;
+			path = PSAlarm.h;
+			refType = 4;
+		};
+		F59F6CB50354E7DA01AEEDB1 = {
+			isa = PBXFileReference;
+			path = PSAlarm.m;
+			refType = 4;
+		};
+		F59F6CB60354E7DA01AEEDB1 = {
+			fileRef = F59F6CB40354E7DA01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F59F6CB70354E7DA01AEEDB1 = {
+			fileRef = F59F6CB50354E7DA01AEEDB1;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+	};
+	rootObject = 29B97313FDCFA39411CA2CEA;
+}
Index: releases/Pester/1.0/Source/VERSION
===================================================================
--- releases/Pester/1.0/Source/VERSION	(revision 29)
+++ releases/Pester/1.0/Source/VERSION	(revision 29)
@@ -0,0 +1,1 @@
+1.0
Index: releases/Pester/1.0/Source/main.m
===================================================================
--- releases/Pester/1.0/Source/main.m	(revision 29)
+++ releases/Pester/1.0/Source/main.m	(revision 29)
@@ -0,0 +1,14 @@
+//
+//  main.m
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Oct 08 2002.
+//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, const char *argv[])
+{
+    return NSApplicationMain(argc, argv);
+}
Index: releases/Pester/1.0/package-Pester.sh
===================================================================
--- releases/Pester/1.0/package-Pester.sh	(revision 29)
+++ releases/Pester/1.0/package-Pester.sh	(revision 29)
@@ -0,0 +1,48 @@
+#!/bin/zsh
+
+# stuff to do:
+# hdiutil create DiskImage.dmg -megabytes <size> -layout NONE
+# hdid -nomount DiskImage.dmg
+# sudo /sbin/newfs_hfs -w -v VolumeName -b 4096 /dev/disk2
+# hdiutil eject /dev/disk2
+
+# also check out 'build' on mosxland.sf.net
+
+set -x -v
+
+PACKAGEDIR="$PWD"
+PRODUCT="Pester"
+
+cd "$PACKAGEDIR"/Source && \
+find . -name \*~\* -exec rm -r '{}' \; && \
+VERSION=`cat VERSION` && \
+DMG="$PRODUCT-$VERSION.dmg" VOL="$PRODUCT $VERSION" MOUNTPOINT="/Volumes/$VOL" && \
+DSTROOT="$PACKAGEDIR/$VOL" && \
+sudo rm -fr "$DSTROOT" && \
+rm -rf build/ && \
+pbxbuild install "DSTROOT=$DSTROOT" && \
+ditto -rsrc "$PACKAGEDIR"/Source "$DSTROOT"/Source && \
+ditto -rsrc "${PACKAGEDIR}/Read Me" "$DSTROOT" && \
+rm -rf "$DSTROOT"/Source/build "${DSTROOT}/Source/Read Me.rtfd" && \
+#breaks in 10.2 and later, sigh.
+#mkdir "$DSTROOT/Read Me.rtfd" && \
+#cd "$DSTROOT/Read Me.rtfd" && \
+#for i in "../Pester.app/Contents/Resources/Read Me.rtfd"/*; do ln -s "$i"; done && \
+find "$DSTROOT" -name ".svn" -exec sudo /bin/rm -rf "{}" \; ; \
+cd "$PACKAGEDIR" && \
+rm -f "$DMG" && \
+hdiutil create "$DMG" -megabytes 5 -ov -type UDIF && \
+DISK=`hdid -nomount "$DMG" | sed -ne ' /Apple_partition_scheme/ s|^/dev/\([^ ]*\).*$|\1|p'` && \
+newfs_hfs -v "$VOL" "/dev/r${DISK}s2" && \
+hdiutil eject "$DISK" && \
+hdid "$DMG" && \
+ditto -rsrc "$DSTROOT" "$MOUNTPOINT" && \
+chmod -R a+rX,u+w "$MOUNTPOINT" && \
+openUp "$MOUNTPOINT" && \
+# sleep 2 && \
+hdiutil eject $DISK && \
+# osascript -e "tell application \"Finder\" to eject disk \"$VOL\"" && \
+hdiutil convert "$DMG" -format UDZO -imagekey zlib-level=9 -o "z$DMG" && \
+mv "z$DMG" "$DMG" && \
+#scp "$DMG" ainaz:web/nriley/software/ && \
+:
