diff --git a/AppKit/AppKit.j b/AppKit/AppKit.j index 0f82e3e88..b9de2065b 100644 --- a/AppKit/AppKit.j +++ b/AppKit/AppKit.j @@ -101,6 +101,7 @@ @import "CPTabView.j" @import "CPText.j" @import "CPTextField.j" +@import "CPTextView.j" @import "CPTokenField.j" @import "CPToolbar.j" @import "CPToolbarItem.j" diff --git a/AppKit/CPBox.j b/AppKit/CPBox.j index 9ab1d47d1..dd8c35192 100644 --- a/AppKit/CPBox.j +++ b/AppKit/CPBox.j @@ -630,7 +630,11 @@ var CPBoxTypeKey = @"CPBoxTypeKey", [_contentView setSubviews:[malformedContentView subviews]]; [self replaceSubview:malformedContentView with:_contentView]; } - + else + { + _titlePosition = CPNoTitle; + } + [self setAutoresizesSubviews:YES]; [_contentView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index b7ff621d0..a980cc953 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -31,6 +31,7 @@ @import "CPDragServer_Constants.j" @import "CPPasteboard.j" @import "CPView.j" +@import "CPKeyValueBinding.j" @class _CPCollectionViewDropIndicator @@ -132,7 +133,6 @@ var HORIZONTAL_MARGIN = 2; CGSize _storedFrameSize; BOOL _uniformSubviewsResizing @accessors(property=uniformSubviewsResizing); - BOOL _lockResizing; CPInteger _currentDropIndex; CPDragOperation _currentDragOperation; @@ -140,6 +140,14 @@ var HORIZONTAL_MARGIN = 2; _CPCollectionViewDropIndicator _dropView; } ++ (Class)_binderClassForBinding:(CPString)aBinding +{ + if (aBinding == CPContentBinding) + return [_CPCollectionViewContentBinder class]; + + return [super _binderClassForBinding:aBinding]; +} + - (id)initWithFrame:(CGRect)aFrame { self = [super initWithFrame:aFrame]; @@ -182,7 +190,7 @@ var HORIZONTAL_MARGIN = 2; _needsMinMaxItemSizeUpdate = YES; _uniformSubviewsResizing = NO; - _lockResizing = NO; + _inLiveResize = NO; _currentDropIndex = -1; _currentDragOperation = CPDragOperationNone; @@ -384,14 +392,7 @@ var HORIZONTAL_MARGIN = 2; _isSelectable = isSelectable; if (!_isSelectable) - { - var index = CPNotFound, - itemCount = [_items count]; - - // Be wary of invalid selection ranges since setContent: does not clear selection indexes. - while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound && index < itemCount) - [_items[index] setSelected:NO]; - } + [self _applySelectionToItems:NO]; } /*! @@ -445,22 +446,15 @@ var HORIZONTAL_MARGIN = 2; { if (!anIndexSet) anIndexSet = [CPIndexSet indexSet]; + if (!_isSelectable || [_selectionIndexes isEqual:anIndexSet]) return; - var index = CPNotFound, - itemCount = [_items count]; - - // Be wary of invalid selection ranges since setContent: does not clear selection indexes. - while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !== CPNotFound && index < itemCount) - [_items[index] setSelected:NO]; + [self _applySelectionToItems:NO]; _selectionIndexes = anIndexSet; - var index = CPNotFound; - - while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !== CPNotFound) - [_items[index] setSelected:YES]; + [self _applySelectionToItems:YES]; var binderClass = [[self class] _binderClassForBinding:@"selectionIndexes"]; [[binderClass getBinding:@"selectionIndexes" forObject:self] reverseSetValueFor:@"selectionIndexes"]; @@ -525,14 +519,14 @@ var HORIZONTAL_MARGIN = 2; - (void)resizeWithOldSuperviewSize:(CGSize)oldBoundsSize { - if (_lockResizing) + if (_inLiveResize) return; - _lockResizing = YES; + _inLiveResize = YES; [self tile]; - _lockResizing = NO; + _inLiveResize = NO; } - (void)tile @@ -972,6 +966,20 @@ var HORIZONTAL_MARGIN = 2; return frame; } +- (void)_applySelectionToItems:(BOOL)select +{ + var numberOfItems = [_items count]; + + [_selectionIndexes enumerateIndexesUsingBlock:function(idx, stop) + { + if (idx < numberOfItems) + [[_items objectAtIndex:idx] setSelected:select]; + else { + stop(YES); + } + }]; +} + @end @implementation CPCollectionView (DragAndDrop) @@ -1586,3 +1594,14 @@ var CPCollectionViewMinItemSizeKey = @"CPCollectionViewMinItemSizeK } @end + +@implementation _CPCollectionViewContentBinder : CPBinder +{ +} + +- (void)setValue:(id)aValue forBinding:(CPString)aBinding +{ + [_source setContent:aValue]; +} + +@end diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index 2e3d1d31a..813a0995a 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -100,8 +100,10 @@ var cachedBlackColor, + (CPDictionary)themeAttributes { return @{ - @"alternate-selected-control-color": [CPNull null], - @"secondary-selected-control-color" : [CPNull null] + @"alternate-selected-control-color": [CPNull null], + @"secondary-selected-control-color": [CPNull null], + @"selected-text-background-color": [CPNull null], + @"selected-text-inactive-background-color": [CPNull null] }; } @@ -498,6 +500,16 @@ var cachedBlackColor, return [[CPColor alloc] _initWithCSSString: aString]; } ++ (CPColor)selectedTextBackgroundColor +{ + return [[self _cachedThemeColor] valueForThemeAttribute:@"selected-text-background-color"] || [CPColor colorWithHexString:"99CCFF"]; +} + ++ (CPColor)_selectedTextBackgroundColorUnfocussed +{ + return [[self _cachedThemeColor] valueForThemeAttribute:@"selected-text-inactive-background-color"] || [CPColor colorWithHexString:"CCCCCC"]; +} + /* @ignore */ - (id)_initWithCSSString:(CPString)aString { diff --git a/AppKit/CPColorPicker.j b/AppKit/CPColorPicker.j index ea3afcd88..66af9b289 100644 --- a/AppKit/CPColorPicker.j +++ b/AppKit/CPColorPicker.j @@ -125,7 +125,8 @@ _brightnessSlider = [[CPSlider alloc] initWithFrame:CGRectMake(0, (aFrame.size.height - 34), aFrame.size.width, 15)]; [_brightnessSlider setValue:15.0 forThemeAttribute:@"track-width"]; - [_brightnessSlider setValue:[CPColor colorWithPatternImage:[[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPColorPicker class]] pathForResource:@"brightness_bar.png"]]] forThemeAttribute:@"track-color"]; + var brightnessImage = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPColorPicker class]] pathForResource:@"brightness_bar.png"] size:CGSizeMake(272, 20)]; + [_brightnessSlider setValue:[CPColor colorWithPatternImage:brightnessImage] forThemeAttribute:@"track-color"]; [_brightnessSlider setMinValue:0.0]; [_brightnessSlider setMaxValue:100.0]; diff --git a/AppKit/CPColorWell.j b/AppKit/CPColorWell.j index 15fa5343b..fb1b0f0dc 100644 --- a/AppKit/CPColorWell.j +++ b/AppKit/CPColorWell.j @@ -255,6 +255,8 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv var colorPanel = [CPColorPanel sharedColorPanel]; + [colorPanel setPlatformWindow:[[self window] platformWindow]]; + [colorPanel setColor:_color]; [colorPanel orderFront:self]; } diff --git a/AppKit/CPCompatibility.j b/AppKit/CPCompatibility.j index d70ffeda3..d58471fe7 100644 --- a/AppKit/CPCompatibility.j +++ b/AppKit/CPCompatibility.j @@ -26,11 +26,12 @@ // Browser Engines CPUnknownBrowserEngine = 0; -CPGeckoBrowserEngine = 1; -CPInternetExplorerBrowserEngine = 2; -CPKHTMLBrowserEngine = 3; -CPOperaBrowserEngine = 4; -CPWebKitBrowserEngine = 5; +CPGeckoBrowserEngine = 1 << 0; +CPInternetExplorerBrowserEngine = 1 << 1; +CPKHTMLBrowserEngine = 1 << 2; +CPOperaBrowserEngine = 1 << 3; +CPWebKitBrowserEngine = 1 << 4; // Safari + Chrome +CPBlinkBrowserEngine = 1 << 5; // Recent Chrome // Operating Systems CPMacOperatingSystem = 0; @@ -80,18 +81,27 @@ CPFileAPIFeature = 31; CPAltEnterTextAreaFeature = 32; - +CPCSSAnimationFeature = 33; /* When an absolutely positioned div (CPView) with an absolutely positioned canvas in it (CPView with drawRect:) moves things on top of the canvas (subviews) don't redraw correctly. E.g. if you have a bunch of text fields in a CPBox in a sheet which animates in, some of the text fields might not be visible because the CPBox has a canvas at the bottom and the box moved form offscreen to onscreen. This bug is probably very related: https://bugs.webkit.org/show_bug.cgi?id=67203 -*/ + */ CPCanvasParentDrawErrorsOnMovementBug = 1 << 0; // The paste event is only sent if an input or textarea has focus. -CPJavaScriptPasteRequiresEditableTarget = 1 << 1; +CPJavaScriptPasteRequiresEditableTarget = 1 << 1; // Redirecting the focus of the browser on keydown to an input for Cmd-V or Ctrl-V makes the paste fail. CPJavaScriptPasteCantRefocus = 1 << 2; +/* + Safari calculates incorrect text size unless you set the canvas font even if it is already set + You can see the bug after disabling the workaround and opening any panel while typing. + You can use the font panel in the manual test for CPTextView. + Look out for a displaced cursor, i.e. after typing letters of small width, such as the 'i'. + https://bugs.webkit.org/show_bug.cgi?id=150224 + */ +CPTextSizingAlwaysNeedsSetFontBug = 1 << 3; + var USER_AGENT = "", PLATFORM_ENGINE = CPUnknownBrowserEngine, @@ -110,15 +120,15 @@ if (typeof window !== "undefined" && typeof window.navigator !== "undefined") // Opera if (typeof window !== "undefined" && window.opera) { - PLATFORM_ENGINE = CPOperaBrowserEngine; + PLATFORM_ENGINE |= CPOperaBrowserEngine; PLATFORM_FEATURES[CPJavaScriptCanvasDrawFeature] = YES; } // Internet Explorer -else if (typeof window !== "undefined" && window.attachEvent) // Must follow Opera check. +else if (typeof window !== "undefined" && (window.attachEvent || (!(window.ActiveXObject) && "ActiveXObject" in window))) // Must follow Opera check. { - PLATFORM_ENGINE = CPInternetExplorerBrowserEngine; + PLATFORM_ENGINE |= CPInternetExplorerBrowserEngine; // Features we can only be sure of with IE (no known independent tests) PLATFORM_FEATURES[CPVMLFeature] = YES; @@ -136,10 +146,10 @@ else if (typeof window !== "undefined" && window.attachEvent) // Must follow Ope PLATFORM_FEATURES[CPJavaScriptClipboardAccessFeature] = YES; } -// WebKit +// Safari + Chrome (WebKit and Blink) else if (USER_AGENT.indexOf("AppleWebKit/") != -1) { - PLATFORM_ENGINE = CPWebKitBrowserEngine; + PLATFORM_ENGINE |= CPWebKitBrowserEngine; // Features we can only be sure of with WebKit (no known independent tests) PLATFORM_FEATURES[CPCSSRGBAFeature] = YES; @@ -179,7 +189,10 @@ else if (USER_AGENT.indexOf("AppleWebKit/") != -1) PLATFORM_BUGS |= CPJavaScriptPasteRequiresEditableTarget; // https://bugs.webkit.org/show_bug.cgi?id=39689 PLATFORM_BUGS |= CPJavaScriptPasteCantRefocus; + PLATFORM_BUGS |= CPTextSizingAlwaysNeedsSetFontBug; } + else if ((window.chrome || (window.Intl && Intl.v8BreakIterator)) && 'CSS' in window) + PLATFORM_ENGINE |= CPBlinkBrowserEngine; // Assume this bug was introduced around Safari 5.1/Chrome 16. This could probably be tighter. if (majorVersion > 533) @@ -189,13 +202,13 @@ else if (USER_AGENT.indexOf("AppleWebKit/") != -1) // KHTML else if (USER_AGENT.indexOf("KHTML") != -1) // Must follow WebKit check. { - PLATFORM_ENGINE = CPKHTMLBrowserEngine; + PLATFORM_ENGINE |= CPKHTMLBrowserEngine; } // Gecko else if (USER_AGENT.indexOf("Gecko") !== -1) // Must follow KHTML check. { - PLATFORM_ENGINE = CPGeckoBrowserEngine; + PLATFORM_ENGINE |= CPGeckoBrowserEngine; PLATFORM_FEATURES[CPJavaScriptCanvasDrawFeature] = YES; @@ -286,7 +299,7 @@ function CPPlatformHasBug(aBug) function CPBrowserIsEngine(anEngine) { - return PLATFORM_ENGINE === anEngine; + return PLATFORM_ENGINE & anEngine; } function CPBrowserIsOperatingSystem(anOperatingSystem) @@ -322,6 +335,14 @@ else CPRedoKeyEquivalentModifierMask = CPControlKeyMask; } +/*! + Sets a feature with the given value. +*/ +function CPSetPlatformFeature(aFeature, aBool) +{ + PLATFORM_FEATURES[aFeature] = aBool; +} + /*! Return the properly prefixed JS property for the given name. E.g. in a webkit browser, CPBrowserStyleProperty('transition') -> WebkitTransition diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 26aaca67d..94286202a 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -25,7 +25,7 @@ @import "CPFont.j" @import "CPShadow.j" -@import "CPView.j" +@import "CPText.j" @import "CPKeyValueBinding.j" @import "CPTrackingArea.j" @@ -169,7 +169,7 @@ var CPControlBlackColor = [CPColor blackColor]; } /*! - Reverse set the binding iff the CPContinuouslyUpdatesValueBindingOption is set. + Reverse set the binding if the CPContinuouslyUpdatesValueBindingOption is set. */ - (void)_continuouslyReverseSetBinding { diff --git a/AppKit/CPEvent.j b/AppKit/CPEvent.j index 66837649d..42dbad35b 100644 --- a/AppKit/CPEvent.j +++ b/AppKit/CPEvent.j @@ -28,7 +28,6 @@ @import "CPCompatibility.j" @import "CGGeometry.j" -@import "CPText.j" @import "CPTrackingArea.j" @class CPTextField @@ -36,6 +35,9 @@ @class CPGraphicsContext @global CPApp +@global CPNewlineCharacter +@global CPCarriageReturnCharacter +@global CPEnterCharacter @typedef DOMEvent @typedef CPEventType @@ -83,7 +85,7 @@ var _CPEventPeriodicEventPeriod = 0, BOOL _suppressCappuccinoCut; BOOL _suppressCappuccinoPaste; #endif - + CPTrackingArea _trackingArea; } @@ -146,7 +148,7 @@ var _CPEventPeriodicEventPeriod = 0, /*! Creates a new mouse tracking event. - + @param anEventType the event type @param aPoint the location of the cursor in the window specified by \c aWindowNumber @param modifierFlags a bitwise combination of the modifiers specified in the CPEvent globals @@ -232,7 +234,7 @@ var _CPEventPeriodicEventPeriod = 0, { if ((anEventType != CPMouseEntered) && (anEventType != CPMouseExited) && (anEventType != CPCursorUpdate)) [CPException raise:CPInternalInconsistencyException reason:"Invalid event type"]; - + if (self = [self _initWithType:anEventType]) { _location = CGPointCreateCopy(aPoint); @@ -243,7 +245,7 @@ var _CPEventPeriodicEventPeriod = 0, _trackingArea = aTrackingArea; _window = [CPApp windowWithWindowNumber:aWindowNumber]; } - + return self; } @@ -336,6 +338,14 @@ var _CPEventPeriodicEventPeriod = 0, return _type; } +/*! + Returns the subtype of the event. +*/ +- (CPEventType)subtype +{ + return _subtype; +} + /*! Returns the event's associated window. */ @@ -633,7 +643,7 @@ var _CPEventPeriodicEventPeriod = 0, { if ((_type !== CPMouseEntered) && (_type !== CPMouseExited) && (_type !== CPCursorUpdate)) [CPException raise:CPInternalInconsistencyException format:@"You can't call trackingArea for events of type %#x", _type] - + return _trackingArea; } diff --git a/AppKit/CPFont.j b/AppKit/CPFont.j index 24e8190cd..90bc28826 100644 --- a/AppKit/CPFont.j +++ b/AppKit/CPFont.j @@ -24,6 +24,7 @@ @import @import "CPView.j" +@import "CPFontDescriptor.j" CPFontDefaultSystemFontFace = @"Arial, sans-serif"; CPFontDefaultSystemFontSize = 12; @@ -433,6 +434,43 @@ following: @end +@implementation CPFont(DescriptorAdditions) + +- (id)_initWithFontDescriptor:(CPFontDescriptor)fontDescriptor +{ + var aName = [fontDescriptor objectForKey: CPFontNameAttribute] , + aSize = [fontDescriptor pointSize], + isBold = [fontDescriptor symbolicTraits] & CPFontBoldTrait, + isItalic = [fontDescriptor symbolicTraits] & CPFontItalicTrait; + + return [self _initWithName:aName size:aSize bold:isBold italic:isItalic system:NO]; +} + ++ (CPFont)fontWithDescriptor:(CPFontDescriptor)fontDescriptor size:(float)aSize +{ + var aName = [fontDescriptor objectForKey: CPFontNameAttribute], + isBold = [fontDescriptor symbolicTraits] & CPFontBoldTrait, + isItalic = [fontDescriptor symbolicTraits] & CPFontItalicTrait; + + return [self _fontWithName:aName size:aSize || [fontDescriptor pointSize] bold:isBold italic:isItalic]; +} + +- (CPFontDescriptor)fontDescriptor +{ + var traits = 0; + + if ([self isBold]) + traits |= CPFontBoldTrait; + + if ([self isItalic]) + traits |= CPFontItalicTrait; + + return [[CPFontDescriptor fontDescriptorWithName:_name size:_size] fontDescriptorWithSymbolicTraits:traits]; +} + +@end + + var CPFontNameKey = @"CPFontNameKey", CPFontSizeKey = @"CPFontSizeKey", CPFontIsBoldKey = @"CPFontIsBoldKey", diff --git a/AppKit/CPFontManager.j b/AppKit/CPFontManager.j index b470025ba..ffffe6464 100644 --- a/AppKit/CPFontManager.j +++ b/AppKit/CPFontManager.j @@ -22,9 +22,12 @@ @import +@import "CPControl.j" @import "CPFont.j" +@import "CPFontDescriptor.j" @global CPApp +@class CPFontPanel CPItalicFontMask = 1 << 0; CPBoldFontMask = 1 << 1; @@ -41,7 +44,20 @@ CPUnitalicFontMask = 1 << 24; var CPSharedFontManager = nil, - CPFontManagerFactory = Nil; + CPFontManagerFactory = nil, + CPFontPanelFactory = nil; + +/* + modifyFont: sender's tag +*/ +CPNoFontChangeAction = 0; +CPViaPanelFontAction = 1; +CPAddTraitFontAction = 2; +CPSizeUpFontAction = 3; +CPSizeDownFontAction = 4; +CPHeavierFontAction = 5; +CPLighterFontAction = 6; +CPRemoveTraitFontAction = 7; /*! @ingroup appkit @@ -59,6 +75,8 @@ var CPSharedFontManager = nil, BOOL _multiple @accessors(getter=isMultiple, setter=setMultiple:); CPDictionary _activeChange; + + unsigned _fontAction; } // Getting the Shared Font Manager @@ -83,6 +101,15 @@ var CPSharedFontManager = nil, { CPFontManagerFactory = aClass; } +/*! + Sets the class that will be used to create the application's + Font panel. +*/ ++ (void)setFontPanelFactory:(Class)aClass +{ + CPFontPanelFactory = aClass; +} + - (id)init { @@ -210,6 +237,7 @@ var CPSharedFontManager = nil, { var tag = [sender tag]; _activeChange = tag === nil ? @{} : @{ @"addTraits": tag }; + _fontAction = CPAddTraitFontAction; [self sendAction]; } @@ -219,6 +247,185 @@ var CPSharedFontManager = nil, return [CPApp sendAction:_action to:_target from:self]; } + +/*! + This method open the font panel, create it if necessary. + @param sender The object that sent the message. +*/ +- (CPFontPanel)fontPanel:(BOOL)createIt +{ + var panel = nil, + panelExists = [CPFontPanelFactory sharedFontPanelExists]; + + if ((panelExists) || (!panelExists && createIt)) + panel = [CPFontPanelFactory sharedFontPanel]; + + return panel; +} + +/*! + Convert a font to have the specified Font traits. The font is unchanged expect for the specified Font traits. + Using CPUnboldFontMask or CPUnitalicFontMask will respectively remove Bold and Italic traits. + @param aFont The font to convert. + @param fontTrait The new font traits mask. + @result The converted font or \c aFont if the conversion failed. +*/ +- (CPFont)convertFont:(CPFont)aFont toHaveTrait:(CPFontTraitMask)fontTrait +{ + var attributes = [[[aFont fontDescriptor] fontAttributes] copy], + symbolicTrait = [[aFont fontDescriptor] symbolicTraits]; + + if (fontTrait & CPBoldFontMask) + symbolicTrait |= CPFontBoldTrait; + + if (fontTrait & CPItalicFontMask) + symbolicTrait |= CPFontItalicTrait; + + if (fontTrait & CPUnboldFontMask) /* FIXME: this only change CPFontSymbolicTrait what about CPFontWeightTrait */ + symbolicTrait &= ~CPFontBoldTrait; + + if (fontTrait & CPUnitalicFontMask) + symbolicTrait &= ~CPFontItalicTrait; + + if (fontTrait & CPExpandedFontMask) + symbolicTrait |= CPFontExpandedTrait; + + if (fontTrait & CPSmallCapsFontMask) + symbolicTrait |= CPFontSmallCapsTrait; + + if (![attributes containsKey:CPFontTraitsAttribute]) + [attributes setObject:[CPDictionary dictionaryWithObject:[CPNumber numberWithUnsignedInt:symbolicTrait] + forKey:CPFontSymbolicTrait] + forKey:CPFontTraitsAttribute]; + else + [[attributes objectForKey:CPFontTraitsAttribute] setObject:[CPNumber numberWithUnsignedInt:symbolicTrait] + forKey:CPFontSymbolicTrait]; + + return [[aFont class] fontWithDescriptor:[CPFontDescriptor fontDescriptorWithFontAttributes:attributes] size:0.0]; +} + +/*! + Convert a font to not have the specified Font traits. The font is unchanged expect for the specified Font traits. + @param aFont The font to convert. + @param fontTrait The font traits mask to remove. + @result The converted font or \c aFont if the conversion failed. +*/ +- (CPFont)convertFont:(CPFont)aFont toNotHaveTrait:(CPFontTraitMask)fontTrait +{ + var attributes = [[[aFont fontDescriptor] fontAttributes] copy], + symbolicTrait = [[aFont fontDescriptor] symbolicTraits]; + + if ((fontTrait & CPBoldFontMask) || (fontTrait & CPUnboldFontMask)) /* FIXME: see convertFont:toHaveTrait: about CPFontWeightTrait */ + symbolicTrait &= ~CPFontBoldTrait; + + if ((fontTrait & CPItalicFontMask) || (fontTrait & CPUnitalicFontMask)) + symbolicTrait &= ~CPFontItalicTrait; + + if (fontTrait & CPExpandedFontMask) + symbolicTrait &= ~CPFontExpandedTrait; + + if (fontTrait & CPSmallCapsFontMask) + symbolicTrait &= ~CPFontSmallCapsTrait; + + if (![attributes containsKey:CPFontTraitsAttribute]) + [attributes setObject:[CPDictionary dictionaryWithObject:[CPNumber numberWithUnsignedInt:symbolicTrait] + forKey:CPFontSymbolicTrait] + forKey:CPFontTraitsAttribute]; + else + [[attributes objectForKey:CPFontTraitsAttribute] setObject:[CPNumber numberWithUnsignedInt:symbolicTrait] + forKey:CPFontSymbolicTrait]; + + return [[aFont class] fontWithDescriptor:[CPFontDescriptor fontDescriptorWithFontAttributes:attributes] size:0.0]; +} + +/*! + Convert a font to have specified size. The font is unchanged expect for the specified size. + @param aFont The font to convert. + @param aSize The new font size. + @result The converted font or \c aFont if the conversion failed. +*/ +- (CPFont)convertFont:(CPFont)aFont toSize:(float)aSize +{ + var descriptor = [aFont fontDescriptor]; + + return [[aFont class] fontWithDescriptor: descriptor size:aSize] +} + +- (void)orderFrontFontPanel:(id)sender +{ + [[self fontPanel:YES] orderFront:sender]; +} + +- (void)modifyFont:(id)sender +{ + _fontAction = [sender tag]; + [self sendAction]; + + if (_selectedFont) + [self setSelectedFont:[self convertFont:_selectedFont] isMultiple:NO]; +} + +/*! + This method causes the receiver to send its action message. + @param sender The object that sent the message. (a Font panel) +*/ +- (void)modifyFontViaPanel:(id)sender +{ + _fontAction = CPViaPanelFontAction; + if (_selectedFont) + [self setSelectedFont:[self convertFont:_selectedFont] isMultiple:NO]; + + [self sendAction]; +} + +/*! + Convert a font according to current font changes, provided by the object that initiated the font change. + @param aFont The font to convert. + @result The converted font or \c aFont if the conversion failed. +*/ +- (CPFont)convertFont:(CPFont)aFont +{ + var newFont = nil; + switch (_fontAction) + { + case CPNoFontChangeAction: + newFont = aFont; + break; + + case CPViaPanelFontAction: + newFont = [[self fontPanel:NO] panelConvertFont:aFont]; + break; + + case CPAddTraitFontAction: + newFont = aFont; + if (!_activeChange) + break; + + var addTraits = [_activeChange valueForKey:@"addTraits"]; + + if (addTraits) + newFont = [self convertFont:aFont toHaveTrait:addTraits]; + break; + + case CPSizeUpFontAction: + newFont = [self convertFont:aFont toSize:[aFont size] + 1.0]; /* any limit ? */ + break; + + case CPSizeDownFontAction: + if ([aFont size] > 1) + newFont = [self convertFont:aFont toSize:[aFont size] - 1.0]; + /* else CPBeep() :-p */ + break; + + default: + CPLog.trace(@"-[" + [self className] + " " + _cmd + "] unsupported font action: " + _fontAction + " aFont unchanged"); + newFont = aFont; + break; + } + + return newFont; +} + @end var _CPFontDetectSpan, diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index c104eba86..d524590d4 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -918,6 +918,7 @@ CPTextColorBinding = @"textColor"; CPTitleBinding = @"title"; CPToolTipBinding = @"toolTip"; CPValueBinding = @"value"; +CPAttributedStringBinding = @"attributedString"; CPValueURLBinding = @"valueURL"; CPValuePathBinding = @"valuePath"; CPDataBinding = @"data"; diff --git a/AppKit/CPObjectController.j b/AppKit/CPObjectController.j index addc031b9..6bd5102db 100644 --- a/AppKit/CPObjectController.j +++ b/AppKit/CPObjectController.j @@ -192,6 +192,12 @@ */ - (void)setEntityName:(CPString)newEntityName { + if (!_managedProxy) + { + _managedProxy = [[_CPManagedProxy alloc] init]; + _isUsingManagedProxy = YES; + } + [_managedProxy setEntityName:newEntityName]; } diff --git a/AppKit/CPPasteboard.j b/AppKit/CPPasteboard.j index 5372a5bef..4e75db8eb 100644 --- a/AppKit/CPPasteboard.j +++ b/AppKit/CPPasteboard.j @@ -44,6 +44,7 @@ CPStringPboardType = @"CPStringPboardType"; CPURLPboardType = @"CPURLPboardType"; CPImagesPboardType = @"CPImagesPboardType"; CPVideosPboardType = @"CPVideosPboardType"; +CPRTFPboardType = @"CPRTFPboardType"; UTF8PboardType = @"public.utf8-plain-text"; @@ -51,8 +52,7 @@ UTF8PboardType = @"public.utf8-plain-text"; CPImagePboardType = @"CPImagePboardType"; -var CPPasteboards = nil, - supportsNativePasteboard = NO; +var CPPasteboards = nil; /*! @ingroup appkit @@ -68,8 +68,6 @@ var CPPasteboards = nil, unsigned _changeCount; CPString _stateUID; - - CPWebScriptObject _nativePasteboard; } /* @@ -83,9 +81,6 @@ var CPPasteboards = nil, [self setVersion:1.0]; CPPasteboards = @{}; - - if (typeof window.cpPasteboardWithName !== "undefined") - supportsNativePasteboard = YES; } /*! @@ -128,12 +123,6 @@ var CPPasteboards = nil, _provided = @{}; _changeCount = 0; - - if (supportsNativePasteboard) - { - _nativePasteboard = window.cpPasteboardWithName(aName); - [self _synchronizePasteboard]; - } } return self; @@ -163,15 +152,6 @@ var CPPasteboards = nil, [_owners setObject:anOwner forKey:type]; } - if (_nativePasteboard) - { - var nativeTypes = [types copy]; - if ([types containsObject:CPStringPboardType]) - nativeTypes.push(UTF8PboardType); - - _nativePasteboard.addTypes_(nativeTypes); - } - return ++_changeCount; } @@ -182,12 +162,6 @@ var CPPasteboards = nil, @return the pasteboard's change count */ - (unsigned)declareTypes:(CPArray)types owner:(id)anOwner -{ - [self _declareTypes:types owner:anOwner updateNativePasteboard:YES]; -} - -/*! @ignore */ -- (unsigned)_declareTypes:(CPArray)types owner:(id)anOwner updateNativePasteboard:(BOOL)shouldUpdate { [_types setArray:types]; @@ -201,16 +175,6 @@ var CPPasteboards = nil, [_owners setObject:anOwner forKey:_types[count]]; } - if (_nativePasteboard && shouldUpdate) - { - var nativeTypes = [types copy]; - if ([types containsObject:CPStringPboardType]) - nativeTypes.push(UTF8PboardType); - - _nativePasteboard.declareTypes_(nativeTypes); - _changeCount = _nativePasteboard.changeCount(); - } - return ++_changeCount; } @@ -273,7 +237,6 @@ var CPPasteboards = nil, */ - (CPArray)types { - [self _synchronizePasteboard]; return _types; } @@ -312,36 +275,6 @@ var CPPasteboards = nil, return nil; } -- (void)_synchronizePasteboard -{ - if (_nativePasteboard && _nativePasteboard.changeCount() > _changeCount) - { - var nativeTypes = [_nativePasteboard.types() copy]; - if ([nativeTypes containsObject:UTF8PboardType]) - nativeTypes.push(CPStringPboardType); - - [self _declareTypes:nativeTypes owner:self updateNativePasteboard:NO]; - - _changeCount = _nativePasteboard.changeCount(); - } -} - -/*! @ignore - method provided for integration with native pasteboard -*/ -- (void)pasteboard:(CPPasteboard)aPasteboard provideDataForType:(CPString)aType -{ - if (aType === CPStringPboardType) - { - var string = _nativePasteboard.stringForType_(UTF8PboardType); - - [self setString:string forType:CPStringPboardType]; - [self setString:string forType:UTF8PboardType]; - } - else - [self setString:_nativePasteboard.stringForType_(aType) forType:aType]; -} - /*! Returns the property list for the specified data type @param aType the requested data type diff --git a/AppKit/CPPopUpButton.j b/AppKit/CPPopUpButton.j index 6eecf9420..12f7b8638 100644 --- a/AppKit/CPPopUpButton.j +++ b/AppKit/CPPopUpButton.j @@ -847,7 +847,17 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); { var count = [aValue count], options = [_info objectForKey:CPOptionsKey], - offset = [self _getInsertNullOffset]; + offset = [self _getInsertNullOffset], + selectedBindingInfo = [_source infoForBinding:CPSelectedObjectBinding], + selectedObject = nil; + + if (selectedBindingInfo) + { + var destination = [selectedBindingInfo objectForKey:CPObservedObjectKey], + keyPath = [selectedBindingInfo objectForKey:CPObservedKeyPathKey]; + + selectedObject = [destination valueForKeyPath:keyPath]; + } if (count + offset != [_source numberOfItems]) { @@ -858,9 +868,19 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); for (var i = 0; i < count; i++) { - var item = [[CPMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:nil]; - [self _setValue:[aValue objectAtIndex:i] forItem:item withOptions:options]; + var item = [[CPMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:nil], + itemValue = [aValue objectAtIndex:i]; + + [self _setValue:itemValue forItem:item withOptions:options]; [_source addItem:item]; + + // Select this item if it is the one selected by the selected object binding + // This is needed if the selected object binding is set before the items + // from the content binding + if (itemValue === selectedObject) + { + [_source setSelectedIndex:[_source numberOfItems] - 1]; + } } } else diff --git a/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j b/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j index 0ce2e2f0e..70768f15e 100644 --- a/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j +++ b/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j @@ -471,9 +471,11 @@ CPTransformableAttributeType = 1800; var value; if (attributeType >= CPInteger16AttributeType && attributeType <= CPFloatAttributeType) - value = [aView intValue]; + value = [aView floatValue]; else if (attributeType == CPBooleanAttributeType) value = [aView state]; + else if (attributeType == CPDateAttributeType) + value = [aView dateValue]; else value = [aView stringValue]; diff --git a/AppKit/CPRuleEditor/CPRuleEditor.j b/AppKit/CPRuleEditor/CPRuleEditor.j index 141e06d63..ac3bcd52c 100644 --- a/AppKit/CPRuleEditor/CPRuleEditor.j +++ b/AppKit/CPRuleEditor/CPRuleEditor.j @@ -146,7 +146,7 @@ var CPRuleEditorItemPBoardType = @"CPRuleEditorItemPBoardType", @"slice-top-border-color": [CPNull null], @"slice-bottom-border-color": [CPNull null], @"slice-last-bottom-border-color": [CPNull null], - @"font": [CPNull null], + @"font": [CPFont systemFontOfSize:12], @"font-color": [CPNull null], @"add-image": [CPNull null], @"remove-image": [CPNull null], diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j index 80509dd16..c7d1524ff 100644 --- a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j +++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j @@ -366,11 +366,12 @@ count = [_ruleOptionViews count], sliceFrame = [self frame], image = [_ruleEditor _imageAdd], + imageSize = image ? [image size] : CGSizeMake(0,0), - buttonFrame = CGRectMake(CGRectGetWidth(sliceFrame) - [image size].width - [self _rowButtonsRightHorizontalPadding], ([_ruleEditor rowHeight] - [image size].height) / 2 - 1, [image size].width, [image size].height); + buttonFrame = CGRectMake(CGRectGetWidth(sliceFrame) - imageSize.width - [self _rowButtonsRightHorizontalPadding], ([_ruleEditor rowHeight] - imageSize.height) / 2 - 1, imageSize.width, imageSize.height); [_addButton setFrame:buttonFrame]; - buttonFrame.origin.x -= [image size].width + [self _rowButtonsInterviewHorizontalPadding]; + buttonFrame.origin.x -= imageSize.width + [self _rowButtonsInterviewHorizontalPadding]; [_subtractButton setFrame:buttonFrame]; if (widthChanged) diff --git a/AppKit/CPScroller.j b/AppKit/CPScroller.j index 98110ef5f..c58e87a1d 100644 --- a/AppKit/CPScroller.j +++ b/AppKit/CPScroller.j @@ -316,7 +316,7 @@ CPThemeStateScrollerKnobDark = CPThemeState("scroller-knob-dark"); // The ordering of these tests is important. We check the knob and // page rects first since they may overlap with the arrows. - if (![self hasThemeState:CPThemeStateSelected]) + if (![self hasThemeState:CPThemeStateSelected] && ![self hasThemeState:CPThemeStateScrollViewLegacy]) return CPScrollerNoPart; if (CGRectContainsPoint([self rectForPart:CPScrollerKnob], aPoint)) diff --git a/AppKit/CPSegmentedControl.j b/AppKit/CPSegmentedControl.j index 2ef546f5e..bd9ec8e04 100644 --- a/AppKit/CPSegmentedControl.j +++ b/AppKit/CPSegmentedControl.j @@ -604,7 +604,12 @@ CPSegmentSwitchTrackingMomentary = 2; - (CPView)createEphemeralSubviewNamed:(CPString)aName { if ([aName hasPrefix:@"segment-content"]) - return [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()]; + { + var view = [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()]; + [view _setUsesSingleLineMode:YES]; + + return view; + } return [[CPView alloc] initWithFrame:CGRectMakeZero()]; } diff --git a/AppKit/CPStringDrawing.j b/AppKit/CPStringDrawing.j index 6c3ce7ce0..f4b35c897 100644 --- a/AppKit/CPStringDrawing.j +++ b/AppKit/CPStringDrawing.j @@ -24,9 +24,13 @@ @import "CGGeometry.j" @import "CPPlatformString.j" +@import "CPFont.j" +@import "CPCompatibility.j" -var CPStringSizeWithFontInWidthCache = {}; +var CPStringSizeWithFontInWidthCache = [], + CPStringSizeWithFontHeightCache = [], + CPStringSizeMeasuringContext; CPStringSizeCachingEnabled = YES; @@ -53,21 +57,67 @@ CPStringSizeCachingEnabled = YES; return [self sizeWithFont:aFont inWidth:NULL]; } -- (CGSize)sizeWithFont:(CPFont)aFont inWidth:(float)aWidth ++ (void) initialize { + if ([self class] != [CPString class]) + return; + +#if PLATFORM(DOM) + if (CPFeatureIsCompatible(CPHTMLCanvasFeature) && !CPStringSizeMeasuringContext) + CPStringSizeMeasuringContext = CGBitmapGraphicsContextCreate(); +#endif +} + +- (CGSize)_sizeWithFont:(CPFont)aFont inWidth:(float)aWidth +{ + var size; + +#if PLATFORM(DOM) if (!CPStringSizeCachingEnabled) return [CPPlatformString sizeOfString:self withFont:aFont forWidth:aWidth]; - var cacheKey = self + [aFont cssString] + aWidth, - size = CPStringSizeWithFontInWidthCache[cacheKey]; + var sizeCacheForFont = CPStringSizeWithFontInWidthCache[self]; - if (size === undefined) - { + if (sizeCacheForFont === undefined) + sizeCacheForFont = CPStringSizeWithFontInWidthCache[self] = []; + + if (!aWidth) + aWidth = '0'; + + var cssString = [aFont cssString], + cacheKey = cssString + '_' + aWidth; + + size = sizeCacheForFont[cacheKey]; + + if (size !== undefined && sizeCacheForFont.hasOwnProperty(cacheKey)) + return CGSizeMakeCopy(size); + + if (!CPFeatureIsCompatible(CPHTMLCanvasFeature) || aWidth > 0) size = [CPPlatformString sizeOfString:self withFont:aFont forWidth:aWidth]; - CPStringSizeWithFontInWidthCache[cacheKey] = size; + else + { + if (CPPlatformHasBug(CPTextSizingAlwaysNeedsSetFontBug) || CPStringSizeMeasuringContext.font !== cssString) + CPStringSizeMeasuringContext.font = cssString; + + var fontHeight = CPStringSizeWithFontHeightCache[cssString]; + + if (fontHeight === undefined) + fontHeight = CPStringSizeWithFontHeightCache[cssString] = [aFont defaultLineHeightForFont]; + + size = CGSizeMake(CPStringSizeMeasuringContext.measureText(self).width, fontHeight); } + sizeCacheForFont[cacheKey] = size; +#else + size = CGSizeMake(0, 0); +#endif return CGSizeMakeCopy(size); } +- (CGSize)sizeWithFont:(CPFont)aFont inWidth:(float)aWidth +{ + var size = [self _sizeWithFont:aFont inWidth:aWidth]; + return CGSizeMake(CEIL(size.width), size.height); +} + @end diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 822619650..ad26ad45f 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -136,6 +136,8 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, - (void)_insertTabViewItems:(CPArray)tabViewItems atIndexes:(CPIndexSet)indexes { + var prevItemsCount = [self numberOfTabViewItems]; + [_tabs insertSegments:tabViewItems atIndexes:indexes]; [tabViewItems makeObjectsPerformSelector:@selector(_setTabView:) withObject:self]; @@ -143,6 +145,10 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [self _reverseSetContent]; [self _sendDelegateTabViewDidChangeNumberOfTabViewItems]; + + // Do not allow empty selection if selection bindings are not enabled. + if (prevItemsCount == 0 && [self numberOfTabViewItems] > 0 && ![self _isSelectionBinded]) + [self _selectTabViewItemAtIndex:0]; } /*! @@ -169,7 +175,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, - (void)_didRemoveTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(CPInteger)idx { // If the selection is managed by bindings, let the binder do that. - if ([self binderForBinding:CPSelectionIndexesBinding] || [self binderForBinding:CPSelectedIndexBinding]) + if ([self _isSelectionBinded]) return; if (_selectedTabViewItem == aTabViewItem) @@ -335,13 +341,40 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [_tabs setSelectedSegment:anIndex]; _selectedTabViewItem = aTabViewItem; - [self _displayItemView:[aTabViewItem view]]; + [self _loadTabViewItem:aTabViewItem]; [self _sendDelegateDidSelectTabViewItem:aTabViewItem]; return YES; } +- (void)_loadTabViewItem:(CPTabViewItem)aTabViewItem +{ + var controller = [aTabViewItem viewController]; + + if (controller !== nil && ![controller isViewLoaded]) + { + [controller loadViewWithCompletionHandler:function(view, error) + { + if (error !== nil) + { + CPLog.warn("Could not load the view for item " + aTabViewItem + ". " + error); + } + else if (view !== nil) + { + [aTabViewItem setView:view]; + + if ([self selectedTabViewItem] == aTabViewItem) + [self _displayItemView:view]; + } + }]; + } + else + { + [self _displayItemView:[aTabViewItem view]]; + } +} + /*! Returns the current item being displayed. @return the tab view item currenly being displayed by the receiver @@ -588,6 +621,11 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, return [cls getBinding:aBinding forObject:self]; } +- (BOOL)_isSelectionBinded +{ + return [self binderForBinding:CPSelectionIndexesBinding] || [self binderForBinding:CPSelectedIndexBinding]; +} + - (void)setItems:(CPArray)tabViewItems { if ([tabViewItems isEqualToArray:[_tabs segments]]) @@ -848,4 +886,4 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", return [super hitTest:aPoint]; } -@end \ No newline at end of file +@end diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index 78795d666..a59526d55 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -270,7 +270,7 @@ CPPressedTab = 2; [self setLabel:title]; if ([_tabView selectedTabViewItem] == self) - [_tabView _displayItemView:[_viewController view]]; + [_tabView _loadTabViewItem:self]; } @end diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index d83abc5a3..d1bce3c4a 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -537,6 +537,14 @@ CPTableColumnUserResizingMask = 1 << 1; return _headerToolTip; } +/*! + @ignore +*/ +- (CPString)description +{ + return [CPString stringWithFormat:"<%@ 0x%@ identifier=%@>", [self className], [CPString stringWithHash:[self UID]], [self identifier]]; +} + @end @implementation CPTableColumnValueBinder : CPBinder diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index a9ec28a28..4c2af01ea 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -417,8 +417,7 @@ var CPTableHeaderViewResizeZone = 3.0, } else if (_isDragging) { - // Disable autoscrolling until it behaves correctly. - //[self _autoscroll:theEvent localLocation:currentLocation]; + [self _autoscroll:theEvent localLocation:currentLocation]; [self _dragTableColumn:_activeColumn to:currentLocation]; } else // tracking a press, could become a drag @@ -682,20 +681,21 @@ var CPTableHeaderViewResizeZone = 3.0, [_columnDragClipView removeFromSuperview]; [_tableView _setDraggedColumn:-1]; - var headerView = [[[_tableView tableColumns] objectAtIndex:aColumnIndex] headerView]; + var tableColumn = [[_tableView tableColumns] objectAtIndex:aColumnIndex], + headerView = [tableColumn headerView]; [[headerView subviews] makeObjectsPerformSelector:@selector(setHidden:) withObject:NO]; if (_tableView._draggedColumnIsSelected) [headerView setThemeState:CPThemeStateSelected]; - var columnRect = [_tableView rectOfColumn:aColumnIndex]; - [_tableView _reloadDataViews]; [[_tableView headerView] setNeedsLayout]; [[CPCursor arrowCursor] set]; [self updateTrackingAreas]; + + [_tableView _sendDelegateDidDragTableColumn:tableColumn]; } - (BOOL)_shouldResizeTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 9b6ea2272..acd843d89 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -203,7 +203,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; @ingroup appkit @class CPTableView - CPTableView object displays record-oriented data in a table and + A table view control displays record-oriented data in a table and allows the user to edit values and resize and rearrange columns. A CPTableView requires you to either set a data source which implements @ref numberofrows "numberOfRowsInTableView:" and @ref objectValueForTable "tableView:objectValueForTableColumn:row:", @@ -5097,14 +5097,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad } } else if (!_isViewBased && [aView isKindOfClass:[CPControl class]] && ![aView isKindOfClass:[CPTextField class]]) - { - [self getColumn:@ref(column) row:@ref(row) forView:aView]; - - _editingColumn = column; - _editingRow = row; - [aView addObserver:self forKeyPath:@"objectValue" options:CPKeyValueObservingOptionOld | CPKeyValueObservingOptionNew context:"editing"]; - } return aView; } @@ -5236,7 +5229,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (!_isViewBased) { [self _setEditingState:NO forView:textField]; - [self _commitDataViewObjectValue:textField]; + [self _commitDataViewObjectValue:textField forColumn:_editingColumn andRow:_editingRow]; } else [textField setBezeled:NO]; @@ -5286,19 +5279,19 @@ Your delegate can implement this method to avoid subclassing the tableview to ad The action for any dataview that supports editing. This will only be called when the value was changed. The table view becomes the first responder after user is done editing a dataview. */ -- (void)_commitDataViewObjectValue:(id)aDataView +- (void)_commitDataViewObjectValue:(id)aDataView forColumn:(CPInteger)column andRow:(CPInteger)row { - var editingTableColumn = _tableColumns[_editingColumn]; + var editingTableColumn = _tableColumns[column]; if (_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_) - [_dataSource tableView:self setObjectValue:[aDataView objectValue] forTableColumn:editingTableColumn row:_editingRow]; + [_dataSource tableView:self setObjectValue:[aDataView objectValue] forTableColumn:editingTableColumn row:row]; // Allow the column binding to do a reverse set. Note that we do this even if the data source method above // is implemented. - [editingTableColumn _reverseSetDataView:aDataView forRow:_editingRow]; + [editingTableColumn _reverseSetDataView:aDataView forRow:row]; - if (_editingRow !== CPNotFound && _editingColumn !== CPNotFound) - [self reloadDataForRowIndexes:[CPIndexSet indexSetWithIndex:_editingRow] columnIndexes:[CPIndexSet indexSetWithIndex:_editingColumn]]; + if (row !== CPNotFound && column !== CPNotFound) + [self _reloadDataForRowIndexes:[CPIndexSet indexSetWithIndex:row] columnIndexes:[CPIndexSet indexSetWithIndex:column]]; } - (void)_setEditingState:(BOOL)editingState forView:(CPView)aView @@ -5348,9 +5341,12 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (context === "editing" && [object superview] === self) { [object removeObserver:self forKeyPath:keyPath]; - [self _commitDataViewObjectValue:object]; - _editingRow = CPNotFound; - _editingColumn = CPNotFound; + + var row, + column; + + [self getColumn:@ref(column) row:@ref(row) forView:object]; + [self _commitDataViewObjectValue:object forColumn:column andRow:row]; } } @@ -5752,10 +5748,10 @@ Your delegate can implement this method to avoid subclassing the tableview to ad @ignore Call the delegate didDragTableColumn with the given tableColumn */ -- (void)_sendDelegateDidDragTableColumn:(CPInteger)column +- (void)_sendDelegateDidDragTableColumn:(CPTableColumn)aTableColumn { if (_implementedDelegateMethods & CPTableViewDelegate_tableView_didDragTableColumn_) - [_delegate tableView:self didDragTableColumn:_tableColumns[column]]; + [_delegate tableView:self didDragTableColumn:aTableColumn]; } /*! diff --git a/AppKit/CPText.j b/AppKit/CPText.j index bfbc25594..1475aaee4 100644 --- a/AppKit/CPText.j +++ b/AppKit/CPText.j @@ -5,6 +5,13 @@ * Created by Alexander Ljungberg. * Copyright 2010, WireLoad, LLC. * + * additions from + * + * Daniel Boehringer on 8/02/2014. + * Copyright Daniel Boehringer on 8/02/2014. + * + * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -20,6 +27,27 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +@import + +@import "CPPasteboard.j" +@import "CPView.j" + +@global CPStringPboardType +@class CPAttributedString +@class _CPRTFParser + +@protocol CPTextDelegate + +- (BOOL)textShouldBeginEditing:(CPText)aTextObject; +- (BOOL)textShouldEndEditing:(CPText)aTextObject; +- (void)textDidBeginEditing:(CPNotification)aNotification; +- (void)textDidChange:(CPNotification)aNotification; +- (void)textDidEndEditing:(CPNotification)aNotification; + +@end + +CPParagraphSeparatorCharacter = 0x2029; +CPLineSeparatorCharacter = 0x2028; CPEnterCharacter = "\u0003"; CPBackspaceCharacter = "\u0008"; CPTabCharacter = "\u0009"; @@ -29,6 +57,7 @@ CPCarriageReturnCharacter = "\u000d"; CPBackTabCharacter = "\u0019"; CPDeleteCharacter = "\u007f"; +@typedef CPTextMovement CPIllegalTextMovement = 0; CPOtherTextMovement = 0; CPReturnTextMovement = 16; @@ -46,8 +75,279 @@ CPWritingDirectionLeftToRight = 0; CPWritingDirectionRightToLeft = 1; @typedef CPTextAlignment -CPLeftTextAlignment = 0; -CPRightTextAlignment = 1; -CPCenterTextAlignment = 2; -CPJustifiedTextAlignment = 3; -CPNaturalTextAlignment = 4; \ No newline at end of file +CPLeftTextAlignment = 0; +CPRightTextAlignment = 1; +CPCenterTextAlignment = 2; +CPJustifiedTextAlignment = 3; +CPNaturalTextAlignment = 4; + +/* + CPText notifications +*/ +CPTextDidBeginEditingNotification = @"CPTextDidBeginEditingNotification"; +CPTextDidChangeNotification = @"CPTextDidChangeNotification"; +CPTextDidEndEditingNotification = @"CPTextDidEndEditingNotification"; + +/* + CPTextView Notifications +*/ +CPTextViewDidChangeSelectionNotification = @"CPTextViewDidChangeSelectionNotification"; +CPTextViewDidChangeTypingAttributesNotification = @"CPTextViewDidChangeTypingAttributesNotification"; + +/* + FIXME: move these to CPAttributed string + Make use of attributed keys in AppKit +*/ +CPFontAttributeName = @"CPFontAttributeName"; +CPForegroundColorAttributeName = @"CPForegroundColorAttributeName"; +CPBackgroundColorAttributeName = @"CPBackgroundColorAttributeName"; +CPShadowAttributeName = @"CPShadowAttributeName"; +CPUnderlineStyleAttributeName = @"CPUnderlineStyleAttributeName"; +CPSuperscriptAttributeName = @"CPSuperscriptAttributeName"; +CPBaselineOffsetAttributeName = @"CPBaselineOffsetAttributeName"; +CPAttachmentAttributeName = @"CPAttachmentAttributeName"; +CPLigatureAttributeName = @"CPLigatureAttributeName"; +CPKernAttributeName = @"CPKernAttributeName"; + +@implementation CPText : CPView +{ + BOOL _isEditable @accessors(getter=isEditable, setter=setEditable:); + BOOL _isSelectable @accessors(getter=isSelectable, setter=setSelectable:); + BOOL _isRichText @accessors(getter=isRichText, setter=setRichText:); +} + +- (void)setSelectable:(BOOL)flag +{ + [self willChangeValueForKey:@"selectable"]; + _isSelectable = flag; + [self didChangeValueForKey:@"selectable"]; + + if (!flag) + [self setEditable:flag]; +} + +- (void)setEditable:(BOOL)flag +{ + [self willChangeValueForKey:@"editable"]; + _isEditable = flag; + [self didChangeValueForKey:@"editable"]; + + if (flag) + [self setSelectable:flag]; +} + +- (void)changeFont:(id)sender +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)copy:(id)sender +{ + var selectedRange = [self selectedRange]; + + if (selectedRange.length < 1) + return; + + var pasteboard = [CPPasteboard generalPasteboard]; + + // put plain representation on the pasteboad unconditionally + [pasteboard declareTypes:[CPStringPboardType] owner:nil]; + [pasteboard setString:[[self stringValue] substringWithRange:selectedRange] forType:CPStringPboardType]; +} + +- (id)_plainStringForPasting +{ + return [[CPPasteboard generalPasteboard] stringForType:CPStringPboardType]; +} + +- (id)_stringForPasting +{ + var pasteboard = [CPPasteboard generalPasteboard], + dataForPasting = [pasteboard stringForType:CPRTFPboardType], + stringForPasting = [pasteboard stringForType:CPStringPboardType]; + + if (dataForPasting || [stringForPasting hasPrefix:"{\\rtf1\\ansi"]) + stringForPasting = [[_CPRTFParser new] parseRTF:dataForPasting ? dataForPasting : stringForPasting]; + + if (![self isRichText] && [stringForPasting isKindOfClass:[CPAttributedString class]]) + stringForPasting = stringForPasting._string; + + return stringForPasting; +} + +- (void)paste:(id)sender +{ + var stringForPasting = [self _stringForPasting]; + + if (stringForPasting) + [self insertText:stringForPasting]; +} + +- (void)copyFont:(id)sender +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)delete:(id)sender +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (CPFont)font:(CPFont)aFont +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return nil; +} + +- (BOOL)isHorizontallyResizable +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return NO; +} + +- (BOOL)isRulerVisible +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return NO; +} + +- (BOOL)isVerticallyResizable +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return NO; +} + +- (CGSize)maxSize +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return CGSizeMake(0,0); +} + +- (CGSize)minSize +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + return CGSizeMake(0,0); +} + +- (void)pasteFont:(id)sender +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)replaceCharactersInRange:(CPRange)aRange withString:(CPString)aString +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)scrollRangeToVisible:(CPRange)aRange +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)selectedAll:(id)sender +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (CPRange)selectedRange +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return CPMakeRange(CPNotFound, 0); +} + +- (void)setFont:(CPFont)aFont +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)setFont:(CPFont)aFont range:(CPRange)aRange +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)setHorizontallyResizable:(BOOL)flag +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)setMaxSize:(CGSize)aSize +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)setMinSize:(CGSize)aSize +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)setString:(CPString)aString +{ + [self replaceCharactersInRange:CPMakeRange(0, [[self string] length]) withString:aString]; +} + +- (void)setUsesFontPanel:(BOOL)flag +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (void)setVerticallyResizable:(BOOL)flag +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (CPString)string +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return nil; +} + +- (void)underline:(id)sender +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +- (BOOL)usesFontPanel +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); + + return NO; +} + +@end + +var CPTextViewIsEditableKey = @"CPTextViewIsEditableKey", + CPTextViewIsSelectableKey = @"CPTextViewIsSelectableKey", + CPTextViewIsRichTextKey = @"CPTextViewIsRichTextKey"; + +@implementation CPText (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + [self setSelectable:[aCoder decodeBoolForKey:CPTextViewIsSelectableKey]]; + [self setEditable:[aCoder decodeBoolForKey:CPTextViewIsEditableKey]]; + [self setRichText:[aCoder decodeBoolForKey:CPTextViewIsRichTextKey]]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; + [aCoder encodeBool:_isEditable forKey:CPTextViewIsEditableKey]; + [aCoder encodeBool:_isSelectable forKey:CPTextViewIsSelectableKey]; + [aCoder encodeBool:_isRichText forKey:CPTextViewIsRichTextKey]; +} + +@end diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 98ba7eaa7..3e07825e5 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -77,26 +77,16 @@ function CPTextFieldBlurFunction(anEvent, owner, domElement, inputElement, resig var ownerWindow = [owner window]; - if (!resigning && [ownerWindow isKeyWindow]) + if (!resigning && [ownerWindow isKeyWindow] && [ownerWindow firstResponder] === owner) { /* - Browsers blur text fields when a click occurs anywhere outside the text field. That is normal for browsers, but in Cocoa the key view retains focus unless the click target accepts first responder. So if we lost focus but were not told to resign and our window is still key, restore focus, - but only if the text field is completely within the browser window. If we restore focus when it - is off screen, the entire body scrolls out of our control. + Previously we had code here which would force the input to regain focus if the input lost focus without the CPTextField having actually lost first responder status. This typically happened because the user clicked away from the input in the browser, without clicking on something that could become the first responder. In the browser, clicking outside of an input blurs it, but in Cocoa and Cappuccino it does not (unless you actually click something that will become the first responder). + + That refocusing code has now been removed because we simply prevent the default action on clicks in the browser instead, which combined with the fix in 58d5d7d7, successfully prevents unintentional focus loss in (at least) Safari 9.1.1, Chrome 51 and Safari for iOS 9.3 when you click outside of a text field. + + Now we can still lose focus unexpectedly: this is when the 'done' button is tapped on the virtual keyboard of a mobile device. In this case we actually do want to resign first responder status, because that is what the done button should do (and if we did not the keyboard would go away and then immediately come back which looks dumb and isn't what the user wanted). */ - if ([owner _isWithinUsablePlatformRect]) - { - [[CPRunLoop mainRunLoop] performBlock:function() - { - // This will prevent to jump to the focused element - var previousScrollingOrigin = [owner _scrollToVisibleRectAndReturnPreviousOrigin]; - - inputElement.focus(); - - [owner _restorePreviousScrollingOrigin:previousScrollingOrigin]; - } - argument:nil order:0 modes:[CPDefaultRunLoopMode]]; - } + [ownerWindow makeFirstResponder:nil]; } CPTextFieldHandleBlur(anEvent, @ref(owner)); @@ -403,7 +393,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); else [self unsetThemeState:CPThemeStateEditable]; - // We only allow first responder status if the field is enable, and editable or selectable. + // We only allow first responder status if the field is enabled, and editable or selectable. if (!(shouldBeEditable && ![self isSelectable]) && [[self window] firstResponder] === self) [[self window] makeFirstResponder:nil]; @@ -411,6 +401,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self setThemeState:CPThemeStateEditable]; else [self unsetThemeState:CPThemeStateEditable]; + + [self updateTrackingAreas]; } /*! @@ -432,6 +424,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // We only allow first responder status if the field is enabled. if (!shouldBeEnabled && [[self window] firstResponder] === self) [[self window] makeFirstResponder:nil]; + + [self updateTrackingAreas]; } /*! @@ -441,6 +435,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)setSelectable:(BOOL)aFlag { _isSelectable = aFlag; + + [self updateTrackingAreas]; } /*! @@ -839,7 +835,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self _resignFirstKeyResponder]; _isEditing = NO; - + if ([self isEditable]) { [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:@{"CPTextMovement": [self _currentTextMovement]}]]; @@ -999,14 +995,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]]; } -- (void)mouseMoved:(CPEvent)anEvent -{ - [super mouseMoved:anEvent]; - [self _updateCursorForEvent:anEvent]; -} - - (void)mouseDown:(CPEvent)anEvent { + if (![self isEnabled]) + return [[self nextResponder] mouseDown:anEvent]; + // Don't track! (ever?) if ([self isEditable] && [self isEnabled]) { @@ -1261,27 +1254,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [_delegate controlTextDidEndEditing:note]; } -- (void)_updateCursorForEvent:(CPEvent)anEvent -{ - var frame = CGRectMakeCopy([self frame]), - contentInset = [self currentValueForThemeAttribute:@"content-inset"]; - - frame = [[self superview] convertRectToBase:CGRectInsetByInset(frame, contentInset)]; - - if ([self isEnabled] && ([self isSelectable] || [self isEditable]) && CGRectContainsPoint(frame, [anEvent locationInWindow])) - { -#if PLATFORM(DOM) - self._DOMElement.style.cursor = "text"; -#endif - } - else - { -#if PLATFORM(DOM) - self._DOMElement.style.cursor = "default"; -#endif - } -} - /*! Returns the string in the text field. */ @@ -2015,7 +1987,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); frame.origin = [wind convertBaseToGlobal:frame.origin]; - // Here we restore the the previous scrolling posiition + // Here we restore the previous scrolling posiition [self _restorePreviousScrollingOrigin:previousScrollingOrigin]; return (CGRectGetMinX(frame) >= CGRectGetMinX(usableRect) && @@ -2202,4 +2174,29 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [_source setObjectValue:aValue]; } -@end \ No newline at end of file +@end + +@implementation CPTextField (CPTrackingArea) + +- (void)updateTrackingAreas +{ + [self removeAllTrackingAreas]; + + if ([self isEnabled] && (_isEditable || _isSelectable)) + { + var myBounds = CGRectMakeCopy([self bounds]), + contentInset = [self currentValueForThemeAttribute:@"content-inset"]; + + [self addTrackingArea:[[CPTrackingArea alloc] initWithRect:CGRectInsetByInset(myBounds, contentInset) + options:CPTrackingMouseEnteredAndExited | CPTrackingCursorUpdate | CPTrackingActiveInKeyWindow + owner:self + userInfo:nil]]; + } +} + +- (void)cursorUpdate:(CPEvent)anEvent +{ + [[CPCursor IBeamCursor] set]; +} + +@end diff --git a/AppKit/CPTextView/CPFontDescriptor.j b/AppKit/CPTextView/CPFontDescriptor.j new file mode 100644 index 000000000..fb4065ddd --- /dev/null +++ b/AppKit/CPTextView/CPFontDescriptor.j @@ -0,0 +1,315 @@ +/* + * CPFontDescriptor.j + * AppKit + * + * Created by Emmanuel Maillard on 07/03/10. + * Copyright Emmanuel Maillard 2010. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +/* + Font descriptor dictionary keys +*/ + +/* + CPFontNameAttribute contains a CPString that specified the font name + (may be an name list like: 'Marker Felt, Lucida Grande, Helvetica') +*/ +CPFontNameAttribute = @"CPFontNameAttribute"; +/* + CPFontSizeAttribute contains a CPString that specified the font size + (as a float value) +*/ +CPFontSizeAttribute = @"CPFontSizeAttribute"; +/* + CPFontTraitsAttribute a CPDictionary that contains font traits keys + (CPFontSymbolicTrait or CPFontWeightTrait) +*/ +CPFontTraitsAttribute = @"CPFontTraitsAttribute"; + +// Font traits dictionary keys +/* + CPFontSymbolicTrait a CPNumber that contains CPFontFamilyClass and + typeface information flags. +*/ +CPFontSymbolicTrait = @"CPFontSymbolicTrait"; + +/* + CPFontWeightTrait + We use CPString with CSS string values for font weight + (normal | bold | bolder | lighter | 100 | 200 | 300 | 400 + | 500 | 600 | 700 | 800 | 900) + NOTE: Cocoa compatibility issue: NSFontWeightTrait are NSNumber for + font weight (from -1.0 to 1.0, 0.0 for normal weight). +*/ +CPFontWeightTrait = @"CPFontWeightTrait"; + +/* + CPFontFamilyClass +*/ +CPFontUnknownClass = 0 << 28; +CPFontOldStyleSerifsClass = 1 << 28; +CPFontTransitionalSerifsClass = 2 << 28; +CPFontModernSerifsClass = 3 << 28; +CPFontClarendonSerifsClass = 4 << 28; +CPFontSlabSerifsClass = 5 << 28; +CPFontFreeformSerifsClass = 7 << 28; +CPFontSansSerifClass = 8 << 28; + +CPFontSerifClass = (CPFontOldStyleSerifsClass | CPFontTransitionalSerifsClass | + CPFontModernSerifsClass | CPFontClarendonSerifsClass | + CPFontSlabSerifsClass | CPFontFreeformSerifsClass); + +CPFontFamilyClassMask = 0xF0000000; + +/* + Typeface information +*/ +CPFontItalicTrait = 1 << 0; +CPFontBoldTrait = 1 << 1; +CPFontExpandedTrait = 1 << 5; /* TODO: CCS 3 font-stretch */ +CPFontCondensedTrait = 1 << 6; +CPFontSmallCapsTrait = 1 << 7; + +/*! + @ingroup appkit + @class CPFontDescriptor +*/ +@implementation CPFontDescriptor : CPObject +{ + CPDictionary _attributes; +} + +/*! + Returns a font descriptor with the specified attributes. + + @param attributes a dictionary that describe the desired font descriptor + @return the requested font descriptor +*/ ++ (CPFontDescriptor)fontDescriptorWithFontAttributes:(CPDictionary)attributes +{ + return [[CPFontDescriptor alloc] initWithFontAttributes:attributes]; +} + +/*! + Returns a font descriptor with the specified name and size. + + @param fontName the name of the font + @param aSize the size of the font (in points) + @return the requested font descriptor +*/ ++ (CPFontDescriptor)fontDescriptorWithName:(CPString)fontName size:(float)size +{ + return [[CPFontDescriptor alloc] initWithFontAttributes:[CPDictionary dictionaryWithObjects:[fontName, [CPString stringWithString:size + '']] forKeys:[CPFontNameAttribute,CPFontSizeAttribute]]]; +} + +/*! + Initialize a font descriptor with the specified attributes. + + @param attributes a dictionary that describe the desired font descriptor + @return the requested font descriptor +*/ +- (id)initWithFontAttributes:(CPDictionary)attributes +{ + if (self = [super init]) + { + _attributes = [[CPMutableDictionary alloc] init]; + + if (attributes) + [_attributes addEntriesFromDictionary:attributes]; + } + + return self; +} + +/*! + Returns a new font descriptor that is the same as the receiver but with the + specified attributes taking precedence over the existing ones. + + @param attributes a dictionary that describe the desired font descriptor + @return the new font descriptor +*/ +- (CPFontDescriptor)fontDescriptorByAddingAttributes:(CPDictionary)attributes +{ + var attrib = [_attributes copy]; + + [attrib addEntriesFromDictionary:attributes]; + + return [[CPFontDescriptor alloc] initWithFontAttributes:attrib]; +} + +/*! + Returns a new font descriptor that is the same as the receiver but with the specified size taking precedence over the existing ones. + + @param aSize the new size + @return the new font descriptor +*/ +- (CPFontDescriptor)fontDescriptorWithSize:(float)aSize +{ + var attrib = [_attributes copy]; + + [attrib setObject:[CPString stringWithString:aSize + ''] forKey:CPFontSizeAttribute]; + + return [[CPFontDescriptor alloc] initWithFontAttributes:attrib]; +} + +/*! + Returns a new font descriptor that is the same as the receiver but with + the specified symbolic traits taking precedence over the existing ones. + + @param symbolicTraits the desired new symbolic traits + @return the new font descriptor +*/ +- (CPFontDescriptor)fontDescriptorWithSymbolicTraits:(CPFontSymbolicTraits)symbolicTraits +{ + var attrib = [_attributes copy]; + + if ([attrib objectForKey:CPFontTraitsAttribute]) + [[attrib objectForKey:CPFontTraitsAttribute] setObject:[CPNumber numberWithUnsignedInt:symbolicTraits] + forKey:CPFontSymbolicTrait]; + else + [attrib setObject:[CPDictionary dictionaryWithObject:[CPNumber numberWithUnsignedInt:symbolicTraits] + forKey:CPFontSymbolicTrait] forKey:CPFontTraitsAttribute]; + + return [[CPFontDescriptor alloc] initWithFontAttributes:attrib]; +} + +- (id)objectForKey:(id)aKey +{ + return [_attributes objectForKey:aKey]; +} + +- (CPDictionary)fontAttributes +{ + return _attributes; +} + +- (float)pointSize +{ + var value = [_attributes objectForKey:CPFontSizeAttribute]; + + return value ? [value floatValue] : 0.0; +} + +- (CPFontSymbolicTraits)symbolicTraits +{ + var traits = [_attributes objectForKey:CPFontTraitsAttribute]; + + return (traits && [traits objectForKey:CPFontSymbolicTrait]) ? [[traits objectForKey:CPFontSymbolicTrait] unsignedIntValue] : 0; +} + +@end + +var CPFontDescriptorAttributesKey = @"CPFontDescriptorAttributesKey"; + +@implementation CPFontDescriptor (CPCoding) + +/*! + Initializes the font descriptor from a coder. + + @param aCoder the coder from which to read the font descriptor data + @return the initialized font +*/ +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self initWithFontAttributes:[aCoder decodeObjectForKey:CPFontDescriptorAttributesKey]]; +} + +/*! + Writes the font descriptor to a coder. + + @param aCoder the coder to which the data will be written +*/ +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_attributes forKey:CPFontDescriptorAttributesKey]; +} + +@end + +var _wrapNameRegEx = new RegExp(/(\w+\s+\w+)(,*)/g); + +/* + Helper methods to CPFont for generating CSS font style +*/ +@implementation CPFontDescriptor (CPFontCSSHelper) + +- (CPString)fontStyleCSSString +{ + return [self symbolicTraits] & CPFontItalicTrait ? @"italic" : @"normal"; +} + +- (CPString)fontWeightCSSString +{ + var traitsAttributes = [_attributes objectForKey:CPFontTraitsAttribute]; + + if (traitsAttributes) + { + /* give preference to CPFontWeightTrait */ + if ([traitsAttributes objectForKey:CPFontWeightTrait]) + return [traitsAttributes objectForKey:CPFontWeightTrait]; + /* else fallback to facetype symbolic traits */ + if ([self symbolicTraits] & CPFontBoldTrait) + return @"bold"; + } + + return @"normal"; +} + +- (CPString)fontSizeCSSString +{ + return [_attributes objectForKey:CPFontSizeAttribute] ? [[_attributes objectForKey:CPFontSizeAttribute] intValue] + "px" : @""; +} + +- (CPString)fontFamilyCSSString +{ + var aName = @""; + + if ([_attributes objectForKey:CPFontNameAttribute]) + aName += [_attributes objectForKey:CPFontNameAttribute].replace(_wrapNameRegEx, '"$1"$2'); + + var symbolicTraits = [self symbolicTraits]; + + if (symbolicTraits) + { + if ((symbolicTraits & CPFontFamilyClassMask) & CPFontSansSerifClass) + aName += @", sans-serif"; + else if ((symbolicTraits & CPFontFamilyClassMask) & CPFontSerifClass) + aName += @", serif"; + } + + return aName; +} + +- (CPString)fontVariantCSSString +{ + if ([self symbolicTraits] & CPFontSmallCapsTrait) + return @"small-caps"; + + return @"normal"; +} + +- (CPString)cssString +{ + return [CPString stringWithString:[self fontStyleCSSString] + " " + + [self fontVariantCSSString] + " " + + [self fontWeightCSSString] + " " + + [self fontSizeCSSString] + " " + + [self fontFamilyCSSString]]; +} + +@end diff --git a/AppKit/CPTextView/CPFontPanel.j b/AppKit/CPTextView/CPFontPanel.j new file mode 100644 index 000000000..81a2cf93f --- /dev/null +++ b/AppKit/CPTextView/CPFontPanel.j @@ -0,0 +1,443 @@ +/* + * CPFontPanel.j + * AppKit + * + * TODOs: + * 1. make browser-width for size smaller and fix columns + * 2. add all the missing features from the MacOS X counterpart (sampleview) + * + * + * Created by Daniel Boehringer on 2/JAN/2014. + * All modifications copyright Daniel Boehringer 2013. + * Extensive code formatting and review by Andrew Hankinson + * Based on original work by + * Created by Emmanuel Maillard on 06/03/2010. + * Copyright Emmanuel Maillard 2010. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +@import "CPPanel.j" +@import "CPColorWell.j" +@import "CPColorPanel.j" +@import "CPBrowser.j" +@import "CPText.j" +@import "CPFontManager.j" + + +@class CPTextStorage +@class CPLayoutManager +@class CPTextContainer +@class CPFontManager + +/* + Collection indexes +*/ +var kTypefaceIndex_Normal = 0, + kTypefaceIndex_Italic = 1, + kTypefaceIndex_Bold = 2, + kTypefaceIndex_BoldItalic = 3, + kToolbarHeight = 32, + kBorderSpacing = 6, + kInnerSpacing = 2, + kNothingChanged = 0, + kFontNameChanged = 1, + kTypefaceChanged = 2, + kSizeChanged = 3, + kTextColorChanged = 4, + kBackgroundColorChanged = 5, + kUnderlineChanged = 6, + kWeightChanged = 7, + _sharedFontPanel; + +// FIXME Locale support +var _availableTraits= [@"Normal", @"Italic", @"Bold", @"Bold Italic"], + _availableSizes = [@"9", @"10", @"11", @"12", @"13", @"14", @"18", @"24", @"36", @"48", @"72", @"96"]; + + +/*! + @ingroup appkit + @class CPFontPanel +*/ +@implementation CPFontPanel : CPPanel +{ + id _fontBrowser; + id _traitBrowser; + id _sizeBrowser; + CPArray _availableFonts; + id _textColorWell; + CPColor _textColor; + int _currentColorButtonTag; + BOOL _setupDone; + int _fontChanges; +} + + +#pragma mark - +#pragma mark Class methods + +/*! + Check if the shared Font panel exists. +*/ ++ (BOOL)sharedFontPanelExists +{ + return _sharedFontPanel !== nil; +} + +/*! + Return the shared Font panel. +*/ ++ (CPFontPanel)sharedFontPanel +{ + if (!_sharedFontPanel) + _sharedFontPanel = [[CPFontPanel alloc] init]; + + return _sharedFontPanel; +} + + +#pragma mark - +#pragma mark Init methods + +/*! @ignore */ +- (id)init +{ + if (self = [super initWithContentRect:CGRectMake(100, 90, 450, 394) styleMask:(CPTitledWindowMask | CPClosableWindowMask /*| CPResizableWindowMask*/ )]) + { + [[self contentView] setBackgroundColor:[CPColor colorWithWhite:0.95 alpha:1.0]]; + [self setTitle:@"Font Panel"]; + [self setLevel:CPFloatingWindowLevel]; + [self setFloatingPanel:YES]; + [self setBecomesKeyOnlyIfNeeded:YES]; + [self setMinSize:CGSizeMake(378, 394)]; + + _availableFonts = [[CPFontManager sharedFontManager] availableFonts]; + _textColor = [CPColor blackColor]; + _setupDone = NO; + _fontChanges = kNothingChanged; + } + + return self; +} + +/*! @ignore */ +- (void)_setupToolbarView +{ + _toolbarView = [[CPView alloc] initWithFrame:CGRectMake(0, kBorderSpacing, CGRectGetWidth([self frame]), kToolbarHeight)]; + [_toolbarView setAutoresizingMask:CPViewWidthSizable]; + + // Text color + _textColorWell = [[CPColorWell alloc] initWithFrame:CGRectMake(10, 0, 25, 25)]; + [_textColorWell setColor:_textColor]; + [_toolbarView addSubview:_textColorWell]; +} + +- (void)_setupBrowser:(CPBrowser)aBrowser +{ + [aBrowser setTarget:self]; + [aBrowser setAction:@selector(browserClicked:)]; + [aBrowser setDoubleAction:@selector(dblClicked:)]; + [aBrowser setAllowsEmptySelection:NO]; + [aBrowser setAllowsMultipleSelection:NO]; + [aBrowser setDelegate:self]; + [[self contentView] addSubview:aBrowser]; +} + +- (void)_setupContents +{ + if (_setupDone) + return; + + _setupDone = YES; + + [self _setupToolbarView]; + + var contentView = [self contentView], + label = [CPTextField labelWithTitle:@"Font name"], + contentBounds = [contentView bounds], + upperView = [[CPView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(contentBounds), CGRectGetHeight(contentBounds) - (kBorderSpacing + kToolbarHeight + kInnerSpacing))]; + + [contentView addSubview:_toolbarView]; + + _fontBrowser = [[CPBrowser alloc] initWithFrame:CGRectMake(10, 35, 150, 350)]; + _traitBrowser = [[CPBrowser alloc] initWithFrame:CGRectMake(155, 35, 150, 350)]; + _sizeBrowser = [[CPBrowser alloc] initWithFrame:CGRectMake(300, 35, 140, 350)]; + + [self _setupBrowser:_fontBrowser]; + [self _setupBrowser:_traitBrowser]; + [self _setupBrowser:_sizeBrowser]; + + [[CPNotificationCenter defaultCenter] addObserver:self + selector:@selector(textViewDidChangeSelection:) + name:CPTextViewDidChangeSelectionNotification + object:nil]; +} + +- (void)textViewDidChangeSelection:(CPNotification)notification +{ + [self _refreshWithTextView:[notification object]]; + +} + +- (void)_refreshWithTextView:(CPTextView)textView +{ + if (![self isVisible]) + return; + + var attribs = [textView _attributesForFontPanel], + font = [attribs objectForKey:CPFontAttributeName] || [[textView textStorage] font] || [CPFont systemFontOfSize:12.0], + color = [attribs objectForKey:CPForegroundColorAttributeName]; + + if (!font) + return; + + var trait = kTypefaceIndex_Normal; + + if ([font isItalic] && [font isBold]) + trait = kTypefaceIndex_BoldItalic; + else if ([font isItalic]) + trait = kTypefaceIndex_Italic; + else if ([font isBold]) + trait = kTypefaceIndex_Bold; + + [self setCurrentFont:font]; + [self setCurrentTrait:trait]; + [self setCurrentSize:[font size] + ""]; //cast to string + + if (!color) + return; + + [_textColorWell setColor:color]; +} + +- (void)orderFront:(id)sender +{ + [self _setupContents]; + [super orderFront:sender]; + [self _refreshWithTextView:[[CPApp keyWindow] firstResponder]]; +} + +- (void)reloadDefaultFontFamilies +{ + _availableFonts = [[CPFontManager sharedFontManager] availableFonts]; +} + +- (BOOL)worksWhenModal +{ + return YES; +} + +/*! + @param aFont the font to convert. + @return The converted font or \c aFont if failed to convert. +*/ +- (CPFont)panelConvertFont:(CPFont)aFont +{ + var newFont = aFont, + index = 0; + + switch (_fontChanges) + { + case kFontNameChanged: + newFont = [CPFont fontWithDescriptor:[[aFont fontDescriptor] fontDescriptorByAddingAttributes: + [CPDictionary dictionaryWithObject:[self currentFont] forKey:CPFontNameAttribute]] size:0.0]; + break; + + case kTypefaceChanged: + index = [self currentTrait]; + if (index == kTypefaceIndex_BoldItalic) + newFont = [[CPFontManager sharedFontManager] convertFont:aFont toHaveTrait:CPBoldFontMask | CPItalicFontMask]; + else if (index == kTypefaceIndex_Bold) + newFont = [[CPFontManager sharedFontManager] convertFont:aFont toHaveTrait:CPBoldFontMask]; + else if (index == kTypefaceIndex_Italic) + newFont = [[CPFontManager sharedFontManager] convertFont:aFont toHaveTrait:CPItalicFontMask]; + else + newFont = [[CPFontManager sharedFontManager] convertFont:aFont toNotHaveTrait:CPBoldFontMask | CPItalicFontMask]; + break; + + case kSizeChanged: + newFont = [[CPFontManager sharedFontManager] convertFont:aFont toSize:[self currentSize]]; + break; + + case kNothingChanged: + break; + + default: + CPLog.trace(@"FIXME: -[" + [self className] + " " + _cmd + "] unhandled _fontChanges: " + _fontChanges); + break; + } + + return newFont; +} + +- (void)setCurrentSize:(CGSize)aSize +{ + [_sizeBrowser selectRow:[_availableSizes indexOfObject:aSize] inColumn:0]; +} + +- (CPString)currentSize +{ + return [_sizeBrowser selectedItem]; +} + +- (void)setCurrentFont:(CPFont)aFont +{ + [_fontBrowser selectRow:[_availableFonts indexOfObject:[aFont familyName]] inColumn:0]; +} + +- (CPString)currentFont +{ + return [_fontBrowser selectedItem]; +} + +- (void)setCurrentTrait:(unsigned)aTrait +{ + var row = 0; + + switch (aTrait) + { + case kTypefaceIndex_Italic: + row = 1; + break; + + case kTypefaceIndex_Bold: + row = 2; + break; + + case kTypefaceIndex_BoldItalic: + row = 3; + break; + } + + [_traitBrowser selectRow:row inColumn:0]; +} + +// FIXME Locale support +- (unsigned)currentTrait +{ + var sel = [_traitBrowser selectedItem]; + + if (sel === "Italic") + return kTypefaceIndex_Italic; + + if (sel === "Bold") + return kTypefaceIndex_Bold; + + if (sel === "Bold Italic") + return kTypefaceIndex_BoldItalic; + + return kTypefaceIndex_Normal; +} + +/*! + Set the selected font in Font panel. + @param font the selected font + @param flag if \c the current selection have multiple fonts. +*/ +- (void)setPanelFont:(CPFont)font isMultiple:(BOOL)flag +{ + [self _setupContents]; + + if ([self currentFont] !== [font familyName]) + [self setCurrentFont:[font familyName]]; + + if ([self currentSize] != [font size]) + [self setCurrentSize:[font size]]; + + var typefaceIndex = kTypefaceIndex_Normal, + symbolicTraits = [[font fontDescriptor] symbolicTraits]; + + if ((symbolicTraits & CPFontItalicTrait) && (symbolicTraits & CPFontBoldTrait)) + typefaceIndex = kTypefaceIndex_BoldItalic; + else if (symbolicTraits & CPFontItalicTrait) + typefaceIndex = kTypefaceIndex_Italic; + else if (symbolicTraits & CPFontBoldTrait) + typefaceIndex = kTypefaceIndex_Bold; + + if ([self currentTrait] != typefaceIndex) + [self setCurrentTrait:typefaceIndex ]; + + _fontChanges = kNothingChanged; +} + +- (void)changeColor:(id)sender +{ + _textColor = [sender color]; + _fontChanges = kTextColorChanged; + [[CPFontManager sharedFontManager] modifyFontViaPanel:self]; +} + +//////////////////////////////////////////////////////////////////// +// TODO: ask CPFontManager for traits // +- (void)browserClicked:(id)aBrowser +{ + if (aBrowser === _fontBrowser) + { + _fontChanges = kFontNameChanged; + [[CPFontManager sharedFontManager] modifyFontViaPanel:self]; + } + else if (aBrowser === _traitBrowser) + { + _fontChanges = kTypefaceChanged; + [[CPFontManager sharedFontManager] modifyFontViaPanel:self]; + } + else if (aBrowser === _sizeBrowser) + { + _fontChanges = kSizeChanged; + [[CPFontManager sharedFontManager] modifyFontViaPanel:self]; + } +} + +- (void)dblClicked:(id)sender +{ + // alert("DOUBLE"); +} + +- (id)browser:(id)aBrowser numberOfChildrenOfItem:(id)anItem +{ + if (aBrowser === _fontBrowser) + return [_availableFonts count]; + + if (aBrowser === _traitBrowser) + return [_availableTraits count] + + return [_availableSizes count] +} + +- (id)browser:(id)aBrowser child:(int)index ofItem:(id)anItem +{ + if (aBrowser === _fontBrowser) + return [_availableFonts objectAtIndex:index]; + + if (aBrowser === _traitBrowser) + return [_availableTraits objectAtIndex:index]; + + return [_availableSizes objectAtIndex:index]; +} + +- (id)browser:(id)aBrowser objectValueForItem:(id)anItem +{ + return anItem; +} + +- (BOOL)browser:(id)aBrowser isLeafItem:(id)anItem +{ + return YES; +} + +@end + +[CPFontManager setFontPanelFactory:[CPFontPanel class]]; diff --git a/AppKit/CPTextView/CPLayoutManager.j b/AppKit/CPTextView/CPLayoutManager.j new file mode 100644 index 000000000..54591368e --- /dev/null +++ b/AppKit/CPTextView/CPLayoutManager.j @@ -0,0 +1,1373 @@ +/* + * CPLayoutManager.j + * AppKit + * + * FIXME remove from DOM when scrolled out of visible area? (as done in CPTableView) + * + * + * Created by Daniel Boehringer on 27/12/2013. + * All modifications copyright Daniel Boehringer 2013. + * Extensive code formatting and review by Andrew Hankinson + * Based on original work by + * Emmanuel Maillard on 27/02/2010. + * Copyright Emmanuel Maillard 2010. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "CPText.j" +@import "CPTextContainer.j" +@import "CGContext.j" +@import "CPTypesetter.j" +@import "CPFont.j" + +@global _MakeRangeFromAbs + +@class CPTextContainer +@class CPTextView + +function _isNewlineCharacter(chr) +{ + return (chr === '\n' || chr === '\r'); +} + +function _RectEqualToRectHorizontally(lhsRect, rhsRect) +{ + return (lhsRect.origin.x == rhsRect.origin.x && + lhsRect.size.width == rhsRect.size.width && + lhsRect.size.height == rhsRect.size.height); +} + +_oncontextmenuhandler = function () { return false; }; + + +/*! + @ingroup appkit + @class CPLayoutManager +*/ +@implementation CPLayoutManager : CPObject +{ + Class _lineFragmentFactory @accessors(setter=setLineFragmentFactory:); + CPMutableArray _textContainers @accessors(getter=textContainers); + CPTextStorage _textStorage @accessors(property=textStorage); + CPTypesetter _typesetter @accessors(property=typesetter); + + CPMutableArray _lineFragments; + CPMutableArray _lineFragmentsForRescue; + id _extraLineFragment; + + CPMutableArray _temporaryAttributes; + + BOOL _isValidatingLayoutAndGlyphs; + CPRange _removeInvalidLineFragmentsRange; +} + + +#pragma mark - +#pragma mark Init methods + +- (id)init +{ + if (self = [super init]) + { + [self _init]; + } + + return self; +} + +- (void)_init +{ + _isValidatingLayoutAndGlyphs = NO; + _lineFragmentFactory = [_CPLineFragment class]; + _lineFragments = [[CPMutableArray alloc] init]; + _textContainers = [[CPMutableArray alloc] init]; + _textStorage = [[CPTextStorage alloc] init]; + _typesetter = [CPTypesetter sharedSystemTypesetter]; + + [_textStorage addLayoutManager:self]; +} + + +#pragma mark - +#pragma mark Text containes method + +- (void)insertTextContainer:(CPTextContainer)aContainer atIndex:(int)index +{ + [_textContainers insertObject:aContainer atIndex:index]; + [aContainer setLayoutManager:self]; +} + +- (void)addTextContainer:(CPTextContainer)aContainer +{ + [_textContainers addObject:aContainer]; + [aContainer setLayoutManager:self]; +} + +- (void)removeTextContainerAtIndex:(int)index +{ + var container = [_textContainers objectAtIndex:index]; + [container setLayoutManager:nil]; + [_textContainers removeObjectAtIndex:index]; +} + +// fixme +- (int)numberOfGlyphs +{ + return [_textStorage length]; +} + +- (int)numberOfCharacters +{ + return [_textStorage length]; +} + +- (CPTextView)firstTextView +{ + return [_textContainers[0] textView]; +} + +// from cocoa (?) +- (CPTextView)textViewForBeginningOfSelection +{ + return [[_textContainers objectAtIndex:0] textView]; +} + +- (BOOL)layoutManagerOwnsFirstResponderInWindow:(CPWindow)aWindow +{ + var firstResponder = [aWindow firstResponder], + c = [_textContainers count]; + + for (var i = 0; i < c; i++) + { + if ([_textContainers[i] textView] === firstResponder) + return YES; + } + + return NO; +} + +- (CGRect)boundingRectForGlyphRange:(CGRange)aRange inTextContainer:(CPTextContainer)container +{ + if (![self numberOfGlyphs]) + return CGRectMake(0, 0, 1, 12); // crude hack to give a cursor in an empty doc. + + if (CPMaxRange(aRange) > [self numberOfGlyphs]) + aRange = CPMakeRange([self numberOfGlyphs] - 1, 1); + + var fragments = _objectsInRange(_lineFragments, aRange), + rect = nil, + c = [fragments count]; + + for (var i = 0; i < c; i++) + { + var fragment = fragments[i]; + + if (fragment._textContainer === container) + { + var frames = [fragment glyphFrames], + l = frames ? frames.length : 0; + + for (var j = 0; j < l; j++) + { + if (CPLocationInRange(fragment._range.location + j, aRange)) + { + if (!rect) + rect = CGRectCreateCopy(frames[j]); + else + rect = CGRectUnion(rect, frames[j]); + } + } + } + } + + return rect ? rect : CGRectMakeZero(); +} + +- (CPRange)glyphRangeForTextContainer:(CPTextContainer)aTextContainer +{ + var range = nil, + c = [_lineFragments count]; + + for (var i = 0; i < c; i++) + { + var fragment = _lineFragments[i]; + + if (fragment._textContainer === aTextContainer) + { + if (!range) + range = CPMakeRangeCopy(fragment._range); + else + range = CPUnionRange(range, fragment._range); + } + } + + return range ? range : CPMakeRange(CPNotFound, 0); +} + +- (void)_removeInvalidLineFragments +{ + _lineFragmentsForRescue = [_lineFragments copy]; + [_lineFragmentsForRescue makeObjectsPerformSelector:@selector(_deinvalidate)]; + + if (_removeInvalidLineFragmentsRange && _removeInvalidLineFragmentsRange.length && _lineFragments.length) + { + // [[_lineFragments subarrayWithRange:_removeInvalidLineFragmentsRange] makeObjectsPerformSelector:@selector(invalidate)]; + [_lineFragments removeObjectsInRange:_removeInvalidLineFragmentsRange]; + [[_lineFragmentsForRescue subarrayWithRange:_removeInvalidLineFragmentsRange] makeObjectsPerformSelector:@selector(invalidate)]; + } + +} + +- (void)_cleanUpDOM +{ + var l = _lineFragmentsForRescue? _lineFragmentsForRescue.length : 0; + + for (var i = 0; i < l; i++) + { + if (_lineFragmentsForRescue[i]._isInvalid) + [_lineFragmentsForRescue[i] _removeFromDOM]; + } +} + +- (void)_validateLayoutAndGlyphs +{ + if (_isValidatingLayoutAndGlyphs) + return; + + _isValidatingLayoutAndGlyphs = YES; + + var startIndex = CPNotFound, + removeRange = CPMakeRange(0, 0), + l = _lineFragments.length; + + if (l) + { + for (var i = 0; i < l; i++) + { + if (_lineFragments[i]._isInvalid) + { + startIndex = _lineFragments[i]._range.location; + removeRange.location = i; + removeRange.length = l - i; + break; + } + } + + // start one line above current line to make sure that a word can jump up + if (startIndex == CPNotFound && CPMaxRange (_lineFragments[l - 1]._range) < [_textStorage length]) + startIndex = CPMaxRange(_lineFragments[l - 1]._range); + } + else + { + startIndex = 0; + } + + /* nothing to validate and layout */ + if (startIndex == CPNotFound) + { + _isValidatingLayoutAndGlyphs = NO; + return; + } + + if (removeRange.length) + _removeInvalidLineFragmentsRange = CPMakeRangeCopy(removeRange); + + // We erased all lines + if (!startIndex) + [self setExtraLineFragmentRect:CGRectMake(0, 0) usedRect:CGRectMake(0, 0) textContainer:nil]; + // document.title=startIndex; + + [_typesetter layoutGlyphsInLayoutManager:self startingAtGlyphIndex:startIndex maxNumberOfLineFragments:-1 nextGlyphIndex:nil]; + +#if PLATFORM(DOM) + [self _cleanUpDOM]; +#endif + + _isValidatingLayoutAndGlyphs = NO; +} + +- (BOOL)_rescuingInvalidFragmentsWasPossibleForGlyphRange:(CPRange)aRange +{ + var l = _lineFragments.length, + location = aRange.location, + found = NO, + targetLine = 0; + + // try to find the first linefragment of the desired range + for (; targetLine < l; targetLine++) + { + if (CPLocationInRange(location, _lineFragments[targetLine]._range)) + { + found = YES; + break; + } + } + + if (!found) + return NO; + + if (!_lineFragmentsForRescue[targetLine]) + return NO; + + var startLineForDOMRemoval = targetLine, + isIdentical = YES, + newLineFragment= _lineFragments[targetLine], + oldLineFragment = _lineFragmentsForRescue[targetLine], + oldLength = CPMaxRange([_lineFragmentsForRescue lastObject]._range), + newLength = [[_textStorage string].length], + removalSkip = 1; + + // if (ABS(newLength - oldLength) > 1) + // return NO; + + if (![oldLineFragment isVisuallyIdenticalToFragment:newLineFragment]) + { + isIdentical = NO; + + // deleting newline in its own line-> move up instead of re-layouting + if (newLength < oldLength && oldLineFragment._range.length == 1 && newLineFragment._range.length > 1 && newLineFragment._range.location === oldLineFragment._range.location && oldLineFragment._isLast) + { + isIdentical = YES; + targetLine--; + removalSkip++; + } + + // newline entered in its own line-> move down instead of re-layouting + if (newLength > oldLength && newLineFragment._range.length == 1 && oldLineFragment._range.length > 1 && newLineFragment._range.location === oldLineFragment._range.location && newLineFragment._isLast) + { + isIdentical = YES; + startLineForDOMRemoval--; + } + } + + // patch the linefragments instead of re-layoutung + if (isIdentical) + { + var rangeOffset = CPMaxRange(_lineFragments[targetLine]._range) - CPMaxRange(_lineFragmentsForRescue[startLineForDOMRemoval]._range); + + if (ABS(rangeOffset) !== ABS(newLength - oldLength)) + return NO; + + var verticalOffset = _lineFragments[targetLine]._fragmentRect.origin.y - _lineFragmentsForRescue[startLineForDOMRemoval]._fragmentRect.origin.y, + l = _lineFragmentsForRescue.length, + newTargetLine = startLineForDOMRemoval + removalSkip; + + for (; newTargetLine < l; newTargetLine++) + { + _lineFragmentsForRescue[newTargetLine]._isInvalid = NO; // protect them from final removal + [_lineFragmentsForRescue[newTargetLine] _relocateVerticallyByY:verticalOffset rangeOffset:rangeOffset]; + _lineFragments.push(_lineFragmentsForRescue[newTargetLine]); + } + } + + return isIdentical; +} + +- (void)invalidateDisplayForGlyphRange:(CPRange)range +{ + var lineFragments = _objectsInRange(_lineFragments, range); + + for (var i = 0; i < lineFragments.length; i++) + [[lineFragments[i]._textContainer textView] setNeedsDisplayInRect:lineFragments[i]._fragmentRect]; +} + +- (void)invalidateLayoutForCharacterRange:(CPRange)aRange isSoft:(BOOL)flag actualCharacterRange:(CPRangePointer)actualCharRange +{ + var firstFragmentIndex = _lineFragments.length ? [_lineFragments _indexOfObject: aRange.location sortedByFunction:_sortRange context:nil] : CPNotFound; + + if (firstFragmentIndex == CPNotFound) + { + if (_lineFragments.length) + { + firstFragmentIndex = _lineFragments.length - 1; + } + else + { + if (actualCharRange) + { + actualCharRange.length = aRange.length; + actualCharRange.location = 0; + } + + return; + } + } + else + { + firstFragmentIndex = firstFragmentIndex + (firstFragmentIndex ? -1 : 0); + } + + var fragment = _lineFragments[firstFragmentIndex], + range = CPMakeRangeCopy(fragment._range); + + fragment._isInvalid = YES; + + /* invalidated all fragments that follow */ + for (var i = firstFragmentIndex + 1; i < _lineFragments.length; i++) + { + _lineFragments[i]._isInvalid = YES; + range = CPUnionRange(range, _lineFragments[i]._range); + } + + if (CPMaxRange(range) < CPMaxRange(aRange)) + range = CPUnionRange(range, aRange); + + if (actualCharRange) + { + actualCharRange.length = range.length; + actualCharRange.location = range.location; + } +} + +- (void)textStorage:(CPTextStorage)textStorage edited:(unsigned)mask range:(CPRange)charRange changeInLength:(int)delta invalidatedRange:(CPRange)invalidatedRange +{ + var actualRange = CPMakeRange(CPNotFound,0); + + [self invalidateLayoutForCharacterRange:invalidatedRange isSoft:NO actualCharacterRange:actualRange]; + [self invalidateDisplayForGlyphRange:actualRange]; + [self _validateLayoutAndGlyphs]; + [[self firstTextView] sizeToFit]; +} + +- (CPRange)glyphRangeForBoundingRect:(CGRect)aRect inTextContainer:(CPTextContainer)container +{ + var c = [_lineFragments count], + range; + + for (var i = 0; i < c; i++) + { + var fragment = _lineFragments[i]; + + if (fragment._textContainer === container) + { + if (CGRectContainsRect(aRect, fragment._fragmentRect)) + { + if (!range) + range = CPMakeRangeCopy(fragment._range); + else + range = CPUnionRange(range, fragment._range); + } + else + { + var glyphRange = CPMakeRange(CPNotFound, 0), + frames = [fragment glyphFrames]; + + for (var j = 0; j < frames.length; j++) + { + if (CGRectIntersectsRect(aRect, frames[j])) + { + if (glyphRange.location == CPNotFound) + glyphRange.location = fragment._range.location + j; + else + glyphRange.length++; + } + } + + if (glyphRange.location != CPNotFound) + { + if (!range) + range = CPMakeRangeCopy(glyphRange); + else + range = CPUnionRange(range, glyphRange); + } + } + } + } + + return range ? range : CPMakeRange(0,0); +} + +- (void)drawBackgroundForGlyphRange:(CPRange)aRange atPoint:(CGPoint)aPoint +{ + +} + +- (void)drawUnderlineForGlyphRange:(CPRange)glyphRange + underlineType:(int)underlineVal + baselineOffset:(float)baselineOffset + lineFragmentRect:(CGRect)lineFragmentRect + lineFragmentGlyphRange:(CPRange)lineGlyphRange + containerOrigin:(CGPoint)containerOrigin +{ +// FIXME +} + +- (void)drawGlyphsForGlyphRange:(CPRange)aRange atPoint:(CGPoint)aPoint +{ + var lineFragments = _objectsInRange(_lineFragments, aRange); + + if (!lineFragments.length) + return; + + var paintedRange = CPMakeRangeCopy(aRange), + l = lineFragments.length, + lineFragmentIndex, + ctx; + + for (lineFragmentIndex = 0; lineFragmentIndex < l; lineFragmentIndex++) + { + var currentFragment = lineFragments[lineFragmentIndex]; + [currentFragment drawInContext:ctx atPoint:aPoint forRange:paintedRange]; + } +} + +- (unsigned)glyphIndexForPoint:(CGPoint)point inTextContainer:(CPTextContainer)container fractionOfDistanceThroughGlyph:(FloatArray)partialFraction +{ + var c = [_lineFragments count]; + + for (var i = 0; i < c; i++) + { + var fragment = _lineFragments[i]; + + if (fragment._textContainer === container) + { + var frames = [fragment glyphFrames], + len = fragment._range.length; + + for (var j = 0; j < len; j++) + { + if (CGRectContainsPoint(frames[j], point)) + { + if (partialFraction) + partialFraction[0] = (point.x - frames[j].origin.x) / frames[j].size.width; + + return fragment._range.location + j; + } + } + } + } + + // Not found, maybe a point left to the last character was clicked -> search again with broader constraints + if ([[_textStorage string] length]) + { + for (var i = 0; i < c; i++) + { + var fragment = _lineFragments[i]; + + if (fragment._textContainer === container) + { + // Within the horizontal territory of the current (not-empty) line? + if (fragment._range.length > 0 && point.y > fragment._fragmentRect.origin.y && + point.y <= fragment._fragmentRect.origin.y + fragment._fragmentRect.size.height) + { + // Skip tabs and move on the last fragment in this line + if (i < c - 1 && _lineFragments[i + 1]._fragmentRect.origin.y === fragment._fragmentRect.origin.y) + continue; + + var nlLoc = CPMaxRange(fragment._range), + lastFrame = [fragment glyphFrames][fragment._range.length - 1], + firstFrame = [fragment glyphFrames][0]; + + // stay on the line the newline character belongs to + if (_isNewlineCharacter([[_textStorage string] characterAtIndex:nlLoc > 0 ? nlLoc - 1 : 0])) + nlLoc--; + + // Clicked right to the last character + if (point.x > CGRectGetMaxX(lastFrame)) + return nlLoc; + // Clicked left to the last character + else if (point.x <= CGRectGetMinX(firstFrame)) + return fragment._range.location; + else + return nlLoc; + } + } + } + } + + return point.y > 0 ? [[_textStorage string] length] : 0; +} + +- (unsigned)glyphIndexForPoint:(CGPoint)point inTextContainer:(CPTextContainer)container +{ + return [self glyphIndexForPoint:point inTextContainer:container fractionOfDistanceThroughGlyph:nil]; +} + +- (void)_setAttributes:(CPDictionary)attributes toTemporaryAttributes:(_CPTemporaryAttributes)tempAttributes +{ + tempAttributes._attributes = attributes; +} + +- (void)_addAttributes:(CPDictionary)attributes toTemporaryAttributes:(_CPTemporaryAttributes)tempAttributes +{ + [tempAttributes._attributes addEntriesFromDictionary:attributes]; +} + +- (void)_handleTemporaryAttributes:(CPDictionary)attributes forCharacterRange:(CPRange)charRange withSelector:(SEL)attributesOperation +{ + // FIXME +} + +- (void)setTemporaryAttributes:(CPDictionary)attributes forCharacterRange:(CPRange)charRange +{ + [self _handleTemporaryAttributes:attributes forCharacterRange:charRange withSelector:@selector(_setAttributes:toTemporaryAttributes:)]; +} + +- (void)addTemporaryAttributes:(CPDictionary)attributes forCharacterRange:(CPRange)charRange +{ + [self _handleTemporaryAttributes:attributes forCharacterRange:charRange withSelector:@selector(_addAttributes:toTemporaryAttributes:)]; +} + +- (void)removeTemporaryAttribute:(CPString)attributeName forCharacterRange:(CPRange)charRange +{ + // FIXME +} + +- (CPDictionary)temporaryAttributesAtCharacterIndex:(unsigned)index effectiveRange:(CPRangePointer)effectiveRange +{ + // FIXME +} + +- (void)textContainerChangedTextView:(CPTextContainer)aContainer +{ + // FIXME +} + +- (void)_appendNewLineFragmentInTextContainer:(CPTextContainer)aTextContainer forGlyphRange:(CPRange)glyphRange +{ + _lineFragments.push([[_lineFragmentFactory alloc] initWithRange:glyphRange textContainer:aTextContainer textStorage:_textStorage]); +} + +- (void)setTextContainer:(CPTextContainer)aTextContainer forGlyphRange:(CPRange)glyphRange +{ + var fragments = _objectsInRange(_lineFragments, glyphRange), + l = fragments.length; + + for (var i = 0; i < l; i++) + fragments[i]._textContainer = aTextContainer; +} + +- (id)_lineFragmentForLocation:(unsigned) aLoc +{ + var fragments = _objectsInRange(_lineFragments, CPMakeRange(aLoc, 0)), + l = fragments.length; + + if (l > 0) + return fragments[0]; + + return nil; +} + +- (id)_firstLineFragmentForLineFromLocation:(unsigned)location +{ + var l = _lineFragments.length; + + for (var i = 0; i < l; i++) + { + if (CPLocationInRange(location, _lineFragments[i]._range)) + { + var j = i; + + while (--j > 0 && !_lineFragments[j]._isLast) + { + // body intentionally left empty + } + + return _lineFragments[j + 1]; + } + } + + return nil; +} +- (id)_lastLineFragmentForLineFromLocation:(unsigned)location +{ + var l = _lineFragments.length; + + for (var i = 0; i < l; i++) + { + if (CPLocationInRange(location, _lineFragments[i]._range)) + { + var j = i; + + while (!_lineFragments[j]._isLast) + j++; + + return _lineFragments[j]; + } + } + + return nil; +} + +- (double)_characterOffsetAtLocation:(unsigned)location +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, location); + + if (!lineFragment) + return 0.0; + + var index = location - lineFragment._range.location; + + return lineFragment._glyphsOffsets[index]; +} + +- (double)_descentAtLocation:(unsigned)location +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, location); + + if (!lineFragment) + return 0.0; + + var index = location - lineFragment._range.location; + + return lineFragment._glyphsFrames[index]._descent; +} + +- (void)setLineFragmentRect:(CGRect)fragmentRect forGlyphRange:(CPRange)glyphRange usedRect:(CGRect)usedRect +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, glyphRange.location); + + if (lineFragment) + { + lineFragment._fragmentRect = CGRectCreateCopy(fragmentRect); + lineFragment._usedRect = CGRectCreateCopy(usedRect); + } +} + +- (void)_setAdvancements:(CPArray)someAdvancements forGlyphRange:(CPRange)glyphRange +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, glyphRange.location); + + if (lineFragment) + [lineFragment setAdvancements:someAdvancements]; +} + +- (void)setLocation:(CGPoint)aPoint forStartOfGlyphRange:(CPRange)glyphRange +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, glyphRange.location); + + if (lineFragment) + lineFragment._location = CGPointCreateCopy(aPoint); +} + +- (CGRect)extraLineFragmentRect +{ + if (_extraLineFragment) + return CGRectCreateCopy(_extraLineFragment._fragmentRect); + + return CGRectMakeZero(); +} + +- (CPTextContainer)extraLineFragmentTextContainer +{ + if (_extraLineFragment) + return _extraLineFragment._textContainer; + + return nil; +} + +- (CGRect)extraLineFragmentUsedRect +{ + if (_extraLineFragment) + return CGRectCreateCopy(_extraLineFragment._usedRect); + + return CGRectMakeZero(); +} + +- (void)setExtraLineFragmentRect:(CGRect)rect usedRect:(CGRect)usedRect textContainer:(CPTextContainer)textContainer +{ + if (textContainer) + { + _extraLineFragment = {}; + _extraLineFragment._fragmentRect = CGRectCreateCopy(rect); + _extraLineFragment._usedRect = CGRectCreateCopy(usedRect); + _extraLineFragment._textContainer = textContainer; + } + else + { + _extraLineFragment = nil; + } +} + +- (CGRect)usedRectForTextContainer:(CPTextContainer)textContainer +{ + var rect, + l = _lineFragments.length; + + for (var i = 0; i < l; i++) + { + if (_lineFragments[i]._textContainer === textContainer) + { + if (rect) + rect = CGRectUnion(rect, _lineFragments[i]._usedRect); + else + rect = CGRectCreateCopy(_lineFragments[i]._usedRect); + } + } + + return rect ? rect : CGRectMakeZero(); +} + +- (CGRect)lineFragmentRectForGlyphAtIndex:(unsigned)glyphIndex effectiveRange:(CPRangePointer)effectiveGlyphRange +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, glyphIndex); + + if (!lineFragment) + return CGRectMakeZero(); + + if (effectiveGlyphRange) + { + effectiveGlyphRange.location = lineFragment._range.location; + effectiveGlyphRange.length = lineFragment._range.length; + } + + return CGRectCreateCopy(lineFragment._fragmentRect); +} + +- (CGRect)lineFragmentUsedRectForGlyphAtIndex:(unsigned)glyphIndex effectiveRange:(CPRangePointer)effectiveGlyphRange +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, glyphIndex); + + if (!lineFragment) + return CGRectMakeZero(); + + if (effectiveGlyphRange) + { + effectiveGlyphRange.location = lineFragment._range.location; + effectiveGlyphRange.length = lineFragment._range.length; + } + + return CGRectCreateCopy(lineFragment._usedRect); +} + +- (CGPoint)locationForGlyphAtIndex:(unsigned)index +{ + if (_lineFragments.length > 0 && index >= [self numberOfGlyphs] - 1) + { + var lineFragment= _lineFragments[_lineFragments.length - 1], + glyphFrames = [lineFragment glyphFrames]; + + if (glyphFrames.length > 0) + return CGPointCreateCopy(glyphFrames[glyphFrames.length - 1].origin); + } + + var lineFragment = _objectWithLocationInRange(_lineFragments, index); + + if (lineFragment) + { + if (index == lineFragment._range.location) + return CGPointCreateCopy(lineFragment._location); + + var glyphFrames = [lineFragment glyphFrames]; + + return CGPointCreateCopy(glyphFrames[index - lineFragment._range.location].origin); + } + + return CGPointMakeZero(); +} + +- (CPTextContainer)textContainerForGlyphAtIndex:(unsigned)index effectiveRange:(CPRangePointer)effectiveGlyphRange withoutAdditionalLayout:(BOOL)flag +{ + var lineFragment = _objectWithLocationInRange(_lineFragments, index); + + if (lineFragment) + { + if (effectiveGlyphRange) + { + effectiveGlyphRange.location = lineFragment._range.location; + effectiveGlyphRange.length = lineFragment._range.length; + } + + return lineFragment._textContainer; + } + + return [_textContainers lastObject]; +} + +- (CPTextContainer)textContainerForGlyphAtIndex:(unsigned)index effectiveRange:(CPRangePointer)effectiveGlyphRange +{ + return [self textContainerForGlyphAtIndex:index effectiveRange:effectiveGlyphRange withoutAdditionalLayout:NO]; +} + +- (CPRange)characterRangeForGlyphRange:(CPRange)aRange actualGlyphRange:(CPRangePointer)actualRange +{ + return _MakeRangeFromAbs([self characterIndexForGlyphAtIndex:aRange.location], + [self characterIndexForGlyphAtIndex:CPMaxRange(aRange)]); +} + +- (unsigned)characterIndexForGlyphAtIndex:(unsigned)index +{ + /* FIXME: stub */ + return index; +} + +- (CPArray)rectArrayForCharacterRange:(CPRange)charRange + withinSelectedCharacterRange:(CPRange)selectedCharRange + inTextContainer:(CPTextContainer)container + rectCount:(CGRectPointer)rectCount +{ + + var rectArray = [], + lineFragments = _objectsInRange(_lineFragments, selectedCharRange); + + if (!lineFragments.length) + return rectArray; + + var containerSize = [container containerSize]; + + for (var i = 0; i < lineFragments.length; i++) + { + var fragment = lineFragments[i]; + + if (fragment._textContainer === container) + { + var frames = [fragment glyphFrames], + rect = nil, + len = fragment._range.length; + + for (var j = 0; j < len; j++) + { + if (CPLocationInRange(fragment._range.location + j, selectedCharRange)) + { + var correctedRect = CGRectCreateCopy(frames[j]); + correctedRect.size.height -= frames[j]._descent; + correctedRect.origin.y -= frames[j]._descent; + if (!rect) + rect = CGRectCreateCopy(correctedRect); + else + rect = CGRectUnion(rect, correctedRect); + + if (_isNewlineCharacter([[_textStorage string] characterAtIndex:MAX(0, CPMaxRange(selectedCharRange) - 1)])) + { + rect.size.width = containerSize.width - rect.origin.x; + } + } + } + + if (rect) + rectArray.push(rect); + } + } + + var len = rectArray.length; + + for (var i = 0; i < len - 1; i++) // extend the width of all but the last one + { + if (FLOOR(CGRectGetMaxY(rectArray[i])) == FLOOR(CGRectGetMaxY(rectArray[i + 1]))) + continue; + + rectArray[i].size.width = containerSize.width - rectArray[i].origin.x; + } + + return rectArray; +} + +@end + + +var CPLayoutManagerTextStorageKey = @"CPLayoutManagerTextStorageKey"; + +@implementation CPLayoutManager (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + [self _init]; + + _textStorage = [aCoder decodeObjectForKey:CPLayoutManagerTextStorageKey]; + [_textStorage addLayoutManager:self]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_textStorage forKey:CPLayoutManagerTextStorageKey]; +} + +@end + + +@implementation CPArray (SortedSearching) + +- (unsigned)_indexOfObject:(id)anObject sortedByFunction:(Function)aFunction context:(id)aContext +{ + var length= self.length; + + if (!aFunction) + return CPNotFound; + + if (length === 0) + return -1; + + var mid, + c, + first = 0, + last = length - 1; + + while (first <= last) + { + mid = FLOOR((first + last) / 2); + c = aFunction(anObject, self[mid], aContext); + + if (c > 0) + { + first = mid + 1; + } + else if (c < 0) + { + last = mid - 1; + } + else + { + while (mid < length - 1 && aFunction(anObject, self[mid + 1], aContext) == CPOrderedSame) + mid++; + + return mid; + } + } + + var result = -first - 1; + + return result >= 0 ? result : CPNotFound; +} + +@end + +var _sortRange = function(location, anObject) +{ + if (CPLocationInRange(location, anObject._range)) + return CPOrderedSame; + else if (CPMaxRange(anObject._range) <= location) + return CPOrderedDescending; + else + return CPOrderedAscending; +} + +var _objectWithLocationInRange = function(aList, aLocation) +{ + var index = [aList _indexOfObject:aLocation sortedByFunction:_sortRange context:nil]; + + if (index != CPNotFound) + return aList[index]; + + return nil; +} + +var _objectsInRange = function(aList, aRange) +{ + var firstIndex = [aList _indexOfObject:aRange.location sortedByFunction:_sortRange context:nil], + lastIndex = [aList _indexOfObject:CPMaxRange(aRange) sortedByFunction:_sortRange context:nil]; + + if (firstIndex === CPNotFound) + firstIndex = 0; + + if (lastIndex === CPNotFound) + lastIndex = aList.length - 1; + + return aList.slice(firstIndex, lastIndex + 1); +} + +@implementation _CPLineFragment : CPObject +{ + CPArray _glyphsFrames @accessors(getter=glyphFrames); + CPArray _glyphsOffsets; + + BOOL _isInvalid; + BOOL _isLast; + CGRect _fragmentRect; + CGRect _usedRect; + CGPoint _location; + CPRange _range; + CPTextContainer _textContainer; + CPMutableArray _runs; +} + +#pragma mark - +#pragma mark Init methods + +- (id)createDOMElementWithText:(CPString)aString andFont:(CPFont)aFont andColor:(CPColor)aColor +{ +#if PLATFORM(DOM) + var style, + span = document.createElement("span"); + + span.oncontextmenu = span.onmousedown = span.onselectstart = _oncontextmenuhandler; + // span.contentEditable = true; // this unfortunately does not work to make native pasting work on safari + + style = span.style; + style.position = "absolute"; + style.visibility = "visible"; + style.padding = "0px"; + style.margin = "0px"; + style.whiteSpace = "pre"; + style.backgroundColor = "transparent"; + style.font = [aFont cssString]; + + if (aColor) + style.color = [aColor cssString]; + + if (CPFeatureIsCompatible(CPJavaScriptInnerTextFeature)) + span.innerText = aString; + else if (CPFeatureIsCompatible(CPJavaScriptTextContentFeature)) + span.textContent = aString; + + // FIXME aString.replace(/&/g,'&') + return span; +#else + return nil; +#endif +} + +- (id)initWithRange:(CPRange)aRange textContainer:(CPTextContainer)aContainer textStorage:(CPTextStorage)textStorage +{ + if (self = [super init]) + { + var effectiveRange = CPMakeRange(0,0), + location; + + _fragmentRect = CGRectMakeZero(); + _usedRect = CGRectMakeZero(); + _location = CGPointMakeZero(); + _range = CPMakeRangeCopy(aRange); + _textContainer = aContainer; + _isInvalid = NO; + _runs = [[CPMutableArray alloc] init]; + + for (location = aRange.location; location < CPMaxRange(aRange); location = CPMaxRange(effectiveRange)) + { + var attributes = [textStorage attributesAtIndex:location effectiveRange:effectiveRange]; + + effectiveRange = attributes ? CPIntersectionRange(aRange, effectiveRange) : aRange; + + var string = [textStorage._string substringWithRange:effectiveRange], + font = [textStorage font] || [CPFont systemFontOfSize:12.0]; + + if ([attributes containsKey:CPFontAttributeName]) + font = [attributes objectForKey:CPFontAttributeName]; + + var color = [attributes objectForKey:CPForegroundColorAttributeName], + elem = [self createDOMElementWithText:string andFont:font andColor:color], + run = {_range:CPMakeRangeCopy(effectiveRange), color:color, font:font, elem:nil, string:string}; + + _runs.push(run); + + if (!CPMaxRange(effectiveRange)) + break; + } + } + + return self; +} + +- (void)setAdvancements:(CPArray)someAdvancements +{ + var count = someAdvancements.length, + origin = CGPointMake(_fragmentRect.origin.x + _location.x, _fragmentRect.origin.y), + height = _usedRect.size.height; + + _glyphsFrames = new Array(count); + _glyphsOffsets = new Array(count); + + for (var i = 0; i < count; i++) + { + _glyphsFrames[i] = CGRectMake(origin.x, origin.y, someAdvancements[i].width, height); + _glyphsFrames[i]._descent = someAdvancements[i].descent + _glyphsOffsets[i] = height - someAdvancements[i].height; + origin.x += someAdvancements[i].width; + } +} + +- (void)_adjustForHeight:(double)height +{ + var count = _glyphsFrames.length; + + for (var i = 0; i < count; i++) + _glyphsFrames[i].origin.y += (height - _fragmentRect.size.height); + + _fragmentRect.size.height = height; +} + +- (CPString)description +{ + return [super description] + + "\n\t_fragmentRect="+CPStringFromRect(_fragmentRect) + + "\n\t_usedRect="+CPStringFromRect(_usedRect) + + "\n\t_location="+CPStringFromPoint(_location) + + "\n\t_range="+CPStringFromRange(_range); +} + +- (void)drawUnderlineForGlyphRange:(CPRange)glyphRange + underlineType:(int)underlineVal + baselineOffset:(float)baselineOffset + containerOrigin:(CGPoint)containerOrigin +{ +// FIXME +} + +- (void)invalidate +{ + _isInvalid = YES; +} + +- (void)_deinvalidate +{ + _isInvalid = NO; +} + +- (void)_removeFromDOM +{ + var l = _runs.length; + + for (var i = 0; i < l; i++) + { + if (_runs[i].elem && _runs[i].DOMactive) + _textContainer._textView._DOMElement.removeChild(_runs[i].elem); + + _runs[i].elem = nil; + _runs[i].DOMactive = NO; + } +} + +- (void)drawInContext:(CGContext)context atPoint:(CGPoint)aPoint forRange:(CPRange)aRange +{ + var runs = _objectsInRange(_runs, aRange), + c = runs.length, + orig = CGPointMake(_fragmentRect.origin.x, _fragmentRect.origin.y); + + for (var i = 0; i < c; i++) + { + var run = runs[i]; + + if (!run.elem && CPRectIntersectsRect([_textContainer._textView exposedRect], _fragmentRect)) + { + run.elem=[self createDOMElementWithText:run.string andFont:run.font andColor:run.color]; + } + + if (run.DOMactive && !run.DOMpatched) + continue; + + if (!_glyphsFrames) + continue; + + var loc = run._range.location - _runs[0]._range.location; + orig.x = _glyphsFrames[loc].origin.x + aPoint.x; + orig.y = _glyphsFrames[loc].origin.y + aPoint.y + _glyphsOffsets[loc]; + + if(run.elem) + { + run.elem.style.left = (orig.x) + "px"; + run.elem.style.top = (orig.y) + "px"; + + if (!run.DOMactive) + _textContainer._textView._DOMElement.appendChild(run.elem); + + run.DOMactive = YES; + } + + run.DOMpatched = NO; + + } +} + +- (void)backgroundColorForGlyphAtIndex:(unsigned)index +{ + var run = _objectWithLocationInRange(_runs, index); + + if (run) + return run.backgroundColor; + + return [CPColor clearColor]; +} + +- (BOOL)isVisuallyIdenticalToFragment:(_CPLineFragment)newLineFragment +{ + var newFragmentRuns= newLineFragment._runs, + oldFragmentRuns= _runs; + + if (!oldFragmentRuns || !newFragmentRuns || oldFragmentRuns.length !== newFragmentRuns.length) + return NO; + + var l = oldFragmentRuns.length; + + for (var i = 0; i < l; i++) + { + if (newFragmentRuns[i].string !== oldFragmentRuns[i].string) + return NO; + + if (!_RectEqualToRectHorizontally(newLineFragment._fragmentRect, _fragmentRect)) + return NO; + + if (newFragmentRuns[i].color !== oldFragmentRuns[i].color || newFragmentRuns[i].font !== oldFragmentRuns[i].font) + return NO; + + } + + return YES; +} + +- (void)_relocateVerticallyByY:(double)verticalOffset rangeOffset:(unsigned)rangeOffset +{ + var l = _runs.length; + + _range.location += rangeOffset; + + for (var i = 0; i < l; i++) + { + _runs[i]._range.location += rangeOffset; + + if (verticalOffset && _runs[i].elem) + { + _runs[i].elem.top = (_runs[i].elem.top + verticalOffset) + 'px'; + _runs[i].DOMpatched = YES; + } + } + + if (!verticalOffset) + return NO; + + _fragmentRect.origin.y += verticalOffset; + _usedRect.origin.y += verticalOffset; + + var l = _glyphsFrames.length; + + for (var i = 0; i < l ; i++) + { + _glyphsFrames[i].origin.y += verticalOffset; + } +} + +@end + +@implementation _CPTemporaryAttributes : CPObject +{ + CPDictionary _attributes; + CPRange _range; +} + +- (id)initWithRange:(CPRange)aRange attributes:(CPDictionary)attributes +{ + if (self = [super init]) + { + _attributes = attributes; + _range = CPMakeRangeCopy(aRange); + } + + return self; +} + +- (CPString)description +{ + return [super description] + + "\n\t_range="+CPStringFromRange(_range) + + "\n\t_attributes="+[_attributes description]; +} + +@end diff --git a/AppKit/CPTextView/CPParagraphStyle.j b/AppKit/CPTextView/CPParagraphStyle.j new file mode 100644 index 000000000..54d88ee73 --- /dev/null +++ b/AppKit/CPTextView/CPParagraphStyle.j @@ -0,0 +1,223 @@ +/* + * CPParagraphStyle.j + * AppKit + * + * FIXME + * This is basically a stub. + * We need to store all the spacing informations as well as writing direction (among others) + * + * Created by Daniel Boehringer on 11/01/2014 + * Copyright Daniel Boehringer 2014. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +@import + +@import "CPText.j" + +CPLeftTabStopType = 0; + +CPParagraphStyleAttributeName = @"CPParagraphStyleAttributeName"; + +var _sharedDefaultParagraphStyle, + _defaultTabStopArray; + +@implementation CPParagraphStyle : CPObject +{ + CPArray _tabStops @accessors(property=tabStops); + CPTextAlignment _alignment @accessors(property=alignment); + unsigned _firstLineHeadIndent @accessors(property=firstLineHeadIndent); + unsigned _headIndent @accessors(property=headIndent); + unsigned _tailIndent @accessors(property=tailIndent); + unsigned _paragraphSpacing @accessors(property=paragraphSpacing); + unsigned _minimumLineHeight @accessors(property=minimumLineHeight); + unsigned _maximumLineHeight @accessors(property=maximumLineHeight); + unsigned _lineSpacing @accessors(property=lineSpacing); +} + + +#pragma mark - +#pragma mark Class methods + ++ (CPParagraphStyle)defaultParagraphStyle +{ + if (!_sharedDefaultParagraphStyle) + _sharedDefaultParagraphStyle = [self new]; + + return _sharedDefaultParagraphStyle; +} + ++ (CPArray)_defaultTabStops +{ + if (!_defaultTabStopArray) + { + var i; + _defaultTabStopArray = []; + + // FIXME: Define constants for these magic numbers: 13, 28 + for (i = 1; i < 16 ; i++) + { + _defaultTabStopArray.push([[CPTextTab alloc] initWithType:CPLeftTabStopType location:i * 28]); + } + } + + return _defaultTabStopArray; +} + + +#pragma mark - +#pragma mark Init methods + +- (id)init +{ + [self _initWithDefaults]; + + return self; +} + +- (CPParagraphStyle)initWithParagraphStyle:(CPParagraphStyle)other +{ + self = [super init]; + + _tabStops = [other._tabStops copy]; + _alignment = other._alignment; + _firstLineHeadIndent = other._firstLineHeadIndent; + _headIndent = other._headIndent; + _tailIndent = other._tailIndent; + _paragraphSpacing = other._paragraphSpacing; + _minimumLineHeight = other._minimumLineHeight; + _maximumLineHeight = other._maximumLineHeight; + _lineSpacing = other._lineSpacing; + + return self; +} + +- (void)_initWithDefaults +{ + _alignment = CPLeftTextAlignment; + _tabStops = [[[self class] _defaultTabStops] copy]; +} + +- (void)addTabStop:(CPTextTab)aStop +{ + _tabStops.push(aStop); +} + +- (id)copy +{ + var other = [[self class] alloc]; + + return [other initWithParagraphStyle:self]; +} + +@end + + +var CPParagraphStyleTabStopsKey = @"CPParagraphStyleTabStopsKey", + CPParagraphStyleAlignmentKey = @"CPParagraphStyleAlignmentKey", + CPParagraphStyleFirstLineHeadIndentKey = @"CPParagraphStyleFirstLineHeadIndentKey", + CPParagraphStyleHeadIndentKey = @"CPParagraphStyleHeadIndentKey", + CPParagraphStyleTailIndentKey = @"CPParagraphStyleTailIndentKey", + CPParagraphStyleParagraphSpacingKey = @"CPParagraphStyleParagraphSpacingKey", + CPParagraphStyleMinimumLineHeightKey = @"CPParagraphStyleMinimumLineHeightKey", + CPParagraphStyleMaximumLineHeightKey = @"CPParagraphStyleMaximumLineHeightKey", + CPParagraphStyleLineSpacingKey = @"CPParagraphStyleLineSpacingKey"; + +@implementation CPParagraphStyle (CPCoding) + +- (id)initWithCoder:(id)aCoder +{ + self = [self init]; + + if (self) + { + _tabStops = [aCoder decodeObjectForKey:"CPParagraphStyleTabStopsKey"]; + _alignment = [aCoder decodeIntForKey:"CPParagraphStyleAlignmentKey"]; + _firstLineHeadIndent = [aCoder decodeIntForKey:"CPParagraphStyleFirstLineHeadIndentKey"]; + _headIndent = [aCoder decodeIntForKey:"CPParagraphStyleHeadIndentKey"]; + _tailIndent = [aCoder decodeIntForKey:"CPParagraphStyleTailIndentKey"]; + _paragraphSpacing = [aCoder decodeIntForKey:"CPParagraphStyleParagraphSpacingKey"]; + _minimumLineHeight = [aCoder decodeIntForKey:"CPParagraphStyleMinimumLineHeightKey"]; + _maximumLineHeight = [aCoder decodeIntForKey:"CPParagraphStyleMaximumLineHeightKey"]; + _lineSpacing = [aCoder decodeIntForKey:"CPParagraphStyleLineSpacingKey"]; + } + + return self; +} + +- (void)encodeWithCoder:(id)aCoder +{ + [aCoder encodeInt:_alignment forKey:"CPParagraphStyleAlignmentKey"]; + [aCoder encodeObject:_tabStops forKey:"CPParagraphStyleTabStopsKey"]; + [aCoder encodeInt:_firstLineHeadIndent forKey:"CPParagraphStyleFirstLineHeadIndentKey"]; + [aCoder encodeInt:_headIndent forKey:"CPParagraphStyleHeadIndentKey"]; + [aCoder encodeInt:_tailIndent forKey:"CPParagraphStyleTailIndentKey"]; + [aCoder encodeInt:_paragraphSpacing forKey:"CPParagraphStyleParagraphSpacingKey"]; + [aCoder encodeInt:_minimumLineHeight forKey:"CPParagraphStyleMinimumLineHeightKey"]; + [aCoder encodeInt:_maximumLineHeight forKey:"CPParagraphStyleMaximumLineHeightKey"]; + [aCoder encodeInt:_lineSpacing forKey:"CPParagraphStyleLineSpacingKey"]; +} + + +@end + + +@implementation CPTextTab : CPObject +{ + int _type @accessors(property = tabStopType); + double _location @accessors(property = location); +} + +- (id)initWithType:(CPTabStopType) aType location:(double) aLocation +{ + if ([self = [super init]]) + { + _type = aType; + _location = aLocation; + } + + return self; +} + +@end + + +var CPTextTabTypeKey = @"CPTextTabTypeKey", + CPTextTabLocationKey = @"CPTextTabLocationKey"; + +@implementation CPTextTab (CPCoding) + +- (id)initWithCoder:(id)aCoder +{ + self = [self init]; + + if (self) + { + _type = [aCoder decodeIntForKey:"CPTextTabTypeKey"]; + _location = [aCoder decodeDoubleForKey:"CPTextTabLocationKey"]; + } + + return self; +} + +- (void)encodeWithCoder:(id)aCoder +{ + [aCoder encodeInt:_type forKey:"CPTextTabTypeKey"]; + [aCoder encodeDouble:_location forKey:"CPTextTabLocationKey"]; +} + +@end diff --git a/AppKit/CPTextView/CPTextContainer.j b/AppKit/CPTextView/CPTextContainer.j new file mode 100644 index 000000000..5c3f485a9 --- /dev/null +++ b/AppKit/CPTextView/CPTextContainer.j @@ -0,0 +1,255 @@ +/* + * CPTextContainer.j + * AppKit + * + * Created by Emmanuel Maillard on 27/02/2010. + * Copyright Emmanuel Maillard 2010. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +@import "CPLayoutManager.j" + +@class CPTextView +@class CPLayoutManager + +/* + @global + @group CPLineSweepDirection +*/ +CPLineSweepLeft = 0; +/* + @global + @group CPLineSweepDirection +*/ +CPLineSweepRight = 1; +/* + @global + @group CPLineSweepDirection +*/ +CPLineSweepDown = 2; +/* + @global + @group CPLineSweepDirection +*/ +CPLineSweepUp = 3; + +/* + @global + @group CPLineMovementDirection +*/ +CPLineDoesntMoves = 0; +/* + @global + @group CPLineMovementDirection +*/ +CPLineMovesLeft = 1; +/* + @global + @group CPLineMovementDirection +*/ +CPLineMovesRight = 2; +/* + @global + @group CPLineMovementDirection +*/ +CPLineMovesDown = 3; +/* + @global + @group CPLineMovementDirection +*/ +CPLineMovesUp = 4; + +/*! + @ingroup appkit + @class CPTextContainer +*/ +@implementation CPTextContainer : CPObject +{ + float _lineFragmentPadding @accessors(property=lineFragmentPadding); + CGSize _size @accessors(property=containerSize) + CPLayoutManager _layoutManager @accessors(property=layoutManager); + CPTextView _textView @accessors(property=textView); + BOOL _inResizing; +} + + +#pragma mark - +#pragma mark Init methods + +- (id)initWithContainerSize:(CGSize)aSize +{ + self = [super init]; + + if (self) + { + _size = aSize; + [self _init]; + } + + return self; +} + +- (id)init +{ + return [self initWithContainerSize:CPMakeSize(1e7, 1e7)]; +} + +- (void)_init +{ + _lineFragmentPadding = 0.0; + + _layoutManager = [[CPLayoutManager alloc] init]; + [_layoutManager addTextContainer:self]; +} + +#pragma mark - +#pragma mark Setter methods + +- (void)setContainerSize:(CGSize)someSize +{ + var oldSize = _size; + + _size = CGSizeMakeCopy(someSize); + + if (oldSize.width != _size.width) + { + _inResizing = YES; + [_layoutManager invalidateLayoutForCharacterRange:CPMakeRange(0, [[_layoutManager textStorage] length]) + isSoft:NO + actualCharacterRange:NULL]; + + [_layoutManager _validateLayoutAndGlyphs]; + [_textView sizeToFit]; // this is necessary to adopt the height of CPTextView in case of rewrapping + _inResizing = NO; + } +} + +// Controls whether the receiver adjusts the width of its bounding rectangle when its text view is resized. +- (void)setWidthTracksTextView:(BOOL)flag +{ + [_textView setPostsFrameChangedNotifications:flag]; + + if (flag) + { + [[CPNotificationCenter defaultCenter] addObserver:self + selector:@selector(textViewFrameChanged:) + name:CPViewFrameDidChangeNotification + object:_textView]; + } + else + { + [[CPNotificationCenter defaultCenter] removeObserver:self + name:CPViewFrameDidChangeNotification + object:_textView]; + } +} + +- (void)textViewFrameChanged:(CPNotification)aNotification +{ + var newSize = CGSizeMake([_textView frame].size.width, _size.height); + + [self setContainerSize:newSize]; +} + +- (void)setTextView:(CPTextView)aTextView +{ + if (_textView) + { + [self _removeAllLines]; + [_textView setTextContainer:nil]; + } + + _textView = aTextView; + + if (_textView) + [_textView setTextContainer:self]; + + [_layoutManager textContainerChangedTextView:self]; +} + +- (BOOL)containsPoint:(CGPoint)aPoint +{ + return CGRectContainsPoint(CGRectMake(0, 0, _size.width, _size.height), aPoint); +} + +- (BOOL)isSimpleRectangularTextContainer +{ + return YES; +} + +- (CGRect)lineFragmentRectForProposedRect:(CGRect)proposedRect + sweepDirection:(CPLineSweepDirection)sweep + movementDirection:(CPLineMovementDirection)movement + remainingRect:(CGRectPointer)remainingRect +{ + var resultRect = CGRectCreateCopy(proposedRect); + + if (sweep != CPLineSweepRight || movement != CPLineMovesDown) + { + CPLog.trace(@"FIXME: unsupported sweep (" + sweep + ") or movement (" + movement + ")"); + return CGRectMakeZero(); + } + + if (resultRect.origin.x + resultRect.size.width > _size.width) + resultRect.size.width = _size.width - resultRect.origin.x; + + if (resultRect.size.width < 0) + resultRect = CGRectMakeZero(); + + if (remainingRect) + { + remainingRect.origin.x = resultRect.origin.x + resultRect.size.width; + remainingRect.origin.y = resultRect.origin.y; + remainingRect.size.height = resultRect.size.height; + remainingRect.size.width = _size.width - (resultRect.origin.x + resultRect.size.width); + } + + return resultRect; +} + +@end + + +var CPTextContainerSizeKey = @"CPTextContainerSizeKey", + CPTextContainerLayoutManagerKey = @"CPTextContainerLayoutManagerKey"; + +@implementation CPTextContainer (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + [self _init]; + + _size = [aCoder decodeSizeForKey:CPTextContainerSizeKey]; + + _layoutManager = [aCoder decodeObjectForKey:CPTextContainerLayoutManagerKey]; + [_layoutManager addTextContainer:self]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeSize:_size forKey:CPTextContainerSizeKey]; + [aCoder encodeObject:_layoutManager forKey:CPTextContainerLayoutManagerKey]; +} + +@end \ No newline at end of file diff --git a/AppKit/CPTextView/CPTextStorage.j b/AppKit/CPTextView/CPTextStorage.j new file mode 100644 index 000000000..65a71cf1a --- /dev/null +++ b/AppKit/CPTextView/CPTextStorage.j @@ -0,0 +1,303 @@ +/* + * CPTextStorage.j + * AppKit + * + * Created by Emmanuel Maillard on 27/02/2010. + * Copyright Emmanuel Maillard 2010. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +@import +@import + +@import "CPText.j" +@import "CPFont.j" + +@class CPLayoutManager; + +CPTextStorageEditedAttributes = 1; +CPTextStorageEditedCharacters = 2; + +CPTextStorageWillProcessEditingNotification = @"CPTextStorageWillProcessEditingNotification"; +CPTextStorageDidProcessEditingNotification = @"CPTextStorageDidProcessEditingNotification"; + +@protocol CPTextStorageDelegate + +- (void)textStorageWillProcessEditing:(CPNotification)aNotification; +- (void)textStorageDidProcessEditing:(CPNotification)aNotification; + +@end + + +var CPTextStorageDelegate_textStorageWillProcessEditing_ = 1 << 1, + CPTextStorageDelegate_textStorageDidProcessEditing_ = 1 << 2; + +/*! + @ingroup appkit + @class CPTextStorage +*/ +@implementation CPTextStorage : CPMutableAttributedString +{ + CPColor _foregroundColor @accessors(property=foregroundColor); + CPFont _font @accessors(property=font); + CPMutableArray _layoutManagers @accessors(getter=layoutManagers); + CPRange _editedRange @accessors(getter=editedRange); + id _delegate @accessors(property=delegate); + int _changeInLength @accessors(property=changeInLength); + unsigned _editedMask @accessors(property=editedMask); + + int _editCount; // {begin,end}Editing counter + unsigned _implementedDelegateMethods; +} + + +#pragma mark - +#pragma mark Init methods + +- (id)initWithString:(CPString)aString attributes:(CPDictionary)attributes +{ + self = [super initWithString:aString attributes:attributes]; + + if (self) + { + _layoutManagers = [[CPMutableArray alloc] init]; + _editedRange = CPMakeRange(CPNotFound, 0); + _changeInLength = 0; + _editedMask = 0; + } + + return self; +} + +- (id)initWithString:(CPString)aString +{ + return [self initWithString:aString attributes:nil]; +} + +- (id)init +{ + return [self initWithString:@"" attributes:nil]; +} + + +#pragma mark - +#pragma mark Delegate methods + +- (void)setDelegate:(id )aDelegate +{ + if (_delegate === aDelegate) + return; + + _implementedDelegateMethods = 0; + _delegate = aDelegate; + + if (_delegate) + { + if ([_delegate respondsToSelector:@selector(textStorageWillProcessEditing:)]) + _implementedDelegateMethods |= CPTextStorageDelegate_textStorageWillProcessEditing_; + + if ([_delegate respondsToSelector:@selector(textStorageDidProcessEditing:)]) + _implementedDelegateMethods |= CPTextStorageDelegate_textStorageDidProcessEditing_; + } +} + + +#pragma mark - +#pragma mark Layout manager methods + +- (void)addLayoutManager:(CPLayoutManager)aManager +{ + if ([_layoutManagers containsObject:aManager]) + return + + [aManager setTextStorage:self]; + [_layoutManagers addObject:aManager]; +} + +- (void)removeLayoutManager:(CPLayoutManager)aManager +{ + if (![_layoutManagers containsObject:aManager]) + return + + [aManager setTextStorage:nil]; + [_layoutManagers removeObject:aManager]; +} + +- (void)invalidateAttributesInRange:(CPRange)aRange +{ + /* FIXME: stub */ +} + + +#pragma mark - +#pragma mark Editing methods + +- (void)processEditing +{ + [self _sendDelegateWillProcessEditingNotification]; + [self invalidateAttributesInRange:[self editedRange]]; + [self _sendDelegateDidProcessEditingNotification]; + + var c = [_layoutManagers count]; + + for (var i = 0; i < c; i++) + { + [[_layoutManagers objectAtIndex:i] textStorage:self + edited:_editedMask + range:_editedRange + changeInLength:_changeInLength + invalidatedRange:_editedRange]; + } + + _editedRange.location = CPNotFound; + _editedMask = 0; + _changeInLength = 0; +} + +- (void)beginEditing +{ + if (_editCount == 0) + _editedRange = CPMakeRange(CPNotFound, 0); + + _editCount++; +} + +- (void)endEditing +{ + _editCount--; + + if (_editCount == 0) + [self processEditing]; +} + +- (void)edited:(unsigned)editedMask range:(CPRange)aRange changeInLength:(int)lengthChange +{ + var copyRange = CPMakeRangeCopy(aRange); + + if (_editCount == 0) // used outside a beginEditing/endEditing + { + _editedMask = editedMask; + _changeInLength = lengthChange; + copyRange.length += lengthChange; + _editedRange = copyRange; + [self processEditing]; + } + else + { + _editedMask |= editedMask; + _changeInLength += lengthChange; + copyRange.length += lengthChange; + + if (_editedRange.location == CPNotFound) + _editedRange = copyRange; + else + _editedRange = CPUnionRange(_editedRange,copyRange); + } +} + +- (void)removeAttribute:(CPString)anAttribute range:(CPRange)aRange +{ + [self beginEditing]; + [super removeAttribute:anAttribute range:aRange]; + [self edited:CPTextStorageEditedAttributes range:aRange changeInLength:0]; + [self endEditing]; +} + +- (void)addAttributes:(CPDictionary)aDictionary range:(CPRange)aRange +{ + [self beginEditing]; + [super addAttributes:aDictionary range:aRange]; + [self edited:CPTextStorageEditedAttributes range:aRange changeInLength:0]; + [self endEditing]; +} + +- (void)deleteCharactersInRange:(CPRange)aRange +{ + [self beginEditing]; + [super deleteCharactersInRange:aRange]; + [self edited:CPTextStorageEditedCharacters range:aRange changeInLength:-aRange.length]; + [self endEditing]; +} + +- (void)replaceCharactersInRange:(CPRange)aRange withString:(CPString)aString +{ + [self beginEditing]; + [super replaceCharactersInRange:aRange withString:aString]; + [self edited:CPTextStorageEditedCharacters range:aRange changeInLength:([aString length] - aRange.length)]; + [self endEditing]; +} + +- (void)replaceCharactersInRange:(CPRange)aRange withAttributedString:(CPAttributedString)aString +{ + [self beginEditing]; + [super replaceCharactersInRange:aRange withAttributedString:aString]; + [self edited:(CPTextStorageEditedAttributes | CPTextStorageEditedCharacters) range:aRange changeInLength:([aString length] - aRange.length)]; + [self endEditing]; +} + +- (CPAttributedString)attributedSubstringFromRange:(CPRange)aRange +{ + if (!aRange.length) + return [CPAttributedString new]; + + return [super attributedSubstringFromRange:aRange]; +} + +@end + + +@implementation CPTextStorage (CPTextStorageDelegate) + +- (void)_sendDelegateWillProcessEditingNotification +{ + if (_implementedDelegateMethods & CPTextStorageDelegate_textStorageWillProcessEditing_) + [_delegate textStorageWillProcessEditing:[[CPNotification alloc] initWithName:CPTextStorageWillProcessEditingNotification object:self userInfo:nil]]; + + [[CPNotificationCenter defaultCenter] postNotificationName:CPTextStorageWillProcessEditingNotification object:self]; +} + +- (void)_sendDelegateDidProcessEditingNotification +{ + if (_implementedDelegateMethods & CPTextStorageDelegate_textStorageDidProcessEditing_) + [_delegate textStorageWillProcessEditing:[[CPNotification alloc] initWithName:CPTextStorageDidProcessEditingNotification object:self userInfo:nil]]; + + [[CPNotificationCenter defaultCenter] postNotificationName:CPTextStorageDidProcessEditingNotification object:self]; +} + +@end + + +@implementation CPTextStorage (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; +} + +@end \ No newline at end of file diff --git a/AppKit/CPTextView/CPTextView.j b/AppKit/CPTextView/CPTextView.j new file mode 100644 index 000000000..8ad4e31f9 --- /dev/null +++ b/AppKit/CPTextView/CPTextView.j @@ -0,0 +1,2757 @@ +/* + * CPTextView.j + * AppKit + * + * Created by Daniel Boehringer on 27/12/2013. + * All modifications copyright Daniel Boehringer 2013. + * Extensive code formatting and review by Andrew Hankinson + * Based on original work by + * Created by Emmanuel Maillard on 27/02/2010. + * Copyright Emmanuel Maillard 2010. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "CPText.j" +@import "CPPasteboard.j" +@import "CPColorPanel.j" +@import "CPFontManager.j" +@import "CPTextStorage.j" +@import "CPTextContainer.j" +@import "CPLayoutManager.j" + +@import "_CPRTFParser.j" +@import "_CPRTFProducer.j" + + +@class CPClipView; +@class _CPSelectionBox; +@class _CPCaret; +@class _CPNativeInputManager; + +@protocol CPTextViewDelegate + +- (BOOL)textView:(CPTextView)aTextView doCommandBySelector:(SEL)aSelector; +- (BOOL)textView:(CPTextView)aTextView shouldChangeTextInRange:(CPRange)affectedCharRange replacementString:(CPString)replacementString; +- (CPDictionary)textView:(CPTextView)textView shouldChangeTypingAttributes:(CPDictionary)oldTypingAttributes toAttributes:(CPDictionary)newTypingAttributes; +- (CPRange)textView:(CPTextView)aTextView willChangeSelectionFromCharacterRange:(CPRange)oldSelectedCharRange toCharacterRange:(CPRange)newSelectedCharRange; +- (void)textViewDidChangeSelection:(CPNotification)aNotification; +- (void)textViewDidChangeTypingAttributes:(CPNotification)aNotification; + +@end + +_MakeRangeFromAbs = function(a1, a2) +{ + return (a1 < a2) ? CPMakeRange(a1, a2 - a1) : CPMakeRange(a2, a1 - a2); +}; + +_MidRange = function(a1) +{ + return Math.floor((CPMaxRange(a1) + a1.location) / 2); +}; + +function _isWhitespaceCharacter(chr) +{ + return (chr === '\n' || chr === '\r' || chr === ' ' || chr === '\t'); +} + +_characterTripletFromStringAtIndex = function(string, index) +{ + if ([string isKindOfClass:CPAttributedString]) + string = string._string; + + var tripletRange = _MakeRangeFromAbs(MAX(0, index - 1), MIN(string.length, index + 2)); + + return [string substringWithRange:tripletRange]; +} + +_regexMatchesStringAtIndex=function(regex, string, index) +{ + var triplet = _characterTripletFromStringAtIndex(string, index); + + return regex.exec(triplet) !== null; +} + + +/* + CPSelectionGranularity +*/ +@typedef CPSelectionGranularity +CPSelectByCharacter = 0; +CPSelectByWord = 1; +CPSelectByParagraph = 2; + +var kDelegateRespondsTo_textShouldBeginEditing = 1 << 0, + kDelegateRespondsTo_textView_doCommandBySelector = 1 << 1, + kDelegateRespondsTo_textView_willChangeSelectionFromCharacterRange_toCharacterRange = 1 << 2, + kDelegateRespondsTo_textView_shouldChangeTextInRange_replacementString = 1 << 3, + kDelegateRespondsTo_textView_shouldChangeTypingAttributes_toAttributes = 1 << 4, + kDelegateRespondsTo_textView_textDidChange = 1 << 5, + kDelegateRespondsTo_textView_didChangeSelection = 1 << 6, + kDelegateRespondsTo_textView_didChangeTypingAttributes = 1 << 7; + +@class _CPCaret; + +/*! + @ingroup appkit + @class CPTextView +*/ +@implementation CPTextView : CPText +{ + BOOL _allowsUndo @accessors(property=allowsUndo); + BOOL _isHorizontallyResizable @accessors(getter=isHorizontallyResizable, setter=setHorizontallyResizable:); + BOOL _isVerticallyResizable @accessors(getter=isVerticallyResizable, setter=setVerticallyResizable:); + BOOL _usesFontPanel @accessors(property=usesFontPanel); + CGPoint _textContainerOrigin @accessors(getter=textContainerOrigin); + CGSize _minSize @accessors(property=minSize); + CGSize _maxSize @accessors(property=maxSize); + CGSize _textContainerInset @accessors(property=textContainerInset); + CPColor _insertionPointColor @accessors(property=insertionPointColor); + CPColor _textColor @accessors(property=textColor); + CPDictionary _selectedTextAttributes @accessors(property=selectedTextAttributes); + CPDictionary _typingAttributes @accessors(property=typingAttributes); + CPFont _font; + CPLayoutManager _layoutManager @accessors(getter=layoutManager); + CPRange _selectionRange @accessors(getter=selectedRange); + CPSelectionGranularity _selectionGranularity @accessors(property=selectionGranularity); + + CPSelectionGranularity _previousSelectionGranularity; // private + CPSelectionGranularity _copySelectionGranularity; // private + + CPTextContainer _textContainer @accessors(property=textContainer); + CPTextStorage _textStorage @accessors(getter=textStorage); + id _delegate @accessors(property=delegate); + + unsigned _delegateRespondsToSelectorMask; + + int _startTrackingLocation; + + _CPCaret _caret; + CPTimer _scrollingTimer; + + BOOL _scrollingDownward; + CPRange _movingSelection; + + int _stickyXLocation; + + CPArray _selectionSpans; + CPView _observedClipView; + CGRect _exposedRect; + + CPTimer _scrollingTimer; + + CPString _placeholderString; +} + ++ (Class)_binderClassForBinding:(CPString)aBinding +{ + if (aBinding === CPValueBinding || aBinding === CPAttributedStringBinding) + return [_CPTextViewValueBinder class]; + + return [super _binderClassForBinding:aBinding]; +} + +#pragma mark - +#pragma mark Class methods + +/* FIXME + just a testing characterSet + all of this depend of the current language. + Need some CPLocale support and maybe even a FSM... + */ + +#pragma mark - +#pragma mark Init methods + +- (id)initWithFrame:(CGRect)aFrame textContainer:(CPTextContainer)aContainer +{ + if (self = [super initWithFrame:aFrame]) + { + [self _init]; + [aContainer setTextView:self]; + + [self setEditable:YES]; + [self setSelectable:YES]; + [self setRichText:NO]; + [self setBackgroundColor:[CPColor whiteColor]]; + + _usesFontPanel = YES; + _allowsUndo = YES; + + _selectedTextAttributes = [CPDictionary dictionaryWithObject:[CPColor selectedTextBackgroundColor] + forKey:CPBackgroundColorAttributeName]; + + _insertionPointColor = [CPColor blackColor]; + + _textColor = [CPColor blackColor]; + _font = [CPFont systemFontOfSize:12.0]; + [self setFont:_font]; + + _typingAttributes = [[CPDictionary alloc] initWithObjects:[_font, _textColor] forKeys:[CPFontAttributeName, CPForegroundColorAttributeName]]; + } + + return self; +} + +- (id)initWithFrame:(CGRect)aFrame +{ + var container = [[CPTextContainer alloc] initWithContainerSize:CGSizeMake(aFrame.size.width, 1e7)]; + + return [self initWithFrame:aFrame textContainer:container]; +} + +- (void)_init +{ +#if PLATFORM(DOM) + _DOMElement.style.cursor = "text"; +#endif + + _selectionRange = CPMakeRange(0, 0); + _textContainerInset = CGSizeMake(2, 0); + _textContainerOrigin = CGPointMake(_bounds.origin.x, _bounds.origin.y); + + _selectionGranularity = CPSelectByCharacter; + + _minSize = CGSizeCreateCopy(_frame.size); + _maxSize = CGSizeMake(_frame.size.width, 1e7); + + _isVerticallyResizable = YES; + _isHorizontallyResizable = NO; + + _typingAttributes = [CPMutableDictionary new]; + _selectedTextAttributes = [CPMutableDictionary new]; + + _caret = [[_CPCaret alloc] initWithTextView:self]; + [_caret setRect:CGRectMake(0, 0, 1, 11)] + + var pboardTypes = [CPStringPboardType, CPColorDragType]; + + if ([self isRichText]) + pboardTypes.push(CPRTFPboardType); + + [self registerForDraggedTypes:pboardTypes]; +} + +- (void)_setObserveWindowKeyNotifications:(BOOL)shouldObserve +{ + if (shouldObserve) + { + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidResignKey:) name:CPWindowDidResignKeyNotification object:[self window]]; + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidBecomeKey:) name:CPWindowDidBecomeKeyNotification object:[self window]]; + } + else + { + [[CPNotificationCenter defaultCenter] removeObserver:self name:CPWindowDidResignKeyNotification object:[self window]]; + [[CPNotificationCenter defaultCenter] removeObserver:self name:CPWindowDidBecomeKeyNotification object:[self window]]; + } +} + +- (void)_removeObservers +{ + if (!_isObserving) + return; + + [super _removeObservers]; + [self _setObserveWindowKeyNotifications:NO]; +} + +- (void)_addObservers +{ + if (_isObserving) + return; + + [super _addObservers]; + [self _setObserveWindowKeyNotifications:YES]; + [self _startObservingClipView]; +} +- (void)_startObservingClipView +{ + if (!_observedClipView) + return; + + var defaultCenter = [CPNotificationCenter defaultCenter]; + + [_observedClipView setPostsFrameChangedNotifications:YES]; + [_observedClipView setPostsBoundsChangedNotifications:YES]; + + [defaultCenter addObserver:self + selector:@selector(superviewFrameChanged:) + name:CPViewFrameDidChangeNotification + object:_observedClipView]; + + [defaultCenter addObserver:self + selector:@selector(superviewBoundsChanged:) + name:CPViewBoundsDidChangeNotification + object:_observedClipView]; +} +- (CGRect)exposedRect +{ + if (!_exposedRect) + { + var superview = [self superview]; + + if ([superview isKindOfClass:[CPClipView class]]) + _exposedRect = [superview bounds]; + else + _exposedRect = [self bounds]; + } + + return _exposedRect; +} + +/*! + @ignore +*/ +- (void)superviewBoundsChanged:(CPNotification)aNotification +{ + _exposedRect = nil; + [self setNeedsDisplay:YES]; +} + +/*! + @ignore +*/ +- (void)superviewFrameChanged:(CPNotification)aNotification +{ + _exposedRect = nil; +} + +- (void)viewWillMoveToSuperview:(CPView)aView +{ + if ([aView isKindOfClass:[CPClipView class]]) + _observedClipView = aView; + else + [self _stopObservingClipView]; + + [super viewWillMoveToSuperview:aView]; +} + +- (void)_stopObservingClipView +{ + if (!_observedClipView) + return; + + var defaultCenter = [CPNotificationCenter defaultCenter]; + + [defaultCenter removeObserver:self + name:CPViewFrameDidChangeNotification + object:_observedClipView]; + + [defaultCenter removeObserver:self + name:CPViewBoundsDidChangeNotification + object:_observedClipView]; + + _observedClipView = nil; +} + +- (void)_windowDidResignKey:(CPNotification)aNotification +{ + if (![[self window] isKeyWindow]) + [self resignFirstResponder]; +} + +- (void)_windowDidBecomeKey:(CPNotification)aNotification +{ + if ([self _isFocused]) + [self _becomeFirstResponder]; +} + +#pragma mark - +#pragma mark Copy and paste methods + +- (void)copy:(id)sender +{ + _copySelectionGranularity = _previousSelectionGranularity; + [super copy:sender]; + + if (![self isRichText]) + return; + + var selectedRange = [self selectedRange], + pasteboard = [CPPasteboard generalPasteboard], + stringForPasting = [[self textStorage] attributedSubstringFromRange:CPMakeRangeCopy(selectedRange)], + richData = [_CPRTFProducer produceRTF:stringForPasting documentAttributes:@{}]; + + [pasteboard declareTypes:[CPStringPboardType, CPRTFPboardType] owner:nil]; + [pasteboard setString:stringForPasting._string forType:CPStringPboardType]; + [pasteboard setString:richData forType:CPRTFPboardType]; +} + +- (void)_pasteString:(id)stringForPasting +{ + if (!stringForPasting) + return; + + if (_copySelectionGranularity > 0 && _selectionRange.location > 0) + { + if (!_isWhitespaceCharacter([[_textStorage string] characterAtIndex:_selectionRange.location - 1]) && + _selectionRange.location != [_layoutManager numberOfCharacters]) + { + [self insertText:" "]; + } + } + + if (_copySelectionGranularity == CPSelectByParagraph) + { + var peekStr = stringForPasting, + i = 0; + + if (![stringForPasting isKindOfClass:[CPString class]]) + peekStr = stringForPasting._string; + + while (_isWhitespaceCharacter([peekStr characterAtIndex:i])) + i++; + + if (i) + { + if ([stringForPasting isKindOfClass:[CPString class]]) + stringForPasting = [stringForPasting stringByReplacingCharactersInRange:CPMakeRange(0, i) withString:'']; + else + [stringForPasting replaceCharactersInRange:CPMakeRange(0, i) withString:'']; + } + } + + [self insertText:stringForPasting]; + + if (_copySelectionGranularity > 0) + { + if (!_isWhitespaceCharacter([[_textStorage string] characterAtIndex:CPMaxRange(_selectionRange)]) && + !_isNewlineCharacter([[_textStorage string] characterAtIndex:MAX(0, _selectionRange.location - 1)]) && + _selectionRange.location != [_layoutManager numberOfCharacters]) + { + [self insertText:" "]; + } + } +} +- (void)pasteAsPlainText:(id)sender +{ + if (![sender isKindOfClass:_CPNativeInputManager] && [[CPApp currentEvent] type] != CPAppKitDefined) + return + + [self _pasteString:[self _plainStringForPasting]]; +} + +- (void)paste:(id)sender +{ + if (![sender isKindOfClass:_CPNativeInputManager] && [[CPApp currentEvent] type] != CPAppKitDefined) + return + + [self _pasteString:[self _stringForPasting]]; +} + +#pragma mark - +#pragma mark Responders method + +- (BOOL)acceptsFirstResponder +{ + return [self isSelectable]; // editable textviews are automatically selectable +} + +- (void)_becomeFirstResponder +{ + [self updateInsertionPointStateAndRestartTimer:YES]; + [[CPFontManager sharedFontManager] setSelectedFont:[self font] isMultiple:NO]; + [self setNeedsDisplay:YES]; + [[CPRunLoop currentRunLoop] performSelector:@selector(focusForTextView:) target:[_CPNativeInputManager class] argument:self order:0 modes:[CPDefaultRunLoopMode]]; +} + + +- (BOOL)becomeFirstResponder +{ + [super becomeFirstResponder]; + [self _becomeFirstResponder]; + + return YES; +} + +- (BOOL)resignFirstResponder +{ + [self _reverseSetBinding]; + [_caret stopBlinking]; + [self setNeedsDisplay:YES]; + [_CPNativeInputManager cancelCurrentInputSessionIfNeeded]; + + return YES; +} + + +#pragma mark - +#pragma mark Delegate methods + +/*! + TODO : documentation +*/ +- (void)setDelegate:(id )aDelegate +{ + if (aDelegate === _delegate) + return; + + _delegateRespondsToSelectorMask = 0; + _delegate = aDelegate; + + if (_delegate) + { + if ([_delegate respondsToSelector:@selector(textDidChange:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textView_textDidChange; + + if ([_delegate respondsToSelector:@selector(textViewDidChangeSelection:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textView_didChangeSelection; + + if ([_delegate respondsToSelector:@selector(textViewDidChangeTypingAttributes:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textView_didChangeTypingAttributes; + + if ([_delegate respondsToSelector:@selector(textView:doCommandBySelector:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textView_doCommandBySelector; + + if ([_delegate respondsToSelector:@selector(textShouldBeginEditing:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textShouldBeginEditing; + + if ([_delegate respondsToSelector:@selector(textView:willChangeSelectionFromCharacterRange:toCharacterRange:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textView_willChangeSelectionFromCharacterRange_toCharacterRange; + + if ([_delegate respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementString:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textView_shouldChangeTextInRange_replacementString; + + if ([_delegate respondsToSelector:@selector(textView:shouldChangeTypingAttributes:toAttributes:)]) + _delegateRespondsToSelectorMask |= kDelegateRespondsTo_textView_shouldChangeTypingAttributes_toAttributes; + } +} + + +#pragma mark - +#pragma mark Key window methods + +- (void)becomeKeyWindow +{ + [self setNeedsDisplay:YES]; +} + +/*! + @ignore +*/ +- (void)resignKeyWindow +{ + [self setNeedsDisplay:YES]; +} + +- (BOOL)_isFirstResponder +{ + return [[self window] firstResponder] === self; +} + +- (BOOL)_isFocused +{ + return [[self window] isKeyWindow] && [self _isFirstResponder]; +} + + +#pragma mark - +#pragma mark Undo redo methods + +- (void)undo:(id)sender +{ + if (_allowsUndo) + [[[self window] undoManager] undo]; +} + +- (void)redo:(id)sender +{ + if (_allowsUndo) + [[[self window] undoManager] redo]; +} + + +#pragma mark - +#pragma mark Accessors + +- (CPString)stringValue +{ + return _textStorage._string; +} + +- (CPString)objectValue +{ + if (_placeholderString) + return nil; + + return [self isRichText]? _textStorage : _textStorage._string; +} +- (void)setObjectValue:(id)aValue +{ + if (_placeholderString) + return; + + if (!aValue) + aValue = @""; + + if (![aValue isKindOfClass:[CPAttributedString class]] && ![aValue isKindOfClass:[CPString class]] && [aValue respondsToSelector:@selector(description)]) + aValue = [aValue description]; + + [self setString:aValue]; +} + +- (void)setString:(id)aString +{ + if ([aString isKindOfClass:[CPAttributedString class]]) + { + [_textStorage replaceCharactersInRange:CPMakeRange(0, [_layoutManager numberOfCharacters]) withAttributedString:aString]; + } + else + { + [_textStorage replaceCharactersInRange:CPMakeRange(0, [_layoutManager numberOfCharacters]) withString:aString]; + } + + if (CPMaxRange(_selectionRange) > [_layoutManager numberOfCharacters]) + [self setSelectedRange:CPMakeRange([_layoutManager numberOfCharacters], 0)]; + + [self didChangeText]; + [_layoutManager _validateLayoutAndGlyphs]; + [self sizeToFit]; + [self setNeedsDisplay:YES]; +} + +- (CPString)string +{ + return [_textStorage string]; +} + +- (void)setTextContainer:(CPTextContainer)aContainer +{ + _textContainer = aContainer; + _layoutManager = [_textContainer layoutManager]; + _textStorage = [_layoutManager textStorage]; + [_textStorage setFont:[self font]]; + [_textStorage setForegroundColor:_textColor]; + + [self invalidateTextContainerOrigin]; +} + +- (void)setTextContainerInset:(CGSize)aSize +{ + _textContainerInset = aSize; + [self invalidateTextContainerOrigin]; +} + +- (void)invalidateTextContainerOrigin +{ + _textContainerOrigin.x = _bounds.origin.x; + _textContainerOrigin.x += _textContainerInset.width; + + _textContainerOrigin.y = _bounds.origin.y; + _textContainerOrigin.y += _textContainerInset.height; +} + +- (void)doCommandBySelector:(SEL)aSelector +{ + if (![self _sendDelegateDoCommandBySelector:aSelector]) + [super doCommandBySelector:aSelector]; +} + +- (void)didChangeText +{ + [[CPNotificationCenter defaultCenter] postNotificationName:CPTextDidChangeNotification object:self]; + + if (_delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_textDidChange) + [_delegate textDidChange:[[CPNotification alloc] initWithName:CPTextDidChangeNotification object:self userInfo:nil]]; +} + +- (BOOL)shouldChangeTextInRange:(CPRange)aRange replacementString:(CPString)aString +{ + if (![self isEditable]) + return NO; + + return [self _sendDelegateTextShouldBeginEditing] && [self _sendDelegateShouldChangeTextInRange:aRange replacementString:aString]; +} + + +#pragma mark - +#pragma mark Insert characters methods + +- (void)_fixupReplaceForRange:(CPRange)aRange +{ + [self setSelectedRange:aRange]; + [_layoutManager _validateLayoutAndGlyphs]; + [self sizeToFit]; + [self scrollRangeToVisible:_selectionRange]; + [self setNeedsDisplay:YES]; +} + +- (void)_replaceCharactersInRange:(CPRange)aRange withAttributedString:(CPString)aString selectionRange:(CPRange)selectionRange +{ + [[[[self window] undoManager] prepareWithInvocationTarget:self] + _replaceCharactersInRange:CPMakeRange(aRange.location, [aString length]) + withAttributedString:[_textStorage attributedSubstringFromRange:CPMakeRangeCopy(aRange)] + selectionRange:CPMakeRangeCopy(_selectionRange)]; + + [_textStorage replaceCharactersInRange:aRange withAttributedString:aString]; + [self _fixupReplaceForRange:selectionRange]; +} + +- (void)insertText:(CPString)aString +{ + var isAttributed = [aString isKindOfClass:CPAttributedString], + string = isAttributed ? [aString string]:aString; + + if (![self shouldChangeTextInRange:CPMakeRangeCopy(_selectionRange) replacementString:string]) + return; + + if (!isAttributed) + aString = [[CPAttributedString alloc] initWithString:aString attributes:_typingAttributes]; + else if (![self isRichText]) + aString = [[CPAttributedString alloc] initWithString:string attributes:_typingAttributes]; + + var undoManager = [[self window] undoManager]; + [undoManager setActionName:@"Replace/insert text"]; + + [[undoManager prepareWithInvocationTarget:self] + _replaceCharactersInRange:CPMakeRange(_selectionRange.location, [aString length]) + withAttributedString:[_textStorage attributedSubstringFromRange:CPMakeRangeCopy(_selectionRange)] + selectionRange:CPMakeRangeCopy(_selectionRange)]; + + [self willChangeValueForKey:@"objectValue"]; + [_textStorage replaceCharactersInRange:CPMakeRangeCopy(_selectionRange) withAttributedString:aString]; + [self didChangeValueForKey:@"objectValue"]; + [self _continuouslyReverseSetBinding]; + + [self _setSelectedRange:CPMakeRange(_selectionRange.location + [string length], 0) affinity:0 stillSelecting:NO overwriteTypingAttributes:NO]; + _startTrackingLocation = _selectionRange.location; + + [self didChangeText]; + [_layoutManager _validateLayoutAndGlyphs]; + [self sizeToFit]; + [self scrollRangeToVisible:_selectionRange]; + _stickyXLocation = MAX(0, _caret._rect.origin.x - 1); +} + +#pragma mark - +#pragma mark Drawing methods + +- (void)drawInsertionPointInRect:(CGRect)aRect color:(CPColor)aColor turnedOn:(BOOL)flag +{ + [_caret setRect:aRect]; + [_caret setVisibility:flag stop:NO]; +} + +- (void)displayRectIgnoringOpacity:(CGRect)aRect inContext:(CPGraphicsContext)aGraphicsContext +{ if ([self isHidden]) + return; + + [self drawRect:aRect]; +} + +- (void)drawRect:(CGRect)aRect +{ +#if PLATFORM(DOM) + var range = [_layoutManager glyphRangeForBoundingRect:aRect inTextContainer:_textContainer]; + + for (var i = 0; i < [_selectionSpans count]; i++) + [_selectionSpans[i] removeFromTextView]; + + _selectionSpans = []; + + if (_selectionRange.length) + { + var rects = [_layoutManager rectArrayForCharacterRange:_selectionRange + withinSelectedCharacterRange:_selectionRange + inTextContainer:_textContainer + rectCount:nil], + effectiveSelectionColor = [self _isFocused] ? [_selectedTextAttributes objectForKey:CPBackgroundColorAttributeName] : [CPColor _selectedTextBackgroundColorUnfocussed], + lengthRect = rects.length; + + for (var i = 0; i < lengthRect; i++) + { + rects[i].origin.x += _textContainerOrigin.x; + rects[i].origin.y += _textContainerOrigin.y; + + var newSpan = [[_CPSelectionBox alloc] initWithTextView:self rect:rects[i] color:effectiveSelectionColor]; + [_selectionSpans addObject:newSpan]; + } + } + + if (range.length) + [_layoutManager drawGlyphsForGlyphRange:range atPoint:_textContainerOrigin]; + + if ([self shouldDrawInsertionPoint]) + { + [self updateInsertionPointStateAndRestartTimer:NO]; + [self drawInsertionPointInRect:_caret._rect color:_insertionPointColor turnedOn:_caret._drawCaret]; + } + else + [_caret setVisibility:NO]; +#endif +} + + +#pragma mark - +#pragma mark Select methods + +- (void)selectAll:(id)sender +{ + if ([self isSelectable]) + { + [_caret stopBlinking]; + [self setSelectedRange:CPMakeRange(0, [_layoutManager numberOfCharacters])]; + } +} + +- (void)setSelectedRange:(CPRange)range +{ + [_CPNativeInputManager cancelCurrentInputSessionIfNeeded]; + [self setSelectedRange:range affinity:0 stillSelecting:NO]; +} + +- (void)setSelectedRange:(CPRange)range affinity:(CPSelectionAffinity)affinity stillSelecting:(BOOL)selecting +{ + [self _setSelectedRange:range affinity:affinity stillSelecting:selecting overwriteTypingAttributes:YES]; +} + +- (void)_setSelectedRange:(CPRange)range affinity:(CPSelectionAffinity)affinity stillSelecting:(BOOL)selecting overwriteTypingAttributes:(BOOL)doOverwrite +{ + var maxRange = CPMakeRange(0, [_layoutManager numberOfCharacters]); + + range = CPIntersectionRange(maxRange, range); + + if (!selecting && [self _delegateRespondsToWillChangeSelectionFromCharacterRangeToCharacterRange]) + { + _selectionRange = [self _sendDelegateWillChangeSelectionFromCharacterRange:_selectionRange toCharacterRange:range]; + } + else + { + _selectionRange = CPMakeRangeCopy(range); + _selectionRange = [self selectionRangeForProposedRange:_selectionRange granularity:[self selectionGranularity]]; + } + + if (_selectionRange.length) + [_layoutManager invalidateDisplayForGlyphRange:_selectionRange]; + else + [self setNeedsDisplay:YES]; + + if (!selecting) + { + if ([self _isFirstResponder]) + [self updateInsertionPointStateAndRestartTimer:((_selectionRange.length === 0) && ![_caret isBlinking])]; + + if (doOverwrite && _placeholderString === nil) + [self setTypingAttributes:[_textStorage attributesAtIndex:CPMaxRange(range) effectiveRange:nil]]; + + [[CPNotificationCenter defaultCenter] postNotificationName:CPTextViewDidChangeSelectionNotification object:self]; + + if (_delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_didChangeSelection) + [_delegate textViewDidChangeSelection:[[CPNotification alloc] initWithName:CPTextViewDidChangeSelectionNotification object:self userInfo:nil]]; + } + + if (!selecting && _selectionRange.length > 0) + [_CPNativeInputManager focusForClipboardOfTextView:self]; +} + +#if PLATFORM(DOM) +- (CGPoint)_cumulativeOffset +{ + var top = 0, + left = 0, + element = self._DOMElement; + + do + { + top += element.offsetTop || 0; + left += element.offsetLeft || 0; + element = element.offsetParent; + } + while(element); + + return CGPointMake(left, top); +} +#endif + + +// interface to the _CPNativeInputManager +- (void)_activateNativeInputElement:(DOMElemet)aNativeField +{ + var attributes = [[self typingAttributes] copy]; + + // make it invisible + [attributes setObject:[CPColor colorWithRed:1 green:1 blue:1 alpha:0] forKey:CPForegroundColorAttributeName]; + + // FIXME: this hack to provide the visual space for the inputmanager should at least bypass the undomanager + var placeholderString = [[CPAttributedString alloc] initWithString:aNativeField.innerHTML attributes:attributes]; + [self insertText:placeholderString]; + + var caretOrigin = [_layoutManager boundingRectForGlyphRange:CPMakeRange(MAX(0, _selectionRange.location - 1), 1) inTextContainer:_textContainer].origin; + caretOrigin.y += [_layoutManager _characterOffsetAtLocation:MAX(0, _selectionRange.location - 1)]; + caretOrigin.x += 2; // two pixel offset to the LHS character + var cumulativeOffset = [self _cumulativeOffset]; + + +#if PLATFORM(DOM) + aNativeField.style.left = (caretOrigin.x + cumulativeOffset.x) + "px"; + aNativeField.style.top = (caretOrigin.y + cumulativeOffset.y) + "px"; + aNativeField.style.font = [[_typingAttributes objectForKey:CPFontAttributeName] cssString]; + aNativeField.style.color = [[_typingAttributes objectForKey:CPForegroundColorAttributeName] cssString]; +#endif + + [_caret setVisibility:NO]; // hide our caret because now the system caret takes over +} + +- (CPArray)selectedRanges +{ + return [_selectionRange]; +} + +#pragma mark - +#pragma mark Keyboard events + +- (void)keyDown:(CPEvent)event +{ + + [[_window platformWindow] _propagateCurrentDOMEvent:YES]; // for the _CPNativeInputManager (necessary at least on FF and chrome) + + if (![_CPNativeInputManager isNativeInputFieldActive] && [event charactersIgnoringModifiers].charCodeAt(0) != 229) // filter out 229 because this would be inserted in chrome on each deadkey + [self interpretKeyEvents:[event]]; + + [_caret setPermanentlyVisible:YES]; +} + +- (void)keyUp:(CPEvent)event +{ + [super keyUp:event]; + + setTimeout(function() { + [_caret setPermanentlyVisible:NO]; + }, 1000); +} + +- (CGPoint)_characterIndexFromRawPoint:(CGPoint)point +{ + var fraction = [], + point = [self convertPoint:point fromView:nil]; + + // convert to container coordinate + point.x -= _textContainerOrigin.x; + point.y -= _textContainerOrigin.y; + + var index = [_layoutManager glyphIndexForPoint:point inTextContainer:_textContainer fractionOfDistanceThroughGlyph:fraction]; + + if (index === CPNotFound) + index = [_layoutManager numberOfCharacters]; + else if (fraction[0] > 0.5) + index++; + + return index; +} +- (CGPoint)_characterIndexFromEvent:(CPEvent)event +{ + return [self _characterIndexFromRawPoint:[event locationInWindow]]; +} + +- (BOOL)needsPanelToBecomeKey +{ + return YES; +} + +#pragma mark - +#pragma mark Mouse Events + +- (void)mouseDown:(CPEvent)event +{ + if (![self isSelectable]) + return; + + [_CPNativeInputManager cancelCurrentInputSessionIfNeeded]; + [_caret setVisibility:NO]; + + _startTrackingLocation = [self _characterIndexFromEvent:event]; + + var granularities = [CPNotFound, CPSelectByCharacter, CPSelectByWord, CPSelectByParagraph]; + [self setSelectionGranularity:granularities[[event clickCount]]]; + + // dragging the selection + if ([self selectionGranularity] == CPSelectByCharacter && CPLocationInRange(_startTrackingLocation, _selectionRange)) + { + var lineBeginningIndex = [_layoutManager _firstLineFragmentForLineFromLocation:_selectionRange.location]._range.location, + placeholderRange = _MakeRangeFromAbs(lineBeginningIndex, CPMaxRange(_selectionRange)), + placeholderString = [_textStorage attributedSubstringFromRange:placeholderRange], + placeholderFrame = CGRectIntersection([_layoutManager boundingRectForGlyphRange:placeholderRange inTextContainer:_textContainer], _frame), + rangeToHide = CPMakeRange(0, _selectionRange.location - lineBeginningIndex), + dragPlaceholder; + + // hide the left part of the first line of the selection that is not included + [placeholderString addAttribute:CPForegroundColorAttributeName + value:[CPColor colorWithRed:1 green:1 blue:1 alpha:0] + range:rangeToHide]; + + _movingSelection = CPMakeRange(_startTrackingLocation, 0); + + dragPlaceholder = [[CPTextView alloc] initWithFrame:placeholderFrame]; + [dragPlaceholder._textStorage replaceCharactersInRange:CPMakeRange(0, 0) withAttributedString:placeholderString]; + + [dragPlaceholder setBackgroundColor:[CPColor colorWithRed:1 green:1 blue:1 alpha:0]]; + [dragPlaceholder setAlphaValue:0.5]; + + var stringForPasting = [_textStorage attributedSubstringFromRange:CPMakeRangeCopy(_selectionRange)], + richData = [_CPRTFProducer produceRTF:stringForPasting documentAttributes:@{}], + draggingPasteboard = [CPPasteboard pasteboardWithName:CPDragPboard]; + [draggingPasteboard declareTypes:[CPRTFPboardType, CPStringPboardType] owner:nil]; + [draggingPasteboard setString:richData forType:CPRTFPboardType]; + [draggingPasteboard setString:stringForPasting._string forType:CPStringPboardType]; + + [self dragView:dragPlaceholder + at:placeholderFrame.origin + offset:nil + event:event + pasteboard:draggingPasteboard + source:self + slideBack:YES]; + + return; + } + + var setRange = CPMakeRange(_startTrackingLocation, 0); + + if ([event modifierFlags] & CPShiftKeyMask) + setRange = _MakeRangeFromAbs(_startTrackingLocation < _MidRange(_selectionRange) ? CPMaxRange(_selectionRange) : _selectionRange.location, _startTrackingLocation); + else + _scrollingTimer = [CPTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(_supportScrolling:) userInfo:nil repeats:YES]; // fixme: only start if we are in the scrolling areas + + [self setSelectedRange:setRange affinity:0 stillSelecting:YES]; +} + +- (void)_supportScrolling:(CPTimer)aTimer +{ + [self mouseDragged:[CPApp currentEvent]]; +} + +- (void)mouseDragged:(CPEvent)event +{ + if (![self isSelectable]) + return; + + if (_movingSelection) + return; + + var oldRange = [self selectedRange], + index = [self _characterIndexFromEvent:event]; + + if (index > oldRange.location) + _scrollingDownward = YES; + + if (index < CPMaxRange(oldRange)) + _scrollingDownward = NO; + + [self setSelectedRange:_MakeRangeFromAbs(index, _startTrackingLocation) + affinity:0 + stillSelecting:YES]; + + [self scrollRangeToVisible:CPMakeRange(index, 0)]; +} + +// handle all the other methods from CPKeyBinding.j + +- (void)mouseUp:(CPEvent)event +{ + _movingSelection = nil; + + // will post CPTextViewDidChangeSelectionNotification + _previousSelectionGranularity = [self selectionGranularity]; + [self setSelectionGranularity:CPSelectByCharacter]; + [self setSelectedRange:[self selectedRange] affinity:0 stillSelecting:NO]; + + var point = [_layoutManager locationForGlyphAtIndex:[self selectedRange].location]; + _stickyXLocation = point.x; + _startTrackingLocation = _selectionRange.location; + + if (_scrollingTimer) + { + [_scrollingTimer invalidate]; + _scrollingTimer = nil; + } +} + +- (void)moveDown:(id)sender +{ + if (![self isSelectable]) + return; + + var fraction = [], + nglyphs = [_layoutManager numberOfCharacters], + sindex = CPMaxRange([self selectedRange]), + rectSource = [_layoutManager boundingRectForGlyphRange:CPMakeRange(sindex, 1) inTextContainer:_textContainer], + rectEnd = nglyphs ? [_layoutManager boundingRectForGlyphRange:CPMakeRange(nglyphs - 1, 1) inTextContainer:_textContainer] : rectSource, + point = rectSource.origin; + + if (_stickyXLocation) + point.x = _stickyXLocation; + + // FIXME: find a better way for getting the coordinates of the next line + point.y += 2 + rectSource.size.height; + + var dindex = point.y >= CGRectGetMaxY(rectEnd) ? nglyphs : [_layoutManager glyphIndexForPoint:point inTextContainer:_textContainer fractionOfDistanceThroughGlyph:fraction], + oldStickyLoc = _stickyXLocation; + + if (fraction[0] > 0.5) + dindex++; + + [self _establishSelection:CPMakeRange(dindex, 0) byExtending:NO]; + _stickyXLocation = oldStickyLoc; + [self scrollRangeToVisible:CPMakeRange(dindex, 0)] + +} + +- (void)moveDownAndModifySelection:(id)sender +{ + if (![self isSelectable]) + return; + + var oldStartTrackingLocation = _startTrackingLocation; + + [self _performSelectionFixupForRange:CPMakeRange(_selectionRange.location < _startTrackingLocation ? _selectionRange.location : CPMaxRange(_selectionRange), 0)]; + [self moveDown:sender]; + _startTrackingLocation = oldStartTrackingLocation; + [self _performSelectionFixupForRange:_MakeRangeFromAbs(_startTrackingLocation, (_selectionRange.location < _startTrackingLocation ? _selectionRange.location : CPMaxRange(_selectionRange)))]; +} + +- (void)moveUp:(id)sender +{ + if (![self isSelectable]) + return; + + var dindex = [self selectedRange].location; + + if (dindex < 1) + return; + + var rectSource = [_layoutManager boundingRectForGlyphRange:CPMakeRange(dindex, 1) inTextContainer:_textContainer]; + + if (!(dindex === [_layoutManager numberOfCharacters] && _isNewlineCharacter([[_textStorage string] characterAtIndex:dindex - 1]))) + dindex = [_layoutManager glyphIndexForPoint:CGPointMake(0, rectSource.origin.y + 1) inTextContainer:_textContainer fractionOfDistanceThroughGlyph:nil]; + + if (dindex < 1) + return; + + var fraction = []; + rectSource = [_layoutManager boundingRectForGlyphRange:CPMakeRange(dindex - 1, 1) inTextContainer:_textContainer]; + dindex = [_layoutManager glyphIndexForPoint:CGPointMake(_stickyXLocation, rectSource.origin.y + 1) inTextContainer:_textContainer fractionOfDistanceThroughGlyph:fraction]; + + if (fraction[0] > 0.5) + dindex++; + + var oldStickyLoc = _stickyXLocation; + [self _establishSelection:CPMakeRange(dindex,0) byExtending:NO]; + _stickyXLocation = oldStickyLoc; + + [self scrollRangeToVisible:CPMakeRange(dindex, 0)]; +} + +- (void)moveUpAndModifySelection:(id)sender +{ + if (![self isSelectable]) + return; + + var oldStartTrackingLocation = _startTrackingLocation; + + [self _performSelectionFixupForRange:CPMakeRange(_selectionRange.location < _startTrackingLocation ? _selectionRange.location : CPMaxRange(_selectionRange), 0)]; + [self moveUp:sender]; + _startTrackingLocation = oldStartTrackingLocation; + [self _performSelectionFixupForRange:_MakeRangeFromAbs(_startTrackingLocation, (_selectionRange.location < _startTrackingLocation ? _selectionRange.location : CPMaxRange(_selectionRange)))]; +} + +- (void)_performSelectionFixupForRange:(CPRange)aSel +{ + aSel.location = MAX(0, aSel.location); + + if (CPMaxRange(aSel) > [_layoutManager numberOfCharacters]) + aSel = CPMakeRange([_layoutManager numberOfCharacters], 0); + + [self setSelectedRange:aSel]; + + var point = [_layoutManager locationForGlyphAtIndex:aSel.location]; + + _stickyXLocation = point.x; +} + +- (void)_establishSelection:(CPSelection)aSel byExtending:(BOOL)flag +{ + if (flag) + aSel = CPUnionRange(aSel, _selectionRange); + + [self _performSelectionFixupForRange:aSel]; + _startTrackingLocation = _selectionRange.location; +} + +- (unsigned)_calculateMoveSelectionFromRange:(CPRange)aRange intoDirection:(integer)move granularity:(CPSelectionGranularity)granularity +{ + var inWord = [self _isCharacterAtIndex:(move > 0 ? CPMaxRange(aRange) : aRange.location) + move granularity:granularity], + aSel = [self selectionRangeForProposedRange:CPMakeRange((move > 0 ? CPMaxRange(aRange) : aRange.location) + move, 0) granularity:granularity], + bSel = [self selectionRangeForProposedRange:CPMakeRange((move > 0 ? CPMaxRange(aSel) : aSel.location) + move, 0) granularity:granularity]; + + return move > 0 ? CPMaxRange(inWord? aSel:bSel) : (inWord? aSel:bSel).location; +} + +- (void)_moveSelectionIntoDirection:(integer)move granularity:(CPSelectionGranularity)granularity +{ + var pos = [self _calculateMoveSelectionFromRange:_selectionRange intoDirection:move granularity:granularity]; + + [self _performSelectionFixupForRange:CPMakeRange(pos, 0)]; + _startTrackingLocation = _selectionRange.location; +} + +- (void)_extendSelectionIntoDirection:(integer)move granularity:(CPSelectionGranularity)granularity +{ + var aSel = CPMakeRangeCopy(_selectionRange); + + if (granularity !== CPSelectByCharacter) + { + var pos = [self _calculateMoveSelectionFromRange:CPMakeRange(aSel.location < _startTrackingLocation ? aSel.location : CPMaxRange(aSel), 0) + intoDirection:move + granularity:granularity]; + aSel = CPMakeRange(pos, 0); + } + + else + aSel = CPMakeRange((aSel.location < _startTrackingLocation? aSel.location : CPMaxRange(aSel)) + move, 0); + + aSel = _MakeRangeFromAbs(_startTrackingLocation, aSel.location); + [self _performSelectionFixupForRange:aSel]; +} + +- (void)moveLeftAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:-1 granularity:CPSelectByCharacter]; +} + +- (void)moveBackward:(id)sender +{ + [self moveLeft:sender]; +} + +- (void)moveBackwardAndModifySelection:(id)sender +{ + [self moveLeftAndModifySelection:sender]; +} + +- (void)moveRightAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:1 granularity:CPSelectByCharacter]; +} + +- (void)moveLeft:(id)sender +{ + if ([self isSelectable]) + [self _establishSelection:CPMakeRange(_selectionRange.location - (_selectionRange.length ? 0 : 1), 0) byExtending:NO]; +} + +- (void)moveToEndOfParagraph:(id)sender +{ + if (![self isSelectable]) + return; + + if (!_isNewlineCharacter([[_textStorage string] characterAtIndex:_selectionRange.location])) + [self _moveSelectionIntoDirection:1 granularity:CPSelectByParagraph]; + + if (_isNewlineCharacter([[_textStorage string] characterAtIndex:MAX(0, _selectionRange.location - 1)])) + [self moveLeft:sender]; +} + +- (void)moveToEndOfParagraphAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:1 granularity:CPSelectByParagraph]; +} + +- (void)moveParagraphForwardAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:1 granularity:CPSelectByParagraph]; +} + +- (void)moveParagraphForward:(id)sender +{ + if ([self isSelectable]) + [self _moveSelectionIntoDirection:1 granularity:CPSelectByParagraph]; +} + +- (void)moveWordBackwardAndModifySelection:(id)sender +{ + [self moveWordLeftAndModifySelection:sender]; +} + +- (void)moveWordBackward:(id)sender +{ + [self moveWordLeft:sender]; +} + +- (void)moveWordForwardAndModifySelection:(id)sender +{ + [self moveWordRightAndModifySelection:sender]; +} + +- (void)moveWordForward:(id)sender +{ + [self moveWordRight:sender]; +} + +- (void)moveToBeginningOfDocument:(id)sender +{ + if ([self isSelectable]) + [self _establishSelection:CPMakeRange(0, 0) byExtending:NO]; +} + +- (void)moveToBeginningOfDocumentAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _establishSelection:CPMakeRange(0, 0) byExtending:YES]; +} + +- (void)moveToEndOfDocument:(id)sender +{ + if ([self isSelectable]) + [self _establishSelection:CPMakeRange([_layoutManager numberOfCharacters], 0) byExtending:NO]; +} + +- (void)moveToEndOfDocumentAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _establishSelection:CPMakeRange([_layoutManager numberOfCharacters], 0) byExtending:YES]; +} + +- (void)moveWordRight:(id)sender +{ + if ([self isSelectable]) + [self _moveSelectionIntoDirection:1 granularity:CPSelectByWord]; +} + +- (void)moveToBeginningOfParagraph:(id)sender +{ + if (![self isSelectable]) + return; + + if (!_isNewlineCharacter([[_textStorage string] characterAtIndex:MAX(0, _selectionRange.location - 1)])) + [self _moveSelectionIntoDirection:-1 granularity:CPSelectByParagraph]; +} + +- (void)moveToBeginningOfParagraphAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:-1 granularity:CPSelectByParagraph]; +} + +- (void)moveParagraphBackward:(id)sender +{ + if ([self isSelectable]) + [self _moveSelectionIntoDirection:-1 granularity:CPSelectByParagraph]; +} + +- (void)moveParagraphBackwardAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:-1 granularity:CPSelectByParagraph]; +} + +- (void)moveWordRightAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:+1 granularity:CPSelectByWord]; +} + +- (void)deleteToEndOfParagraph:(id)sender +{ + if (![self isSelectable] || ![self isEditable]) + return; + + [self moveToEndOfParagraphAndModifySelection:self]; + [self delete:self]; +} + +- (void)deleteToBeginningOfParagraph:(id)sender +{ + if (![self isSelectable] || ![self isEditable]) + return; + + [self moveToBeginningOfParagraphAndModifySelection:self]; + [self delete:self]; +} + +- (void)deleteToBeginningOfLine:(id)sender +{ + if (![self isSelectable] || ![self isEditable]) + return; + + [self moveToLeftEndOfLineAndModifySelection:self]; + [self delete:self]; +} + +- (void)deleteToEndOfLine:(id)sender +{ + if (![self isSelectable] || ![self isEditable]) + return; + + [self moveToRightEndOfLineAndModifySelection:self]; + [self delete:self]; +} + +- (void)deleteWordBackward:(id)sender +{ + if (![self isSelectable] || ![self isEditable]) + return; + + [self moveWordLeftAndModifySelection:self]; + [self delete:self]; +} + +- (void)deleteWordForward:(id)sender +{ + if (![self isSelectable] || ![self isEditable]) + return; + + [self moveWordRightAndModifySelection:self]; + [self delete:self]; +} + +- (void)moveToLeftEndOfLine:(id)sender byExtending:(BOOL)flag +{ + if (![self isSelectable]) + return; + + var nglyphs = [_layoutManager numberOfCharacters], + loc = nglyphs == _selectionRange.location ? MAX(0, _selectionRange.location - 1) : _selectionRange.location, + fragment = [_layoutManager _firstLineFragmentForLineFromLocation:loc]; + + if (fragment) + [self _establishSelection:CPMakeRange(fragment._range.location, 0) byExtending:flag]; +} + +- (void)moveToLeftEndOfLine:(id)sender +{ + [self moveToLeftEndOfLine:sender byExtending:NO]; +} + +- (void)moveToLeftEndOfLineAndModifySelection:(id)sender +{ + [self moveToLeftEndOfLine:sender byExtending:YES]; +} + +- (void)moveToRightEndOfLine:(id)sender byExtending:(BOOL)flag +{ + if (![self isSelectable]) + return; + + var fragment = [_layoutManager _lastLineFragmentForLineFromLocation:_selectionRange.location]; + + if (!fragment) + return; + + var nglyphs = [_layoutManager numberOfCharacters], + loc = nglyphs == CPMaxRange(fragment._range) ? nglyphs : MAX(0, CPMaxRange(fragment._range) - 1); + + [self _establishSelection:CPMakeRange(loc, 0) byExtending:flag]; +} + +- (void)moveToRightEndOfLine:(id)sender +{ + [self moveToRightEndOfLine:sender byExtending:NO]; +} + +- (void)moveToRightEndOfLineAndModifySelection:(id)sender +{ + [self moveToRightEndOfLine:sender byExtending:YES]; +} + +- (void)moveWordLeftAndModifySelection:(id)sender +{ + if ([self isSelectable]) + [self _extendSelectionIntoDirection:-1 granularity:CPSelectByWord]; +} + +- (void)moveWordLeft:(id)sender +{ + if ([self isSelectable]) + [self _moveSelectionIntoDirection:-1 granularity:CPSelectByWord] +} + +- (void)moveRight:(id)sender +{ + if ([self isSelectable]) + [self _establishSelection:CPMakeRange(CPMaxRange(_selectionRange) + (_selectionRange.length ? 0 : 1), 0) byExtending:NO]; +} + +- (void)_deleteForRange:(CPRange)changedRange +{ + if (![self shouldChangeTextInRange:changedRange replacementString:@""]) + return; + + changedRange = CPIntersectionRange(CPMakeRange(0, [_layoutManager numberOfCharacters]), changedRange); + + [[[_window undoManager] prepareWithInvocationTarget:self] _replaceCharactersInRange:CPMakeRange(changedRange.location, 0) + withAttributedString:[_textStorage attributedSubstringFromRange:CPMakeRangeCopy(changedRange)] + selectionRange:CPMakeRangeCopy(_selectionRange)]; + [self willChangeValueForKey:@"objectValue"]; + [_textStorage deleteCharactersInRange:CPMakeRangeCopy(changedRange)]; + [self didChangeValueForKey:@"objectValue"]; + [self _continuouslyReverseSetBinding]; + + [self setSelectedRange:CPMakeRange(changedRange.location, 0)]; + [self didChangeText]; + [_layoutManager _validateLayoutAndGlyphs]; + [self sizeToFit]; + _stickyXLocation = _caret._rect.origin.x; +} + +- (void)cancelOperation:(id)sender +{ + [_CPNativeInputManager cancelCurrentInputSessionIfNeeded]; // handle ESC during native input +} + +- (void)deleteBackward:(id)sender ignoreSmart:(BOOL)ignoreFlag +{ + var changedRange; + + if (CPEmptyRange(_selectionRange) && _selectionRange.location > 0) + changedRange = CPMakeRange(_selectionRange.location - 1, 1); + else + changedRange = _selectionRange; + + // smart delete + if (!ignoreFlag && _copySelectionGranularity > 0 && + changedRange.location > 0 && _isWhitespaceCharacter([[_textStorage string] characterAtIndex:_selectionRange.location - 1]) && + changedRange.location < [[self string] length] && _isWhitespaceCharacter([[_textStorage string] characterAtIndex:CPMaxRange(changedRange)])) + changedRange.length++; + + [self _deleteForRange:changedRange]; + _startTrackingLocation = _selectionRange.location; +} + +- (void)deleteBackward:(id)sender +{ + _copySelectionGranularity = _previousSelectionGranularity; // smart delete + [self deleteBackward:self ignoreSmart:_selectionRange.length > 0? NO:YES]; +} + +- (void)deleteForward:(id)sender +{ + var changedRange; + + if (CPEmptyRange(_selectionRange) && _selectionRange.location < [_layoutManager numberOfCharacters]) + changedRange = CPMakeRange(_selectionRange.location, 1); + else + changedRange = _selectionRange; + + [self _deleteForRange:changedRange]; +} + +- (void)cut:(id)sender +{ + var selectedRange = [self selectedRange]; + + if (selectedRange.length < 1) + return; + + [self copy:sender]; + [self deleteBackward:sender ignoreSmart:NO]; +} + +- (void)insertLineBreak:(id)sender +{ + [self insertText:@"\n"]; +} + +- (void)insertTab:(id)sender +{ + [self insertText:@"\t"]; +} + +- (void)insertTabIgnoringFieldEditor:(id)sender +{ + [self insertTab:sender]; +} + +- (void)insertNewlineIgnoringFieldEditor:(id)sender +{ + [self insertLineBreak:sender]; +} + +- (void)insertNewline:(id)sender +{ + [self insertLineBreak:sender]; +} + +- (void)_enrichEssentialTypingAttributes:(CPDictionary)attributes +{ + if (![attributes containsKey:CPFontAttributeName]) + [attributes setObject:[self font] forKey:CPFontAttributeName]; + + if (![attributes containsKey:CPForegroundColorAttributeName]) + [attributes setObject:[self textColor] forKey:CPForegroundColorAttributeName]; +} + +- (void)setTypingAttributes:(CPDictionary)attributes +{ + if (!attributes) + attributes = [CPDictionary dictionary]; + + if ([self _delegateRespondsToShouldChangeTypingAttributesToAttributes]) + { + _typingAttributes = [self _sendDelegateShouldChangeTypingAttributes:_typingAttributes toAttributes:attributes]; + } + else + { + _typingAttributes = [attributes copy]; + + [self _enrichEssentialTypingAttributes:_typingAttributes]; + } + + [[CPNotificationCenter defaultCenter] postNotificationName:CPTextViewDidChangeTypingAttributesNotification + object:self]; + + if (_delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_didChangeTypingAttributes) + [_delegate textViewDidChangeTypingAttributes:[[CPNotification alloc] initWithName:CPTextViewDidChangeTypingAttributesNotification object:self userInfo:nil]]; +} + +- (CPDictionary)_attributesForFontPanel +{ + var attributes = [[_textStorage attributesAtIndex:CPMaxRange(_selectionRange) effectiveRange:nil] copy]; + + [self _enrichEssentialTypingAttributes:attributes]; + + return attributes; +} + +- (void)delete:(id)sender +{ + [self deleteBackward:sender]; +} + + +#pragma mark - +#pragma mark Font methods + +- (CPFont)font +{ + return _font || [CPFont systemFontOfSize:12.0]; +} + +- (void)setFont:(CPFont)font +{ + _font = font; + + var length = [_layoutManager numberOfCharacters]; + + if (length) + { + [_textStorage addAttribute:CPFontAttributeName value:_font range:CPMakeRange(0, length)]; + [_textStorage setFont:_font]; + [self scrollRangeToVisible:CPMakeRange(length, 0)]; + } +} + +- (void)setFont:(CPFont)font range:(CPRange)range +{ + if (![self isRichText]) + { + _font = font; + [_textStorage setFont:_font]; + } + + var currentAttributes = [_textStorage attributesAtIndex:range.location effectiveRange:nil] || _typingAttributes; + + [[[[self window] undoManager] prepareWithInvocationTarget:self] + setFont:[currentAttributes objectForKey:CPFontAttributeName] || [self font] + range:CPMakeRangeCopy(range)]; + + [_textStorage addAttribute:CPFontAttributeName value:font range:CPMakeRangeCopy(range)]; + [_layoutManager _validateLayoutAndGlyphs]; +} + +- (void)changeFont:(id)sender +{ + var currRange = CPMakeRange(_selectionRange.location, 0), + oldFont, + attributes, + scrollRange = CPMakeRange(CPMaxRange(_selectionRange), 0), + undoManager = [[self window] undoManager]; + + [undoManager beginUndoGrouping]; + + if ([self isRichText]) + { + if (!CPEmptyRange(_selectionRange)) + { + while (CPMaxRange(currRange) < CPMaxRange(_selectionRange)) // iterate all "runs" + { + attributes = [_textStorage attributesAtIndex:CPMaxRange(currRange) + longestEffectiveRange:currRange + inRange:_selectionRange]; + oldFont = [attributes objectForKey:CPFontAttributeName] || [self font]; + + [self setFont:[sender convertFont:oldFont] range:currRange]; + } + } + else + { + [_typingAttributes setObject:[sender selectedFont] forKey:CPFontAttributeName]; + } + } + else + { + var length = [_textStorage length]; + + oldFont = [self font]; + [self setFont:[sender convertFont:oldFont] range:CPMakeRange(0, length)]; + scrollRange = CPMakeRange(length, 0); + } + + [undoManager endUndoGrouping]; + + [_layoutManager _validateLayoutAndGlyphs]; + [self sizeToFit]; + [self setNeedsDisplay:YES]; + [self scrollRangeToVisible:scrollRange]; +} + + +#pragma mark - +#pragma mark Color methods + +- (void)changeColor:(id)sender +{ + [self setTextColor:[sender color] range:_selectionRange]; +} + +- (void)setTextColor:(CPColor)aColor +{ + _textColor = [aColor copy]; + [self setTextColor:aColor range:CPMakeRange(0, [_layoutManager numberOfCharacters])]; + [_typingAttributes setObject:_textColor forKey:CPForegroundColorAttributeName]; +} + +- (void)setTextColor:(CPColor)aColor range:(CPRange)range +{ + var currentAttributes = [_textStorage attributesAtIndex:range.location effectiveRange:nil] || _typingAttributes; + + [[[[self window] undoManager] prepareWithInvocationTarget:self] + setTextColor:[currentAttributes objectForKey:CPForegroundColorAttributeName] || _textColor + range:CPMakeRangeCopy(range)]; + + if (!CPEmptyRange(range)) + { + if (aColor) + [_textStorage addAttribute:CPForegroundColorAttributeName value:aColor range:CPMakeRangeCopy(range)]; + else + [_textStorage removeAttribute:CPForegroundColorAttributeName range:CPMakeRangeCopy(range)]; + } + else + [_typingAttributes setObject:aColor forKey:CPForegroundColorAttributeName]; + + [_layoutManager textStorage:_textStorage edited:0 range:CPMakeRangeCopy(range) changeInLength:0 invalidatedRange:CPMakeRangeCopy(range)]; +} + +- (void)underline:(id)sender +{ + if (![self shouldChangeTextInRange:_selectionRange replacementString:nil]) + return; + + if (!CPEmptyRange(_selectionRange)) + { + var attrib = [_textStorage attributesAtIndex:_selectionRange.location effectiveRange:nil]; + + if ([attrib containsKey:CPUnderlineStyleAttributeName] && [[attrib objectForKey:CPUnderlineStyleAttributeName] intValue]) + [_textStorage removeAttribute:CPUnderlineStyleAttributeName range:_selectionRange]; + else + [_textStorage addAttribute:CPUnderlineStyleAttributeName value:[CPNumber numberWithInt:1] range:CPMakeRangeCopy(_selectionRange)]; + } + else + { + if ([_typingAttributes containsKey:CPUnderlineStyleAttributeName] && [[_typingAttributes objectForKey:CPUnderlineStyleAttributeName] intValue]) + [_typingAttributes setObject:[CPNumber numberWithInt:0] forKey:CPUnderlineStyleAttributeName]; + else + [_typingAttributes setObject:[CPNumber numberWithInt:1] forKey:CPUnderlineStyleAttributeName]; + } + + [_layoutManager textStorage:_textStorage edited:0 range:CPMakeRangeCopy(_selectionRange) changeInLength:0 invalidatedRange:CPMakeRangeCopy(_selectionRange)]; +} + +- (CPSelectionAffinity)selectionAffinity +{ + return 0; +} + +- (BOOL)isRulerVisible +{ + return NO; +} + +- (void)replaceCharactersInRange:(CPRange)aRange withString:(CPString)aString +{ + [_textStorage replaceCharactersInRange:aRange withString:aString]; +} + +- (void)setConstrainedFrameSize:(CGSize)desiredSize +{ + [self setFrameSize:desiredSize]; +} + +- (void)sizeToFit +{ + [self setFrameSize:[self frameSize]]; +} + +- (void)setFrameSize:(CGSize)aSize +{ + var minSize = [self minSize], + maxSize = [self maxSize], + desiredSize = CGSizeCreateCopy(aSize), + rect = CGRectUnion([_layoutManager boundingRectForGlyphRange:CPMakeRange(0, 1) inTextContainer:_textContainer], + [_layoutManager boundingRectForGlyphRange:CPMakeRange(MAX(0, [_layoutManager numberOfCharacters] - 2), 1) inTextContainer:_textContainer]), + myClipviewSize = nil; + + if ([[self superview] isKindOfClass:[CPClipView class]]) + myClipviewSize = [[self superview] frame].size; + + if ([_layoutManager extraLineFragmentTextContainer] === _textContainer) + rect = CGRectUnion(rect, [_layoutManager extraLineFragmentRect]); + + if (_isHorizontallyResizable) + { + rect = [_layoutManager boundingRectForGlyphRange:CPMakeRange(0, MAX(0, [_layoutManager numberOfCharacters] - 1)) inTextContainer:_textContainer]; // needs expensive "deep" recalculation + + desiredSize.width = rect.size.width + 2 * _textContainerInset.width; + + if (desiredSize.width < minSize.width) + desiredSize.width = minSize.width; + else if (desiredSize.width > maxSize.width) + desiredSize.width = maxSize.width; + } + + if (_isVerticallyResizable) + { + desiredSize.height = rect.size.height + 2 * _textContainerInset.height; + + if (desiredSize.height < minSize.height) + desiredSize.height = minSize.height; + else if (desiredSize.height > maxSize.height) + desiredSize.height = maxSize.height; + } + + if (myClipviewSize) + { + if (desiredSize.width < myClipviewSize.width) + desiredSize.width = myClipviewSize.width; + if (desiredSize.height < myClipviewSize.height) + desiredSize.height = myClipviewSize.height; + } + + [super setFrameSize:desiredSize]; +} + +- (void)scrollRangeToVisible:(CPRange)aRange +{ + var rect; + + if (CPEmptyRange(aRange)) + { + if (aRange.location >= [_layoutManager numberOfCharacters]) + rect = [_layoutManager extraLineFragmentRect]; + else + rect = [_layoutManager lineFragmentRectForGlyphAtIndex:aRange.location effectiveRange:nil]; + } + else + { + rect = [_layoutManager boundingRectForGlyphRange:aRange inTextContainer:_textContainer]; + } + + rect.origin.x += _textContainerOrigin.x; + rect.origin.y += _textContainerOrigin.y; + + [self scrollRectToVisible:rect]; +} + +- (BOOL)_isCharacterAtIndex:(unsigned)index granularity:(CPSelectionGranularity)granularity +{ + var characterSet; + + switch (granularity) + { + case CPSelectByWord: + characterSet = [[self class] _wordBoundaryRegex]; + break; + + case CPSelectByParagraph: + characterSet = [[self class] _paragraphBoundaryRegex]; + break; + default: + // FIXME if (!characterSet) croak! + } + + return _regexMatchesStringAtIndex(characterSet, [_textStorage string], index); +} + ++ (JSObject)_wordBoundaryRegex +{ + return new RegExp("(^[0-9][\\.,])|(^.[^-\\.,+#'\"!§$%&/\\(<\\[\\]>\\)=?`´*\\s{}\\|¶])", "m"); +} + ++ (JSObject)_paragraphBoundaryRegex +{ + return new RegExp("^.[^\\n\\r]", "m"); +} + ++ (JSObject)_whitespaceRegex +{ + // do not include \n here or we will get cross paragraph selections + return new RegExp("^.[ \\t]+", "m"); +} + +- (CPRange)_characterRangeForIndex:(unsigned)index asDefinedByRegex:(JSObject)regex +{ + return [self _characterRangeForIndex:index asDefinedByLRegex:regex andRRegex:regex] +} + +- (CPRange)_characterRangeForIndex:(unsigned)index asDefinedByLRegex:(JSObject)lregex andRRegex:(JSObject)rregex +{ + var wordRange = CPMakeRange(index, 0), + numberOfCharacters = [_layoutManager numberOfCharacters], + string = [_textStorage string]; + + // extend to the left + for (var searchIndex = index - 1; searchIndex >= 0 && _regexMatchesStringAtIndex(lregex, string, searchIndex); searchIndex--) + wordRange.location = searchIndex; + + // extend to the right + searchIndex = index + 1; + + while (searchIndex < numberOfCharacters && _regexMatchesStringAtIndex(rregex, string, searchIndex)) + searchIndex++; + + return _MakeRangeFromAbs(wordRange.location, MIN(MAX(0, numberOfCharacters), searchIndex)); +} + +- (CPRange)selectionRangeForProposedRange:(CPRange)proposedRange granularity:(CPSelectionGranularity)granularity +{ + var textStorageLength = [_layoutManager numberOfCharacters]; + + if (textStorageLength == 0) + return CPMakeRange(0, 0); + + if (proposedRange.location >= textStorageLength) + proposedRange = CPMakeRange(textStorageLength, 0); + + if (CPMaxRange(proposedRange) > textStorageLength) + proposedRange.length = textStorageLength - proposedRange.location; + + var string = [_textStorage string], + lregex, + rregex, + lloc = proposedRange.location, + rloc = CPMaxRange(proposedRange); + + switch (granularity) + { + case CPSelectByWord: + lregex = _isWhitespaceCharacter([string characterAtIndex:lloc])? [[self class] _whitespaceRegex] : [[self class] _wordBoundaryRegex]; + rregex = _isWhitespaceCharacter([string characterAtIndex:CPMaxRange(proposedRange)])? [[self class] _whitespaceRegex] : [[self class] _wordBoundaryRegex]; + break; + case CPSelectByParagraph: + lregex = rregex = [[self class] _paragraphBoundaryRegex]; + + // triple click right in last line of a paragraph-> select this paragraph completely + if (lloc > 0 && _isNewlineCharacter([string characterAtIndex:lloc]) && + !_isNewlineCharacter([string characterAtIndex:lloc - 1])) + lloc--; + + if (rloc > 0 && _isNewlineCharacter([string characterAtIndex:rloc])) + rloc--; + + break; + default: + return proposedRange; + } + + var granularRange = [self _characterRangeForIndex:lloc + asDefinedByLRegex:lregex + andRRegex:rregex]; + + if (proposedRange.length == 0 && _isNewlineCharacter([string characterAtIndex:proposedRange.location])) + return _MakeRangeFromAbs(_isNewlineCharacter([string characterAtIndex:lloc])? proposedRange.location : granularRange.location, proposedRange.location + 1); + + if (proposedRange.length) + granularRange = CPUnionRange(granularRange, [self _characterRangeForIndex:rloc + asDefinedByLRegex:lregex + andRRegex:rregex]); + + // include the newline character in case of triple click selecting as is done by apple + if (granularity == CPSelectByParagraph && _isNewlineCharacter([string characterAtIndex:CPMaxRange(granularRange)])) + granularRange.length++; + + return granularRange; +} + +- (BOOL)shouldDrawInsertionPoint +{ + return (_selectionRange.length === 0 && [self _isFocused]); +} + +- (void)updateInsertionPointStateAndRestartTimer:(BOOL)flag +{ + var caretRect, + numberOfGlyphs = [_layoutManager numberOfCharacters]; + + if (_selectionRange.length) + [_caret setVisibility:NO]; + + if (_selectionRange.location >= numberOfGlyphs) // cursor is "behind" the last chacacter + { + caretRect = [_layoutManager boundingRectForGlyphRange:CPMakeRange(MAX(0,_selectionRange.location - 1), 1) inTextContainer:_textContainer]; + + if (!numberOfGlyphs) + { + var font = [_typingAttributes objectForKey:CPFontAttributeName] || [self font]; + + caretRect.size.height = [font size]; + caretRect.origin.y = ([font ascender] - [font descender]) * 0.5 + _textContainerOrigin.y; + } + + caretRect.origin.x += caretRect.size.width; + + if (_selectionRange.location > 0 && [[_textStorage string] characterAtIndex:_selectionRange.location - 1] === '\n') + { + caretRect.origin.y += caretRect.size.height; + caretRect.origin.x = 0; + } + } + else + caretRect = [_layoutManager boundingRectForGlyphRange:CPMakeRange(_selectionRange.location, 1) inTextContainer:_textContainer]; + + var loc = (_selectionRange.location === numberOfGlyphs && numberOfGlyphs > 0) ? _selectionRange.location - 1 : _selectionRange.location, + caretOffset = [_layoutManager _characterOffsetAtLocation:loc], + oldYPosition = CGRectGetMaxY(caretRect), + caretDescend = [_layoutManager _descentAtLocation:loc]; + + if (caretOffset > 0) + { + caretRect.origin.y += caretOffset; + caretRect.size.height = oldYPosition - caretRect.origin.y; + } + if (caretDescend < 0) + caretRect.size.height -= caretDescend; + + caretRect.origin.x += _textContainerOrigin.x; + caretRect.origin.y += _textContainerOrigin.y; + caretRect.size.width = 1; + + [_caret setRect:caretRect]; + + if (flag) + [_caret startBlinking]; +} + +- (void)draggingUpdated:(CPDraggingInfo)info +{ + var point = [info draggingLocation], + location = [self _characterIndexFromRawPoint:CGPointCreateCopy(point)]; + + _movingSelection = CPMakeRange(location, 0); + [_caret _drawCaretAtLocation:_movingSelection.location]; + [_caret setVisibility:YES]; +} + +#pragma mark - +#pragma mark Dragging operation + +- (void)performDragOperation:(CPDraggingInfo)aSender +{ + var location = [self convertPoint:[aSender draggingLocation] fromView:nil], + pasteboard = [aSender draggingPasteboard]; + + if ([pasteboard availableTypeFromArray:[CPRTFPboardType, CPStringPboardType]]) + { + [_caret setVisibility:NO]; + + if (CPLocationInRange(_movingSelection.location, _selectionRange)) + { + [self setSelectedRange:_movingSelection]; + _movingSelection = nil; + return; + } + + if (_movingSelection.location > CPMaxRange(_selectionRange)) + _movingSelection.location -= _selectionRange.length; + + [self _deleteForRange:_selectionRange]; + [self setSelectedRange:_movingSelection]; + + var dataForPasting = [pasteboard stringForType:CPRTFPboardType] || [pasteboard stringForType:CPStringPboardType]; + + // setTimeout is to a work around a transaction issue with the undomanager + setTimeout(function(){ + + if ([dataForPasting hasPrefix:"{\\rtf"]) + [self insertText:[[_CPRTFParser new] parseRTF:dataForPasting]]; + else + [self insertText:dataForPasting]; + }, 0); + } + + if ([pasteboard availableTypeFromArray:[CPColorDragType]]) + [self setTextColor:[CPKeyedUnarchiver unarchiveObjectWithData:[pasteboard dataForType:CPColorDragType]] range:_selectionRange]; +} + +- (BOOL)isSelectable +{ + return [super isSelectable] && !_placeholderString; +} +- (BOOL)isEditable +{ + return [super isEditable] && !_placeholderString; +} + +- (void)_setPlaceholderString:(CPString)aString +{ + if (_placeholderString === aString) + return; + + _placeholderString = aString; + + [self setString:[[CPAttributedString alloc] initWithString:_placeholderString attributes:@{CPForegroundColorAttributeName:[CPColor colorWithRed:0.66 green:0.66 blue:0.66 alpha:1]}]]; +} + +- (void)_continuouslyReverseSetBinding +{ + var binderClass = [[self class] _binderClassForBinding:CPAttributedStringBinding] || + [[self class] _binderClassForBinding:CPValueBinding], + theBinding = [binderClass getBinding:CPAttributedStringBinding forObject:self] || [binderClass getBinding:CPValueBinding forObject:self]; + + if ([theBinding continuouslyUpdatesValue]) + [theBinding reverseSetValueFor:@"objectValue"]; +} + +- (void)_reverseSetBinding +{ + var binderClass = [[self class] _binderClassForBinding:CPAttributedStringBinding] || + [[self class] _binderClassForBinding:CPValueBinding], + theBinding = [binderClass getBinding:CPAttributedStringBinding forObject:self] || [binderClass getBinding:CPValueBinding forObject:self]; + + [theBinding reverseSetValueFor:@"objectValue"]; +} + +@end + + +@implementation CPTextView (CPTextViewDelegate) + +- (BOOL)_delegateRespondsToShouldChangeTypingAttributesToAttributes +{ + return _delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_shouldChangeTypingAttributes_toAttributes; +} + +- (BOOL)_delegateRespondsToWillChangeSelectionFromCharacterRangeToCharacterRange +{ + return _delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_willChangeSelectionFromCharacterRange_toCharacterRange; +} + +- (BOOL)_sendDelegateDoCommandBySelector:(SEL)aSelector +{ + if (!(_delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_doCommandBySelector)) + return NO; + + return [_delegate textView:self doCommandBySelector:aSelector]; +} + +- (BOOL)_sendDelegateTextShouldBeginEditing +{ + if (!(_delegateRespondsToSelectorMask & kDelegateRespondsTo_textShouldBeginEditing)) + return YES; + + return [_delegate textShouldBeginEditing:self]; +} + +- (BOOL)_sendDelegateShouldChangeTextInRange:(CPRange)aRange replacementString:(CPString)aString +{ + if (!(_delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_shouldChangeTextInRange_replacementString)) + return YES; + + return [_delegate textView:self shouldChangeTextInRange:aRange replacementString:aString]; +} + +- (CPDictionary)_sendDelegateShouldChangeTypingAttributes:(CPDictionary)typingAttributes toAttributes:(CPDictionary)attributes +{ + if (!(_delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_doCommandBySelector)) + return [CPDictionary dictionary]; + + return [_delegate textView:self shouldChangeTypingAttributes:typingAttributes toAttributes:attributes]; +} + +- (CPRange)_sendDelegateWillChangeSelectionFromCharacterRange:(CPRange)selectionRange toCharacterRange:(CPRange)range +{ + if (!(_delegateRespondsToSelectorMask & kDelegateRespondsTo_textView_willChangeSelectionFromCharacterRange_toCharacterRange)) + return CPMakeRange(0, 0); + + return [_delegate textView:self willChangeSelectionFromCharacterRange:selectionRange toCharacterRange:range]; +} + +@end + + +var CPTextViewAllowsUndoKey = @"CPTextViewAllowsUndoKey", + CPTextViewUsesFontPanelKey = @"CPTextViewUsesFontPanelKey", + CPTextViewContainerKey = @"CPTextViewContainerKey", + CPTextViewLayoutManagerKey = @"CPTextViewLayoutManagerKey", + CPTextViewTextStorageKey = @"CPTextViewTextStorageKey", + CPTextViewInsertionPointColorKey = @"CPTextViewInsertionPointColorKey", + CPTextViewSelectedTextAttributesKey = @"CPTextViewSelectedTextAttributesKey", + CPTextViewDelegateKey = @"CPTextViewDelegateKey"; + +@implementation CPTextView (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + [self _init]; + + [self setInsertionPointColor:[aCoder decodeObjectForKey:CPTextViewInsertionPointColorKey]]; + + var selectedTextAttributes = [aCoder decodeObjectForKey:CPTextViewSelectedTextAttributesKey], + enumerator = [selectedTextAttributes keyEnumerator], + key; + + while (key = [enumerator nextObject]) + [_selectedTextAttributes setObject:[selectedTextAttributes valueForKey:key] forKey:key]; + + if (![_selectedTextAttributes valueForKey:CPBackgroundColorAttributeName]) + [_selectedTextAttributes setObject:[CPColor selectedTextBackgroundColor] forKey:CPBackgroundColorAttributeName]; + + [self setAllowsUndo:[aCoder decodeBoolForKey:CPTextViewAllowsUndoKey]]; + [self setUsesFontPanel:[aCoder decodeBoolForKey:CPTextViewUsesFontPanelKey]]; + + [self setDelegate:[aCoder decodeObjectForKey:CPTextViewDelegateKey]]; + + var container = [aCoder decodeObjectForKey:CPTextViewContainerKey]; + [container setTextView:self]; + + _typingAttributes = [[_textStorage attributesAtIndex:0 effectiveRange:nil] copy]; + + if (![_typingAttributes valueForKey:CPForegroundColorAttributeName]) + [_typingAttributes setObject:[CPColor blackColor] forKey:CPForegroundColorAttributeName]; + + _textColor = [_typingAttributes valueForKey:CPForegroundColorAttributeName]; + [self setFont:[_typingAttributes valueForKey:CPFontAttributeName]]; + + [self setString:[_textStorage string]]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; + + [aCoder encodeObject:_delegate forKey:CPTextViewDelegateKey]; + [aCoder encodeObject:_textContainer forKey:CPTextViewContainerKey]; + [aCoder encodeObject:_insertionPointColor forKey:CPTextViewInsertionPointColorKey]; + [aCoder encodeObject:_selectedTextAttributes forKey:CPTextViewSelectedTextAttributesKey]; + [aCoder encodeBool:_allowsUndo forKey:CPTextViewAllowsUndoKey]; + [aCoder encodeBool:_usesFontPanel forKey:CPTextViewUsesFontPanelKey]; +} + +@end + + +@implementation _CPSelectionBox : CPObject +{ + DOMElement _selectionBoxDOM; + CGRect _rect; + CPColor _color + CPTextView _textView; +} + +- (id)initWithTextView:(CPTextView)aTextView rect:(CGRect)aRect color:(CPColor)aColor +{ + if (self = [super init]) + { + _textView = aTextView; + _rect = aRect; + _color = aColor; + + [self _createSpan]; + _textView._DOMElement.appendChild(_selectionBoxDOM); + } + + return self; +} + +- (void)removeFromTextView +{ + _textView._DOMElement.removeChild(_selectionBoxDOM); +} + +- (void)_createSpan +{ + +#if PLATFORM(DOM) + _selectionBoxDOM = document.createElement("span"); + _selectionBoxDOM.style.position = "absolute"; + _selectionBoxDOM.style.visibility = "visible"; + _selectionBoxDOM.style.padding = "0px"; + _selectionBoxDOM.style.margin = "0px"; + _selectionBoxDOM.style.whiteSpace = "pre"; + _selectionBoxDOM.style.backgroundColor = [_color cssString]; + + _selectionBoxDOM.style.width = (_rect.size.width) + "px"; + _selectionBoxDOM.style.left = (_rect.origin.x) + "px"; + _selectionBoxDOM.style.top = (_rect.origin.y) + "px"; + _selectionBoxDOM.style.height = (_rect.size.height) + "px"; + _selectionBoxDOM.style.zIndex = -1000; + _selectionBoxDOM.oncontextmenu = _selectionBoxDOM.onmousedown = _selectionBoxDOM.onselectstart = function () { return false; }; +#endif + +} + +@end + + +@implementation _CPCaret : CPObject +{ + BOOL _drawCaret; + BOOL _permanentlyVisible @accessors(property=permanentlyVisible); + CGRect _rect; + CPTextView _textView; + CPTimer _caretTimer; + DOMElement _caretDOM; +} + +- (void)setRect:(CGRect)aRect +{ + _rect = CGRectCreateCopy(aRect); + +#if PLATFORM(DOM) + _caretDOM.style.left = (aRect.origin.x) + "px"; + _caretDOM.style.top = (aRect.origin.y) + "px"; + _caretDOM.style.height = (aRect.size.height) + "px"; +#endif +} + +- (id)initWithTextView:(CPTextView)aView +{ + if (self = [super init]) + { +#if PLATFORM(DOM) + var style; + + if (!_caretDOM) + { + _caretDOM = document.createElement("span"); + style = _caretDOM.style; + style.position = "absolute"; + style.visibility = "visible"; + style.padding = "0px"; + style.margin = "0px"; + style.whiteSpace = "pre"; + style.backgroundColor = "black"; + _caretDOM.style.width = "1px"; + _textView = aView; + _textView._DOMElement.appendChild(_caretDOM); + } +#endif + } + + return self; +} + +- (void)setVisibility:(BOOL)visibilityFlag stop:(BOOL)stopFlag +{ + +#if PLATFORM(DOM) + _caretDOM.style.visibility = visibilityFlag ? "visible" : "hidden"; +#endif + + if (!visibilityFlag && stopFlag) + [self stopBlinking]; +} + +- (void)setVisibility:(BOOL)visibilityFlag +{ + [self setVisibility:visibilityFlag stop:YES]; +} + +- (void)_blinkCaret:(CPTimer)aTimer +{ + _drawCaret = (!_drawCaret) || _permanentlyVisible; + [_textView setNeedsDisplayInRect:_rect]; +} + +- (void)startBlinking +{ + _drawCaret = YES; + + if ([self isBlinking]) + return; + + _caretTimer = [CPTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(_blinkCaret:) userInfo:nil repeats:YES]; +} + +- (void)isBlinking +{ + return [_caretTimer isValid]; +} + +- (void)stopBlinking +{ + _drawCaret = NO; + + if (_caretTimer) + { + [_caretTimer invalidate]; + _caretTimer = nil; + } +} + +- (void)_drawCaretAtLocation:(int)aLoc +{ + var rect = [_textView._layoutManager boundingRectForGlyphRange:CPMakeRange(aLoc, 1) inTextContainer:_textView._textContainer]; + + if (aLoc >= [_textView._layoutManager numberOfCharacters]) + rect.origin.x = CGRectGetMaxX(rect) + + [self setRect:rect]; +} + +@end + + +var _CPNativeInputField, + _CPNativeInputFieldKeyDownCalled, + _CPNativeInputFieldKeyUpCalled, + _CPNativeInputFieldKeyPressedCalled, + _CPNativeInputFieldActive; + +var _CPCopyPlaceholder = '-'; + +@implementation _CPNativeInputManager : CPObject + ++ (BOOL)isNativeInputFieldActive +{ + return _CPNativeInputFieldActive; +} + ++ (void)cancelCurrentNativeInputSession +{ + +#if PLATFORM(DOM) + _CPNativeInputField.innerHTML = ''; +#endif + + [self _endInputSessionWithString:_CPNativeInputField.innerHTML]; +} + ++ (void)cancelCurrentInputSessionIfNeeded +{ + if (!_CPNativeInputFieldActive) + return; + + [self cancelCurrentNativeInputSession]; +} + ++ (void)_endInputSessionWithString:(CPString)aStr +{ + _CPNativeInputFieldActive = NO; + + var currentFirstResponder = [[CPApp keyWindow] firstResponder], + placeholderRange = CPMakeRange([currentFirstResponder selectedRange].location - 1, 1); + + [currentFirstResponder setSelectedRange:placeholderRange]; + [currentFirstResponder insertText:aStr]; + _CPNativeInputField.innerHTML = ''; + + + [self hideInputElement]; + [currentFirstResponder updateInsertionPointStateAndRestartTimer:YES]; +} + ++ (void)initialize +{ +#if PLATFORM(DOM) + _CPNativeInputField = document.createElement("div"); + _CPNativeInputField.contentEditable = YES; + _CPNativeInputField.style.width = "64px"; + _CPNativeInputField.style.zIndex = 10000; + _CPNativeInputField.style.position = "absolute"; + _CPNativeInputField.style.visibility = "visible"; + _CPNativeInputField.style.padding = "0px"; + _CPNativeInputField.style.margin = "0px"; + _CPNativeInputField.style.whiteSpace = "pre"; + _CPNativeInputField.style.outline = "0px solid transparent"; + + document.body.appendChild(_CPNativeInputField); + + _CPNativeInputField.addEventListener("keyup", function(e) + { + _CPNativeInputFieldKeyUpCalled = YES; + + // filter out the shift-up, cursor keys and friends used to access the deadkeys + // fixme: e.which is depreciated(?) -> find a better way to identify the modifier-keyups + if (e.which < 27 || e.which == 91 || e.which == 93) // include apple command keys + { + if (e.which == 13) + _CPNativeInputField.innerHTML = ''; + + if (_CPNativeInputField.innerHTML.length == 0 || _CPNativeInputField.innerHTML.length > 2) // backspace + [self cancelCurrentInputSessionIfNeeded]; + + return false; // prevent the default behaviour + } + + var currentFirstResponder = [[CPApp keyWindow] firstResponder]; + + if (![currentFirstResponder respondsToSelector:@selector(_activateNativeInputElement:)]) + return false; // prevent the default behaviour + + var charCode = _CPNativeInputField.innerHTML.charCodeAt(0); + + // å and Å need to be filtered out in keyDown: due to chrome inserting 229 on a deadkey + if (charCode == 229 || charCode == 197) + { + [currentFirstResponder insertText:_CPNativeInputField.innerHTML]; + _CPNativeInputField.innerHTML = ''; + return; + } + + // chrome-trigger: keypressed is omitted for deadkeys + if (!_CPNativeInputFieldActive && _CPNativeInputFieldKeyPressedCalled == NO && _CPNativeInputField.innerHTML.length && _CPNativeInputField.innerHTML != _CPCopyPlaceholder && _CPNativeInputField.innerHTML.length < 3) + { + _CPNativeInputFieldActive = YES; + [currentFirstResponder _activateNativeInputElement:_CPNativeInputField]; + } + else + { + if (_CPNativeInputFieldActive) + [self _endInputSessionWithString:_CPNativeInputField.innerHTML]; + + // prevent the copy placeholder beeing removed by cursor keys + if (_CPNativeInputFieldKeyPressedCalled) + _CPNativeInputField.innerHTML = ''; + } + + _CPNativeInputFieldKeyDownCalled = NO; + + return false; // prevent the default behaviour + }, true); + + _CPNativeInputField.addEventListener("keydown", function(e) + { + // this protects from heavy typing and the shift key + if (_CPNativeInputFieldKeyDownCalled) + return true; + + _CPNativeInputFieldKeyDownCalled = YES; + _CPNativeInputFieldKeyUpCalled = NO; + _CPNativeInputFieldKeyPressedCalled = NO; + var currentFirstResponder = [[CPApp keyWindow] firstResponder]; + + // webkit-browsers: cursor keys do not emit keypressed and would otherwise activate deadkey mode + if (!CPBrowserIsEngine(CPGeckoBrowserEngine) && e.which >= 37 && e.which <= 40) + _CPNativeInputFieldKeyPressedCalled = YES; + + if (![currentFirstResponder respondsToSelector:@selector(_activateNativeInputElement:)]) + return; + + // FF-trigger: here the best way to detect a dead key is the missing keyup event + if (CPBrowserIsEngine(CPGeckoBrowserEngine)) + setTimeout(function(){ + _CPNativeInputFieldKeyDownCalled = NO; + + if (!_CPNativeInputFieldActive && _CPNativeInputFieldKeyUpCalled == NO && _CPNativeInputField.innerHTML.length && _CPNativeInputField.innerHTML != _CPCopyPlaceholder && _CPNativeInputField.innerHTML.length < 3 && !e.repeat) + { + _CPNativeInputFieldActive = YES; + [currentFirstResponder _activateNativeInputElement:_CPNativeInputField]; + } + else if (!_CPNativeInputFieldActive) + [self hideInputElement]; + }, 200); + + return false; + }, true); // capture mode + + _CPNativeInputField.addEventListener("keypress", function(e) + { + _CPNativeInputFieldKeyUpCalled = YES; + _CPNativeInputFieldKeyPressedCalled = YES; + return false; + + }, true); // capture mode + + _CPNativeInputField.onpaste = function(e) + { + var nativeClipboard = (e.originalEvent || e).clipboardData, + richtext, + pasteboard = [CPPasteboard generalPasteboard], + currentFirstResponder = [[CPApp keyWindow] firstResponder], + isPlain = NO; + + if ([currentFirstResponder respondsToSelector:@selector(isRichText)] && ![currentFirstResponder isRichText]) + isPlain = YES; + + // this is the rich chrome / FF codepath (where we can use RTF directly) + if ((richtext = nativeClipboard.getData('text/rtf')) && !(!!window.event.shiftKey) && !isPlain) + { + e.preventDefault(); + + // setTimeout to prevent flickering in FF + setTimeout(function(){ + [currentFirstResponder insertText:[[_CPRTFParser new] parseRTF:richtext]] + }, 20); + + return false; + } + + // plain is the same in all browsers... + + var data = e.clipboardData.getData('text/plain'), + cappString = [pasteboard stringForType:CPStringPboardType]; + + if (cappString != data) + { + [pasteboard declareTypes:[CPStringPboardType] owner:nil]; + [pasteboard setString:data forType:CPStringPboardType]; + } + + setTimeout(function(){ // prevent dom-flickering (only needed for FF) + [currentFirstResponder paste:self]; + }, 20); + + return false; + } + + if (CPBrowserIsEngine(CPGeckoBrowserEngine)) + { + _CPNativeInputField.oncopy = function(e) + { + var pasteboard = [CPPasteboard generalPasteboard], + string, + currentFirstResponder = [[CPApp keyWindow] firstResponder]; + + [currentFirstResponder copy:self]; + + var stringForPasting = [pasteboard stringForType:CPStringPboardType]; + e.clipboardData.setData('text/plain', stringForPasting); + + return false; + } + + _CPNativeInputField.oncut = function(e) + { + var pasteboard = [CPPasteboard generalPasteboard], + string, + currentFirstResponder = [[CPApp keyWindow] firstResponder]; + + // prevent dom-flickering + setTimeout(function(){ + [currentFirstResponder cut:self]; + }, 20); + + // this is necessary because cut will only execute in the future + [currentFirstResponder copy:self]; + + var stringForPasting = [pasteboard stringForType:CPStringPboardType]; + + e.clipboardData.setData('text/plain', stringForPasting); + + return false; + } + } +#endif +} + ++ (void)focusForTextView:(CPTextView)currentFirstResponder +{ + if (![currentFirstResponder respondsToSelector:@selector(_activateNativeInputElement:)]) + return; + + [self hideInputElement]; + +#if PLATFORM(DOM) + _CPNativeInputField.focus(); +#endif + +} + ++ (void)focusForClipboardOfTextView:(CPTextView)textview +{ + +#if PLATFORM(DOM) + if (!_CPNativeInputFieldActive && _CPNativeInputField.innerHTML.length == 0) + _CPNativeInputField.innerHTML = _CPCopyPlaceholder; // make sure we have a selection to allow the native pasteboard work in safari + + [self focusForTextView:textview]; + + // select all in the contenteditable div (http://stackoverflow.com/questions/12243898/how-to-select-all-text-in-contenteditable-div) + if (document.body.createTextRange) + { + var range = document.body.createTextRange(); + + range.moveToElementText(_CPNativeInputField); + range.select(); + } + else if (window.getSelection) + { + var selection = window.getSelection(), + range = document.createRange(); + + range.selectNodeContents(_CPNativeInputField); + selection.removeAllRanges(); + selection.addRange(range); + } +#endif + +} + ++ (void)hideInputElement +{ + +#if PLATFORM(DOM) + _CPNativeInputField.style.top = "-10000px"; + _CPNativeInputField.style.left = "-10000px"; +#endif + +} + +@end + + +@class _CPTextFieldValueBinder; + +@implementation _CPTextViewValueBinder : _CPTextFieldValueBinder + +- (void)setPlaceholderValue:(id)aValue withMarker:(CPString)aMarker forBinding:(CPString)aBinding +{ + [_source _setPlaceholderString:aValue]; +} + +- (void)setValue:(id)aValue forBinding:(CPString)aBinding +{ + if (aValue === nil || (aValue.isa && [aValue isMemberOfClass:CPNull])) + [_source _setPlaceholderString:[self _placeholderForMarker:CPNullMarker]]; + else + [_source _setPlaceholderString:nil]; + + [_source setObjectValue:aValue]; +} + +@end + + + diff --git a/AppKit/CPTextView/CPTypesetter.j b/AppKit/CPTextView/CPTypesetter.j new file mode 100644 index 000000000..17319cd57 --- /dev/null +++ b/AppKit/CPTextView/CPTypesetter.j @@ -0,0 +1,429 @@ +/* + * CPTypesetter.j + * AppKit + * + * Created by Daniel Boehringer on 27/12/2013. + * All modifications copyright Daniel Boehringer 2013. + * Extensive code formatting and review by Andrew Hankinson + * Based on original work by + * Emmanuel Maillard on 27/02/2010. + * Copyright Emmanuel Maillard 2010. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@import "CPParagraphStyle.j" +@import "CPTextStorage.j" +@import "CPFont.j" + +// forward declare these classes for type matching +@class CPLayoutManager +@class CPTextContainer +@class CPTextView + +/* + CPTypesetterControlCharacterAction +*/ +CPTypesetterZeroAdvancementAction = 1 << 0; +CPTypesetterWhitespaceAction = 1 << 1; +CPSTypesetterHorizontalTabAction = 1 << 2; +CPTypesetterLineBreakAction = 1 << 3; +CPTypesetterParagraphBreakAction = 1 << 4; +CPTypesetterContainerBreakAction = 1 << 5; + +var CPSystemTypesetterFactory, + _sharedSimpleTypesetter; + +@implementation CPTypesetter : CPObject + + +#pragma mark - +#pragma mark Class methods + ++ (void)initialize +{ + [CPTypesetter _setSystemTypesetterFactory:[CPSimpleTypesetter class]]; +} + ++ (id)sharedSystemTypesetter +{ + return [CPSystemTypesetterFactory sharedInstance]; +} + ++ (void)_setSystemTypesetterFactory:(Class)aClass +{ + CPSystemTypesetterFactory = aClass; +} + +- (CPTypesetterControlCharacterAction)actionForControlCharacterAtIndex:(unsigned)charIndex +{ + return CPTypesetterZeroAdvancementAction; +} + +- (CPLayoutManager)layoutManager +{ + return nil; +} + +- (CPTextContainer)currentTextContainer +{ + return nil; +} + +- (CPArray)textContainers +{ + return nil; +} + +- (void)layoutGlyphsInLayoutManager:(CPLayoutManager)layoutManager + startingAtGlyphIndex:(unsigned)startGlyphIndex + maxNumberOfLineFragments:(unsigned)maxNumLines + nextGlyphIndex:(UIntegerReference)nextGlyph +{ + _CPRaiseInvalidAbstractInvocation(self, _cmd); +} + +@end + +@implementation CPSimpleTypesetter : CPTypesetter +{ + CPLayoutManager _layoutManager @accessors(property=layoutManager); + CPTextContainer _currentTextContainer @accessors(property=currentTextContainer); + CPTextStorage _textStorage; + + CPRange _attributesRange; + CPDictionary _currentAttributes; + CPParagraphStyle _currentParagraph; + + float _lineHeight; + float _lineBase; + float _lineWidth; + + unsigned _indexOfCurrentContainer; + + CPArray _lineFragments; +} + + +#pragma mark - +#pragma mark Class methods + ++ (id)sharedInstance +{ + if (!_sharedSimpleTypesetter) + _sharedSimpleTypesetter = [[CPSimpleTypesetter alloc] init]; + + return _sharedSimpleTypesetter; +} + +- (CPArray)textContainers +{ + return [_layoutManager textContainers]; +} + +- (CPTextTab)textTabForWidth:(double)aWidth writingDirection:(CPWritingDirection)direction +{ + var tabStops = [_currentParagraph tabStops]; + + if (!tabStops) + tabStops = [CPParagraphStyle _defaultTabStops]; + + var l = tabStops.length; + + if (aWidth > tabStops[l - 1]._location) + return nil; + + for (var i = l - 1; i >= 0; i--) + { + if (aWidth > tabStops[i]._location) + { + if (i + 1 < l) + return tabStops[i + 1]; + } + } + + if (i === -1) + return tabStops[0]; + + return nil; +} + +- (BOOL)_flushRange:(CPRange)lineRange + lineOrigin:(CGPoint)lineOrigin + currentContainer:(CPTextContainer)aContainer + advancements:(CPArray)advancements + lineCount:(unsigned)lineCount + sameLine:(BOOL)sameLine +{ + var myX = 0, + rect = CGRectMake(lineOrigin.x, lineOrigin.y, _lineWidth, _lineHeight), + containerSize = aContainer._size; + + [_layoutManager _appendNewLineFragmentInTextContainer:_currentTextContainer forGlyphRange:lineRange] + + var fragment = [_layoutManager._lineFragments lastObject]; + fragment._isLast = !sameLine; + _lineFragments.push(fragment); + + [_layoutManager setLineFragmentRect:rect forGlyphRange:lineRange usedRect:rect]; + + switch ([_currentParagraph alignment]) + { + case CPLeftTextAlignment: + myX = 0; + break; + + case CPCenterTextAlignment: + myX = (containerSize.width - _lineWidth) / 2; + break; + + case CPRightTextAlignment: + myX = containerSize.width - _lineWidth; + break; + } + + [_layoutManager setLocation:CGPointMake(myX, _lineBase) forStartOfGlyphRange:lineRange]; + [_layoutManager _setAdvancements:advancements forGlyphRange:lineRange]; + + if (!sameLine) //fix the _lineFragments when fontsizes differ + { + var l = _lineFragments.length; + + for (var i = 0 ; i < l ; i++) + [_lineFragments[i] _adjustForHeight:_lineHeight]; + } + + if (!lineCount) // do not rescue on first line + return NO; + + if (aContainer._inResizing) + return NO; + + return ([_layoutManager _rescuingInvalidFragmentsWasPossibleForGlyphRange:lineRange]); +} + +- (void)layoutGlyphsInLayoutManager:(CPLayoutManager)layoutManager + startingAtGlyphIndex:(unsigned)glyphIndex + maxNumberOfLineFragments:(unsigned)maxNumLines + nextGlyphIndex:(UIntegerReference)nextGlyph +{ + var textContainers = [layoutManager textContainers], + textContainersCount = [textContainers count]; + + _layoutManager = layoutManager; + _textStorage = [_layoutManager textStorage]; + _indexOfCurrentContainer = MAX(0, [textContainers + indexOfObject:[_layoutManager textContainerForGlyphAtIndex:glyphIndex effectiveRange:nil withoutAdditionalLayout:YES] + inRange:CPMakeRange(0, textContainersCount)]); + + _currentTextContainer = textContainers[_indexOfCurrentContainer]; + + _attributesRange = CPMakeRange(0, 0); + _lineHeight = 0; + _lineBase = 0; + _lineWidth = 0; + + var containerSize = [_currentTextContainer containerSize], + containerSizeWidth = containerSize.width, + containerSizeHeight = containerSize.height, + lineRange = CPMakeRange(glyphIndex, 0), + wrapRange = CPMakeRange(0, 0), + wrapWidth = 0, + isNewline = NO, + isTabStop = NO, + isWordWrapped = NO, + numberOfGlyphs= [_textStorage length], + leading, + numLines = 0, + theString = [_textStorage string], + lineOrigin, + ascent, + descent, + advancements = [], + prevRangeWidth = 0, + measuringRange = CPMakeRange(glyphIndex, 0), + currentAnchor = 0, + currentFont, + currentFontLineHeight, + previousFont, + currentParagraphMinimumLineHeight, + currentParagraphMaximumLineHeight, + currentParagraphLineSpacing; + + if (glyphIndex > 0) + lineOrigin = CGPointCreateCopy([_layoutManager lineFragmentRectForGlyphAtIndex:glyphIndex effectiveRange:nil].origin); + else if ([_layoutManager extraLineFragmentTextContainer]) + lineOrigin = CGPointMake(0, [_layoutManager extraLineFragmentUsedRect].origin.y); + else + lineOrigin = CGPointMake(0, 0); + + [_layoutManager _removeInvalidLineFragments]; + + if (![_textStorage length]) + return; + + _lineFragments = []; + + for (; numLines != maxNumLines && glyphIndex < numberOfGlyphs; glyphIndex++) + { + // check whether there any change in the attributes from here on + if (!CPLocationInRange(glyphIndex, _attributesRange)) + { + _currentAttributes = [_textStorage attributesAtIndex:glyphIndex effectiveRange:_attributesRange]; + currentFont = [_currentAttributes objectForKey:CPFontAttributeName]; + _currentParagraph = [_currentAttributes objectForKey:CPParagraphStyleAttributeName] || [CPParagraphStyle defaultParagraphStyle]; + currentParagraphMinimumLineHeight = [_currentParagraph minimumLineHeight]; + currentParagraphMaximumLineHeight = [_currentParagraph maximumLineHeight]; + currentParagraphLineSpacing = [_currentParagraph lineSpacing]; + + if (!currentFont) + currentFont = [_textStorage font] || [CPFont systemFontOfSize:12.0]; + + ascent = [currentFont ascender] + descent = [currentFont descender] + leading = (ascent - descent) * 0.2; // FAKE leading + + currentFontLineHeight = ascent - descent + leading; + + if (previousFont !== currentFont) + { + measuringRange = CPMakeRange(glyphIndex, 0); + currentAnchor = prevRangeWidth; + previousFont = currentFont; + } + + } + + if (currentFontLineHeight > _lineHeight) + _lineHeight = currentFontLineHeight; + + if (ascent > _lineBase) + _lineBase = ascent; + + lineRange.length++; + measuringRange.length++; + + var currentCharCode = theString.charCodeAt(glyphIndex), // use pure javascript methods for performance reasons + rangeWidth = [theString.substr(measuringRange.location, measuringRange.length) _sizeWithFont:currentFont inWidth:NULL].width + currentAnchor; + + switch (currentCharCode) // faster than sending actionForControlCharacterAtIndex: called for each char. + { + case 9: // '\t' + { + var nextTab = [self textTabForWidth:rangeWidth + lineOrigin.x writingDirection:0]; + + isTabStop = YES; + + if (nextTab) + rangeWidth = nextTab._location - lineOrigin.x; + else + rangeWidth += 28; //FIXME + } // fallthrough intentional + case 32: // ' ' + wrapRange = CPMakeRangeCopy(lineRange); + wrapWidth = rangeWidth; + wrapRange._height = _lineHeight; + wrapRange._base = _lineBase; + break; + + case 10: + case 13: + isNewline = YES; + } + + advancements.push({width: rangeWidth - prevRangeWidth, height: ascent, descent: descent}); + + prevRangeWidth = _lineWidth = rangeWidth; + + if (lineOrigin.x + rangeWidth > containerSizeWidth) + { + if (wrapWidth) + { + lineRange = wrapRange; + _lineWidth = wrapWidth; + _lineHeight = wrapRange._height; + _lineBase = wrapRange._base; + } + + isNewline = YES; + isWordWrapped = YES; + glyphIndex = CPMaxRange(lineRange) - 1; // start the line starts directly at current character + } + + if (isNewline || isTabStop) + { + if ([self _flushRange:lineRange lineOrigin:lineOrigin currentContainer:_currentTextContainer advancements:advancements lineCount:numLines sameLine:!isNewline]) + return; + + if (isTabStop) + { + lineOrigin.x += rangeWidth; + isTabStop = NO; + } + + if (isNewline) + { + if (currentParagraphMinimumLineHeight && currentParagraphMinimumLineHeight > _lineHeight) + _lineHeight = currentParagraphMinimumLineHeight; + + if (currentParagraphMaximumLineHeight && currentParagraphMaximumLineHeight < _lineHeight) + _lineHeight = currentParagraphMaximumLineHeight; + + lineOrigin.y += _lineHeight; + + if (currentParagraphLineSpacing) + lineOrigin.y += currentParagraphLineSpacing; + + if (lineOrigin.y > containerSizeHeight && _indexOfCurrentContainer < textContainersCount - 1) + { + _currentTextContainer = textContainers[++_indexOfCurrentContainer]; + containerSize = [_currentTextContainer containerSize]; + containerSizeWidth = containerSize.width; + containerSizeHeight = containerSize.height; + } + + lineOrigin.x = 0; + numLines++; + isNewline = NO; + _lineFragments = []; + _lineHeight = 0; + _lineBase = ascent; + } + + _lineWidth = 0; + advancements = []; + currentAnchor = 0; + prevRangeWidth = 0; + lineRange = CPMakeRange(glyphIndex + 1, 0); + measuringRange = CPMakeRange(glyphIndex + 1, 0); + wrapRange = CPMakeRange(0, 0); + wrapWidth = 0; + isWordWrapped = NO; + } + } + + // this is to "flush" the remaining characters + if (lineRange.length) + { + [self _flushRange:lineRange lineOrigin:lineOrigin currentContainer:_currentTextContainer advancements:advancements lineCount:numLines sameLine:NO]; + } + + var rect = CGRectMake(0, lineOrigin.y, containerSizeWidth, [_layoutManager._lineFragments lastObject]._usedRect.size.height - descent); + [_layoutManager setExtraLineFragmentRect:rect usedRect:rect textContainer:_currentTextContainer]; +} + +@end diff --git a/AppKit/CPTextView/_CPRTFParser.j b/AppKit/CPTextView/_CPRTFParser.j new file mode 100644 index 000000000..08a7400ff --- /dev/null +++ b/AppKit/CPTextView/_CPRTFParser.j @@ -0,0 +1,793 @@ +/* RTFParser.j + + Parse a RTF string into a CPAttributedString + + Copyright (C) 2014 Daniel Boehringer + +FIXME: this class should be redone using a 'real' parser + + * all paragraph spacing information is currently not parsed + + + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +@import +@import +@import "CPFontManager.j" +@import "CPParagraphStyle.j" + +@global CPLeftTextAlignment +@global CPRightTextAlignment +@global CPCenterTextAlignment +@global CPJustifiedTextAlignment +@global CPNaturalTextAlignment + +@global CPFontAttributeName +@global CPForegroundColorAttributeName + +var hexTable = []; + +// Hold the attributes of the current run +@implementation _RTFAttribute : CPObject +{ + CPRange _range; + CPParagraphStyle paragraph; + CPColor fgColour; + CPColor bgColour; + CPColor ulColour; + CPString fontName; + unsigned fontSize; + BOOL bold; + BOOL italic; + BOOL underline; + BOOL strikethrough; + BOOL script; + BOOL _tabChanged; +} + +- (id)init +{ + if (self = [super init]) + { + [self resetFont]; + [self resetParagraphStyle]; + _range = CPMakeRange(0, 0); + } + + return self; +} + +- (id)copy +{ + var mynew = [_RTFAttribute new]; + + mynew.paragraph = [paragraph copy]; + mynew.fontName = fontName; + mynew.fgColour = fgColour; + mynew.bgColour = bgColour; + mynew.ulColour = ulColour; + + return mynew; +} + +- (CPFont)currentFont +{ + var font = [CPFont _fontWithName:fontName size:fontSize bold:bold italic:italic]; + + if (font) + return font; + + //Before giving up and using a default font, we try if this is + //not the case of a font with a composite name, such as + //'Helvetica-Light'. In that case, even if we don't have + //exactly an 'Helvetica-Light' font family, we might have an + //'Helvetica' one. + var range = [fontName rangeOfString:@"-"]; + + if (range.location != CPNotFound) + { + var fontFamily = [fontName substringToIndex: range.location]; + + font = [CPFont fontWithName:fontFamily size:fontSize]; + } + + /* Last resort, default font. :-( */ + if (font == nil) + font = [CPFont systemFontOfSize:fontSize]; + + return font; +} + +- (CPNumber)script +{ + return [CPNumber numberWithInt: script]; +} + +- (CPNumber)underline +{ + if (underline != 0) + return [CPNumber numberWithInteger: underline]; + else + return nil; +} + +- (CPNumber)strikethrough +{ + if (strikethrough != 0) + return [CPNumber numberWithInteger: strikethrough]; + else + return nil; +} + +- (void)resetParagraphStyle +{ + paragraph = [[CPParagraphStyle defaultParagraphStyle] copy]; +} + +- (void)resetFont +{ + var font = [CPFont systemFontOfSize:12]; + + fontName = [font familyName]; + fontSize = 12.0; + italic = NO; + bold = NO; + underline = 0; + strikethrough = 0; + script = 0; +} + +- (void)addTab:(float)location type:(CPTextTabType)type +{ + var tab = [[CPTextTab alloc] initWithType:CPLeftTabStopType + location:location]; + + if (!_tabChanged) + { + [paragraph setTabStops:[tab]]; + _tabChanged = YES; + } + else + { + [paragraph addTabStop: tab]; + } +} + +- (CPDictionary)dictionary +{ + var ret = @{}; + [ret setObject:[self currentFont] forKey:CPFontAttributeName]; + [ret setObject:paragraph forKey:CPParagraphStyleAttributeName]; + + if (fgColour) + [ret setObject:fgColour forKey:CPForegroundColorAttributeName]; + + return ret; +} +@end + + +// based on https://github.com/lazygyu/RTF-parser + +var kRTFParserType_char = 0, + kRTFParserType_dest = 1, + kRTFParserType_prop = 2, + kRTFParserType_spec = 3; + +// Keyword descriptions +var kRgsymRtf = { + // keyword dflt fPassDflt kwd idx + "b" : [ "b", 1, false, kRTFParserType_prop, "propBold"], + "ul" : [ "ul", 1, false, kRTFParserType_prop, "propUnderline"], + "i" : [ "i", 1, false, kRTFParserType_prop, "propItalic"], + "li" : [ "li", 0, false, kRTFParserType_prop, "propPgnFormat"], + "pgnucltr" : [ "pgnucltr", "pgULtr", true, kRTFParserType_prop, "propPgnFormat"], + "pgnlcltr" : [ "pgnlcltr", "pgLLtr", true, kRTFParserType_prop, "propPgnFormat"], + "qc" : [ "qc", "justC", true, kRTFParserType_prop, "propJust"], + "ql" : [ "ql", "justL", true, kRTFParserType_prop, "propJust"], + "qr" : [ "qr", "justR", true, kRTFParserType_prop, "propJust"], + "qj" : [ "qj", "justF", true, kRTFParserType_prop, "propJust"], + "paperw" : [ "paperw", 12240, false, kRTFParserType_prop, "propXaPage"], + "paperh" : [ "paperh", 15480, false, kRTFParserType_prop, "propYaPage"], + "margl" : [ "margl", 1800, false, kRTFParserType_prop, "propXaLeft"], + "margr" : [ "margr", 1800, false, kRTFParserType_prop, "propXaRight"], + "margt" : [ "margt", 1440, false, kRTFParserType_prop, "propYaTop"], + "margb" : [ "margb", 1440, false, kRTFParserType_prop, "propYaBottom"], + "pgnstart" : [ "pgnstart", 1, true, kRTFParserType_prop, "propPgnStart"], + "facingp" : [ "facingp", 1, true, kRTFParserType_prop, "propFacingp"], + "landscape" : [ "landscape",1, true, kRTFParserType_prop, "propLandscape"], + "par" : [ "par", 0, false, kRTFParserType_char, "\n"], + "pard" : [ "pard", 0, false, kRTFParserType_prop, "propDefaultPara"], + "\0x0a" : [ "\0x0a", 0, false, kRTFParserType_char, "\n"], + "\0x0d" : [ "\0x0d", 0, false, kRTFParserType_char, ""], + "tab" : [ "tab", 0, false, kRTFParserType_char, "\t"], + "ldblquote" : [ "ldblquote",0, false, kRTFParserType_char, '"'], + "rdblquote" : [ "rdblquote",0, false, kRTFParserType_char, '"'], + "bin" : [ "bin", 0, false, kRTFParserType_spec, "ipfnBin"], + "*" : [ "*", 0, false, kRTFParserType_spec, "ipfnDestSkip"], + "'" : [ "'", 0, false, kRTFParserType_spec, "ipfnHex"], + "author" : [ "author", 0, false, kRTFParserType_dest, "destSkip"], + "buptim" : [ "buptim", 0, false, kRTFParserType_dest, "destSkip"], + "colortbl" : [ "colortbl", 0, false, kRTFParserType_dest, "destSkip"], + "comment" : [ "comment", 0, false, kRTFParserType_dest, "destSkip"], + "creatim" : [ "creatim", 0, false, kRTFParserType_dest, "destSkip"], + "doccomm" : [ "doccomm", 0, false, kRTFParserType_dest, "destSkip"], + "fonttbl" : [ "fonttbl", 0, false, kRTFParserType_dest, "destSkip"], + "footer" : [ "footer", 0, false, kRTFParserType_dest, "destSkip"], + "footerf" : [ "footerf", 0, false, kRTFParserType_dest, "destSkip"], + "footerl" : [ "footerl", 0, false, kRTFParserType_dest, "destSkip"], + "footerr" : [ "footerr", 0, false, kRTFParserType_dest, "destSkip"], + "footnote" : [ "footnote", 0, false, kRTFParserType_dest, "destSkip"], + "ftncn" : [ "ftncn", 0, false, kRTFParserType_dest, "destSkip"], + "ftnsep" : [ "ftnsep", 0, false, kRTFParserType_dest, "destSkip"], + "ftnsepc" : [ "ftnsepc", 0, false, kRTFParserType_dest, "destSkip"], + "fprq" : [ "fprq", 0, false, kRTFParserType_dest, "destSkip"], +// "fcharset" : [ "fcharset", 0, false, kRTFParserType_dest, "destSkip"], + "rquote" : [ "rquote", 0, false, kRTFParserType_char, "'"], +// "s" : [ "s", 0, false, kRTFParserType_dest, "destSkip"], + "header" : [ "header", 0, false, kRTFParserType_dest, "destSkip"], + "headerf" : [ "headerf", 0, false, kRTFParserType_dest, "destSkip"], + "headerl" : [ "headerl", 0, false, kRTFParserType_dest, "destSkip"], + "headerr" : [ "headerr", 0, false, kRTFParserType_dest, "destSkip"], + "info" : [ "info", 0, false, kRTFParserType_dest, "destSkip"], + "keywords" : [ "keywords", 0, false, kRTFParserType_dest, "destSkip"], + "operator" : [ "operator", 0, false, kRTFParserType_dest, "destSkip"], + "pict" : [ "pict", 0, false, kRTFParserType_dest, "destSkip"], + "printim" : [ "printim", 0, false, kRTFParserType_dest, "destSkip"], + "private1" : [ "private1", 0, false, kRTFParserType_dest, "destSkip"], + "revtim" : [ "revtim", 0, false, kRTFParserType_dest, "destSkip"], + "rxe" : [ "rxe", 0, false, kRTFParserType_dest, "destSkip"], + "stylesheet" : [ "stylesheet",0, false, kRTFParserType_dest, "destSkip"], + "subject" : [ "subject", 0, false, kRTFParserType_dest, "destSkip"], + "tc" : [ "tc", 0, false, kRTFParserType_dest, "destSkip"], + "title" : [ "title", 0, false, kRTFParserType_dest, "destSkip"], + "txe" : [ "txe", 0, false, kRTFParserType_dest, "destSkip"], + "xe" : [ "xe", 0, false, kRTFParserType_dest, "destSkip"], + "[" : [ "[", 0, false, kRTFParserType_char, '['], + " " : [ " ", 0, false, kRTFParserType_char, ' '], + "]" : [ "]", 0, false, kRTFParserType_char, ']'], + "{" : [ "{", 0, false, kRTFParserType_char, '{'], + "}" : [ "}", 0, false, kRTFParserType_char, '}'], + "\\" : [ "\\", 0, false, kRTFParserType_char, '\\'] + }; + +@implementation _CPRTFParser : CPObject +{ + CPString _codePage; + CGSize _paper; + CPString _rtf; + unsigned _curState; + CPArray _states; + unsigned _currentParseIndex; + BOOL _hexreturn; + _RTFAttribute _currentRun; + CPAttributedString _result; + CPArray _colorArray; + CPArray _fontArray; + CPString _freename; + BOOL _parsingFontTable; +} + +- (id)init +{ + if (self = [super init]) + { + _paper = CPMakeSize(0, 0); + _rtf = ""; + _curState = 0; // 0 = normal, 1 = skip + _states = []; + _currentParseIndex = 0; + _hexreturn = NO; + _result = [CPAttributedString new]; + _colorArray = []; + _fontArray = ['Arial']; // FIXME: should be name of system font + _freename = ""; + _parsingFontTable = NO; + } + + return self; +} + +- (CPString)_checkChar:(CPArray)sym parameter:(CPString)ch +{ + switch (_curState) + { + case 0: + if (sym && sym[4]) + return sym[4]; + + case 1: + // CPLogConsole("skipped : " + sym[4]); + return ''; + + default: + if (sym && sym[4]) + return sym[4]; + } +} + +- (BOOL)pushState +{ + _states.push["group"]; + return YES; +} + +- (BOOL)popState +{ + _states.pop(); + + if (_curState > 0) + _curState--; + + return YES; +} + +- (CPString)_parseSpec:(CPArray)sym parameter:(CPString)v +{ + var ch = ''; + + switch (sym[4]) + { + case "ipfnDestSkip": + _curState++; + return ''; + + case "ipfnHex": + ch = _rtf.charAt(++_currentParseIndex); + + var hex = ''; + + while (new RegExp("[a-fA-F0-9\\']").test(ch)) + { + if (ch == "'") + { + _currentParseIndex++; + continue; + } + + hex += (ch + ''); + ch = _rtf.charAt(++_currentParseIndex); + } + //ch = parseInt(ch, 16); + //console.log("hex : " + hex); + _hexreturn = YES; + _currentParseIndex--; + + if (_curState !== 0) + return ''; + else + return hex; + break; + + case "codePage": + ch = _rtf.charAt(++_currentParseIndex); + + var code = ''; + + while (new RegExp("[0-9]").test(ch)) + { + code += (ch + ''); + ch = _rtf.charAt(++_currentParseIndex); + } + + _codePage = code; + _currentParseIndex--; + break; + } + + return ''; +} + +- (void)_flushCurrentRun +{ + var newOffset = 0; + + if (_currentRun) + { + if ([_result length] == _currentRun._range.location) + return; + + _currentRun._range.length = [_result length] - _currentRun._range.location; + newOffset = CPMaxRange(_currentRun._range); + + var dict = [_currentRun dictionary]; + + [_result setAttributes:dict range:_currentRun._range]; // flush previous run + _currentRun.fgColour = [CPColor blackColor]; + } + else + _currentRun = [_RTFAttribute new]; + + _currentRun._range = CPMakeRange(newOffset, 0); // open a new one +} + +- (CPString)_applyPropChange:sym parameter:param +{ + //console.log("prop : " + sym[0] + " / param : " + param+ ' '); + + switch (sym[0]) + { + case "pard": + [self _flushCurrentRun]; + break; + + case "b": // bold + if (param === 0) + { + if (_currentRun && _currentRun.bold) + [self _flushCurrentRun]; + + _currentRun.bold = NO + } + else + { + if (_currentRun && !_currentRun.bold) + [self _flushCurrentRun]; + + _currentRun.bold = YES; + } + + break; + + case "i": // italic + if (param === 0) + { + if (_currentRun && _currentRun.italic) + [self _flushCurrentRun]; + + _currentRun.italic = NO + } + else + { + if (_currentRun && !_currentRun.italic) + [self _flushCurrentRun]; + + _currentRun.italic = YES; + } + + break; + + case "qc": // paragraph center + [_currentRun.paragraph setAlignment:CPCenterTextAlignment]; + break; + + case "paperw": + _paper.width = param; + break; + + case "paperh": + _paper.height = param; + break; + } + + return ''; +} + + +- (CPString)_changeDest:(CPArray)sym +{ + switch (sym[0]) + { + case "colortbl": + _colorArray.push([CPColor blackColor]); + break; + + case "fonttbl": + _parsingFontTable = YES; + break; + } + + if (sym[4] == "destSkip") + { + CPLogConsole("Dest skip start : [" + sym[0] + "]"); + _curState++; + } + + return ''; +} + +- (CPString)_translateKeyword:(CPString)keyword parameter:(CPString)param fParameter:(BOOL)fParam +{ + if (kRgsymRtf[keyword] !== undefined) + { + var sym = kRgsymRtf[keyword]; + + switch (sym[3]) + { + case kRTFParserType_prop: + if (sym[2] || !fParam) + param = sym[1]; + + return [self _applyPropChange:sym parameter:param]; + + case kRTFParserType_char: + if((param + '') !== 'NaN' && (param + '') !== 'null' && (param + '').length) + _currentParseIndex -= (param + '').length; + + return [self _checkChar:sym parameter:param]; + + case kRTFParserType_dest: + return [self _changeDest:sym]; + + case kRTFParserType_spec: + return [self _parseSpec:sym parameter:param]; + + default: + return ''; + } + } + else + { + switch (keyword) + { + case "red": + var oldColor = [_colorArray lastObject], + green = [oldColor greenComponent], + blue = [oldColor blueComponent]; + + _colorArray.pop(); + _colorArray.push([CPColor colorWithRed:parseInt(param) / 255 green:green blue:blue alpha:1.0]); + break; + + case "green": + var oldColor = [_colorArray lastObject], + red = [oldColor redComponent], + blue = [oldColor blueComponent]; + + _colorArray.pop(); + _colorArray.push([CPColor colorWithRed:red green: parseInt(param) / 255 blue:blue alpha:1.0]); + break; + + case "blue": + var oldColor = [_colorArray lastObject], + green = [oldColor greenComponent], + red = [oldColor redComponent]; + + _colorArray.pop(); + _colorArray.push([CPColor colorWithRed:red green:green blue:parseInt(param) / 255 alpha:1.0]); + _colorArray.push([CPColor blackColor]); // placeholder for next color + break; + + case "cf": // change foreground color + [self _flushCurrentRun]; + var fontIndex = parseInt(param) - 1; + + if (_currentRun && fontIndex >= 0) + _currentRun.fgColour = _colorArray[fontIndex]; + + break; + + case "f": // change font + [self _flushCurrentRun]; + var fontIndex = parseInt(param); + + if (_currentRun && fontIndex >= 0 && fontIndex < _fontArray.length) + _currentRun.fontName = _fontArray[fontIndex]; + break; + + case "fs": // change font size + [self _flushCurrentRun]; + _currentRun.fontSize = parseInt(param) / 2; + break; + + case "tx": // tabstop + var location = parseInt(param) / 20; + + if (_currentRun) + [_currentRun addTab:location type:CPLeftTabStopType]; + + break; + + default: + CPLogConsole("skip : " + keyword + " param: " + param); + + } + + if (_states.length > 0) + _curState = 1; + + return ''; + } +} + +- (CPString)_parseKeyword:(CPString)rtf length:(unsigned)len +{ + var ch = '', + fParam = false, + fNeg = false, + keyword = '', + param = ''; + + _rtf = rtf; + + if (++_currentParseIndex >= len) + return len; + + ch = rtf.charAt(_currentParseIndex); + + if (!/[a-zA-Z]/.test(ch)) + return [self _translateKeyword:ch parameter:nil fParameter:fParam]; + + while (new RegExp("[a-zA-Z]").test(ch)) + { + keyword += ch; + ch = rtf.charAt(++_currentParseIndex); + } + + if (ch == '-') + { + fNeg = true; + ch = rtf.charAt(++_currentParseIndex); + } + + fParam = true; + + while (new RegExp("[0-9]").test(ch)) + { + param += (ch + ''); + ch = rtf.charAt(++_currentParseIndex); + } + + _currentParseIndex--; + param = parseInt(param); + + if (fNeg) + param *= -1; + + return [self _translateKeyword:keyword parameter:param fParameter:fParam]; +} + +- (void)_appendPlainString:(CPString) aString +{ + [_result replaceCharactersInRange:CPMakeRange([_result length], 0) withString:aString]; + +} +- (CPAttributedString)parseRTF:(CPString)rtf +{ + rtf = rtf.replace(/\\\n/g, "\\par\n") + + if (rtf.length == 0) + return ''; + + _currentParseIndex = -1; + + var len = rtf.length, + tmp = '', + ch = '', + hex = '', + lastchar = 0; + + while (_currentParseIndex < len) + { + tmp = rtf.charAt(++_currentParseIndex); + + if (tmp !== "\\" && hex.length > 0) + { + [self _appendPlainString: String.fromCharCode(parseInt((hex), 16))]; + hex = ''; + } + + switch (tmp) + { + case " ": + if (lastchar == 1) + { + lastchar = 0; + } + else + { + _freename += tmp; + [self _appendPlainString:tmp]; + } + + break; + + case "{": + if ([self pushState]) + CPLogConsole("push"); + + break; + + case "}": + if ([self popState]) + CPLogConsole("pop"); + + if (_freename) + { + CPLogConsole(_freename); + + if (_parsingFontTable) + { + _fontArray.push(_freename); + _parsingFontTable = NO; + } + + _freename = ""; + } + + [self _flushCurrentRun] + break; + + case "\\": + _freename = ''; + ch = [self _parseKeyword:rtf length:len]; + + if (!_hexreturn && ch.length == 0) + lastchar = 1; + else + lastchar = 0; + + if (_hexreturn) + { + if (ch.length > 0) + { + if (parseInt(ch, 16) & 0x80) + { + hex += ch.toUpperCase(); + } + else + { + [self _appendPlainString: String.fromCharCode(parseInt((hex + ch), 16))]; + hex = ''; + } + + if (hex.length == 4) + { + var temp = parseInt(hex, 16); + + if (hexTable && hexTable[hex.toUpperCase()] !== undefined) + temp = parseInt(hexTable[hex.toUpperCase()], 16); + + [self _appendPlainString: String.fromCharCode(temp)] + hex = ''; + } + } + else + { + CPLogConsole("hex skipped"); + } + + _hexreturn = NO; + } + else if (ch !== undefined && _curState === 0) + { + [self _appendPlainString:ch]; + } + + break; + + case 0x0d: + case 0x0a: + case '\n': + case '\r': + break; + + default: + lastchar = 0; + + if (_curState == 0) + [self _appendPlainString:tmp]; + else if (tmp !== ';') + _freename += tmp; + + break; + } + } + + return _result; +} + +@end diff --git a/AppKit/CPTextView/_CPRTFProducer.j b/AppKit/CPTextView/_CPRTFProducer.j new file mode 100644 index 000000000..ef540ef3d --- /dev/null +++ b/AppKit/CPTextView/_CPRTFProducer.j @@ -0,0 +1,615 @@ +/* + RTFProducer.j + + Serialize CPAttributedString to a RTF String + + Copyright (C) 2014 Daniel Boehringer + This file is based on the RTFProducer from GNUStep + (which i co-authored with Fred Kiefer in 1999) + + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +@import "CPParagraphStyle.j" +@import "CPColor.j" +@import "CPGraphics.j" +@import "CPFontManager.j" + +@global CPForegroundColorAttributeName +@global CPBackgroundColorAttributeName +@global CPUnderlineStyleAttributeName +@global CPSuperscriptAttributeName +@global CPBaselineOffsetAttributeName +@global CPAttachmentAttributeName +@global CPLigatureAttributeName +@global CPKernAttributeName + +@global CPLeftTextAlignment +@global CPRightTextAlignment +@global CPCenterTextAlignment +@global CPJustifiedTextAlignment +@global CPNaturalTextAlignment + +var PAPERSIZE = @"PaperSize", + LEFTMARGIN = @"LeftMargin", + RIGHTMARGIN = @"RightMargin", + TOPMARGIN = @"TopMargin", + BUTTOMMARGIN = @"ButtomMargin"; + +function _points2twips(a) { return (a) * 20.0; } + +@implementation _CPRTFProducer : CPObject +{ + CPAttributedString text; + CPMutableDictionary fontDict; + CPMutableDictionary colorDict; + CPDictionary docDict; + CPMutableArray attachments; + CPFont currentFont; + CPColor fgColor; + CPColor bgColor; + CPColor ulColor; +} + +#pragma mark - +#pragma mark Class methods + + ++ (CPString)produceRTF:(CPAttributedString)aText documentAttributes:(CPDictionary)dict +{ + var mynew = [self new]; + + return [mynew RTFDStringFromAttributedString:aText documentAttributes:dict]; +} + + +#pragma mark - +#pragma mark init methods + +- (id)init +{ + if (self = [super init]) + { + // maintain a dictionary for the used colours + // (for rtf-header generation) + colorDict = [CPMutableDictionary new]; + + //maintain a dictionary for the used fonts + //(for rtf-header generation) + fontDict = [CPMutableDictionary new]; + + fgColor = [CPColor blackColor]; + bgColor= [CPColor whiteColor]; + } + + return self; +} + +// private stuff follows +- (CPString)fontTable +{ + if (![fontDict count]) + return @""; + + var fontlistString = "", + fontEnum, + currFont, + keyArray; + + keyArray = [fontDict allKeys]; + keyArray = [keyArray sortedArrayUsingSelector:@selector(compare:)]; + fontEnum = [keyArray objectEnumerator]; + + while ((currFont = [fontEnum nextObject]) !== nil) + { + var fontFamily, + detail; + + if ([currFont isEqualToString:@"Symbol"]) + fontFamily = @"tech"; + else if ([currFont isEqualToString:@"Helvetica"]) + fontFamily = @"swiss"; + else if ([currFont isEqualToString:@"Arial"]) + fontFamily = @"swiss"; + else if ([currFont isEqualToString:@"Courier"]) + fontFamily = @"modern"; + else if ([currFont isEqualToString:@"Times"]) + fontFamily = @"roman"; + else fontFamily = @"nil"; + + detail = [CPString stringWithFormat:@"%@\\f%@ %@;", [fontDict objectForKey:currFont], fontFamily, currFont]; + fontlistString += detail; + } + + return [CPString stringWithFormat:@"{\\fonttbl%@}\n", fontlistString]; +} + +- (CPString)colorTable +{ + if (![colorDict count]) + return @""; + + var result, + count = [colorDict count], + list = [CPMutableArray arrayWithCapacity:count], + keyEnum = [colorDict keyEnumerator], + next, + i; + + while ((next = [keyEnum nextObject]) !== nil) + { + var cn = [colorDict objectForKey:next]; + [list insertObject:[CPColor colorWithCSSString:next] atIndex:[cn intValue]-1]; + } + + result = [CPString stringWithString:@"{\\colortbl;"]; + + for (i = 0; i < count; i++) + { + var color = [[list objectAtIndex:i] + colorUsingColorSpaceName:CPCalibratedRGBColorSpace]; + + result += [CPString stringWithFormat:@"\\red%d\\green%d\\blue%d;", + ([color redComponent] * 255), + ([color greenComponent] * 255), + ([color blueComponent] * 255)]; + } + + result += @"}\n"; + + return result; +} + +- (CPString)documentAttributes +{ + if (!docDict) + return @""; + + var result, + detail, + val, + num; + + result = [CPString string]; + + val = [docDict objectForKey:PAPERSIZE]; + + if (val) + { + var size = [val sizeValue]; + + detail = [CPString stringWithFormat:@"\\paperw%d \\paperh%d", + _points2twips(size.width), + _points2twips(size.height)]; + + result += detail; + } + + num = [docDict objectForKey:LEFTMARGIN]; + + if (num) + { + var f = [num floatValue]; + + detail = [CPString stringWithFormat:@"\\margl%d", _points2twips(f)]; + result += detail; + } + + num = [docDict objectForKey:RIGHTMARGIN]; + + if (num) + { + var f = [num floatValue]; + + detail = [CPString stringWithFormat:@"\\margr%d", _points2twips(f)]; + result += detail; + } + + num = [docDict objectForKey:TOPMARGIN]; + + if (num) + { + var f = [num floatValue]; + + detail = [CPString stringWithFormat:@"\\margt%d", _points2twips(f)]; + result += detail; + } + + num = [docDict objectForKey:BUTTOMMARGIN]; + + if (num) + { + var f = [num floatValue]; + + detail = [CPString stringWithFormat:@"\\margb%d", _points2twips(f)]; + result += detail; + } + + return result; +} + +- (CPString)headerString +{ + var result; + + result = [CPString stringWithString:@"{\\rtf1\\ansi"]; + result += [self fontTable]; + result += [self colorTable]; + result += [self documentAttributes]; + + return result; +} + +- (CPString)trailerString +{ + return @"}"; +} + +- (CPString)fontToken:(CPString) fontName +{ + var fCount = [fontDict objectForKey:fontName]; + + if (fCount == nil) + { + var count = [fontDict count]; + + fCount = [CPString stringWithFormat:@"\\f%d", count]; + [fontDict setObject:fCount forKey:fontName]; + } + + return fCount; +} + +- (int)numberForColor:(CPColor)color +{ + var num = [colorDict objectForKey:[color cssString]]; + + if (!num) + [colorDict setObject:num = [CPNumber numberWithInt:[colorDict count] + 1] + forKey:[color cssString]]; + + return [num intValue]; +} + +- (CPString)paragraphStyle:(CPParagraphStyle)paraStyle +{ + var headerString = [CPString stringWithString:@"\\pard"], + twips; + + if (paraStyle == nil) + return headerString; + + switch ([paraStyle alignment]) + { + case CPRightTextAlignment: + headerString += @"\\qr"; + break; + + case CPCenterTextAlignment: + headerString += @"\\qc"; + break; + + case CPLeftTextAlignment: + headerString += @"\\ql"; + break; + + case CPJustifiedTextAlignment: + headerString += @"\\qj"; + break; + + default: + headerString += @"\\ql"; + break; + } + + // write first line indent and left indent + var twips = _points2twips([paraStyle firstLineHeadIndent]); + + if (twips != 0.0) + headerString += [CPString stringWithFormat:@"\\fi%d", twips]; + + twips = _points2twips([paraStyle headIndent]); + + if (twips != 0.0) + headerString += [CPString stringWithFormat:@"\\li%d", twips]; + + twips = _points2twips([paraStyle tailIndent]); + + if (twips != 0.0) + headerString += [CPString stringWithFormat:@"\\ri%d", twips]; + + twips = _points2twips([paraStyle paragraphSpacing]); + + if (twips != 0.0) + headerString += [CPString stringWithFormat:@"\\sa%d", twips]; + + twips = _points2twips([paraStyle minimumLineHeight]); + + if (twips != 0.0) + headerString += [CPString stringWithFormat:@"\\sl%d", twips]; + + twips = _points2twips([paraStyle maximumLineHeight]); + + if (twips != 0.0) + headerString += [CPString stringWithFormat:@"\\sl-%d", twips]; + + var enumerator, + tab; + + enumerator = [[paraStyle tabStops] objectEnumerator]; + + while ((tab = [enumerator nextObject])) + { + switch ([tab tabStopType]) + { + case CPLeftTabStopType: + // no tabkind emission needed + break; +/* case NSRightTabStopType: + headerString += @"\\tqr"; + break; + case NSCenterTabStopType: + headerString += @"\\tqc"; + break; + case NSDecimalTabStopType: + headerString += @"\\tqdec"; + break; + default: + NSLog(@"Unknown tab stop type."); +*/ + } + + headerString += [CPString stringWithFormat:@"\\tx%d",_points2twips([tab location])]; + } + + return headerString; +} + +- (CPString)runStringForString:(CPString) substring + attributes:(CPDictionary) attributes + paragraphStart:(BOOL) first +{ + var result = "", + headerString = "", + trailerString = "", + attribEnum, + currAttrib; + + if (first) + { + var paraStyle = [attributes objectForKey:CPParagraphStyleAttributeName]; + headerString += [self paragraphStyle:paraStyle]; + } + + /* + * analyze attributes of current run + * + * FIXME: All the character attributes should be output relative to the font + * attributes of the paragraph. So if the paragraph has underline on it should + * still be possible to switch it off for some characters, which currently is + * not possible. + */ + attribEnum = [attributes keyEnumerator]; + + while ((currAttrib = [attribEnum nextObject]) != nil) + { + if ([currAttrib isEqualToString:CPFontAttributeName]) + { + /* + * handle fonts + */ + var font, + fontName, + traits; + + font = [attributes objectForKey:CPFontAttributeName]; + fontName = [font familyName]; + traits = [[CPFontManager sharedFontManager] traitsOfFont:font]; + + /* + * font name + */ + if (currentFont == nil || ![fontName isEqualToString:[currentFont familyName]]) + headerString += [self fontToken:fontName]; + + /* + * font size + */ + if (currentFont == nil || [font size] != [currentFont size]) + { + var points = [font size] * 2, + pString; + + pString = [CPString stringWithFormat:@"\\fs%d", points]; + headerString += pString; + } + /* + * font attributes + */ + if (traits & CPItalicFontMask) + { + headerString += @"\\i"; + trailerString += @"\\i0"; + } + + if (traits & CPBoldFontMask) + { + headerString += @"\\b"; + trailerString += @"\\b0"; + } + + if (first) + currentFont = font; + } + else if ([currAttrib isEqualToString:CPForegroundColorAttributeName]) + { + var color = [attributes objectForKey:CPForegroundColorAttributeName]; + + if (![color isEqual:fgColor]) + { + headerString += [CPString stringWithFormat:@"\\cf%d", [self numberForColor:color]]; + trailerString += @"\\cf0"; + } + } + else if ([currAttrib isEqualToString:CPBackgroundColorAttributeName]) + { + var color = [attributes objectForKey:CPBackgroundColorAttributeName]; + + if (![color isEqual:bgColor]) + { + headerString += [CPString stringWithFormat:@"\\cb%d", [self numberForColor:color]]; + trailerString += @"\\cb0"; + } + } + else if ([currAttrib isEqualToString:CPUnderlineStyleAttributeName]) + { + headerString += @"\\ul"; + trailerString += @"\\ulnone"; + } + else if ([currAttrib isEqualToString:CPSuperscriptAttributeName]) + { + var value = [attributes objectForKey:CPSuperscriptAttributeName], + svalue = [value intValue] * 6; + + if (svalue > 0) + { + headerString += [CPString stringWithFormat:@"\\up%d", svalue]; + trailerString += @"\\up0"; + } + else if (svalue < 0) + { + headerString += [CPString stringWithFormat:@"\\dn-%d", svalue]; + trailerString += @"\\dn0"; + } + } + else if ([currAttrib isEqualToString:CPBaselineOffsetAttributeName]) + { + var value = [attributes objectForKey:CPBaselineOffsetAttributeName], + svalue = [value floatValue] * 2; + + if (svalue > 0) + { + headerString += [CPString stringWithFormat:@"\\up%d", svalue]; + trailerString += @"\\up0"; + } + else if (svalue < 0) + { + headerString += [CPString stringWithFormat:@"\\dn-%d", svalue]; + trailerString += @"\\dn0"; + } + } + else if ([currAttrib isEqualToString:CPAttachmentAttributeName]) + { + } + else if ([currAttrib isEqualToString:CPLigatureAttributeName]) + { + } + else if ([currAttrib isEqualToString:CPKernAttributeName]) + { + } + } + + substring = substring.replace(/\\/g, '\\\\'); + substring = substring.replace(/\n/g, '\\par\n'); + substring = substring.replace(/\t/g, '\\tab'); + substring = substring.replace(/{/g, '\\{'); + substring = substring.replace(/}/g, '\\}'); + // FIXME: All characters not in the standard encoding must be + // replaced by \'xx + + if (!first) + { + var braces; + + if ([headerString length]) + braces = [CPString stringWithFormat:@"{%@ %@}", headerString, substring]; + else + braces = substring; + + result += braces; + } + else + { + var nobraces; + + if ([headerString length]) + nobraces = [CPString stringWithFormat:@"%@ %@", headerString, substring]; + else + nobraces = substring; + + result += nobraces; + } + + return result + trailerString; +} + +- (CPString)bodyString +{ + var string = [text string], + result = "", + loc = 0, + length = [string length], + currRange = CPMakeRange(loc, 0), + completeRange = CPMakeRange(0, length), + first = YES; + + // FIXME split along newline characters and run as outer loop + while (CPMaxRange(currRange) < CPMaxRange(completeRange)) // save all "runs" + { + var attributes, + substring, + runString; + + attributes = [text attributesAtIndex:CPMaxRange(currRange) + longestEffectiveRange:currRange + inRange:completeRange]; + substring = [string substringWithRange:currRange]; + runString = [self runStringForString:substring + attributes:attributes + paragraphStart:YES]; + + result += runString; + first = NO; + } + + return result; +} + + +- (CPString)RTFDStringFromAttributedString:(CPAttributedString)aText + documentAttributes:(CPDictionary)dict +{ + var output = [CPString string], + headerString, + trailerString, + bodyString; + + text = aText; + docDict = dict; + + /* + * do not change order! (esp. body has to be generated first; builds context) + */ + bodyString = [self bodyString]; + trailerString = [self trailerString]; + headerString = [self headerString]; + + output += headerString; + output += bodyString; + output += trailerString; + return output; +} +@end \ No newline at end of file diff --git a/AppKit/CPTheme.j b/AppKit/CPTheme.j index a9246cc89..0fa38f7d5 100644 --- a/AppKit/CPTheme.j +++ b/AppKit/CPTheme.j @@ -322,7 +322,7 @@ function ThemeState(stateNames) var stateNameKeys = []; this._stateNames = {}; - for (key in stateNames) + for (var key in stateNames) { if (!stateNames.hasOwnProperty(key)) continue; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 669f21122..f28ff5f4b 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -112,6 +112,11 @@ CPViewHeightSizable = 16; */ CPViewMaxYMargin = 32; +_CPViewWillAppearNotification = @"CPViewWillAppearNotification"; +_CPViewDidAppearNotification = @"CPViewDidAppearNotification"; +_CPViewWillDisappearNotification = @"CPViewWillDisappearNotification"; +_CPViewDidDisappearNotification = @"CPViewDidDisappearNotification"; + CPViewBoundsDidChangeNotification = @"CPViewBoundsDidChangeNotification"; CPViewFrameDidChangeNotification = @"CPViewFrameDidChangeNotification"; @@ -172,6 +177,7 @@ var CPViewHighDPIDrawingEnabled = YES; CPArray _registeredDraggedTypesArray; BOOL _isHidden; + BOOL _isHiddenOrHasHiddenAncestor; BOOL _hitTests; BOOL _clipsToBounds; @@ -246,6 +252,8 @@ var CPViewHighDPIDrawingEnabled = YES; id _animator; CPDictionary _animationsDictionary; + BOOL _inhibitDOMUpdates @accessors(setter=_setInhibitDOMUpdates); + BOOL _forceUpdates @accessors(setter=_setForceUpdates); } /* @@ -372,6 +380,7 @@ var CPViewHighDPIDrawingEnabled = YES; _opacity = 1.0; _isHidden = NO; + _isHiddenOrHasHiddenAncestor = NO; _hitTests = YES; _hierarchyScaleSize = CGSizeMake(1.0 , 1.0); @@ -397,12 +406,14 @@ var CPViewHighDPIDrawingEnabled = YES; [self _setupViewFlags]; [self _loadThemeAttributes]; + + _inhibitDOMUpdates = NO; + _forceUpdates = NO; } return self; } - /*! Sets the tooltip for the receiver. @@ -410,7 +421,7 @@ var CPViewHighDPIDrawingEnabled = YES; */ - (void)setToolTip:(CPString)aToolTip { - if (_toolTip == aToolTip) + if (_toolTip === aToolTip) return; if (aToolTip && ![aToolTip isKindOfClass:CPString]) @@ -568,7 +579,7 @@ var CPViewHighDPIDrawingEnabled = YES; [[self window] _dirtyKeyViewLoop]; // If this is already one of our subviews, remove it. - if (aSubview._superview == self) + if (aSubview._superview === self) { var index = [_subviews indexOfObjectIdenticalTo:aSubview]; @@ -597,8 +608,9 @@ var CPViewHighDPIDrawingEnabled = YES; // Remove the view from its previous superview. [aSubview _removeFromSuperview]; + [aSubview _postViewWillAppearNotification]; // Set ourselves as the superview. - aSubview._superview = self; + [aSubview _setSuperview:self]; } if (anIndex === CPNotFound || anIndex >= count) @@ -623,11 +635,6 @@ var CPViewHighDPIDrawingEnabled = YES; [aSubview setNextResponder:self]; [aSubview _scaleSizeUnitSquareToSize:[self _hierarchyScaleSize]]; - // If the subview is not hidden and one of its ancestors is hidden, - // notify the subview that it is now hidden. - if (![aSubview isHidden] && [self isHiddenOrHasHiddenAncestor]) - [aSubview _notifyViewDidHide]; - [aSubview viewDidMoveToSuperview]; // Set the subview's window to our own. @@ -688,6 +695,7 @@ var CPViewHighDPIDrawingEnabled = YES; [[self window] _dirtyKeyViewLoop]; [_superview willRemoveSubview:self]; + [self _postViewWillDisappearNotification]; [_superview._subviews removeObjectIdenticalTo:self]; @@ -697,13 +705,10 @@ var CPViewHighDPIDrawingEnabled = YES; // If the view is not hidden and one of its ancestors is hidden, // notify the view that it is now unhidden. - if (!_isHidden && [_superview isHiddenOrHasHiddenAncestor]) - [self _notifyViewDidUnhide]; + [self _setSuperview:nil]; [self _notifyWindowDidResignKey]; [self _notifyViewDidResignFirstResponder]; - - _superview = nil; } /*! @@ -863,7 +868,7 @@ var CPViewHighDPIDrawingEnabled = YES; do { - if (view == aView) + if (view === aView) return YES; } while(view = [view superview]) @@ -978,7 +983,7 @@ var CPViewHighDPIDrawingEnabled = YES; - (CPView)viewWithTag:(CPInteger)aTag { - if ([self tag] == aTag) + if ([self tag] === aTag) return self; var index = 0, @@ -1013,7 +1018,7 @@ var CPViewHighDPIDrawingEnabled = YES; */ - (void)setFrame:(CGRect)aFrame { - if (CGRectEqualToRect(_frame, aFrame)) + if (CGRectEqualToRect(_frame, aFrame) && !_forceUpdates) return; _inhibitFrameAndBoundsChangedNotifications = YES; @@ -1030,7 +1035,7 @@ var CPViewHighDPIDrawingEnabled = YES; [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; if (!_inhibitUpdateTrackingAreas) - [self _updateTrackingAreas]; + [self _updateTrackingAreasWithRecursion:YES]; } /*! @@ -1084,7 +1089,7 @@ var CPViewHighDPIDrawingEnabled = YES; { var origin = _frame.origin; - if (!aPoint || CGPointEqualToPoint(origin, aPoint)) + if (!aPoint || (CGPointEqualToPoint(origin, aPoint) && !_forceUpdates)) return; origin.x = aPoint.x; @@ -1097,13 +1102,16 @@ var CPViewHighDPIDrawingEnabled = YES; [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; #if PLATFORM(DOM) - var transform = _superview ? _superview._boundsTransform : NULL; + if (!_inhibitDOMUpdates) + { + var transform = _superview ? _superview._boundsTransform : NULL; - CPDOMDisplayServerSetStyleLeftTop(_DOMElement, transform, origin.x, origin.y); + CPDOMDisplayServerSetStyleLeftTop(_DOMElement, transform, origin.x, origin.y); + } #endif if (!_inhibitUpdateTrackingAreas && !_inhibitFrameAndBoundsChangedNotifications) - [self _updateTrackingAreas]; + [self _updateTrackingAreasWithRecursion:YES]; } /*! @@ -1116,7 +1124,7 @@ var CPViewHighDPIDrawingEnabled = YES; { var size = _frame.size; - if (!aSize || CGSizeEqualToSize(size, aSize)) + if (!aSize || (CGSizeEqualToSize(size, aSize) && !_forceUpdates)) return; var oldSize = CGSizeMakeCopy(size); @@ -1257,7 +1265,7 @@ var CPViewHighDPIDrawingEnabled = YES; [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; if (!_inhibitUpdateTrackingAreas && !_inhibitFrameAndBoundsChangedNotifications) - [self _updateTrackingAreas]; + [self _updateTrackingAreasWithRecursion:!_autoresizesSubviews]; } /*! @@ -1270,7 +1278,8 @@ var CPViewHighDPIDrawingEnabled = YES; #if PLATFORM(DOM) var scale = [self scaleSize]; - CPDOMDisplayServerSetStyleSize(_DOMElement, aSize.width * 1 / scale.width, aSize.height * 1 / scale.height); + if (!_inhibitDOMUpdates) + CPDOMDisplayServerSetStyleSize(_DOMElement, aSize.width * 1 / scale.width, aSize.height * 1 / scale.height); if (_DOMContentsElement) { @@ -1306,7 +1315,7 @@ var CPViewHighDPIDrawingEnabled = YES; [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; if (!_inhibitUpdateTrackingAreas) - [self _updateTrackingAreas]; + [self _updateTrackingAreasWithRecursion:YES]; } /*! @@ -1374,7 +1383,7 @@ var CPViewHighDPIDrawingEnabled = YES; [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; if (!_inhibitUpdateTrackingAreas && !_inhibitFrameAndBoundsChangedNotifications) - [self _updateTrackingAreas]; + [self _updateTrackingAreasWithRecursion:YES]; } /*! @@ -1418,7 +1427,7 @@ var CPViewHighDPIDrawingEnabled = YES; [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; if (!_inhibitUpdateTrackingAreas && !_inhibitFrameAndBoundsChangedNotifications) - [self _updateTrackingAreas]; + [self _updateTrackingAreasWithRecursion:YES]; } @@ -1430,7 +1439,7 @@ var CPViewHighDPIDrawingEnabled = YES; { var mask = [self autoresizingMask]; - if (mask == CPViewNotSizable) + if (mask === CPViewNotSizable) return; var frame = _superview._frame, @@ -1599,10 +1608,8 @@ var CPViewHighDPIDrawingEnabled = YES; // FIXME: Should we return to visibility? This breaks in FireFox, Opera, and IE. // _DOMElement.style.visibility = (_isHidden = aFlag) ? "hidden" : "visible"; - _isHidden = aFlag; - #if PLATFORM(DOM) - _DOMElement.style.display = _isHidden ? "none" : "block"; + _DOMElement.style.display = aFlag ? "none" : "block"; #endif if (aFlag) @@ -1613,7 +1620,7 @@ var CPViewHighDPIDrawingEnabled = YES; { do { - if (self == view) + if (self === view) { [_window makeFirstResponder:[self nextValidKeyView]]; break; @@ -1622,33 +1629,89 @@ var CPViewHighDPIDrawingEnabled = YES; while (view = [view superview]); } - [self _notifyViewDidHide]; + [self _postViewWillDisappearNotification]; + [self _recursiveGainedHiddenAncestor]; } else { [self setNeedsDisplay:YES]; - [self _notifyViewDidUnhide]; + + [self _postViewWillAppearNotification]; + [self _recursiveLostHiddenAncestor]; } + + _isHidden = aFlag; } -- (void)_notifyViewDidHide +- (void)_postViewWillAppearNotification { - [self viewDidHide]; - - var count = [_subviews count]; - - while (count--) - [_subviews[count] _notifyViewDidHide]; + [[CPNotificationCenter defaultCenter] postNotificationName:_CPViewWillAppearNotification object:self userInfo:nil]; } -- (void)_notifyViewDidUnhide +- (void)_postViewDidAppearNotification { - [self viewDidUnhide]; + [[CPNotificationCenter defaultCenter] postNotificationName:_CPViewDidAppearNotification object:self userInfo:nil]; +} - var count = [_subviews count]; +- (void)_postViewWillDisappearNotification +{ + [[CPNotificationCenter defaultCenter] postNotificationName:_CPViewWillDisappearNotification object:self userInfo:nil]; +} - while (count--) - [_subviews[count] _notifyViewDidUnhide]; +- (void)_postViewDidDisappearNotification +{ + [[CPNotificationCenter defaultCenter] postNotificationName:_CPViewDidDisappearNotification object:self userInfo:nil]; +} + +- (void)_setSuperview:(CPView)aSuperview +{ + var hasOldSuperview = (_superview !== nil), + hasNewSuperview = (aSuperview !== nil), + oldSuperviewIsHidden = hasOldSuperview && [_superview isHiddenOrHasHiddenAncestor], + newSuperviewIsHidden = hasNewSuperview && [aSuperview isHiddenOrHasHiddenAncestor]; + + if (!newSuperviewIsHidden && oldSuperviewIsHidden) + [self _recursiveLostHiddenAncestor]; + + if (newSuperviewIsHidden && !oldSuperviewIsHidden) + [self _recursiveGainedHiddenAncestor]; + + _superview = aSuperview; + + if (hasOldSuperview) + [self _postViewDidDisappearNotification]; + + if (hasNewSuperview) + [self _postViewDidAppearNotification]; +} + +- (void)_recursiveLostHiddenAncestor +{ + if (_isHiddenOrHasHiddenAncestor) + { + _isHiddenOrHasHiddenAncestor = NO; + [self viewDidUnhide]; + } + + [_subviews enumerateObjectsUsingBlock:function(view, idx, stop) + { + [view _recursiveLostHiddenAncestor]; + }]; +} + +- (void)_recursiveGainedHiddenAncestor +{ + if (!_isHidden) + { + [self viewDidHide]; + } + + _isHiddenOrHasHiddenAncestor = YES; + + [_subviews enumerateObjectsUsingBlock:function(view, idx, stop) + { + [view _recursiveGainedHiddenAncestor]; + }]; } /*! @@ -1683,7 +1746,7 @@ var CPViewHighDPIDrawingEnabled = YES; */ - (void)setAlphaValue:(float)anAlphaValue { - if (_opacity == anAlphaValue) + if (_opacity === anAlphaValue) return; _opacity = anAlphaValue; @@ -1718,12 +1781,7 @@ var CPViewHighDPIDrawingEnabled = YES; */ - (BOOL)isHiddenOrHasHiddenAncestor { - var view = self; - - while (view && ![view isHidden]) - view = [view superview]; - - return view !== nil; + return _isHiddenOrHasHiddenAncestor; } /*! @@ -1887,10 +1945,10 @@ var CPViewHighDPIDrawingEnabled = YES; */ - (void)setBackgroundColor:(CPColor)aColor { - if (_backgroundColor == aColor) + if (_backgroundColor === aColor) return; - if (aColor == [CPNull null]) + if (aColor === [CPNull null]) aColor = nil; _backgroundColor = aColor; @@ -1933,7 +1991,7 @@ var CPViewHighDPIDrawingEnabled = YES; var image = slices[i], size = [image size]; - if (!size || (size.width == 0 && size.height == 0)) + if (!size || (size.width === 0 && size.height === 0)) size = nil; _DOMImageSizes[i] = size; @@ -1988,10 +2046,12 @@ var CPViewHighDPIDrawingEnabled = YES; CPDOMDisplayServerSetStyleSize(_DOMImageParts[0], size.width, size.height); } else + { _DOMElement.style.background = colorCSS; if (patternImage) CPDOMDisplayServerSetStyleBackgroundSize(_DOMElement, [patternImage size].width + "px", [patternImage size].height + "px"); + } } else { @@ -2025,7 +2085,7 @@ var CPViewHighDPIDrawingEnabled = YES; partIndex++; } - if (_backgroundType == BackgroundNinePartImage) + if (_backgroundType === BackgroundNinePartImage) { var left = _DOMImageSizes[0] ? _DOMImageSizes[0].width : 0, right = _DOMImageSizes[2] ? _DOMImageSizes[2].width : 0, @@ -2086,7 +2146,7 @@ var CPViewHighDPIDrawingEnabled = YES; CPDOMDisplayServerSetStyleRightBottom(_DOMImageParts[partIndex], NULL, 0.0, 0.0); } } - else if (_backgroundType == BackgroundVerticalThreePartImage) + else if (_backgroundType === BackgroundVerticalThreePartImage) { var top = _DOMImageSizes[0] ? _DOMImageSizes[0].height : 0, bottom = _DOMImageSizes[2] ? _DOMImageSizes[2].height : 0; @@ -2118,7 +2178,7 @@ var CPViewHighDPIDrawingEnabled = YES; CPDOMDisplayServerSetStyleSize(_DOMImageParts[partIndex], frameSize.width, bottom); } } - else if (_backgroundType == BackgroundHorizontalThreePartImage) + else if (_backgroundType === BackgroundHorizontalThreePartImage) { var left = _DOMImageSizes[0] ? _DOMImageSizes[0].width : 0, right = _DOMImageSizes[2] ? _DOMImageSizes[2].width : 0; @@ -2857,8 +2917,8 @@ setBoundsOrigin: return YES; } -/* - FIXME Not yet implemented +/*! + Scrolls the view’s CPClipView in the direction of a mouse event that occurs outside of it. */ - (BOOL)autoscroll:(CPEvent)anEvent { @@ -3080,7 +3140,7 @@ setBoundsOrigin: */ - (void)setLayer:(CALayer)aLayer { - if (_layer == aLayer) + if (_layer === aLayer) return; if (_layer) @@ -3494,14 +3554,14 @@ setBoundsOrigin: Invoked automatically when the view’s geometry changes such that its tracking areas need to be recalculated. You should override this method to remove out of date tracking areas and add recomputed tracking areas; - + Cocoa calls this on every view, whereas they have tracking area(s) or not. Cappuccino behaves differently : - updateTrackingAreas is called when placing a view in the view hierarchy (that is in a window) - if you have only CPTrackingInVisibleRect tracking areas attached to a view, it will not be called again (until you move the view in the hierarchy) - if you have at least one non-CPTrackingInVisibleRect tracking area attached, it will be called every time the view geometry could be modified You don't have to touch to CPTrackingInVisibleRect tracking areas, they will be automatically updated - + Please note that it is the owner of a tracking area who is called for updateTrackingAreas. But, if a view without any tracking area is inserted in the view hierarchy (that is, in a window), the view is called for updateTrackingAreas. This enables you to use updateTrackingArea to initially attach your tracking areas to the view. @@ -3513,16 +3573,16 @@ setBoundsOrigin: /*! This utility method is intended for CPView subclasses overriding updateTrackingAreas - + Typical use would be : - + - (void)updateTrackingAreas { [self removeAllTrackingAreas]; - + ... add your specific updated tracking areas ... } - + */ - (void)removeAllTrackingAreas { @@ -3541,21 +3601,21 @@ setBoundsOrigin: [_trackingAreas removeObjectIdenticalTo:trackingArea]; } -- (void)_updateTrackingAreas +- (void)_updateTrackingAreasWithRecursion:(BOOL)shouldCallRecursively { _inhibitUpdateTrackingAreas = YES; - [self _recursivelyUpdateTrackingAreas]; - - _inhibitUpdateTrackingAreas = NO; -} - -- (void)_recursivelyUpdateTrackingAreas -{ [self _updateTrackingAreasForOwners:[self _calcTrackingAreaOwners]]; - for (var i = 0; i < _subviews.length; i++) - [_subviews[i] _recursivelyUpdateTrackingAreas]; + if (shouldCallRecursively) + { + // Now, call _updateTrackingAreasWithRecursion on subviews + + for (var i = 0; i < _subviews.length; i++) + [_subviews[i] _updateTrackingAreasWithRecursion:YES]; + } + + _inhibitUpdateTrackingAreas = NO; } - (CPArray)_calcTrackingAreaOwners @@ -3652,7 +3712,6 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", _window = [aCoder decodeObjectForKey:CPViewWindowKey]; _superview = [aCoder decodeObjectForKey:CPViewSuperviewKey]; - // We have to manually add the subviews so that they will receive // viewWillMoveToSuperview: and viewDidMoveToSuperview: _subviews = []; @@ -3707,6 +3766,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", #endif [self setHidden:[aCoder decodeBoolForKey:CPViewIsHiddenKey]]; + _isHiddenOrHasHiddenAncestor = NO; if ([aCoder containsValueForKey:CPViewOpacityKey]) [self setAlphaValue:[aCoder decodeIntForKey:CPViewOpacityKey]]; diff --git a/AppKit/CPViewController.j b/AppKit/CPViewController.j index 559a12f05..104313474 100644 --- a/AppKit/CPViewController.j +++ b/AppKit/CPViewController.j @@ -150,7 +150,7 @@ var CPViewControllerCachedCibs; If you use Interface Builder to create your views, and you initialize the controller using the initWithCibName:bundle: methods, then you MUST NOT override this method. - + @note When using this method, the cib loading system is synchronous. See the loadViewWithCompletionHandler: method for an asynchronous loading. */ @@ -178,12 +178,12 @@ var CPViewControllerCachedCibs; } /*! - Loads asynchronously the cib and creates the view that the controller manages. - - @param aHandler A function passing the loaded view as the first argument - and a network error or nil as the second argument: function(view, error). - - @note If the view has already been loaded, the completion handler is run immediatly + Asynchronously load the cib and create the view that the controller manages. + + @param aHandler a function which will be passed the loaded view as the first + argument and a network error or nil as the second argument: function(view, error). + + @note If the view has already been loaded, the completion handler is run immediatly and the process is synchronous. */ - (void)loadViewWithCompletionHandler:(Function/*(view, error)*/)aHandler @@ -213,11 +213,11 @@ var CPViewControllerCachedCibs; if (anError == nil) { var data = [CPData dataWithRawString:aData], - aCib = [[CPCib alloc] _initWithData:data bundle:_cibBundle cibName:_cibName]; + aCib = [[CPCib alloc] _initWithData:data bundle:_cibBundle cibName:_cibName]; [CPViewControllerCachedCibs setObject:aCib forKey:_cibName]; [aCib instantiateCibWithExternalNameTable:_cibExternalNameTable]; - aHandler(_view, nil); + [self _viewDidLoadWithCompletionHandler:aHandler]; } else { @@ -228,13 +228,13 @@ var CPViewControllerCachedCibs; else { [cib instantiateCibWithExternalNameTable:_cibExternalNameTable]; - aHandler(_view, nil); + [self _viewDidLoadWithCompletionHandler:aHandler]; } } else { _view = [CPView new]; - aHandler(_view, nil); + [self _viewDidLoadWithCompletionHandler:aHandler]; } } @@ -292,6 +292,16 @@ var CPViewControllerCachedCibs; [self didChangeValueForKey:"isViewLoaded"]; } +- (void)_viewDidLoadWithCompletionHandler:(Function)aHandler +{ + [self _registerOrUnregister:YES notificationsForView:_view]; + + [self willChangeValueForKey:"isViewLoaded"]; + aHandler(_view, nil); + _isViewLoaded = YES; + [self didChangeValueForKey:"isViewLoaded"]; +} + /*! This method is called after the view controller has loaded its associated views into memory. @@ -305,6 +315,79 @@ var CPViewControllerCachedCibs; } +/*! + Called after the view controller’s view has been loaded into memory is about to be added to the + view hierarchy in the window. + + @discussion You can override this method to perform tasks prior to a view controller’s view + getting added to view hierarchy, such as setting the view’s highlight color. This method is called when: + + • The view is about to be added to the view hierarchy of the view controller + + If you override this method, call this method on super at some point in your implementation in case + a superclass also overrides this method. + + The default implementation of this method does nothing. +*/ +- (void)viewWillAppear +{ + +} + +/*! + Called when the view controller’s view is fully transitioned onto the screen. + + @discussion This method is called after the completion of any drawing and animations + involved in the initial appearance of the view. You can override this method to + perform tasks appropriate for that time, such as work that should not interfere + with the presentation animation, or starting an animation that you want to begin + after the view appears. + + If you override this method, call this method on super at some point in your + implementation in case a superclass also overrides this method. + + The default implementation of this method does nothing. +*/ +- (void)viewDidAppear +{ + +} + +/*! + Called when the view controller’s view is about to be removed from the view hierarchy in the window. + + @discussion You can override this method to perform tasks that are to precede the disappearance + of the view controller’s view, such as stopping a continuous animation that you + started in response to the viewDidAppear method call. This method is called when: + + • The view is about to be removed from the view hierarchy of the window + + If you override this method, call this method on super at some point in your + implementation in case a superclass also overrides this method. + + The default implementation of this method does nothing. +*/ +- (void)viewWillDisappear +{ + +} + +/*! + Called after the view controller’s view is removed from the view hierarchy in a window. + + @discussion You can override this method to perform tasks associated with removing the view + controller’s view from the window’s view hierarchy, such as releasing resources + not needed when the view is not visible or no longer part of the window. + + If you override this method, call this method on super at some point in your + implementation in case a superclass also overrides this method. + + The default implementation of this method does nothing. +*/ +- (void)viewDidDisappear +{ + +} /*! Manually sets the view that the controller manages. @@ -318,6 +401,9 @@ var CPViewControllerCachedCibs; { var willChangeIsViewLoaded = (_isViewLoaded == NO && aView != nil) || (_isViewLoaded == YES && aView == nil); + [self _registerOrUnregister:NO notificationsForView:_view]; + [self _registerOrUnregister:YES notificationsForView:aView]; + if (willChangeIsViewLoaded) [self willChangeValueForKey:"isViewLoaded"]; @@ -333,6 +419,30 @@ var CPViewControllerCachedCibs; return NO; } +- (void)_registerOrUnregister:(BOOL)shouldRegister notificationsForView:(CPView)aView +{ + if (aView === nil) + return; + + var center = [CPNotificationCenter defaultCenter], + notifs_to_sel = @{_CPViewWillAppearNotification : @"viewWillAppear", + _CPViewDidAppearNotification : @"viewDidAppear", + _CPViewWillDisappearNotification : @"viewWillDisappear", + _CPViewDidDisappearNotification : @"viewDidDisappear"}; + + [notifs_to_sel enumerateKeysAndObjectsUsingBlock:function(notif, selString, stop) + { + var selector = CPSelectorFromString(selString); + if ([self implementsSelector:selector]) + { + if (shouldRegister) + [center addObserver:self selector:selector name:notif object:aView]; + else + [center removeObserver:self name:notif object:aView]; + } + }]; +} + @end diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 9c4880938..fd1a0b469 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -308,7 +308,7 @@ CPTexturedBackgroundWindowMask [self setPlatformWindow:[CPPlatformWindow primaryPlatformWindow]]; else { - // give zero sized borderless bridge windows a default size if we're not in the browser so they show up in NativeHost. + // give zero sized borderless bridge windows a default size. if ((aStyleMask & CPBorderlessBridgeWindowMask) && aContentRect.size.width === 0 && aContentRect.size.height === 0) { var visibleFrame = [[[CPScreen alloc] init] visibleFrame]; @@ -655,7 +655,6 @@ CPTexturedBackgroundWindowMask CPBorderlessWindowMask CPTitledWindowMask CPClosableWindowMask - CPMiniaturizableWindowMask (NOTE: only available in NativeHost) CPResizableWindowMask CPTexturedBackgroundWindowMask CPBorderlessBridgeWindowMask @@ -4099,6 +4098,9 @@ var interpolate = function(fromValue, toValue, progress) [overlappingTrackingAreas addObject:aTrackingArea]; } + if (overlappingTrackingAreas.length === 0) + return; + var frontmostTrackingArea = overlappingTrackingAreas[0], frontmostView = [frontmostTrackingArea view]; @@ -4202,12 +4204,11 @@ var interpolate = function(fromValue, toValue, progress) { // This will put a tracking event in the _queuedTrackingEvents queue. // - // We optimize this queue with this policy : + // We optimize this queue with this policy: // - if mouseEntered, search if queue contains a previous mouseExited for the same tracking area. If so, discard both. // - if mouseExited, search if queue contains a previous mouseEntered for the same tracking area. If so, discard both. // - // This is not Cocoa way of doing as it would send every event. - // But final result should be the same. + // This is not the Cocoa way of doing as it would send every event, but the final result should be the same. var eventType = [anEvent type], trackingArea = [anEvent trackingArea]; diff --git a/AppKit/CoreAnimation/CPAnimationContext.j b/AppKit/CoreAnimation/CPAnimationContext.j index 3281d10d0..ac90e8943 100644 --- a/AppKit/CoreAnimation/CPAnimationContext.j +++ b/AppKit/CoreAnimation/CPAnimationContext.j @@ -3,22 +3,19 @@ @import "CPView.j" @import +@import -@import "jshashtable.j" -@import "CSSAnimation.j" - -@typedef HashTable; +@typedef Map; var _CPAnimationContextStack = nil, - _animationFlushingObserver = nil, - _animationFrameUpdaters = {}; + _animationFlushingObserver = nil; @implementation CPAnimationContext : CPObject { double _duration @accessors(property=duration); CAMediaTimingFunction _timingFunction @accessors(property=timingFunction); Function _completionHandlerAgent; - HashTable _animationsByObject; + Map _animationsByObject; } + (id)currentContext @@ -64,7 +61,7 @@ var _CPAnimationContextStack = nil, _duration = 0.0; _timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; _completionHandlerAgent = nil; - _animationsByObject = new Hashtable(); + _animationsByObject = new Map(); return self; } @@ -83,8 +80,10 @@ var _CPAnimationContextStack = nil, { if (!_animationFlushingObserver) { +#if (DEBUG) CPLog.debug("create new observer"); - _animationFlushingObserver = CFRunLoopObserverCreate(2, true, 0, _animationFlushingObserverCallback,0); +#endif + _animationFlushingObserver = CFRunLoopObserverCreate(2, true, 0, _animationFlushingObserverCallback, 0); CFRunLoopAddObserver([CPRunLoop mainRunLoop], _animationFlushingObserver); } } @@ -115,7 +114,9 @@ var _CPAnimationContextStack = nil, [context _flushAnimations]; [_CPAnimationContextStack removeLastObject]; -CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); +#if (DEBUG) + CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); +#endif return YES; } @@ -131,7 +132,7 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); if (!animByKeyPath) { var newAnimByKeyPath = @{aKeyPath:resolvedAction}; - _animationsByObject.put(anObject, newAnimByKeyPath); + _animationsByObject.set(anObject, newAnimByKeyPath); } else [animByKeyPath setObject:resolvedAction forKey:aKeyPath]; @@ -145,27 +146,31 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); values, keyTimes, timingFunctions, - objectId; + needsPeriodicFrameUpdates, + objectId = [anObject UID]; if (!aKeyPath || !anObject || !(animation = [anObject animationForKey:aKeyPath]) || ![animation isKindOfClass:[CAAnimation class]]) return nil; duration = [animation duration] || [self duration]; - - var needsFrameTimer = (aKeyPath == @"frame" || aKeyPath == @"frameSize") && - ([anObject hasCustomLayoutSubviews] || [anObject hasCustomDrawRect]) && - (objectId = [anObject UID]); + needsPeriodicFrameUpdates = [[anObject animator] needsPeriodicFrameUpdatesForKeyPath:aKeyPath]; if (_completionHandlerAgent) _completionHandlerAgent.increment(); + var animatorClass = [[anObject class] animatorClass]; + var completionFunction = function() { - if (needsFrameTimer) - [self stopFrameUpdaterWithIdentifier:objectId]; - else if (animationCompletion) + if (needsPeriodicFrameUpdates) + [animatorClass stopUpdaterWithIdentifier:objectId]; + + if (animationCompletion) animationCompletion(); + if (needsPeriodicFrameUpdates || animationCompletion) + [[CPRunLoop currentRunLoop] performSelectors]; + if (_completionHandlerAgent) _completionHandlerAgent.decrement(); }; @@ -198,6 +203,7 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); return { object:anObject, + root:anObject, keypath:animatedKeyPath, values:values, keytimes:keyTimes, @@ -212,7 +218,7 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); if (![_CPAnimationContextStack count]) return; - if (_animationsByObject.size() == 0) + if (_animationsByObject.size == 0) { if (_completionHandlerAgent) _completionHandlerAgent.fire(); @@ -223,27 +229,26 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); - (void)_startAnimations { - var targetViews = _animationsByObject.keys(), - cssAnimations = [], + var cssAnimations = [], timers = []; - [targetViews enumerateObjectsUsingBlock:function(targetView, idx, stop) + _animationsByObject.forEach(function(animByKeyPath, targetView) { - var animByKeyPath = _animationsByObject.get(targetView); - [animByKeyPath enumerateKeysAndObjectsUsingBlock:function(aKey, anAction, stop) { - [self getAnimations:cssAnimations getTimers:timers forView:targetView usingAction:anAction rootView:targetView cssAnimate:YES]; + [self getAnimations:cssAnimations getTimers:timers usingAction:anAction cssAnimate:YES]; }]; + }); - _animationsByObject.remove(targetView); - }]; + _animationsByObject.clear(); // start timers var k = timers.length; while(k--) { - CPLog.debug("START TIMER " + timers[k].identifier()); +#if (DEBUG) + CPLog.debug("START TIMER " + timers[k].description()); +#endif timers[k].start(); } @@ -251,77 +256,58 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); var n = cssAnimations.length; while(n--) { - CPLog.debug("START ANIMATION " + cssAnimations[n].animationsnames); +#if (DEBUG) + CPLog.debug("START ANIMATION " + cssAnimations[n].description()); +#endif cssAnimations[n].start(); } } -- (void)getAnimations:(CPArray)cssAnimations getTimers:(CPArray)timers forView:(CPView)aTargetView usingAction:(Object)anAction rootView:(CPView)rootView cssAnimate:(BOOL)needsCSSAnimation +- (void)getAnimations:(CPArray)cssAnimations getTimers:(CPArray)timers usingAction:(Object)anAction cssAnimate:(BOOL)needsCSSAnimation { - var keyPath = anAction.keypath, - isFrameKeyPath = (keyPath == @"frame" || keyPath == @"frameSize"), - customLayout = [aTargetView hasCustomLayoutSubviews], - customDrawing = [aTargetView hasCustomDrawRect], - needsFrameTimer = isFrameKeyPath && (customLayout || customDrawing); + var values = anAction.values; + + if (values.length == 2) + { + var start = values[0], + end = values[1]; + + if (anAction.keypath == @"frame" && CGRectEqualToRect(start, end) + || anAction.keypath == @"frameSize" && CGSizeEqualToSize(start, end) + || anAction.keypath == @"frameOrigin" && CGPointEqualToPoint(start, end)) + return; + } + + var targetView = anAction.object, + keyPath = anAction.keypath, + isFrameKeyPath = (keyPath == @"frame" || keyPath == @"frameSize"), + customLayout = [targetView hasCustomLayoutSubviews], + customDrawing = [targetView hasCustomDrawRect], + declarative_subviews_layout = (!customLayout || [targetView implementsSelector:@selector(frameRectOfView:inSuperviewSize:)]), + needsPeriodicFrameUpdates = [[targetView animator] needsPeriodicFrameUpdatesForKeyPath:keyPath], + timer = nil, + animatorClass = [[targetView class] animatorClass]; if (needsCSSAnimation) { - var identifier = [aTargetView UID], - duration = anAction.duration, - timingFunctions = anAction.timingfunctions, - properties = [], - valueFunctions = [], - cssAnimation = nil; - - [cssAnimations enumerateObjectsUsingBlock:function(anim, idx, stop) - { - if (anim.identifier == identifier) - { - cssAnimation = anim; - stop(YES); - } - }]; - - if (cssAnimation == nil) - { - var domElement = [aTargetView DOMElementForKeyPath:keyPath]; - cssAnimation = new CSSAnimation(domElement, identifier); - cssAnimations.push(cssAnimation); - } - - var css_mapping = [[aTargetView class] cssPropertiesForKeyPath:keyPath]; - - [css_mapping enumerateObjectsUsingBlock:function(aDict, anIndex, stop) - { - var completionFunction = (anIndex == 0) ? anAction.completion : null; - var property = [aDict objectForKey:@"property"], - getter = [aDict objectForKey:@"value"]; - - cssAnimation.addPropertyAnimation(property, getter, duration, anAction.keytimes, anAction.values, timingFunctions, completionFunction); - }]; - - if (needsFrameTimer) - cssAnimation.setRemoveAnimationPropertyOnCompletion(false); + [animatorClass addAnimations:cssAnimations forAction:anAction]; } - if (needsFrameTimer) + if (needsPeriodicFrameUpdates) { - var timer = [self addFrameUpdaterWithIdentifier:[rootView UID] forView:aTargetView keyPath:keyPath duration:anAction.duration]; - - if (timer) - timers.push(timer); + [animatorClass addFrameUpdaters:timers forAction:anAction]; } - var subviews = [aTargetView subviews], + var subviews = [targetView subviews], count = [subviews count]; if (count && isFrameKeyPath) { - var frameTimerId = [rootView UID], - lastIndex = count - 1; - [subviews enumerateObjectsUsingBlock:function(aSubview, idx, stop) { + if (!declarative_subviews_layout && [aSubview autoresizingMask] == 0) + return; + var action = [self actionFromAction:anAction forAnimatedSubview:aSubview], targetFrame = [action.values lastObject]; @@ -333,70 +319,44 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); action.completion = function() { [aSubview setFrame:targetFrame]; - CPLog.debug(aSubview + " setFrame: "); +#if (DEBUG) + CPLog.debug(aSubview + " setFrame: " + CPStringFromRect(targetFrame)); +#endif + if (idx == count - 1) + [animatorClass stopUpdaterWithIdentifier:[anAction.root UID]]; + }; + } - if (idx == lastIndex) - [self stopFrameUpdaterWithIdentifier:frameTimerId]; - }; - } - - [self getAnimations:cssAnimations getTimers:timers forView:aSubview usingAction:action rootView:rootView cssAnimate:!customLayout]; - }]; + var animate = !needsPeriodicFrameUpdates; + [self getAnimations:cssAnimations getTimers:timers usingAction:action cssAnimate:animate]; + }]; } } - (Object)actionFromAction:(Object)anAction forAnimatedSubview:(CPView)aView { var targetValue = [anAction.values lastObject], + startFrame = [aView frame], endFrame, values; - if (anAction.keypath == @"frame") + if (anAction.keypath == "frame") targetValue = targetValue.size; - endFrame = [aView frameWithNewSuperviewSize:targetValue]; - values = [[aView frame], endFrame]; + endFrame = [[aView superview] frameRectOfView:aView inSuperviewSize:targetValue]; + values = [startFrame, endFrame]; return { object:aView, + root:anAction.root, keypath:"frame", values:values, keytimes:[0, 1], duration:anAction.duration, - timingfunctions:anAction.timingFunctions + timingfunctions:anAction.timingfunctions }; } -- (Function)addFrameUpdaterWithIdentifier:(CPString)anIdentifier forView:(CPView)aView keyPath:(CPString)aKeyPath duration:(float)aDuration -{ - var frameUpdater = _animationFrameUpdaters[anIdentifier], - result = nil; - - if (frameUpdater == null) - { - frameUpdater = new FrameUpdater(anIdentifier); - _animationFrameUpdaters[anIdentifier] = frameUpdater; - result = frameUpdater; - } - - frameUpdater.addTarget(aView, aKeyPath, aDuration); - - return result; -} - -- (void)stopFrameUpdaterWithIdentifier:(CPString)anIdentifier -{ - var frameUpdater = _animationFrameUpdaters[anIdentifier]; - - if (frameUpdater) - { - frameUpdater.stop(); - delete _animationFrameUpdaters[anIdentifier]; - } - else - CPLog.warn("Could not find FrameUpdater with identifier " + anIdentifier); -} - - (void)setCompletionHandler:(Function)aCompletionHandler { if (_completionHandlerAgent) @@ -417,6 +377,11 @@ CPLog.debug(_cmd + "context stack =" + _CPAnimationContextStack); @implementation CPView (CPAnimationContext) +- (CGRect)frameRectOfView:(CPView)aView inSuperviewSize:(CGSize)aSize +{ + return [aView frameWithNewSuperviewSize:aSize]; +} + - (CGRect)frameWithNewSuperviewSize:(CGSize)newSize { var mask = [self autoresizingMask]; @@ -542,7 +507,9 @@ CompletionHandlerAgent.prototype.invalidate = function() var _animationFlushingObserverCallback = function() { -CPLog.debug("_animationFlushingObserverCallback"); +#if (DEBUG) + CPLog.debug("_animationFlushingObserverCallback"); +#endif if ([_CPAnimationContextStack count] == 1) { var context = [_CPAnimationContextStack lastObject]; @@ -550,158 +517,16 @@ CPLog.debug("_animationFlushingObserverCallback"); [_CPAnimationContextStack removeLastObject]; } -CPLog.debug("_animationFlushingObserver "+_animationFlushingObserver+" stack:" + [_CPAnimationContextStack count]); +#if (DEBUG) + CPLog.debug("_animationFlushingObserver "+_animationFlushingObserver+" stack:" + [_CPAnimationContextStack count]); +#endif if (_animationFlushingObserver && ![_CPAnimationContextStack count]) { +#if (DEBUG) CPLog.debug("removeObserver"); +#endif CFRunLoopObserverInvalidate([CPRunLoop mainRunLoop], _animationFlushingObserver); _animationFlushingObserver = nil; } }; - -CFRunLoopObserver = function(activities, repeats, order, callout, context) -{ - this.activities = activities; - this.repeats = repeats; - this.order = order; - this.callout = callout; - this.context = context; - - this.isvalid = true; -}; - -CFRunLoopObserverCreate = function(activities, repeats, order, callout, context) -{ - return new CFRunLoopObserver(activities, repeats, order, callout, context); -}; - -CFRunLoopAddObserver = function(runloop, observer, mode) -{ - var observers = runloop._observers; - - if (!observers) - observers = (runloop._observers = []); - - if (observers.indexOf(observer) == -1) - observers.push(observer); -}; - -CFRunLoopObserverInvalidate = function(runloop, observer, mode) -{ - CFRunLoopRemoveObserver(runloop, observer, mode); -}; - -CFRunLoopRemoveObserver = function(runloop, observer, mode) -{ - var observers = runloop._observers; - if (observers) - { - var idx = observers.indexOf(observer); - if (idx !== -1) - { - observers.splice(idx, 1); - - if (observers.length == 0) - runloop._observers = nil; - } - } -}; - -var FrameUpdater = function(anIdentifier) -{ - this._identifier = anIdentifier; - this._duration = 0; - this._stop = false; - this._targets = []; - this._callbacks = []; - var frameUpdater = this; - - this._updateFunction = function(timestamp) - { - if (frameUpdater._stop) - return; - - if (this._startDate == null) - this._startDate = timestamp; - - for (var i = 0; i < frameUpdater._callbacks.length; i++) - frameUpdater._callbacks[i](); - - if (timestamp - this._startDate < frameUpdater._duration * 1000) - window.requestAnimationFrame(frameUpdater._updateFunction); - }; -}; - -FrameUpdater.prototype.start = function() -{ - window.requestAnimationFrame(this._updateFunction); -}; - -FrameUpdater.prototype.stop = function() -{ -CPLog.debug("stop FrameUpdater with id " + this.identifier()); - - this._stop = true; - - var targets = this._targets; - - for (var i = 0; i < targets.length; i++) - { - CPLog.debug(targets[i] + " Remove animation-name property"); - targets[i]._DOMElement.style.removeProperty(CPBrowserCSSProperty("animation-name")); - } -}; - -FrameUpdater.prototype.updateFunction = function() -{ - return this._updateFunction; -}; - -FrameUpdater.prototype.identifier = function() -{ - return this._identifier; -}; - -FrameUpdater.prototype.addTarget = function(target, keyPath, duration) -{ - var callback = createUpdateFrame(target, keyPath); - - if (callback) - { - this._duration = MAX(this._duration, duration); - this._targets.push(target); - this._callbacks.push(callback); - } -}; - -var createUpdateFrame = function(aView, aKeyPath) -{ - if (aKeyPath !== "frame" && aKeyPath !== "frameSize") - return nil; - - var style = getComputedStyle(aView._DOMElement); - - var updateFrame = function(timestamp) - { - var width = ROUND(style.getPropertyCSSValue('width').getFloatValue(CSSPrimitiveValue.CSS_PX)), - height = ROUND(style.getPropertyCSSValue('height').getFloatValue(CSSPrimitiveValue.CSS_PX)); - - if (aKeyPath == "frame") - { - var left = ROUND(style.getPropertyCSSValue('left').getFloatValue(CSSPrimitiveValue.CSS_PX)), - top = ROUND(style.getPropertyCSSValue('top').getFloatValue(CSSPrimitiveValue.CSS_PX)), - frame = CGRectMake(left, top, width, height); - - [aView setFrame:frame]; - } - else if (aKeyPath == "frameSize") - { - [aView setFrameSize:CGSizeMake(width, height)]; - } - - [[CPRunLoop currentRunLoop] performSelectors]; - }; - - return updateFrame; -}; diff --git a/AppKit/CoreAnimation/CPViewAnimator.j b/AppKit/CoreAnimation/CPViewAnimator.j index b2e811e3b..961f79a17 100644 --- a/AppKit/CoreAnimation/CPViewAnimator.j +++ b/AppKit/CoreAnimation/CPViewAnimator.j @@ -1,38 +1,24 @@ @import "_CPObjectAnimator.j" @import "CPView.j" +@import "CPCompatibility.j" +@import "CSSAnimation.j" + +var DEFAULT_CSS_PROPERTIES = nil, + FRAME_UPDATERS = {}; @implementation CPViewAnimator : _CPObjectAnimator { + BOOL _wantsPeriodicFrameUpdates @accessors(property=wantsPeriodicFrameUpdates); } -- (void)viewWillMoveToSuperview:(CPView)aSuperview +- (id)initWithTarget:(id)aTarget { - var orderInAnim = [self animationForKey:@"CPAnimationTriggerOrderIn"]; + self = [super initWithTarget:aTarget]; - if (orderInAnim && [orderInAnim isKindOfClass:[CAPropertyAnimation class]]) - { - [_target setValue:[orderInAnim fromValue] forKeyPath:[orderInAnim keyPath]]; - } + _wantsPeriodicFrameUpdates = NO; - [_target viewWillMoveToSuperview:aSuperview]; -} - -- (void)viewDidMoveToSuperview -{ - var orderInAnim = [self animationForKey:@"CPAnimationTriggerOrderIn"]; - - if (orderInAnim && [orderInAnim isKindOfClass:[CAPropertyAnimation class]]) - { - [self _setTargetValue:YES withKeyPath:@"CPAnimationTriggerOrderIn" fallback:nil completion:function() - { - [_target setValue:[orderInAnim toValue] forKeyPath:[orderInAnim keyPath]]; - }]; - } - else - { - [_target viewDidMoveToSuperview]; - } + return self; } - (void)removeFromSuperview @@ -81,7 +67,9 @@ { var handler = function() { + [_target _setForceUpdates:YES]; [_target performSelector:aSelector withObject:aTargetValue]; + [_target _setForceUpdates:NO]; }; [self _setTargetValue:aTargetValue withKeyPath:aKeyPath fallback:handler completion:handler]; @@ -92,7 +80,7 @@ var animation = [_target animationForKey:aKeyPath], context = [CPAnimationContext currentContext]; - if (!animation || ![animation isKindOfClass:[CAAnimation class]] || (![context duration] && ![animation duration]) || ![_CPObjectAnimator supportsCSSAnimations]) + if (!animation || ![animation isKindOfClass:[CAAnimation class]] || (![context duration] && ![animation duration]) || !CPFeatureIsCompatible(CPCSSAnimationFeature)) { if (fallback) fallback(); @@ -103,18 +91,107 @@ } } ++ (CPDictionary)_defaultCSSProperties +{ + if (DEFAULT_CSS_PROPERTIES == nil) + { + var transformProperty = "transform"; + + DEFAULT_CSS_PROPERTIES = @{ + "backgroundColor" : [@{"property":"background", "value":function(sv, val){return [val cssString];}}], + "alphaValue" : [@{"property":"opacity"}], + "frame" : [@{"property":transformProperty, "value":frameToCSSTranslationTransformMatrix}, + @{"property":"width", "value":transformFrameToWidth}, + @{"property":"height", "value":transformFrameToHeight}], + "frameOrigin" : [@{"property":transformProperty, "value":frameOriginToCSSTransformMatrix}], + "frameSize" : [@{"property":"width", "value":transformSizeToWidth}, + @{"property":"height", "value":transformSizeToHeight}] + }; + } + + return DEFAULT_CSS_PROPERTIES; +} + ++ (void)addAnimations:(CPArray)animations forAction:(id)anAction +{ + var target = anAction.object; + + return [self _addAnimations:animations forAction:anAction domElement:[target _DOMElement] identifier:[target UID]]; +} + ++ (void)_addAnimations:(CPArray)animations forAction:(id)anAction domElement:(Object)aDomElement identifier:(CPString)anIdentifier +{ + var animation = [animations objectPassingTest:function(anim, idx, stop) + { + return anim.identifier == anIdentifier; + }]; + + if (animation == nil) + { + animation = new CSSAnimation(aDomElement, anIdentifier, [anAction.object debug_description]); + [animations addObject:animation]; + } + + var css_mapping = [self _cssPropertiesForKeyPath:anAction.keypath]; + + [css_mapping enumerateObjectsUsingBlock:function(aDict, anIndex, stop) + { + var completionFunction = (anIndex == 0) ? anAction.completion : null, + property = [aDict objectForKey:@"property"], + getter = [aDict objectForKey:@"value"]; + + animation.addPropertyAnimation(property, getter, anAction.duration, anAction.keytimes, anAction.values, anAction.timingfunctions, completionFunction); + }]; +} + ++ (CPArray)_cssPropertiesForKeyPath:(CPString)aKeyPath +{ + return [[self _defaultCSSProperties] objectForKey:aKeyPath]; +} + ++ (void)addFrameUpdaters:(CPArray)frameUpdaters forAction:(id)anAction +{ + var rootIdentifier = [anAction.root UID]; + + var frameUpdater = [frameUpdaters objectPassingTest:function(updater, idx, stop) + { + // There is one timer, linked to the top view, that updates the whole hierarchy. + return updater.identifier() == rootIdentifier; + }]; + + if (frameUpdater == nil) + { + frameUpdater = new FrameUpdater(rootIdentifier); + [frameUpdaters addObject:frameUpdater]; + FRAME_UPDATERS[rootIdentifier] = frameUpdater; + } + + frameUpdater.addTarget(anAction.object, anAction.keypath, anAction.duration); +} + ++ (void)stopUpdaterWithIdentifier:(CPString)anIdentifier +{ + var frameUpdater = FRAME_UPDATERS[anIdentifier]; + + if (frameUpdater) + { + frameUpdater.stop(); + delete FRAME_UPDATERS[anIdentifier]; + } + else + CPLog.warn("Could not find FrameUpdater with identifier " + anIdentifier); +} + +- (BOOL)needsPeriodicFrameUpdatesForKeyPath:(CPString)aKeyPath +{ + return ((aKeyPath == @"frame" || aKeyPath == @"frameSize") && + (([_target hasCustomLayoutSubviews] && ![_target implementsSelector:@selector(frameRectOfView:inSuperviewSize:)]) + || [_target hasCustomDrawRect])) + || [self wantsPeriodicFrameUpdates]; +} + @end -var transformOrigin = function(start, current) -{ - return "translate(" + (current.x - start.x) + "px," + (current.y - start.y) + "px)"; -}; - -var transformFrameToTranslate = function(start, current) -{ - return transformOrigin(start.origin, current.origin); -}; - var transformFrameToWidth = function(start, current) { return current.size.width + "px"; @@ -135,36 +212,27 @@ var transformSizeToHeight = function(start, current) return current.height + "px"; }; -var DEFAULT_CSS_PROPERTIES = nil; +var CSSStringFromCGAffineTransform = function(anAffineTransform) +{ + return "matrix(" + anAffineTransform.a + ", " + anAffineTransform.b + ", " + anAffineTransform.c + ", " + anAffineTransform.d + ", " + anAffineTransform.tx + (CPBrowserIsEngine(CPGeckoBrowserEngine) ? "px, " : ", ") + anAffineTransform.ty + (CPBrowserIsEngine(CPGeckoBrowserEngine) ? "px)" : ")"); +}; + +var frameOriginToCSSTransformMatrix = function(start, current) +{ + var affine = CGAffineTransformMakeTranslation(current.x - start.x, current.y - start.y); + + return CSSStringFromCGAffineTransform(affine); +}; + +var frameToCSSTranslationTransformMatrix = function(start, current) +{ + var affine = CGAffineTransformMakeTranslation(current.origin.x - start.origin.x, current.origin.y - start.origin.y); + + return CSSStringFromCGAffineTransform(affine); +}; @implementation CPView (CPAnimatablePropertyContainer) -+ (CPDictionary)defaultCSSProperties -{ - if (DEFAULT_CSS_PROPERTIES == nil) - { - var transformProperty = CPBrowserCSSProperty("transform"); - - DEFAULT_CSS_PROPERTIES = @{ - "backgroundColor" : [@{"property":"background", "value":function(sv, val){return [val cssString];}}], - "alphaValue" : [@{"property":"opacity"}], - "frame" : [@{"property":transformProperty, "value":transformFrameToTranslate}, - @{"property":"width", "value":transformFrameToWidth}, - @{"property":"height", "value":transformFrameToHeight}], - "frameOrigin" : [@{"property":transformProperty, "value":transformOrigin}], - "frameSize" : [@{"property":"width", "value":transformSizeToWidth}, - @{"property":"height", "value":transformSizeToHeight}] - }; - } - - return DEFAULT_CSS_PROPERTIES; -} - -+ (CPArray)cssPropertiesForKeyPath:(CPString)aKeyPath -{ - return [[self defaultCSSProperties] objectForKey:aKeyPath]; -} - + (Class)animatorClass { var anim_class = CPClassFromString(CPStringFromClass(self) + "Animator"); @@ -183,14 +251,16 @@ var DEFAULT_CSS_PROPERTIES = nil; return _animator; } -- (id)DOMElementForKeyPath:(CPString)aKeyPath -{ - return _DOMElement; -} - + (CAAnimation)defaultAnimationForKey:(CPString)aKey { - if ([self cssPropertiesForKeyPath:aKey] !== nil) + // TODO: remove when supported. + if (aKey == @"CPAnimationTriggerOrderIn") + { + CPLog.warn("CPView animated key path CPAnimationTriggerOrderIn is not supported yet."); + return nil; + } + + if ([[self animatorClass] _cssPropertiesForKeyPath:aKey] !== nil) return [CAAnimation animation]; return nil; @@ -219,4 +289,147 @@ var DEFAULT_CSS_PROPERTIES = nil; _animationsDictionary = [animationsDict copy]; } -@end \ No newline at end of file +- (Object)_DOMElement +{ + return _DOMElement; +} + +- (CPString)debug_description +{ + return [self identifier] || [self className]; +} + +@end + +@implementation CPArray (Additions) + +- (CPArray)objectPassingTest:(Function)aFunction +{ + var idx = [self indexOfObjectPassingTest:aFunction]; + + if (idx !== CPNotFound) + return [self objectAtIndex:idx]; + + return nil; +} +@end + +var FrameUpdater = function(anIdentifier) +{ + this._identifier = anIdentifier; + this._requestId = null; + this._duration = 0; + this._stop = false; + this._targets = []; + this._callbacks = []; + + var frameUpdater = this; + + this._updateFunction = function(timestamp) + { + if (frameUpdater._startDate == null) + frameUpdater._startDate = timestamp; + + if (frameUpdater._stop) + return; + + for (var i = 0; i < frameUpdater._callbacks.length; i++) + frameUpdater._callbacks[i](); + + if (timestamp - frameUpdater._startDate < frameUpdater._duration * 1000) + window.requestAnimationFrame(frameUpdater._updateFunction); + }; +}; + +FrameUpdater.prototype.start = function() +{ + this._requestId = window.requestAnimationFrame(this._updateFunction); +}; + +FrameUpdater.prototype.stop = function() +{ + CPLog.warn("STOP FrameUpdater" + this._identifier); + + // window.cancelAnimationFrame support is Chrome 24, Firefox 23, IE 10, Opera 15, Safari 6.1 + if (window.cancelAnimationFrame) + window.cancelAnimationFrame(this._requestId); + + this._stop = true; +}; + +FrameUpdater.prototype.updateFunction = function() +{ + return this._updateFunction; +}; + +FrameUpdater.prototype.identifier = function() +{ + return this._identifier; +}; + +FrameUpdater.prototype.description = function() +{ + return ""; +}; + +FrameUpdater.prototype.addTarget = function(target, keyPath, duration) +{ + var callback = createUpdateFrame(target, keyPath); + + if (callback) + { + this._duration = MAX(this._duration, duration); + this._targets.push(target); + this._callbacks.push(callback); + } +}; + +var createUpdateFrame = function(aView, aKeyPath) +{ + if (aKeyPath !== "frame" && aKeyPath !== "frameSize" && aKeyPath !== "frameOrigin") + return nil; + + var style = getComputedStyle([aView _DOMElement]), + getCSSPropertyValue = function(prop) { + return ROUND(parseFloat(style.getPropertyValue(prop))); + }, + initialOrigin = CGPointMakeCopy([aView frameOrigin]), + transformProperty = CPBrowserStyleProperty("transform"), + updateFrame = function(timestamp) + { + if (aKeyPath === "frameSize") + { + var width = getCSSPropertyValue("width"), + height = getCSSPropertyValue("height"); + + [aView setFrameSize:CGSizeMake(width, height)]; + } + else + { + [aView _setInhibitDOMUpdates:YES]; + + var matrix = style[transformProperty].split('(')[1].split(')')[0].split(','), + x = ROUND(initialOrigin.x + parseFloat(matrix[4])), + y = ROUND(initialOrigin.y + parseFloat(matrix[5])); + + if (aKeyPath === "frame") + { + var width = getCSSPropertyValue("width"), + height = getCSSPropertyValue("height"); + + [aView setFrame:CGRectMake(x, y, width, height)]; + } + else + { + [aView setFrameOrigin:CGPointMake(x, y)]; + } + + [aView _setInhibitDOMUpdates:NO]; + } + + [[CPRunLoop currentRunLoop] performSelectors]; + // CPLog.debug("update " + [aView debug_description]); + }; + + return updateFrame; +}; diff --git a/AppKit/CoreAnimation/CSSAnimation.j b/AppKit/CoreAnimation/CSSAnimation.j index 31d0c8f7f..e9e560c9d 100644 --- a/AppKit/CoreAnimation/CSSAnimation.j +++ b/AppKit/CoreAnimation/CSSAnimation.j @@ -3,7 +3,7 @@ var ANIMATIONS_GLOBAL_ID = 0, CURRENT_ANIMATIONS = {}, ANIMATION_END_EVENT_NAME, - ANIMATION__PROPERTY, + ANIMATION_PROPERTY, ANIMATION_NAME_PROPERTY, ANIMATION_DURATION_PROPERTY, ANIMATION_TIMING_FUNCTION_PROPERTY, @@ -15,18 +15,26 @@ var defineCSSProperties = function() if (this.done) return; - ANIMATION_END_EVENT_NAME = CPBrowserStyleProperty("animationend"), - ANIMATION_PROPERTY = CPBrowserCSSProperty("animation"), - ANIMATION_NAME_PROPERTY = CPBrowserCSSProperty("animation-name"), - ANIMATION_DURATION_PROPERTY = CPBrowserCSSProperty("animation-duration"), - ANIMATION_TIMING_FUNCTION_PROPERTY = CPBrowserCSSProperty("animation-timing-function"), - ANIMATION_FILL_MODE_PROPERTY = CPBrowserCSSProperty("animation-fill-mode"), - ANIMATION_KEYFRAMES_RULE = "@" + ANIMATION_PROPERTY.substring(0, ANIMATION_PROPERTY.indexOf("animation")) + "keyframes"; + ANIMATION_END_EVENT_NAME = CPBrowserStyleProperty("animationend"); + ANIMATION_PROPERTY = CPBrowserCSSProperty("animation"); + ANIMATION_NAME_PROPERTY = CPBrowserCSSProperty("animation-name"); + ANIMATION_DURATION_PROPERTY = CPBrowserCSSProperty("animation-duration"); + ANIMATION_TIMING_FUNCTION_PROPERTY = CPBrowserCSSProperty("animation-timing-function"); + ANIMATION_FILL_MODE_PROPERTY = CPBrowserCSSProperty("animation-fill-mode"); + ANIMATION_KEYFRAMES_RULE = "@" + ANIMATION_PROPERTY.substring(0, ANIMATION_PROPERTY.indexOf("animation")) + "keyframes"; this.done = true; -} +}; -CSSAnimation = function(aTarget/*DOM Element*/, anIdentifier) +var removeFromParent = function(aNode) +{ + var parentNode = aNode.parentNode; + + if (parentNode) + parentNode.removeChild(aNode); +}; + +CSSAnimation = function(aTarget/* DOM Element */, anIdentifier, aTargetName) { defineCSSProperties(); @@ -37,11 +45,14 @@ CSSAnimation = function(aTarget/*DOM Element*/, anIdentifier) animation = CURRENT_ANIMATIONS[anIdentifier]; if (animation) - console.warn("Animation "+ anIdentifier + " is already in use. Ignoring."); + { + console.warn("Animation " + anIdentifier + " is already in use. Ignoring."); + } else { this.target = aTarget; this.identifier = anIdentifier; + this.targetName = aTargetName; this.animationName = animationName; this.listener = null; this.styleElement = null; @@ -51,32 +62,38 @@ CSSAnimation = function(aTarget/*DOM Element*/, anIdentifier) this.animationsdurations = []; this.islive = false; this.didBuildDOMElements = false; - this.removeAnimationPropertyOnCompletion = true; animation = this; CURRENT_ANIMATIONS[anIdentifier] = animation; } return animation; +}; + +CSSAnimation.prototype.description = function() +{ + return ""; } -CSSAnimation.prototype.addPropertyAnimation = function(propertyName/*String*/, valueFunction/*Function*/, aDuration/*float*/, aKeyTimes/*d, [d]*/, aValues/*Array*/, aTimingFunctions/*[d,d,d,d],[[d,d,d,d]]*/, aCompletionfunction/*Function*/) +CSSAnimation.prototype.addPropertyAnimation = function(propertyName/* String */, valueFunction/* Function */, aDuration/* float */, aKeyTimes/* (d, [d]) */, aValues/* Array */, aTimingFunctions/* [d,d,d,d], [[d,d,d,d]] */, aCompletionfunction/* Function */) { if (this.islive) return false; // TODO: If a property already exist, replace its values & valueFunctions. - var name = this.animationName + "_" + propertyName; + var fullAnimationName = this.animationName + "_" + propertyName; - var animation = {name:name, - property:propertyName, - valuefunction:valueFunction, - keytimes:aKeyTimes, - values:aValues, - duration:aDuration, - completionfunction:aCompletionfunction}; + var animation = { + name: fullAnimationName, + property: propertyName, + valuefunction: valueFunction, + keytimes: aKeyTimes, + values: aValues, + duration: aDuration, + completionfunction: aCompletionfunction }; var animationTimingFunction; + if (aTimingFunctions && (aTimingFunctions[0] instanceof Array)) { animation.keyframestimingFunctions = aTimingFunctions; @@ -84,22 +101,25 @@ CSSAnimation.prototype.addPropertyAnimation = function(propertyName/*String*/, v animationTimingFunction = "linear"; } else + { animationTimingFunction = "cubic-bezier(" + aTimingFunctions + ")"; + } this.animationstimingfunctions.push(animationTimingFunction); this.propertyanimations.push(animation); - this.animationsnames.push(name); + this.animationsnames.push(fullAnimationName); this.animationsdurations.push(aDuration + "s"); return true; -} +}; CSSAnimation.prototype.keyFrames = function() { var keyframesRules = []; var count = this.propertyanimations.length; + for (var i = 0; i < count; i++) { var animation = this.propertyanimations[i], @@ -119,7 +139,7 @@ CSSAnimation.prototype.keyFrames = function() value = values[j], timingFunction; - if (valuefunction !== nil) + if (valuefunction !== null) value = valuefunction(start_value, value); var keyframeContent = property + ": " + value + ";"; @@ -130,15 +150,17 @@ CSSAnimation.prototype.keyFrames = function() } var keyframe = "\t" + Math.round(keytime * 100) + "% {\n\t\t" + keyframeContent + "\n\t}\n"; + keyframes.push(keyframe); } // TODO ! Add keyframe rule to CPCompatibility var rule = ANIMATION_KEYFRAMES_RULE + " " + animation.name + " {\n" + keyframes.join(" ") + "}\n"; + keyframesRules.push(rule); } return keyframesRules.join("\n"); -} +}; CSSAnimation.prototype.appendKeyFramesRule = function() { @@ -148,20 +170,21 @@ CSSAnimation.prototype.appendKeyFramesRule = function() styleElement.appendChild(nodeText); document.head.appendChild(styleElement); -} +}; CSSAnimation.prototype.createKeyFramesStyleElement = function() { if (!this.styleElement) { var styleElement = document.createElement("style"); + styleElement.setAttribute("type", "text/css"); this.styleElement = styleElement; } return this.styleElement; -} +}; CSSAnimation.prototype.endEventListener = function() { @@ -174,30 +197,33 @@ CSSAnimation.prototype.endEventListener = function() var AnimationEndListener = function(event) { var idx = inFlightAnimationsNames.indexOf(event.animationName); + if (idx !== -1) inFlightAnimationsNames.splice(idx, 1); - if (inFlightAnimationsNames.length == 0) + if (inFlightAnimationsNames.length > 0) + return; + + for (var i = 0; i < animationsNames.length; i++) { - for (var i = 0; i < animationsNames.length; i++) - { - var completion = animation.completionFunctionForAnimationName(animationsNames[i]); - if (completion) - completion(); - } + var completion = animation.completionFunctionForAnimationName(animationsNames[i]); - var eventTarget = event.target, - style = eventTarget.style; + if (completion) + completion(); + } - if (animation.removeAnimationPropertyOnCompletion) - style.removeProperty(ANIMATION_NAME_PROPERTY); + var eventTarget = event.target, + style = eventTarget.style; + try + { + style.removeProperty(ANIMATION_NAME_PROPERTY); style.removeProperty(ANIMATION_DURATION_PROPERTY); style.removeProperty(ANIMATION_FILL_MODE_PROPERTY); style.removeProperty("-webkit-backface-visibility"); if (animation.animationstimingfunctions.length) - style.removeProperty(ANIMATION_TIMING_FUNCTION_PROPERTY); + style.removeProperty(ANIMATION_TIMING_FUNCTION_PROPERTY); removeFromParent(animation.styleElement); @@ -205,13 +231,17 @@ CSSAnimation.prototype.endEventListener = function() animation.listener = null; delete (CURRENT_ANIMATIONS[animation.identifier]); } + catch (err) + { + console.warn("CSSAnimation.j - " + err); + } }; this.listener = AnimationEndListener; } return this.listener; -} +}; CSSAnimation.prototype.completionFunctionForAnimationName = function(aName) { @@ -221,18 +251,20 @@ CSSAnimation.prototype.completionFunctionForAnimationName = function(aName) while (count--) { var anim = propanims[count]; - if (anim.name == aName) + + if (anim.name === aName) return anim.completionfunction; } return null; -} +}; CSSAnimation.prototype.addAnimationEndEventListener = function() { var listener = this.endEventListener(); + this.target.addEventListener(ANIMATION_END_EVENT_NAME, listener, false); -} +}; CSSAnimation.prototype.setTargetStyleProperties = function() { @@ -247,7 +279,7 @@ CSSAnimation.prototype.setTargetStyleProperties = function() // http://webdesign.tutsplus.com/tutorials/htmlcss-tutorials/css3-animations-the-hiccups-and-bugs-youll-want-to-avoid/ style.setProperty("-webkit-backface-visibility", "hidden"); -} +}; CSSAnimation.prototype.buildDOMElements = function() { @@ -258,16 +290,11 @@ CSSAnimation.prototype.buildDOMElements = function() this.setTargetStyleProperties(); this.didBuildDOMElements = true; -} - -CSSAnimation.prototype.setRemoveAnimationPropertyOnCompletion = function(flag) -{ - this.removeAnimationPropertyOnCompletion = flag; -} +}; CSSAnimation.prototype.start = function() { - if (this.propertyanimations.length == 0 || this.islive) + if (this.propertyanimations.length === 0 || this.islive) return false; if (!this.didBuildDOMElements) @@ -278,11 +305,4 @@ CSSAnimation.prototype.start = function() this.islive = true; return true; -} - -var removeFromParent= function(aNode) -{ - var parentNode = aNode.parentNode; - if (parentNode) - parentNode.removeChild(aNode); -} +}; diff --git a/AppKit/CoreAnimation/_CPObjectAnimator.j b/AppKit/CoreAnimation/_CPObjectAnimator.j index 289d079f0..944327057 100644 --- a/AppKit/CoreAnimation/_CPObjectAnimator.j +++ b/AppKit/CoreAnimation/_CPObjectAnimator.j @@ -20,12 +20,13 @@ var _supportsCSSAnimations = null; id _target; } -+ (BOOL)supportsCSSAnimations ++ (BOOL)initialize { - if (_supportsCSSAnimations === null) - _supportsCSSAnimations = CPBrowserCSSProperty("animation"); + if ([self class] !== [_CPObjectAnimator class]) + return; - return _supportsCSSAnimations; + var compat = (CPBrowserCSSProperty("animation") !== nil); + CPSetPlatformFeature(CPCSSAnimationFeature, compat); } - (id)initWithTarget:(id)aTarget @@ -77,11 +78,11 @@ var _supportsCSSAnimations = null; var animation = [_target animationForKey:aKeyPath], context = [CPAnimationContext currentContext]; - if (!animation || ![animation isKindOfClass:[CAAnimation class]] || (![context duration] && ![animation duration]) || ![_CPObjectAnimator supportsCSSAnimations]) + if (!animation || ![animation isKindOfClass:[CAAnimation class]] || (![context duration] && ![animation duration]) || !CPFeatureIsCompatible(CPCSSAnimationFeature)) [_target setValue:aTargetValue forKey:aKeyPath]; else { - [context _enqueueActionForObject:_target keyPath:aKeyPath targetValue:aTargetValue completionHandler:function() + [context _enqueueActionForObject:_target keyPath:aKeyPath targetValue:aTargetValue animationCompletion:function() { [_target setValue:aTargetValue forKey:aKeyPath]; }]; diff --git a/AppKit/CoreAnimation/jshashtable.j b/AppKit/CoreAnimation/jshashtable.j deleted file mode 100644 index f685e9b38..000000000 --- a/AppKit/CoreAnimation/jshashtable.j +++ /dev/null @@ -1,370 +0,0 @@ -/** - * Copyright 2010 Tim Down. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * jshashtable - * - * jshashtable is a JavaScript implementation of a hash table. It creates a single constructor function called Hashtable - * in the global scope. - * - * Author: Tim Down - * Version: 2.1 - * Build date: 21 March 2010 - * Website: http://www.timdown.co.uk/jshashtable - */ - -Hashtable = (function() { - var FUNCTION = "function"; - - var arrayRemoveAt = (typeof Array.prototype.splice == FUNCTION) ? - function(arr, idx) { - arr.splice(idx, 1); - } : - - function(arr, idx) { - var itemsAfterDeleted, i, len; - if (idx === arr.length - 1) { - arr.length = idx; - } else { - itemsAfterDeleted = arr.slice(idx + 1); - arr.length = idx; - for (i = 0, len = itemsAfterDeleted.length; i < len; ++i) { - arr[idx + i] = itemsAfterDeleted[i]; - } - } - }; - - function hashObject(obj) { - var hashCode; - if (typeof obj == "string") { - return obj; - } else if (typeof obj.hashCode == FUNCTION) { - // Check the hashCode method really has returned a string - hashCode = obj.hashCode(); - return (typeof hashCode == "string") ? hashCode : hashObject(hashCode); - } else if (typeof obj.toString == FUNCTION) { - return obj.toString(); - } else { - try { - return String(obj); - } catch (ex) { - // For host objects (such as ActiveObjects in IE) that have no toString() method and throw an error when - // passed to String() - return Object.prototype.toString.call(obj); - } - } - } - - function equals_fixedValueHasEquals(fixedValue, variableValue) { - return fixedValue.equals(variableValue); - } - - function equals_fixedValueNoEquals(fixedValue, variableValue) { - return (typeof variableValue.equals == FUNCTION) ? - variableValue.equals(fixedValue) : (fixedValue === variableValue); - } - - function createKeyValCheck(kvStr) { - return function(kv) { - if (kv === null) { - throw new Error("null is not a valid " + kvStr); - } else if (typeof kv == "undefined") { - throw new Error(kvStr + " must not be undefined"); - } - }; - } - - var checkKey = createKeyValCheck("key"), checkValue = createKeyValCheck("value"); - - /*----------------------------------------------------------------------------------------------------------------*/ - - function Bucket(hash, firstKey, firstValue, equalityFunction) { - this[0] = hash; - this.entries = []; - this.addEntry(firstKey, firstValue); - - if (equalityFunction !== null) { - this.getEqualityFunction = function() { - return equalityFunction; - }; - } - } - - var EXISTENCE = 0, ENTRY = 1, ENTRY_INDEX_AND_VALUE = 2; - - function createBucketSearcher(mode) { - return function(key) { - var i = this.entries.length, entry, equals = this.getEqualityFunction(key); - while (i--) { - entry = this.entries[i]; - if ( equals(key, entry[0]) ) { - switch (mode) { - case EXISTENCE: - return true; - case ENTRY: - return entry; - case ENTRY_INDEX_AND_VALUE: - return [ i, entry[1] ]; - } - } - } - return false; - }; - } - - function createBucketLister(entryProperty) { - return function(aggregatedArr) { - var startIndex = aggregatedArr.length; - for (var i = 0, len = this.entries.length; i < len; ++i) { - aggregatedArr[startIndex + i] = this.entries[i][entryProperty]; - } - }; - } - - Bucket.prototype = { - getEqualityFunction: function(searchValue) { - return (typeof searchValue.equals == FUNCTION) ? equals_fixedValueHasEquals : equals_fixedValueNoEquals; - }, - - getEntryForKey: createBucketSearcher(ENTRY), - - getEntryAndIndexForKey: createBucketSearcher(ENTRY_INDEX_AND_VALUE), - - removeEntryForKey: function(key) { - var result = this.getEntryAndIndexForKey(key); - if (result) { - arrayRemoveAt(this.entries, result[0]); - return result[1]; - } - return null; - }, - - addEntry: function(key, value) { - this.entries[this.entries.length] = [key, value]; - }, - - keys: createBucketLister(0), - - values: createBucketLister(1), - - getEntries: function(entries) { - var startIndex = entries.length; - for (var i = 0, len = this.entries.length; i < len; ++i) { - // Clone the entry stored in the bucket before adding to array - entries[startIndex + i] = this.entries[i].slice(0); - } - }, - - containsKey: createBucketSearcher(EXISTENCE), - - containsValue: function(value) { - var i = this.entries.length; - while (i--) { - if ( value === this.entries[i][1] ) { - return true; - } - } - return false; - } - }; - - /*----------------------------------------------------------------------------------------------------------------*/ - - // Supporting functions for searching hashtable buckets - - function searchBuckets(buckets, hash) { - var i = buckets.length, bucket; - while (i--) { - bucket = buckets[i]; - if (hash === bucket[0]) { - return i; - } - } - return null; - } - - function getBucketForHash(bucketsByHash, hash) { - var bucket = bucketsByHash[hash]; - - // Check that this is a genuine bucket and not something inherited from the bucketsByHash's prototype - return ( bucket && (bucket instanceof Bucket) ) ? bucket : null; - } - - /*----------------------------------------------------------------------------------------------------------------*/ - - function Hashtable(hashingFunctionParam, equalityFunctionParam) { - var that = this; - var buckets = []; - var bucketsByHash = {}; - - var hashingFunction = (typeof hashingFunctionParam == FUNCTION) ? hashingFunctionParam : hashObject; - var equalityFunction = (typeof equalityFunctionParam == FUNCTION) ? equalityFunctionParam : null; - - this.put = function(key, value) { - checkKey(key); - checkValue(value); - var hash = hashingFunction(key), bucket, bucketEntry, oldValue = null; - - // Check if a bucket exists for the bucket key - bucket = getBucketForHash(bucketsByHash, hash); - if (bucket) { - // Check this bucket to see if it already contains this key - bucketEntry = bucket.getEntryForKey(key); - if (bucketEntry) { - // This bucket entry is the current mapping of key to value, so replace old value and we're done. - oldValue = bucketEntry[1]; - bucketEntry[1] = value; - } else { - // The bucket does not contain an entry for this key, so add one - bucket.addEntry(key, value); - } - } else { - // No bucket exists for the key, so create one and put our key/value mapping in - bucket = new Bucket(hash, key, value, equalityFunction); - buckets[buckets.length] = bucket; - bucketsByHash[hash] = bucket; - } - return oldValue; - }; - - this.get = function(key) { - checkKey(key); - - var hash = hashingFunction(key); - - // Check if a bucket exists for the bucket key - var bucket = getBucketForHash(bucketsByHash, hash); - if (bucket) { - // Check this bucket to see if it contains this key - var bucketEntry = bucket.getEntryForKey(key); - if (bucketEntry) { - // This bucket entry is the current mapping of key to value, so return the value. - return bucketEntry[1]; - } - } - return null; - }; - - this.containsKey = function(key) { - checkKey(key); - var bucketKey = hashingFunction(key); - - // Check if a bucket exists for the bucket key - var bucket = getBucketForHash(bucketsByHash, bucketKey); - - return bucket ? bucket.containsKey(key) : false; - }; - - this.containsValue = function(value) { - checkValue(value); - var i = buckets.length; - while (i--) { - if (buckets[i].containsValue(value)) { - return true; - } - } - return false; - }; - - this.clear = function() { - buckets.length = 0; - bucketsByHash = {}; - }; - - this.isEmpty = function() { - return !buckets.length; - }; - - var createBucketAggregator = function(bucketFuncName) { - return function() { - var aggregated = [], i = buckets.length; - while (i--) { - buckets[i][bucketFuncName](aggregated); - } - return aggregated; - }; - }; - - this.keys = createBucketAggregator("keys"); - this.values = createBucketAggregator("values"); - this.entries = createBucketAggregator("getEntries"); - - this.remove = function(key) { - checkKey(key); - - var hash = hashingFunction(key), bucketIndex, oldValue = null; - - // Check if a bucket exists for the bucket key - var bucket = getBucketForHash(bucketsByHash, hash); - - if (bucket) { - // Remove entry from this bucket for this key - oldValue = bucket.removeEntryForKey(key); - if (oldValue !== null) { - // Entry was removed, so check if bucket is empty - if (!bucket.entries.length) { - // Bucket is empty, so remove it from the bucket collections - bucketIndex = searchBuckets(buckets, hash); - arrayRemoveAt(buckets, bucketIndex); - delete bucketsByHash[hash]; - } - } - } - return oldValue; - }; - - this.size = function() { - var total = 0, i = buckets.length; - while (i--) { - total += buckets[i].entries.length; - } - return total; - }; - - this.each = function(callback) { - var entries = that.entries(), i = entries.length, entry; - while (i--) { - entry = entries[i]; - callback(entry[0], entry[1]); - } - }; - - this.putAll = function(hashtable, conflictCallback) { - var entries = hashtable.entries(); - var entry, key, value, thisValue, i = entries.length; - var hasConflictCallback = (typeof conflictCallback == FUNCTION); - while (i--) { - entry = entries[i]; - key = entry[0]; - value = entry[1]; - - // Check for a conflict. The default behaviour is to overwrite the value for an existing key - if ( hasConflictCallback && (thisValue = that.get(key)) ) { - value = conflictCallback(key, thisValue, value); - } - that.put(key, value); - } - }; - - this.clone = function() { - var clone = new Hashtable(hashingFunctionParam, equalityFunctionParam); - clone.putAll(that); - return clone; - }; - } - - return Hashtable; -})(); \ No newline at end of file diff --git a/AppKit/CoreGraphics/CGContext.j b/AppKit/CoreGraphics/CGContext.j index ed518129a..158169cff 100644 --- a/AppKit/CoreGraphics/CGContext.j +++ b/AppKit/CoreGraphics/CGContext.j @@ -24,6 +24,7 @@ @import "CPCompatibility.j" @import "CGGeometry.j" @import "CGPath.j" +@import "CGContextText.j" @typedef CGContext diff --git a/AppKit/CoreGraphics/CGContextText.j b/AppKit/CoreGraphics/CGContextText.j new file mode 100644 index 000000000..92cf30c9d --- /dev/null +++ b/AppKit/CoreGraphics/CGContextText.j @@ -0,0 +1,86 @@ +/* + * CGContextText.j + * CoreText + * + * Created by Nicholas Small. + * Copyright 2011, 280 North, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +kCGTextFill = 0; +kCGTextStroke = 1; +kCGTextFillStroke = 2; +kCGTextInvisible = 3; + +function CGContextGetTextMatrix(/* CGContext */ aContext) +{ + return aContext._textMatrix; +} + +function CGContextSetTextMatrix(/* CGContext */ aContext, /* CGAffineTransform */ aTransform) +{ + aContext._textMatrix = aTransform; +} + +function CGContextGetTextPosition(/* CGContext */ aContext) +{ + return aContext._textPosition || _CGPointMakeZero(); +} + +function CGContextSetTextPosition(/* CGContext */ aContext, /* float */ x, /* float */ y) +{ + aContext._textPosition = CGPointMake(x, y); +} + +function CGContextGetFont(/* CGContext */ aContext) +{ + return aContext._CPFont; +} + +function CGContextSelectFont(/* CGContext */ aContext, /* CPFont */ aFont) +{ + aContext.font = [aFont cssString]; + aContext._CPFont = aFont; +} + +function CGContextSetTextDrawingMode(/* CGContext */ aContext, /* CGTextDrawingMode */ aMode) +{ + aContext._textDrawingMode = aMode; +} + +function CGContextShowText(/* CGContext */ aContext, /* CPString */ aString) +{ + CGContextShowTextAtPoint(aContext, aContext._textPosition.x, aContext._textPosition.y, aString); +} + +function CGContextShowTextAtPoint(/* CGContext */ aContext, /* float */ x, /* float */ y, /* CPString */ aString) +{ + aContext.textBaseline = @"middle"; + aContext.textAlign = @"left"; + + var mode = aContext._textDrawingMode; + if (!mode && mode !== 0) + mode = kCGTextFill; + + var width = aContext.measureText(aString).width; + + if (mode === kCGTextFill || mode === kCGTextFillStroke) + aContext.fillText(aString, x, y); + if (mode === kCGTextStroke || mode === kCGTextFillStroke) + aContext.strokeText(aString, x, y); + + aContext._textPosition = CGPointMake(x + width, y); +} diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index f73c9205f..16b1a4954 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -60,6 +60,7 @@ var PrimaryPlatformWindow = NULL; BOOL _mouseIsDown; BOOL _mouseDownIsRightClick; + int _firstMouseDownButton; CGPoint _lastMouseEventLocation; CPWindow _mouseDownWindow; CPTimeInterval _lastMouseUp; diff --git a/AppKit/Platform/DOM/CPPlatformPasteboard.j b/AppKit/Platform/DOM/CPPlatformPasteboard.j index e749a1fae..9ca0b3141 100644 --- a/AppKit/Platform/DOM/CPPlatformPasteboard.j +++ b/AppKit/Platform/DOM/CPPlatformPasteboard.j @@ -384,9 +384,10 @@ Return true if the event may be a copy and paste event, but the target is not an if ([value length]) { - var pasteboard = [CPPasteboard generalPasteboard]; + var pasteboard = [CPPasteboard generalPasteboard], + cappString = [pasteboard stringForType:CPStringPboardType]; - if ([pasteboard _stateUID] != value) + if (cappString != value) { [pasteboard declareTypes:[CPStringPboardType] owner:self]; [pasteboard setString:value forType:CPStringPboardType]; @@ -450,9 +451,10 @@ Return true if the event may be a copy and paste event, but the target is not an if ([value length]) { - var pasteboard = [CPPasteboard generalPasteboard]; + var pasteboard = [CPPasteboard generalPasteboard], + cappString = [pasteboard stringForType:CPStringPboardType]; - if ([pasteboard _stateUID] != value) + if (cappString != value) { [pasteboard declareTypes:[CPStringPboardType] owner:self]; [pasteboard setString:value forType:CPStringPboardType]; diff --git a/AppKit/Platform/DOM/CPPlatformString.j b/AppKit/Platform/DOM/CPPlatformString.j index 844eeea3e..fb440d36d 100644 --- a/AppKit/Platform/DOM/CPPlatformString.j +++ b/AppKit/Platform/DOM/CPPlatformString.j @@ -171,7 +171,9 @@ var DOMFixedWidthSpanElement = nil, span.style.width = ROUND(aWidth) + "px"; } - span.style.font = [(aFont || DefaultFont) cssString]; + var effectiveFontCSSString = [(aFont || DefaultFont) cssString]; + if (span.style.font !== effectiveFontCSSString) + span.style.font = effectiveFontCSSString; if (CPFeatureIsCompatible(CPJavaScriptInnerTextFeature)) span.innerText = aString; diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index fa54e8892..360fbf9f1 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -952,8 +952,8 @@ _CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotificatio timestamp:timestamp windowNumber:windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]; event._DOMEvent = aDOMEvent; - // We lag 1 event behind without this timeout. - setTimeout(function() + // We lag 1 event behind without this approach + window.requestAnimationFrame(function() { if (aDOMEvent.deltaMode !== undefined && aDOMEvent.deltaMode !== 0) { @@ -992,10 +992,10 @@ _CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotificatio _DOMScrollingElement.scrollLeft = 150; _DOMScrollingElement.scrollTop = 150; - // Is this needed? - //[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + // this is needed to prevent flickering during scrolling + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; - }, 0); + }); // We hide the dom element after a little bit // so that other DOM elements such as inputs @@ -1171,7 +1171,11 @@ _CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotificatio var touch = aDOMEvent.touches.length ? aDOMEvent.touches[0] : aDOMEvent.changedTouches[0]; newEvent.clientX = touch.clientX; - newEvent.clientY = touch.clientY; + + /* + Normally the document can't scroll in Cappuccino: our body element has top:0 and bottom:0 with absolute positioning. So it should always be exactly the height of the viewport. The below handles a special case. iOS scrolls the document when the virtual keyboard is present and it needs to move a text input upwards visually to avoid covering the input with the keyboard. For most purposes we can ignore this, except here. In theory I think we could always apply this (scrollTop should always be 0 on every other device and situation) but let's be defensive and only apply it for touch events to minimise the risk of surprises. + */ + newEvent.clientY = _DOMWindow.document.body.scrollTop + touch.clientY; newEvent.timestamp = [CPEvent currentTimestamp]; newEvent.target = aDOMEvent.target; @@ -1245,12 +1249,16 @@ _CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotificatio { if (_mouseIsDown) { + if (aDOMEvent.button !== _firstMouseDownButton) + return; + event = _CPEventFromNativeMouseEvent(aDOMEvent, _mouseDownIsRightClick ? CPRightMouseUp : CPLeftMouseUp, location, modifierFlags, timestamp, windowNumber, nil, -1, CPDOMEventGetClickCount(_lastMouseUp, timestamp, location), 0, nil); _mouseIsDown = NO; _lastMouseUp = event; _mouseDownWindow = nil; _mouseDownIsRightClick = NO; + _firstMouseDownButton = -1; } if (_DOMEventMode) @@ -1270,6 +1278,16 @@ _CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotificatio _mouseDownIsRightClick = button == 2 || (CPBrowserIsOperatingSystem(CPMacOperatingSystem) && button == 0 && modifierFlags & CPControlKeyMask); + // If mouse is already down, that means that a second mouse button is pushed. This could interfere in mouse events treatment. Just ignore it. + // BUT we have to track which button will be first released. + if (_mouseIsDown) + { + _mouseDownIsRightClick = !_mouseDownIsRightClick; + return; + } + + _firstMouseDownButton = button; + if ((sourceElement.tagName === "INPUT" || sourceElement.tagName === "TEXTAREA") && sourceElement != _DOMFocusElement) { if ([CPPlatform supportsDragAndDrop]) diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 31bd445ac..6902f92c7 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -389,8 +389,11 @@ var themedButtonValues = nil, var color = [CPColor blackColor], themedColorValues = [ - [@"alternate-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]], - [@"secondary-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]] + [@"alternate-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]], + [@"secondary-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]], + [@"selected-text-background-color", [CPColor colorWithHexString:"99CCFF"]], + [@"selected-text-inactive-background-color", [CPColor colorWithHexString:"CCCCCC"]] + ]; [self registerThemeValues:themedColorValues forObject:color]; diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index ee6917791..365cadba0 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -106,8 +106,10 @@ var themedButtonValues = nil, var color = [CPColor redColor], themedColorValues = [ - [@"alternate-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]], - [@"secondary-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]] + [@"alternate-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]], + [@"secondary-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]], + [@"selected-text-background-color", [CPColor colorWithHexString:"99CCFF"]], + [@"selected-text-inactive-background-color", [CPColor colorWithHexString:"CCCCCC"]] ]; [self registerThemeValues:themedColorValues forObject:color]; diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index 1a02755f5..38721d086 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -66,6 +66,7 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, CPString _text; CGSize _textSize; + BOOL _usesSingleLineMode @accessors; unsigned _flags; @@ -107,6 +108,8 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, } _textSize = nil; + _usesSingleLineMode = NO; + [self setHitTests:NO]; } @@ -550,14 +553,16 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, case CPLineBreakByCharWrapping: case CPLineBreakByWordWrapping: textStyle.wordWrap = "break-word"; - try { + try + { textStyle.whiteSpace = "pre"; textStyle.whiteSpace = "-o-pre-wrap"; textStyle.whiteSpace = "-pre-wrap"; textStyle.whiteSpace = "-moz-pre-wrap"; textStyle.whiteSpace = "pre-wrap"; } - catch (e) { + catch (e) + { //internet explorer doesn't like these properties textStyle.whiteSpace = "pre"; } @@ -723,6 +728,9 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, _lineBreakMode === CPLineBreakByWordWrapping) { _textSize = [_text sizeWithFont:_font inWidth:textRectWidth]; + + if (_usesSingleLineMode) + _textSize.height = [_font defaultLineHeightForFont]; } else { diff --git a/CommonJS/lib/cappuccino/nativehost.js b/CommonJS/lib/cappuccino/nativehost.js deleted file mode 100644 index 8def87642..000000000 --- a/CommonJS/lib/cappuccino/nativehost.js +++ /dev/null @@ -1,70 +0,0 @@ -var FILE = require("file"); -var OS = require("os"); - -var NATIVEHOST_SOURCE = FILE.path(module.path).dirname().dirname().dirname().join("support", "NativeHost.app"); - -exports.buildNativeHost = function(rootPath, buildNative, options) { - options = options || {}; - options.index = options.index || "index.html"; - - rootPath = FILE.path(rootPath); - buildNative = FILE.path(buildNative); - - if (buildNative.exists()) - buildNative.rmtree(); - - buildNative.dirname().mkdirs(); - // FIXME: Narwhal doesn't preserve permissions - // FILE.copyTree(NATIVEHOST_SOURCE, buildNative); - OS.system(["cp", "-r", NATIVEHOST_SOURCE, buildNative]); - FILE.chmod(buildNative.join("Contents", "MacOS", "NativeHost"), 0755); - - var rootBaseName = rootPath.basename(); - var buildClientDirectory = buildNative.join("Contents", "Resources", rootBaseName); - - FILE.mkdirs(FILE.dirname(buildClientDirectory)); - // FILE.copyTree(rootPath, buildClientDirectory); - OS.system(["cp", "-r", rootPath, buildClientDirectory]); - - var defaultBundleName = buildNative.basename().match(/^(.*)(\.app)?$/)[1]; - - function mergePlist(plist, path) { - var otherPlist = CFPropertyList.readPropertyListFromFile(String(path)); - - otherPlist.keys().forEach(function(key) { - var value = otherPlist.valueForKey(key); - plist.setValueForKey(key, value); - - if (key === "CPBundleName") - plist.setValueForKey("CFBundleName", value); - - if (key === "CFBundleIconFile") { - var iconPath = rootPath.join("Resources", value); - if (iconPath.isFile()) - iconPath.copy(buildNative.join("Contents", "Resources", value)); - else - print("Warning: CFBundleIconFile references " + value + " but does not exist in the resources directory."); - } - - if (key === "CFBundleExecutable") { - buildNative.join("Contents", "MacOS", "NativeHost").rename(value); - // FIXME: - FILE.chmod(buildNative.join("Contents", "MacOS", value), 0755); - } - }); - } - - CFPropertyList.modifyPlist(buildNative.join("Contents", "Info.plist"), function(plist) { - - plist.setValueForKey("CFBundleName", defaultBundleName); - plist.setValueForKey("NHInitialResource", FILE.join(rootBaseName, options.index)); - - // merge Cappuccino plist - var cappPlistPath = rootPath.join("Info.plist"); - if (cappPlistPath.isFile()) - mergePlist(plist, cappPlistPath); - - if (options.extraPlistPath) - mergePlist(plist, options.extraPlistPath); - }); -} diff --git a/Foundation/CPCache.j b/Foundation/CPCache.j index 217758a6b..9292094a3 100644 --- a/Foundation/CPCache.j +++ b/Foundation/CPCache.j @@ -64,7 +64,7 @@ var CPCacheDelegate_cache_willEvictObject_ = 1 << 1; { CPDictionary _items; int _currentPosition; - BOOL _totalCostCache; + int _totalCostCache; unsigned _implementedDelegateMethods; CPString _name @accessors(property=name); @@ -374,4 +374,4 @@ var CPCacheDelegate_cache_willEvictObject_ = 1 << 1; return cacheItem; } -@end \ No newline at end of file +@end diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index 574873ef6..000a2c849 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -115,7 +115,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); */ - (id)initWithString:(CPString)description { - var format = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}) ([-+])(\d{2})(\d{2})/, + var format = new RegExp("(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2}) ([-+])(\\d{2})(\\d{2})"), d = description.match(new RegExp(format)); if (!d || d.length != 10) @@ -262,7 +262,7 @@ Date.parseISO8601 = function (date) // First, check for native parsing. timestamp = Date.parse(date); - if (isNaN(timestamp) && (struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) + if (isNaN(timestamp) && (struct = new RegExp("^(\\d{4}|[+\\-]\\d{6})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:(Z)|([+\\-])(\\d{2})(?::(\\d{2}))?)?)?$").exec(date))) { // avoid NaN timestamps caused by "undefined" values being passed to Date.UTC for (var i = 0, k; (k = numericKeys[i]); ++i) @@ -294,4 +294,4 @@ function _isNumberType(value) return YES; else return NO; -} \ No newline at end of file +} diff --git a/Foundation/CPDateFormatter.j b/Foundation/CPDateFormatter.j index f66179ba2..3624b7208 100644 --- a/Foundation/CPDateFormatter.j +++ b/Foundation/CPDateFormatter.j @@ -1931,7 +1931,7 @@ var defaultDateFormatterBehavior = CPDateFormatterBehavior10_4, */ - (int)_secondsFromTimeZoneDefaultFormatString:(CPString)aTimeZoneFormatString { - var format = /\w*([HPG-GMT])?([+-])(\d{1,2})([:])?(\d{2})\w*/, + var format = new RegExp("\\w*([HPG-GMT])?([+-])(\\d{1,2})([:])?(\\d{2})\\w*"), result = aTimeZoneFormatString.match(new RegExp(format)), seconds = 0; @@ -1969,7 +1969,7 @@ var defaultDateFormatterBehavior = CPDateFormatterBehavior10_4, var character = [aToken characterAtIndex:0], length = [aToken length], targetedArray, - format = /\w*([HPG-GMT])?([+-])(\d{1,2})([:])?(\d{2})\w*/, + format = new RegExp("\\w*([HPG-GMT])?([+-])(\\d{1,2})([:])?(\\d{2})\\w*"), result = aString.match(new RegExp(format)); switch (character) diff --git a/Foundation/CPDecimal.j b/Foundation/CPDecimal.j index 72fbe89cc..03e32124c 100644 --- a/Foundation/CPDecimal.j +++ b/Foundation/CPDecimal.j @@ -119,7 +119,7 @@ function CPDecimalMakeWithString(string, locale) // Note: this doesn't accept .01 for example, should it? // If yes simply add '?' after integer part group, i.e. ([+\-]?)((?:0|[1-9]\d*)?) // Note: now it accept .01 style. - var matches = string.match(/^([+\-]?)((?:0|[0-9]\d*)?)(?:\.(\d*))?(?:[eE]([+\-]?)(\d+))?$/); + var matches = string.match(new RegExp("^([+\\-]?)((?:0|[0-9]\\d*)?)(?:\\.(\\d*))?(?:[eE]([+\\-]?)(\\d+))?$")); if (!matches) return CPDecimalMakeNaN(); diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index 95c00d36a..e4b55f752 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -399,299 +399,299 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOpti - (void)_replaceModifiersForKey:(CPString)aKey { - if ([_replacedKeys containsObject:aKey] || ![_nativeClass automaticallyNotifiesObserversForKey:aKey]) - return; - - [_replacedKeys addObject:aKey]; - - var theClass = _nativeClass, - KVOClass = _targetObject.isa, - capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substring(1); - - // Attribute and To-One Relationships - var setKey_selector = sel_getUid("set" + capitalizedKey + ":"), - setKey_method = class_getInstanceMethod(theClass, setKey_selector); - - if (setKey_method) + if (![_replacedKeys containsObject:aKey] && [_nativeClass automaticallyNotifiesObserversForKey:aKey]) { - var setKey_method_imp = setKey_method.method_imp; + [_replacedKeys addObject:aKey]; - class_addMethod(KVOClass, setKey_selector, function(self, _cmd, anObject) + var theClass = _nativeClass, + KVOClass = _targetObject.isa, + capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substring(1); + + // Attribute and To-One Relationships + var setKey_selector = sel_getUid("set" + capitalizedKey + ":"), + setKey_method = class_getInstanceMethod(theClass, setKey_selector); + + if (setKey_method) { - [self willChangeValueForKey:aKey]; + var setKey_method_imp = setKey_method.method_imp; - setKey_method_imp(self, _cmd, anObject); - - [self didChangeValueForKey:aKey]; - }, setKey_method.method_types); - } - - // FIXME: Deprecated. - var _setKey_selector = sel_getUid("_set" + capitalizedKey + ":"), - _setKey_method = class_getInstanceMethod(theClass, _setKey_selector); - - if (_setKey_method) - { - var _setKey_method_imp = _setKey_method.method_imp; - - class_addMethod(KVOClass, _setKey_selector, function(self, _cmd, anObject) - { - [self willChangeValueForKey:aKey]; - - _setKey_method_imp(self, _cmd, anObject); - - [self didChangeValueForKey:aKey]; - }, _setKey_method.method_types); - } - - // Ordered To-Many Relationships - var insertObject_inKeyAtIndex_selector = sel_getUid("insertObject:in" + capitalizedKey + "AtIndex:"), - insertObject_inKeyAtIndex_method = - class_getInstanceMethod(theClass, insertObject_inKeyAtIndex_selector), - - insertKey_atIndexes_selector = sel_getUid("insert" + capitalizedKey + ":atIndexes:"), - insertKey_atIndexes_method = - class_getInstanceMethod(theClass, insertKey_atIndexes_selector), - - removeObjectFromKeyAtIndex_selector = sel_getUid("removeObjectFrom" + capitalizedKey + "AtIndex:"), - removeObjectFromKeyAtIndex_method = - class_getInstanceMethod(theClass, removeObjectFromKeyAtIndex_selector), - - removeKeyAtIndexes_selector = sel_getUid("remove" + capitalizedKey + "AtIndexes:"), - removeKeyAtIndexes_method = class_getInstanceMethod(theClass, removeKeyAtIndexes_selector); - - if ((insertObject_inKeyAtIndex_method || insertKey_atIndexes_method) && - (removeObjectFromKeyAtIndex_method || removeKeyAtIndexes_method)) - { - if (insertObject_inKeyAtIndex_method) - { - var insertObject_inKeyAtIndex_method_imp = insertObject_inKeyAtIndex_method.method_imp; - - class_addMethod(KVOClass, insertObject_inKeyAtIndex_selector, function(self, _cmd, anObject, anIndex) + class_addMethod(KVOClass, setKey_selector, function(self, _cmd, anObject) { - [self willChange:CPKeyValueChangeInsertion - valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] - forKey:aKey]; + [self willChangeValueForKey:aKey]; - insertObject_inKeyAtIndex_method_imp(self, _cmd, anObject, anIndex); + setKey_method_imp(self, _cmd, anObject); - [self didChange:CPKeyValueChangeInsertion - valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] - forKey:aKey]; - }, insertObject_inKeyAtIndex_method.method_types); + [self didChangeValueForKey:aKey]; + }, setKey_method.method_types); } - if (insertKey_atIndexes_method) + // FIXME: Deprecated. + var _setKey_selector = sel_getUid("_set" + capitalizedKey + ":"), + _setKey_method = class_getInstanceMethod(theClass, _setKey_selector); + + if (_setKey_method) { - var insertKey_atIndexes_method_imp = insertKey_atIndexes_method.method_imp; + var _setKey_method_imp = _setKey_method.method_imp; - class_addMethod(KVOClass, insertKey_atIndexes_selector, function(self, _cmd, objects, indexes) + class_addMethod(KVOClass, _setKey_selector, function(self, _cmd, anObject) { - [self willChange:CPKeyValueChangeInsertion - valuesAtIndexes:[indexes copy] - forKey:aKey]; + [self willChangeValueForKey:aKey]; - insertKey_atIndexes_method_imp(self, _cmd, objects, indexes); + _setKey_method_imp(self, _cmd, anObject); - [self didChange:CPKeyValueChangeInsertion - valuesAtIndexes:[indexes copy] - forKey:aKey]; - }, insertKey_atIndexes_method.method_types); + [self didChangeValueForKey:aKey]; + }, _setKey_method.method_types); } - if (removeObjectFromKeyAtIndex_method) + // Ordered To-Many Relationships + var insertObject_inKeyAtIndex_selector = sel_getUid("insertObject:in" + capitalizedKey + "AtIndex:"), + insertObject_inKeyAtIndex_method = + class_getInstanceMethod(theClass, insertObject_inKeyAtIndex_selector), + + insertKey_atIndexes_selector = sel_getUid("insert" + capitalizedKey + ":atIndexes:"), + insertKey_atIndexes_method = + class_getInstanceMethod(theClass, insertKey_atIndexes_selector), + + removeObjectFromKeyAtIndex_selector = sel_getUid("removeObjectFrom" + capitalizedKey + "AtIndex:"), + removeObjectFromKeyAtIndex_method = + class_getInstanceMethod(theClass, removeObjectFromKeyAtIndex_selector), + + removeKeyAtIndexes_selector = sel_getUid("remove" + capitalizedKey + "AtIndexes:"), + removeKeyAtIndexes_method = class_getInstanceMethod(theClass, removeKeyAtIndexes_selector); + + if ((insertObject_inKeyAtIndex_method || insertKey_atIndexes_method) && + (removeObjectFromKeyAtIndex_method || removeKeyAtIndexes_method)) { - var removeObjectFromKeyAtIndex_method_imp = removeObjectFromKeyAtIndex_method.method_imp; - - class_addMethod(KVOClass, removeObjectFromKeyAtIndex_selector, function(self, _cmd, anIndex) + if (insertObject_inKeyAtIndex_method) { - [self willChange:CPKeyValueChangeRemoval - valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] - forKey:aKey]; + var insertObject_inKeyAtIndex_method_imp = insertObject_inKeyAtIndex_method.method_imp; - removeObjectFromKeyAtIndex_method_imp(self, _cmd, anIndex); + class_addMethod(KVOClass, insertObject_inKeyAtIndex_selector, function(self, _cmd, anObject, anIndex) + { + [self willChange:CPKeyValueChangeInsertion + valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] + forKey:aKey]; - [self didChange:CPKeyValueChangeRemoval - valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] - forKey:aKey]; - }, removeObjectFromKeyAtIndex_method.method_types); + insertObject_inKeyAtIndex_method_imp(self, _cmd, anObject, anIndex); + + [self didChange:CPKeyValueChangeInsertion + valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] + forKey:aKey]; + }, insertObject_inKeyAtIndex_method.method_types); + } + + if (insertKey_atIndexes_method) + { + var insertKey_atIndexes_method_imp = insertKey_atIndexes_method.method_imp; + + class_addMethod(KVOClass, insertKey_atIndexes_selector, function(self, _cmd, objects, indexes) + { + [self willChange:CPKeyValueChangeInsertion + valuesAtIndexes:[indexes copy] + forKey:aKey]; + + insertKey_atIndexes_method_imp(self, _cmd, objects, indexes); + + [self didChange:CPKeyValueChangeInsertion + valuesAtIndexes:[indexes copy] + forKey:aKey]; + }, insertKey_atIndexes_method.method_types); + } + + if (removeObjectFromKeyAtIndex_method) + { + var removeObjectFromKeyAtIndex_method_imp = removeObjectFromKeyAtIndex_method.method_imp; + + class_addMethod(KVOClass, removeObjectFromKeyAtIndex_selector, function(self, _cmd, anIndex) + { + [self willChange:CPKeyValueChangeRemoval + valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] + forKey:aKey]; + + removeObjectFromKeyAtIndex_method_imp(self, _cmd, anIndex); + + [self didChange:CPKeyValueChangeRemoval + valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] + forKey:aKey]; + }, removeObjectFromKeyAtIndex_method.method_types); + } + + if (removeKeyAtIndexes_method) + { + var removeKeyAtIndexes_method_imp = removeKeyAtIndexes_method.method_imp; + + class_addMethod(KVOClass, removeKeyAtIndexes_selector, function(self, _cmd, indexes) + { + [self willChange:CPKeyValueChangeRemoval + valuesAtIndexes:[indexes copy] + forKey:aKey]; + + removeKeyAtIndexes_method_imp(self, _cmd, indexes); + + [self didChange:CPKeyValueChangeRemoval + valuesAtIndexes:[indexes copy] + forKey:aKey]; + }, removeKeyAtIndexes_method.method_types); + } + + // These are optional. + var replaceObjectInKeyAtIndex_withObject_selector = + sel_getUid("replaceObjectIn" + capitalizedKey + "AtIndex:withObject:"), + replaceObjectInKeyAtIndex_withObject_method = + class_getInstanceMethod(theClass, replaceObjectInKeyAtIndex_withObject_selector); + + if (replaceObjectInKeyAtIndex_withObject_method) + { + var replaceObjectInKeyAtIndex_withObject_method_imp = + replaceObjectInKeyAtIndex_withObject_method.method_imp; + + class_addMethod(KVOClass, replaceObjectInKeyAtIndex_withObject_selector, + function(self, _cmd, anIndex, anObject) + { + [self willChange:CPKeyValueChangeReplacement + valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] + forKey:aKey]; + + replaceObjectInKeyAtIndex_withObject_method_imp(self, _cmd, anIndex, anObject); + + [self didChange:CPKeyValueChangeReplacement + valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] + forKey:aKey]; + }, replaceObjectInKeyAtIndex_withObject_method.method_types); + } + + var replaceKeyAtIndexes_withKey_selector = + sel_getUid("replace" + capitalizedKey + "AtIndexes:with" + capitalizedKey + ":"), + replaceKeyAtIndexes_withKey_method = + class_getInstanceMethod(theClass, replaceKeyAtIndexes_withKey_selector); + + if (replaceKeyAtIndexes_withKey_method) + { + var replaceKeyAtIndexes_withKey_method_imp = replaceKeyAtIndexes_withKey_method.method_imp; + + class_addMethod(KVOClass, replaceKeyAtIndexes_withKey_selector, function(self, _cmd, indexes, objects) + { + [self willChange:CPKeyValueChangeReplacement + valuesAtIndexes:[indexes copy] + forKey:aKey]; + + replaceObjectInKeyAtIndex_withObject_method_imp(self, _cmd, indexes, objects); + + [self didChange:CPKeyValueChangeReplacement + valuesAtIndexes:[indexes copy] + forKey:aKey]; + }, replaceKeyAtIndexes_withKey_method.method_types); + } } - if (removeKeyAtIndexes_method) + // Unordered To-Many Relationships + var addKeyObject_selector = sel_getUid("add" + capitalizedKey + "Object:"), + addKeyObject_method = class_getInstanceMethod(theClass, addKeyObject_selector), + + addKey_selector = sel_getUid("add" + capitalizedKey + ":"), + addKey_method = class_getInstanceMethod(theClass, addKey_selector), + + removeKeyObject_selector = sel_getUid("remove" + capitalizedKey + "Object:"), + removeKeyObject_method = class_getInstanceMethod(theClass, removeKeyObject_selector), + + removeKey_selector = sel_getUid("remove" + capitalizedKey + ":"), + removeKey_method = class_getInstanceMethod(theClass, removeKey_selector); + + if ((addKeyObject_method || addKey_method) && (removeKeyObject_method || removeKey_method)) { - var removeKeyAtIndexes_method_imp = removeKeyAtIndexes_method.method_imp; - - class_addMethod(KVOClass, removeKeyAtIndexes_selector, function(self, _cmd, indexes) + if (addKeyObject_method) { - [self willChange:CPKeyValueChangeRemoval - valuesAtIndexes:[indexes copy] - forKey:aKey]; + var addKeyObject_method_imp = addKeyObject_method.method_imp; - removeKeyAtIndexes_method_imp(self, _cmd, indexes); + class_addMethod(KVOClass, addKeyObject_selector, function(self, _cmd, anObject) + { + [self willChangeValueForKey:aKey + withSetMutation:CPKeyValueUnionSetMutation + usingObjects:[CPSet setWithObject:anObject]]; - [self didChange:CPKeyValueChangeRemoval - valuesAtIndexes:[indexes copy] - forKey:aKey]; - }, removeKeyAtIndexes_method.method_types); - } + addKeyObject_method_imp(self, _cmd, anObject); - // These are optional. - var replaceObjectInKeyAtIndex_withObject_selector = - sel_getUid("replaceObjectIn" + capitalizedKey + "AtIndex:withObject:"), - replaceObjectInKeyAtIndex_withObject_method = - class_getInstanceMethod(theClass, replaceObjectInKeyAtIndex_withObject_selector); + [self didChangeValueForKey:aKey + withSetMutation:CPKeyValueUnionSetMutation + usingObjects:[CPSet setWithObject:anObject]]; + }, addKeyObject_method.method_types); + } - if (replaceObjectInKeyAtIndex_withObject_method) - { - var replaceObjectInKeyAtIndex_withObject_method_imp = - replaceObjectInKeyAtIndex_withObject_method.method_imp; - - class_addMethod(KVOClass, replaceObjectInKeyAtIndex_withObject_selector, - function(self, _cmd, anIndex, anObject) + if (addKey_method) { - [self willChange:CPKeyValueChangeReplacement - valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] - forKey:aKey]; + var addKey_method_imp = addKey_method.method_imp; - replaceObjectInKeyAtIndex_withObject_method_imp(self, _cmd, anIndex, anObject); + class_addMethod(KVOClass, addKey_selector, function(self, _cmd, objects) + { + [self willChangeValueForKey:aKey + withSetMutation:CPKeyValueUnionSetMutation + usingObjects:[objects copy]]; - [self didChange:CPKeyValueChangeReplacement - valuesAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] - forKey:aKey]; - }, replaceObjectInKeyAtIndex_withObject_method.method_types); - } + addKey_method_imp(self, _cmd, objects); - var replaceKeyAtIndexes_withKey_selector = - sel_getUid("replace" + capitalizedKey + "AtIndexes:with" + capitalizedKey + ":"), - replaceKeyAtIndexes_withKey_method = - class_getInstanceMethod(theClass, replaceKeyAtIndexes_withKey_selector); + [self didChangeValueForKey:aKey + withSetMutation:CPKeyValueUnionSetMutation + usingObjects:[objects copy]]; + }, addKey_method.method_types); + } - if (replaceKeyAtIndexes_withKey_method) - { - var replaceKeyAtIndexes_withKey_method_imp = replaceKeyAtIndexes_withKey_method.method_imp; - - class_addMethod(KVOClass, replaceKeyAtIndexes_withKey_selector, function(self, _cmd, indexes, objects) + if (removeKeyObject_method) { - [self willChange:CPKeyValueChangeReplacement - valuesAtIndexes:[indexes copy] - forKey:aKey]; + var removeKeyObject_method_imp = removeKeyObject_method.method_imp; - replaceObjectInKeyAtIndex_withObject_method_imp(self, _cmd, indexes, objects); + class_addMethod(KVOClass, removeKeyObject_selector, function(self, _cmd, anObject) + { + [self willChangeValueForKey:aKey + withSetMutation:CPKeyValueMinusSetMutation + usingObjects:[CPSet setWithObject:anObject]]; - [self didChange:CPKeyValueChangeReplacement - valuesAtIndexes:[indexes copy] - forKey:aKey]; - }, replaceKeyAtIndexes_withKey_method.method_types); - } - } + removeKeyObject_method_imp(self, _cmd, anObject); - // Unordered To-Many Relationships - var addKeyObject_selector = sel_getUid("add" + capitalizedKey + "Object:"), - addKeyObject_method = class_getInstanceMethod(theClass, addKeyObject_selector), + [self didChangeValueForKey:aKey + withSetMutation:CPKeyValueMinusSetMutation + usingObjects:[CPSet setWithObject:anObject]]; + }, removeKeyObject_method.method_types); + } - addKey_selector = sel_getUid("add" + capitalizedKey + ":"), - addKey_method = class_getInstanceMethod(theClass, addKey_selector), - - removeKeyObject_selector = sel_getUid("remove" + capitalizedKey + "Object:"), - removeKeyObject_method = class_getInstanceMethod(theClass, removeKeyObject_selector), - - removeKey_selector = sel_getUid("remove" + capitalizedKey + ":"), - removeKey_method = class_getInstanceMethod(theClass, removeKey_selector); - - if ((addKeyObject_method || addKey_method) && (removeKeyObject_method || removeKey_method)) - { - if (addKeyObject_method) - { - var addKeyObject_method_imp = addKeyObject_method.method_imp; - - class_addMethod(KVOClass, addKeyObject_selector, function(self, _cmd, anObject) + if (removeKey_method) { - [self willChangeValueForKey:aKey - withSetMutation:CPKeyValueUnionSetMutation - usingObjects:[CPSet setWithObject:anObject]]; + var removeKey_method_imp = removeKey_method.method_imp; - addKeyObject_method_imp(self, _cmd, anObject); + class_addMethod(KVOClass, removeKey_selector, function(self, _cmd, objects) + { + [self willChangeValueForKey:aKey + withSetMutation:CPKeyValueMinusSetMutation + usingObjects:[objects copy]]; - [self didChangeValueForKey:aKey - withSetMutation:CPKeyValueUnionSetMutation - usingObjects:[CPSet setWithObject:anObject]]; - }, addKeyObject_method.method_types); - } + removeKey_method_imp(self, _cmd, objects); - if (addKey_method) - { - var addKey_method_imp = addKey_method.method_imp; + [self didChangeValueForKey:aKey + withSetMutation:CPKeyValueMinusSetMutation + usingObjects:[objects copy]]; + }, removeKey_method.method_types); + } - class_addMethod(KVOClass, addKey_selector, function(self, _cmd, objects) + // intersect: is optional. + var intersectKey_selector = sel_getUid("intersect" + capitalizedKey + ":"), + intersectKey_method = class_getInstanceMethod(theClass, intersectKey_selector); + + if (intersectKey_method) { - [self willChangeValueForKey:aKey - withSetMutation:CPKeyValueUnionSetMutation - usingObjects:[objects copy]]; + var intersectKey_method_imp = intersectKey_method.method_imp; - addKey_method_imp(self, _cmd, objects); + class_addMethod(KVOClass, intersectKey_selector, function(self, _cmd, aSet) + { + [self willChangeValueForKey:aKey + withSetMutation:CPKeyValueIntersectSetMutation + usingObjects:[aSet copy]]; - [self didChangeValueForKey:aKey - withSetMutation:CPKeyValueUnionSetMutation - usingObjects:[objects copy]]; - }, addKey_method.method_types); - } + intersectKey_method_imp(self, _cmd, aSet); - if (removeKeyObject_method) - { - var removeKeyObject_method_imp = removeKeyObject_method.method_imp; - - class_addMethod(KVOClass, removeKeyObject_selector, function(self, _cmd, anObject) - { - [self willChangeValueForKey:aKey - withSetMutation:CPKeyValueMinusSetMutation - usingObjects:[CPSet setWithObject:anObject]]; - - removeKeyObject_method_imp(self, _cmd, anObject); - - [self didChangeValueForKey:aKey - withSetMutation:CPKeyValueMinusSetMutation - usingObjects:[CPSet setWithObject:anObject]]; - }, removeKeyObject_method.method_types); - } - - if (removeKey_method) - { - var removeKey_method_imp = removeKey_method.method_imp; - - class_addMethod(KVOClass, removeKey_selector, function(self, _cmd, objects) - { - [self willChangeValueForKey:aKey - withSetMutation:CPKeyValueMinusSetMutation - usingObjects:[objects copy]]; - - removeKey_method_imp(self, _cmd, objects); - - [self didChangeValueForKey:aKey - withSetMutation:CPKeyValueMinusSetMutation - usingObjects:[objects copy]]; - }, removeKey_method.method_types); - } - - // intersect: is optional. - var intersectKey_selector = sel_getUid("intersect" + capitalizedKey + ":"), - intersectKey_method = class_getInstanceMethod(theClass, intersectKey_selector); - - if (intersectKey_method) - { - var intersectKey_method_imp = intersectKey_method.method_imp; - - class_addMethod(KVOClass, intersectKey_selector, function(self, _cmd, aSet) - { - [self willChangeValueForKey:aKey - withSetMutation:CPKeyValueIntersectSetMutation - usingObjects:[aSet copy]]; - - intersectKey_method_imp(self, _cmd, aSet); - - [self didChangeValueForKey:aKey - withSetMutation:CPKeyValueIntersectSetMutation - usingObjects:[aSet copy]]; - }, intersectKey_method.method_types); + [self didChangeValueForKey:aKey + withSetMutation:CPKeyValueIntersectSetMutation + usingObjects:[aSet copy]]; + }, intersectKey_method.method_types); + } } } @@ -1300,6 +1300,10 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOpti if (aKeyPath === _firstPart) { var pathChanges = [CPMutableDictionary dictionaryWithObject:CPKeyValueChangeSetting forKey:CPKeyValueChangeKindKey]; + var isBeforeFlag = !![changes objectForKey:CPKeyValueChangeNotificationIsPriorKey]; + + if (isBeforeFlag) + [pathChanges setObject:1 forKey:CPKeyValueChangeNotificationIsPriorKey]; if (_options & CPKeyValueObservingOptionOld) { @@ -1308,7 +1312,7 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOpti [pathChanges setObject:oldValue != null ? oldValue : [CPNull null] forKey:CPKeyValueChangeOldKey]; } - if (_options & CPKeyValueObservingOptionNew) + if (!isBeforeFlag && (_options & CPKeyValueObservingOptionNew)) { var newValue = [_object valueForKeyPath:_firstPart + "." + _secondPart]; @@ -1317,14 +1321,17 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOpti [_observer observeValueForKeyPath:_firstPart + "." + _secondPart ofObject:_object change:pathChanges context:_context]; - //since a has changed, we should remove ourselves as an observer of the old a, and observe the new one - if (_value) - [_value removeObserver:self forKeyPath:_secondPart]; + // Nothing has changed yet when doing willChange.... + if (!isBeforeFlag) { + //since a has changed, we should remove ourselves as an observer of the old a, and observe the new one + if (_value) + [_value removeObserver:self forKeyPath:_secondPart]; - _value = [_object valueForKey:_firstPart]; + _value = [_object valueForKey:_firstPart]; - if (_value) - [_value addObserver:self forKeyPath:_secondPart options:_options context:nil]; + if (_value) + [_value addObserver:self forKeyPath:_secondPart options:_options context:nil]; + } } else { diff --git a/Foundation/CPObject.j b/Foundation/CPObject.j index f5aea7aa6..b0cfd2e26 100644 --- a/Foundation/CPObject.j +++ b/Foundation/CPObject.j @@ -275,13 +275,13 @@ CPLog(@"Got some class: %@", inst); } /*! - Tests whether the receiver implements to the provided selector regardless of inheritance. - @param aSelector the selector for which to test the receiver - @return \c YES if the receiver implements the selector + Tests if instances of a given class implement the provided selector regardless of inheritance. + @param aSelector the selector for which to test the class + @return \c YES if instances of the class implement the selector */ -- (BOOL)implementsSelector:(SEL)aSelector ++ (BOOL)instancesImplementSelector:(SEL)aSelector { - var methods = class_copyMethodList(isa), + var methods = class_copyMethodList(self), count = methods.length; while (count--) @@ -291,6 +291,16 @@ CPLog(@"Got some class: %@", inst); return NO; } +/*! + Tests if the receiver implements the provided selector regardless of inheritance. + @param aSelector the selector for which to test the receiver + @return \c YES if the receiver implements the selector +*/ +- (BOOL)implementsSelector:(SEL)aSelector +{ + return [[self class] instancesImplementSelector:aSelector]; +} + /*! Test whether instances of this class conforms to the provided protocol. @param aProtocol the protocol for which to test the class diff --git a/Foundation/CPRunLoop.j b/Foundation/CPRunLoop.j index a745040d7..4afd72109 100644 --- a/Foundation/CPRunLoop.j +++ b/Foundation/CPRunLoop.j @@ -494,3 +494,51 @@ var CPRunLoopLastNativeRunLoop = 0; } @end + +function CFRunLoopObserver(activities, repeats, order, callout, context) +{ + this.activities = activities; + this.repeats = repeats; + this.order = order; + this.callout = callout; + this.context = context; + + this.isvalid = true; +}; + +function CFRunLoopObserverCreate(activities, repeats, order, callout, context) +{ + return new CFRunLoopObserver(activities, repeats, order, callout, context); +}; + +function CFRunLoopAddObserver(runloop, observer, mode) +{ + var observers = runloop._observers; + + if (!observers) + observers = (runloop._observers = []); + + if (observers.indexOf(observer) == -1) + observers.push(observer); +}; + +function CFRunLoopObserverInvalidate(runloop, observer, mode) +{ + CFRunLoopRemoveObserver(runloop, observer, mode); +}; + +function CFRunLoopRemoveObserver(runloop, observer, mode) +{ + var observers = runloop._observers; + if (observers) + { + var idx = observers.indexOf(observer); + if (idx !== -1) + { + observers.splice(idx, 1); + + if (observers.length == 0) + runloop._observers = nil; + } + } +}; diff --git a/Foundation/_CPCollectionKVCOperators.j b/Foundation/_CPCollectionKVCOperators.j index 6180c29f7..36fe72145 100644 --- a/Foundation/_CPCollectionKVCOperators.j +++ b/Foundation/_CPCollectionKVCOperators.j @@ -22,7 +22,7 @@ @import "CPObject.j" -var _CPCollectionKVCOperatorSimpleRE = /^@(avg|count|m(ax|in)|sum|unionOfObjects|distinctUnionOfObjects|unionOfArrays|distinctUnionOfArrays|distinctUnionOfSets)(\.|$)/; +var _CPCollectionKVCOperatorSimpleRE = new RegExp("^@(avg|count|m(ax|in)|sum|unionOfObjects|distinctUnionOfObjects|unionOfArrays|distinctUnionOfArrays|distinctUnionOfSets)(\\.|$)"); @implementation _CPCollectionKVCOperator : CPObject diff --git a/Objective-J/Bootstrap.js b/Objective-J/Bootstrap.js index ddd7263bf..2810c76fd 100644 --- a/Objective-J/Bootstrap.js +++ b/Objective-J/Bootstrap.js @@ -49,17 +49,26 @@ if (DOMBaseElementsCount > 0) if (typeof OBJJ_COMPILER_FLAGS !== 'undefined') { - var flags = 0; + var flags = {}; for (var i = 0; i < OBJJ_COMPILER_FLAGS.length; i++) { - var flag = ObjJAcornCompiler.Flags[OBJJ_COMPILER_FLAGS[i]]; - - if (flag != null) + switch (OBJJ_COMPILER_FLAGS[i]) { - flags |= flag; + case "IncludeDebugSymbols": + flags.includeMethodFunctionNames = true; + break; + + case "IncludeTypeSignatures": + flags.includeIvarTypeSignatures = true; + flags.includeMethodArgumentTypeSignatures = true; + break; + + case "InlineMsgSend": + flags.inlineMsgSendFunctions = true; + break; } } - exports.setCurrentCompilerFlags(flags); + FileExecutable.setCurrentCompilerFlags(flags); } // Turn the main file into a URL. diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index 2c112e749..d07064696 100755 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -371,7 +371,7 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure, onprogress) { var aFilePath = aURL.toString().substring(5), OS = require("os"), - gccFlags = require("objective-j").currentGccCompilerFlags(), + gccFlags = require("objective-j").FileExecutable.currentGccCompilerFlags(), chunk, fileContents = ""; diff --git a/Objective-J/CommonJS/lib/objective-j.js b/Objective-J/CommonJS/lib/objective-j.js index 1d74d0f10..4d7feb707 100644 --- a/Objective-J/CommonJS/lib/objective-j.js +++ b/Objective-J/CommonJS/lib/objective-j.js @@ -1,6 +1,7 @@ var FILE = require("file"); var sprintf = require("printf").sprintf; +var OS = require("os"); var window = exports.window = require("browser/window"); @@ -80,6 +81,7 @@ exports.run = function(args) // copy the args since we're going to modify them var argv = args.slice(1); + var outputFormatInXML = false; if (argv[0] === "--version" || argv[0] === "-v") { @@ -120,25 +122,33 @@ exports.run = function(args) case "-x": case "--xml": argv.shift(); - exports.outputFormatInXML = true; + exports.messageOutputFormatInXML = true; + outputFormatInXML = true; break; case "-g": case "--include-debug-symbols": argv.shift(); - (OBJJ_COMPILER_FLAGS || (OBJJ_COMPILER_FLAGS = [])).push("IncludeDebugSymbols"); + var flags = ObjectiveJ.FileExecutable.currentCompilerFlags(); + flags.includeMethodFunctionNames = true; + ObjectiveJ.FileExecutable.setCurrentCompilerFlags(flags); break; case "-T": case "--dont-include-type-signatures": argv.shift(); - (OBJJ_COMPILER_FLAGS || (OBJJ_COMPILER_FLAGS = [])).push("IncludeTypeSignatures"); + var flags = ObjectiveJ.FileExecutable.currentCompilerFlags(); + flags.includeIvarTypeSignatures = true; + flags.includeMethodArgumentTypeSignatures = true; + ObjectiveJ.FileExecutable.setCurrentCompilerFlags(flags); break; case "-O2": case "--inline-msg-send": argv.shift(); - (OBJJ_COMPILER_FLAGS || (OBJJ_COMPILER_FLAGS = [])).push("InlineMsgSend"); + var flags = ObjectiveJ.FileExecutable.currentCompilerFlags(); + flags.inlineMsgSendFunctions = true; + ObjectiveJ.FileExecutable.setCurrentCompilerFlags(flags); break; } } @@ -160,19 +170,7 @@ exports.run = function(args) } catch(e) { - if (exports.outputFormatInXML) - { - var dict = new CFMutableDictionary(); - dict.addValueForKey('line', e.line ? e.line : 0); - dict.addValueForKey('sourcePath', e.path ? e.path : mainFilePath); - dict.addValueForKey('message', e.message); - - errors.push(dict); - } - else - { - errors.push("\n" + e); - } + errors.push(e); } if (typeof main === "function") @@ -194,10 +192,8 @@ exports.run = function(args) if (errors.length) { - if (exports.outputFormatInXML) - throw CFPropertyListCreateXMLData(errors, kCFPropertyListXMLFormat_v1_0).rawString(); - else - throw errors; + // Make sure we get exit will failiure + OS.exit(1); } } else @@ -271,7 +267,6 @@ function getPackage() { exports.version = function() { return getPackage()["version"]; } exports.revision = function() { return getPackage()["cappuccino-revision"]; } exports.timestamp = function() { return new Date(getPackage()["cappuccino-timestamp"]); } -exports.outputFormatInXML = false; exports.fullVersionString = function() { return sprintf("objective-j %s (%04d-%02d-%02d %s)", diff --git a/Objective-J/CommonJS/lib/objective-j/compiler.js b/Objective-J/CommonJS/lib/objective-j/compiler.js index 6f761e3a5..681c00116 100644 --- a/Objective-J/CommonJS/lib/objective-j/compiler.js +++ b/Objective-J/CommonJS/lib/objective-j/compiler.js @@ -6,10 +6,6 @@ var FILE = require("file"), require("objective-j/rhino/regexp-rhino-patch"); -ObjectiveJ.ObjJAcornCompiler.Flags.Preprocess = 1 << 10; -ObjectiveJ.ObjJAcornCompiler.Flags.Compress = 1 << 11; -ObjectiveJ.ObjJAcornCompiler.Flags.CheckSyntax = 1 << 12; - var compressors = { ss : { id : "minify/shrinksafe" } //,yui : { id : "minify/yuicompressor" } @@ -37,9 +33,8 @@ function compressor(code) function compileWithResolvedFlags(aFilePath, objjcFlags, gccFlags, asPlainJavascript) { - var shouldObjjPreprocess = objjcFlags & ObjectiveJ.ObjJAcornCompiler.Flags.Preprocess, - shouldCheckSyntax = objjcFlags & ObjectiveJ.ObjJAcornCompiler.Flags.CheckSyntax, - shouldCompress = objjcFlags & ObjectiveJ.ObjJAcornCompiler.Flags.Compress, + var shouldObjjPreprocess = true, + shouldCompress = objjcFlags.compress, fileContents = "", executable, code; @@ -118,7 +113,7 @@ function compileWithResolvedFlags(aFilePath, objjcFlags, gccFlags, asPlainJavasc } } - ObjectiveJ.setCurrentCompilerFlags(objjcFlags); + ObjectiveJ.FileExecutable.setCurrentCompilerFlags(objjcFlags); ObjectiveJ.make_narwhal_factory(absolutePath, basePath, translateFilenameToPath)(require, {}, module, system, print); executable = new ObjectiveJ.FileExecutable(FILE.basename(aFilePath)); @@ -153,7 +148,7 @@ function resolveFlags(args) count = args.length, gccFlags = [], - objjcFlags = ObjectiveJ.ObjJAcornCompiler.Flags.Preprocess | ObjectiveJ.ObjJAcornCompiler.Flags.CheckSyntax; + objjcFlags = {}; for (; index < count; ++index) { @@ -180,27 +175,23 @@ function resolveFlags(args) } } - else if (argument.indexOf("-E") === 0) - objjcFlags &= ~ObjectiveJ.ObjJAcornCompiler.Flags.Preprocess; - - else if (argument.indexOf("-S") === 0) - objjcFlags &= ~ObjectiveJ.ObjJAcornCompiler.Flags.CheckSyntax; - else if (argument.indexOf("-T") === 0) - objjcFlags &= ~ObjectiveJ.ObjJAcornCompiler.Flags.IncludeTypeSignatures; - + { + objjcFlags.includeIvarTypeSignatures = false; + objjcFlags.includeMethodArgumentTypeSignatures = false; + } else if (argument.indexOf("-g") === 0) - objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.IncludeDebugSymbols; + objjcFlags.includeMethodFunctionNames = true; else if (argument.indexOf("-O") === 0) { - objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Compress; + objjcFlags.compress = true; // FIXME: currently we are sending in '-O2' when we want InlineMsgSend. Here we only check if we it is '-O...' if (argument.length > 2) - objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.InlineMsgSend; + objjcFlags.inlineMsgSendFunctions = true; } else if (argument.indexOf("-G") === 0) - objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Generate; + objjcFlags.generate = true; else filePaths.push(argument); @@ -223,7 +214,7 @@ exports.main = function(args) { var shouldPrintOutput = false, asPlainJavascript = false, - objjcFlags = 0; + objjcFlags = {}; var argv = args.slice(1); @@ -251,7 +242,8 @@ exports.main = function(args) if (argv[0] === "-T" || argv[0] === "--includeTypeSignatures") { - objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.IncludeTypeSignatures; + objjcFlags.includeIvarTypeSignatures = true; + objjcFlags.includeMethodArgumentTypeSignatures = true; argv.shift(); continue; } @@ -280,9 +272,19 @@ exports.main = function(args) var resolved = resolveFlags(argv), outputFilePaths = resolved.outputFilePaths, - gccFlags = resolved.gccFlags; + gccFlags = resolved.gccFlags, + resolvedObjjcFlags = resolved.objjcFlags; + + // Merge resolved keys into objjcFlags + for (var key in resolvedObjjcFlags) + { + if (resolvedObjjcFlags.hasOwnProperty(key)) + { + if (resolvedObjjcFlags[key]) + objjcFlags[key] = resolvedObjjcFlags[key]; + } + } - objjcFlags |= resolved.objjcFlags; resolved.filePaths.forEach(function(filePath, index) { if (!shouldPrintOutput) diff --git a/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js b/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js index 613d9b254..136a8388e 100644 --- a/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js +++ b/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js @@ -907,7 +907,7 @@ BundleTask.prototype.defineSourceTasks = function() basePath = absolutePath.substring(0, absolutePath.length - theTranslatedFilename.length); // Here we set the current compiler flags so the load system will know what compiler flags to use - ObjectiveJ.setCurrentGccCompilerFlags(environmentCompilerFlags); + ObjectiveJ.FileExecutable.setCurrentGccCompilerFlags(environmentCompilerFlags); // Here we tell the CFBundle to load frameworks for the current build enviroment and not the enviroment that is running CFBundle.environments = function() {return [anEnvironment.name(), "ObjJ"]}; ObjectiveJ.make_narwhal_factory(absolutePath, basePath, translateFilenameToPath)(require, e, module, system, print); diff --git a/Objective-J/Executable.js b/Objective-J/Executable.js index 227b890a4..f138fb6c2 100644 --- a/Objective-J/Executable.js +++ b/Objective-J/Executable.js @@ -169,6 +169,10 @@ Executable.prototype.execute = function() this._compiler.popImport(); this.setCode(this._compiler.compilePass2()); + + if (FileExecutable.printWarningsAndErrors(this._compiler, exports.messageOutputFormatInXML)) + throw "Compilation error"; + this._compiler = null; } @@ -471,7 +475,6 @@ Executable.fileExecutableSearcherForURL = function(/*CFURL*/ referenceURL) var referenceURLString = referenceURL.absoluteString(), cachedFileExecutableSearcher = cachedFileExecutableSearchers[referenceURLString], aFilenameTranslateDictionary = Executable.filenameTranslateDictionary ? Executable.filenameTranslateDictionary() : null; - cachedSearchResults = { }; if (!cachedFileExecutableSearcher) { @@ -499,7 +502,7 @@ Executable.fileExecutableSearcherForURL = function(/*CFURL*/ referenceURL) { if (!aStaticResource) { - var compilingFileUrl = ObjJAcornCompiler ? ObjJAcornCompiler.currentCompileFile : null; + var compilingFileUrl = exports.ObjJCompiler ? exports.ObjJCompiler.currentCompileFile : null; throw new Error("Could not load file at " + aURL + (compilingFileUrl ? " when compiling " + compilingFileUrl : "")); } diff --git a/Objective-J/FileExecutable.js b/Objective-J/FileExecutable.js index a3b471a7e..d6e72e655 100644 --- a/Objective-J/FileExecutable.js +++ b/Objective-J/FileExecutable.js @@ -22,6 +22,9 @@ var FileExecutablesForURLStrings = { }; +var currentCompilerFlags = {}; +var currentGccCompilerFlags = ""; + function FileExecutable(/*CFURL|String*/ aURL, /*Dictionary*/ aFilenameTranslateDictionary) { aURL = makeAbsoluteURL(aURL); @@ -41,7 +44,17 @@ function FileExecutable(/*CFURL|String*/ aURL, /*Dictionary*/ aFilenameTranslate if (fileContents.match(/^@STATIC;/)) executable = decompile(fileContents, aURL); else if ((extension === "j" || !extension) && !fileContents.match(/^{/)) - executable = exports.ObjJAcornCompiler.compileFileDependencies(fileContents, aURL, exports.currentCompilerFlags()); + { + var compiler = exports.ObjJCompiler.compileFileDependencies(fileContents, aURL, currentCompilerFlags || {}); + + if (FileExecutable.printWarningsAndErrors(compiler, exports.messageOutputFormatInXML)) + throw "Compilation error"; + + var fileDependencies = compiler.dependencies.map(function (aFileDep) { + return new FileDependency(new CFURL(aFileDep.url), aFileDep.isLocal); + }); + executable = new Executable(compiler.jsBuffer ? compiler.jsBuffer.toString() : null, fileDependencies, compiler.URL, null, compiler); + } else executable = new Executable(fileContents, [], aURL); @@ -139,3 +152,110 @@ FileExecutable._lookupCachedFunction = function(/*CFURL|String*/ aURL) aURL = typeof aURL === "string" ? aURL : aURL.absoluteString(); return FunctionCache[aURL]; } + +FileExecutable.setCurrentGccCompilerFlags = function(/*String*/ compilerFlags) +{ + if (currentGccCompilerFlags === compilerFlags) return; + + currentGccCompilerFlags = compilerFlags; + + var args = compilerFlags.split(" "), + count = args.length, + objjcFlags = {}; + + for (var index = 0; index < count; ++index) + { + var argument = args[index]; + + if (argument.indexOf("-g") === 0) + objjcFlags.includeMethodFunctionNames = true; + else if (argument.indexOf("-O") === 0) { + objjcFlags.inlineMsgSendFunctions = true; + // FIXME: currently we are sending in '-O2' when we want InlineMsgSend. Here we only check if it is '-O...'. + // Maybe we should have some other option for this + if (argument.length > 2) + objjcFlags.inlineMsgSendFunctions = true; + } + //else if (argument.indexOf("-G") === 0) + //objjcFlags |= ObjJAcornCompiler.Flags.Generate; + else if (argument.indexOf("-T") === 0) { + objjcFlags.includeIvarTypeSignatures = false; + objjcFlags.includeMethodArgumentTypeSignatures = false; + } + } + + FileExecutable.setCurrentCompilerFlags(objjcFlags); +} + +FileExecutable.currentGccCompilerFlags = function(/*String*/ compilerFlags) +{ + return currentGccCompilerFlags; +} + +FileExecutable.setCurrentCompilerFlags = function(/*JSObject*/ compilerFlags) +{ + currentCompilerFlags = compilerFlags; + // Here we set the default flags if they are not included. We do this as the default values + // in the compiler might not be what we want. + if (currentCompilerFlags.transformNamedFunctionDeclarationToAssignment == null) + currentCompilerFlags.transformNamedFunctionDeclarationToAssignment = true; + if (currentCompilerFlags.sourceMap == null) + currentCompilerFlags.sourceMap = false; + if (currentCompilerFlags.inlineMsgSendFunctions == null) + currentCompilerFlags.inlineMsgSendFunctions = false; +} + +FileExecutable.currentCompilerFlags = function(/*JSObject*/ compilerFlags) +{ + return currentCompilerFlags; +} + +/*! + This funtion prints all errors and warnings for the provieded compiler. It returns true if there + are any errors in the list. it will print it in xml format if printXML is 'true' + */ +FileExecutable.printWarningsAndErrors = function(/*ObjJCompiler*/ compiler, /*BOOL*/ printXML) +{ + var warnings = [], + anyErrors = false; + + for (var i = 0; i < compiler.warningsAndErrors.length; i++) + { + var warning = compiler.warningsAndErrors[i], + message = compiler.prettifyMessage(warning); + + // Set anyErrors to 'true' if there are any errors in the list + anyErrors = anyErrors || warning.messageType === "ERROR"; +#ifdef BROWSER + console.log(message); +#else + if (printXML) + { + var dict = new CFMutableDictionary(); + if (warning.messageOnLine != null) dict.addValueForKey('line', warning.messageOnLine) + if (warning.path != null) dict.addValueForKey('sourcePath', new CFURL(warning.path).path()) + if (message != null) dict.addValueForKey('message', message) + + warnings.push(dict); + } + else + { + print(message); + } +#endif + } + +#ifndef BROWSER + if (warnings.length && printXML) + try { + print(CFPropertyListCreateXMLData(warnings, kCFPropertyListXMLFormat_v1_0).rawString()); + } catch (e) { + print ("XML encode error: " + e); + } +#endif + + return anyErrors; +} + +// Set the compiler flags to empty dictionary so the default values are correct. +FileExecutable.setCurrentCompilerFlags({}); diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index fb53b2481..b6b279970 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -1,31 +1,55 @@ -/* - * ObjJAcornCompiler.js - * Objective-J - * - * Created by Martin Carlberg. - * Copyright 2013, Martin Carlberg. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ +// ObjJAcornCompiler was written by Martin Carlberg and released under +// an MIT license. +// +// Git repositories for ObjJAcornCompiler are available at +// +// https://github.com/mrcarlberg/ObjJAcornCompiler.git +// +// Please use the [github bug tracker][ghbt] to report issues. +// +// [ghbt]: https://github.com/mrcarlberg/ObjJAcornCompiler/issues +// +// This file defines the main compiler interface. +// +// Copyright 2013, 2014, 2015, 2016, Martin Carlberg. + + +(function(mod) +{ + //print("Compiler INIT! exports: " + typeof exports + ", module: " + typeof module + ", define: " + typeof define); + mod(exports.ObjJCompiler || (exports.ObjJCompiler = {}), exports.acorn, exports.acorn.walk/*, sourceMap*/); // Plain browser env +})(function(exports, acorn, walk, sourceMap) +{ +"use strict"; + +exports.version = "0.3.7"; +//exports.acorn = acorn; var Scope = function(prev, base) { this.vars = Object.create(null); + if (base) for (var key in base) this[key] = base[key]; this.prev = prev; - if (prev) this.compiler = prev.compiler; + + if (prev) + { + this.compiler = prev.compiler; + this.nodeStack = prev.nodeStack.slice(0); + this.nodePriorStack = prev.nodePriorStack.slice(0); + this.nodeStackOverrideType = prev.nodeStackOverrideType.slice(0); + } + else + { + this.nodeStack = []; + this.nodePriorStack = []; + this.nodeStackOverrideType = []; + } +} + +Scope.prototype.toString = function() +{ + return this.ivars ? "ivars: " + JSON.stringify(this.ivars) : ""; } Scope.prototype.compiler = function() @@ -107,9 +131,20 @@ Scope.prototype.copyAddedSelfToIvarsToParent = function() Scope.prototype.addMaybeWarning = function(warning) { - var rootScope = this.rootScope(); + var rootScope = this.rootScope(), + maybeWarnings = rootScope._maybeWarnings; - (rootScope._maybeWarnings || (rootScope._maybeWarnings = [])).push(warning); + if (!maybeWarnings) + rootScope._maybeWarnings = maybeWarnings = [warning]; + else + { + var lastWarning = maybeWarnings[maybeWarnings.length - 1]; + + // MessageSendExpression (and maybe others) will walk some expressions multible times and + // possible generate warnings multible times. Here we check if this warning is already added + if (!lastWarning.isEqualTo(warning)) + maybeWarnings.push(warning); + } } Scope.prototype.maybeWarnings = function() @@ -117,6 +152,113 @@ Scope.prototype.maybeWarnings = function() return this.rootScope()._maybeWarnings; } +Scope.prototype.pushNode = function(node, overrideType) +{ + // Here we push 3 things to a stack. The node, override type and an array that can keep track of prior nodes on this level. + // The current node is also pushed to the last prior array. + // Special case when node is the same as the parent node. This happends when using an override type when walking the AST + // The same prior list is then used instead of a new empty one. + var nodePriorStack = this.nodePriorStack, + length = nodePriorStack.length, + lastPriorList = length ? nodePriorStack[length - 1] : null, + lastNode = length ? this.nodeStack[length - 1] : null; + // First add this node to parent list of nodes, if it has one + if (lastPriorList) { + if (lastNode !== node) { + // If not the same node push the node + lastPriorList.push(node); + } + } + // Use the last prior list if it is the same node + nodePriorStack.push(lastNode === node ? lastPriorList : []); + this.nodeStack.push(node); + this.nodeStackOverrideType.push(overrideType); +} + +Scope.prototype.popNode = function() +{ + this.nodeStackOverrideType.pop(); + this.nodePriorStack.pop(); + return this.nodeStack.pop(); +} + +Scope.prototype.currentNode = function() +{ + var nodeStack = this.nodeStack; + return nodeStack[nodeStack.length - 1]; +} + +Scope.prototype.currentOverrideType = function() +{ + var nodeStackOverrideType = this.nodeStackOverrideType; + return nodeStackOverrideType[nodeStackOverrideType.length - 1]; +} + +Scope.prototype.priorNode = function() +{ + var nodePriorStack = this.nodePriorStack, + length = nodePriorStack.length; + + if (length > 1) { + var parent = nodePriorStack[length - 2], + l = parent.length; + return parent[l - 2] || null; + } + return null; +} + +Scope.prototype.formatDescription = function(index, formatDescription, useOverrideForNode) +{ + var nodeStack = this.nodeStack, + length = nodeStack.length; + + index = index || 0; + if (index >= length) + return null; + + // Get the nodes backwards from the stack + var i = length - index - 1; + var currentNode = nodeStack[i]; + var currentFormatDescription = formatDescription || this.compiler.formatDescription; + // Get the parent descriptions except if no formatDescription was provided, then it is the root description + var parentFormatDescriptions = formatDescription ? formatDescription.parent : currentFormatDescription; + + var nextFormatDescription; + if (parentFormatDescriptions) { + var nodeType = useOverrideForNode === currentNode ? this.nodeStackOverrideType[i] : currentNode.type; + //console.log("nodeType: " + nodeType + ", (useOverrideForNode === currentNode):" + + !!(useOverrideForNode === currentNode)); + nextFormatDescription = parentFormatDescriptions[nodeType]; + if (useOverrideForNode === currentNode && !nextFormatDescription) { + //console.log("Stop"); + return null; + } + } + + //console.log("index: " + index + ", currentNode: " + JSON.stringify(currentNode) + ", currentFormatDescription: " + JSON.stringify(currentFormatDescription) + ", nextFormatDescription: " + JSON.stringify(nextFormatDescription)); + + if (nextFormatDescription) { + // Check for more 'parent' attributes or return nextFormatDescription + return this.formatDescription(index + 1, nextFormatDescription); + } else { + // Check for a virtual node one step up in the stack + nextFormatDescription = this.formatDescription(index + 1, formatDescription, currentNode); + if (nextFormatDescription) + return nextFormatDescription; + else { + // Ok, we have found a format description (currentFormatDescription). + // Lets check if we have any other descriptions dependent on the prior node. + var priorFormatDescriptions = currentFormatDescription.prior; + if (priorFormatDescriptions) { + var priorNode = this.priorNode(), + priorFormatDescription = priorFormatDescriptions[priorNode ? priorNode.type : "None"]; + if (priorFormatDescription) + return priorFormatDescription; + } + return currentFormatDescription; + } + } +} + var GlobalVariableMaybeWarning = function(/* String */ aMessage, /* SpiderMonkey AST node */ node, /* String */ code) { this.message = createMessage(aMessage, node, code); @@ -126,29 +268,129 @@ var GlobalVariableMaybeWarning = function(/* String */ aMessage, /* SpiderMonkey GlobalVariableMaybeWarning.prototype.checkIfWarning = function(/* Scope */ st) { var identifier = this.node.name; - return !st.getLvar(identifier) && typeof global[identifier] === "undefined" && typeof window[identifier] === "undefined" && !st.compiler.getClassDef(identifier); + return !st.getLvar(identifier) && typeof global[identifier] === "undefined" && (typeof window === 'undefined' || typeof window[identifier] === "undefined") && !st.compiler.getClassDef(identifier); } -function StringBuffer() +GlobalVariableMaybeWarning.prototype.isEqualTo = function(/* GlobalVariableMaybeWarning */ aWarning) { - this.atoms = []; + if (this.message.message !== aWarning.message.message) return false; + if (this.node.start !== aWarning.node.start) return false; + if (this.node.end !== aWarning.node.end) return false; + + return true; } -StringBuffer.prototype.toString = function() +function StringBuffer(useSourceNode, file) +{ + if (useSourceNode) { + this.rootNode = new sourceMap.SourceNode(); + this.concat = this.concatSourceNode; + this.toString = this.toStringSourceNode; + this.isEmpty = this.isEmptySourceNode; + this.appendStringBuffer = this.appendStringBufferSourceNode; + this.length = this.lengthSourceNode; + if (file) + this.file = file.toString(); + } else { + this.atoms = []; + this.concat = this.concatString; + this.toString = this.toStringString; + this.isEmpty = this.isEmptyString; + this.appendStringBuffer = this.appendStringBufferString; + this.length = this.lengthString; + } +} + +StringBuffer.prototype.toStringString = function() { return this.atoms.join(""); } -StringBuffer.prototype.concat = function(aString) +StringBuffer.prototype.toStringSourceNode = function() +{ + return this.rootNode.toStringWithSourceMap({file: this.file}); +} + +StringBuffer.prototype.concatString = function(aString) { this.atoms.push(aString); } -StringBuffer.prototype.isEmpty = function() +StringBuffer.prototype.concatSourceNode = function(aString, node) +{ + if (node) { + //console.log("Snippet: " + aString + ", line: " + node.loc.start.line + ", column: " + node.loc.start.column + ", source: " + node.loc.source); + this.rootNode.add(new sourceMap.SourceNode(node.loc.start.line, node.loc.start.column, node.loc.source, aString)); + } else + this.rootNode.add(aString); + if (!this.notEmpty) + this.notEmpty = true; +} + +// '\n' will indent. '\n\0' will not indent. '\n\1' will indent one more then the current indent level. +// '\n\-1' will indent one less then the current indent level. Numbers from 0-9 can me used. +StringBuffer.prototype.concatFormat = function(aString) +{ + if (!aString) return; + var lines = aString.split("\n"), + size = lines.length; + if (size > 1) { + this.concat(lines[0]); + for (var i = 1; i < size; i++) { + var line = lines[i]; + this.concat("\n"); + if (line.slice(0, 1) === "\\") { + var numberLength = 1; + var indent = line.slice(1, 1 + numberLength); + if (indent === '-') { + numberLength = 2; + indent = line.slice(1, 1 + numberLength); + } + var indentationNumber = parseInt(indent); + if (indentationNumber) { + this.concat(indentationNumber > 0 ? indentation + Array(indentationNumber * indentationSpaces + 1).join(indentType) : indentation.substring(indentationSize * -indentationNumber)); + } + line = line.slice(1 + numberLength); + } else if (line || i === size - 1) { + // Ident if there is something between line breaks or the last linebreak + this.concat(indentation); + } + if (line) this.concat(line); + } + } else + this.concat(aString); +} + +StringBuffer.prototype.isEmptyString = function() { return this.atoms.length !== 0; } +StringBuffer.prototype.isEmptySourceNode = function() +{ + return this.notEmpty; +} + +StringBuffer.prototype.appendStringBufferString = function(stringBuffer) +{ + this.atoms.push.apply(this.atoms, stringBuffer.atoms); +} + +StringBuffer.prototype.appendStringBufferSourceNode = function(stringBuffer) +{ + this.rootNode.add(stringBuffer.rootNode); +} + +StringBuffer.prototype.lengthString = function() +{ + return this.atoms.length; +} + +StringBuffer.prototype.lengthSourceNode = function() +{ + return this.rootNode.children.length; +} + // Both the ClassDef and ProtocolDef conforms to a 'protocol' (That we can't declare in Javascript). // Both Objects have the attribute 'protocols': Array of ProtocolDef that they conform to // Both also have the functions: addInstanceMethod, addClassMethod, getInstanceMethod and getClassMethod @@ -188,21 +430,19 @@ ClassDef.prototype.listOfNotImplementedMethodsForProtocols = function(protocolDe protocolClassMethods = protocolDef.requiredClassMethods, inheritFromProtocols = protocolDef.protocols; - if (protocolInstanceMethods) - for (var methodName in protocolInstanceMethods) { - var methodDef = protocolInstanceMethods[methodName]; + if (protocolInstanceMethods) for (var methodName in protocolInstanceMethods) { + var methodDef = protocolInstanceMethods[methodName]; - if (!instanceMethods[methodName]) - resultList.push({"methodDef": methodDef, "protocolDef": protocolDef}); - } + if (!instanceMethods[methodName]) + resultList.push({"methodDef": methodDef, "protocolDef": protocolDef}); + } - if (protocolClassMethods) - for (var methodName in protocolClassMethods) { - var methodDef = protocolClassMethods[methodName]; + if (protocolClassMethods) for (var methodName in protocolClassMethods) { + var methodDef = protocolClassMethods[methodName]; - if (!classMethods[methodName]) - resultList.push({"methodDef": methodDef, "protocolDef": protocolDef}); - } + if (!classMethods[methodName]) + resultList.push({"methodDef": methodDef, "protocolDef": protocolDef}); + } if (inheritFromProtocols) resultList = resultList.concat(this.listOfNotImplementedMethodsForProtocols(inheritFromProtocols)); @@ -344,7 +584,7 @@ ProtocolDef.prototype.getClassMethod = function(name) { for (var i = 0, size = protocols.length; i < size; i++) { var protocol = protocols[i], - method = protocol.getInstanceMethod(name); + method = protocol.getClassMethod(name); if (method) return method; @@ -365,184 +605,227 @@ var MethodDef = function(name, types) this.types = types; } -var reservedIdentifiers = exports.acorn.makePredicate("self _cmd undefined localStorage arguments"); +var reservedIdentifiers = acorn.makePredicate("self _cmd undefined localStorage arguments"); -var wordPrefixOperators = exports.acorn.makePredicate("delete in instanceof new typeof void"); +var wordPrefixOperators = acorn.makePredicate("delete in instanceof new typeof void"); -var isLogicalBinary = exports.acorn.makePredicate("LogicalExpression BinaryExpression"); -var isInInstanceof = exports.acorn.makePredicate("in instanceof"); +var isLogicalBinary = acorn.makePredicate("LogicalExpression BinaryExpression"); +var isInInstanceof = acorn.makePredicate("in instanceof"); -var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, /*unsigned*/ pass, /* Dictionary */ classDefs, /* Dictionary */ protocolDefs, /* Dictionary */ typeDefs) + // A optional argument can be given to further configure + // the compiler. These options are recognized: + + var defaultOptions = { + // Acorn options. For more information check objj-acorn. + // We have a function here to create a new object every time we copy + // the default options. + acornOptions: function() { return Object.create(null) }, + + // Turn on `sourceMap` generate a source map for the compiler file. + sourceMap: false, + + // The compiler can do different passes. + // 1: Parse and walk AST tree to collect file dependencies. + // 2: Parse and walk to generate code. + // Pass one is only for when the Objective-J load and runtime. + pass: 2, + + // Pass in class definitions. New class definitions in source file will be added here when compiling. + classDefs: function() { return Object.create(null) }, + + // Pass in protocol definitions. New protocol definitions in source file will be added here when compiling. + protocolDefs: function() { return Object.create(null) }, + + // Pass in typeDef definitions. New typeDef definitions in source file will be added here when compiling. + typeDefs: function() { return Object.create(null) }, + + // Turn off `generate` to make the compile copy the code from the source file (and replace needed parts) + // instead of generate it from the AST tree. The preprocessor does not work if this is turn off as it alters + // the AST tree and not the original source. We should deprecate this in the future. + generate: true, + + // Turn on `generateObjJ` to generate Objecitve-J code instead of Javascript code. This can be used to beautify + // the code. + generateObjJ: false, + + // Format description for generated code. For more information look at the readme file in the format folder. + formatDescription: null, + + // How many spaces for indentation when generation code. + indentationSpaces: 4, + + // The type of indentation. Default is space. Can be changed to tab or any other string. + indentationType: " ", + + // Include comments when generating code. This option will turn on the acorn options trackComments and trackCommentsIncludeLineBreak. + includeComments: false, + + // There is a bug in Safari 2.0 that can't handle a named function declaration. See http://kangax.github.io/nfe/#safari-bug + // Turn on `transformNamedFunctionDeclarationToAssignment` to make the compiler transform these. + // We support this here as the old Objective-J compiler (Not a real compiler, Preprocessor.js) transformed + // named function declarations to assignments. + // Example: 'function f(x) { return x }' transforms to: 'f = function(x) { return x }' + transformNamedFunctionDeclarationToAssignment: false, + + // Turn off `includeMethodFunctionNames` to remove function names on methods. + includeMethodFunctionNames: true, + + // Turn off `includeMethodArgumentTypeSignatures` to remove type information on method arguments. + includeMethodArgumentTypeSignatures: true, + + // Turn off `includeIvarTypeSignatures` to remove type information on ivars. + includeIvarTypeSignatures: true, + + // Turn off `inlineMsgSendFunctions` to use message send functions. Needed to use message send decorators. + inlineMsgSendFunctions: true, + }; + + // We copy the options to a new object as we don't want to mess up incoming options when we start compiling. + function setupOptions(opts) { + var options = Object.create(null); + for (var opt in defaultOptions) { + if (opts && Object.prototype.hasOwnProperty.call(opts, opt)) { + var incomingOpt = opts[opt]; + options[opt] = typeof incomingOpt === 'function' ? incomingOpt() : incomingOpt; + } else if (defaultOptions.hasOwnProperty(opt)) { + var defaultOpt = defaultOptions[opt]; + options[opt] = typeof defaultOpt === 'function' ? defaultOpt() : defaultOpt; + } + } + return options; + } + +var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, options) { this.source = aString; - this.URL = new CFURL(aURL); - this.pass = pass; - this.jsBuffer = new StringBuffer(); + this.URL = aURL && aURL.toString(); + options = setupOptions(options); + this.options = options; + this.pass = options.pass; + this.classDefs = options.classDefs; + this.protocolDefs = options.protocolDefs; + this.typeDefs = options.typeDefs; + this.generate = options.generate; + this.createSourceMap = options.sourceMap; + this.formatDescription = options.formatDescription; + this.includeComments = options.includeComments; + this.transformNamedFunctionDeclarationToAssignment = options.transformNamedFunctionDeclarationToAssignment; + this.jsBuffer = new StringBuffer(this.createSourceMap, aURL); this.imBuffer = null; this.cmBuffer = null; - this.warnings = []; + this.dependencies = []; + this.warningsAndErrors = []; + this.lastPos = 0; + + //this.formatDescription = { + // Identifier: {before:"", after:"", parent: {ReturnStatement: {after:"", before:""}, Statement: {after:"", before:""}}}, + // BlockStatement: {before:" ", after:"", afterLeftBrace: "\n", beforeRightBrace: "/* Before Brace */"}, + // Statement: {before:"", after:"/*Statement after*/;\n"} + //}; + + var acornOptions = options.acornOptions; + + if (acornOptions) + { + if (!acornOptions.sourceFile && this.URL) + acornOptions.sourceFile = this.URL.substr(this.URL.lastIndexOf('/') + 1); + if (options.sourceMap && !acornOptions.locations) + acornOptions.locations = true; + } + else + { + acornOptions = options.acornOptions = this.URL && {sourceFile: this.URL.substr(this.URL.lastIndexOf('/') + 1)}; + if (options.sourceMap) + acornOptions.locations = true; + } try { - this.tokens = exports.acorn.parse(aString); + this.tokens = acorn.parse(aString, options.acornOptions); + (this.pass === 2 && (options.includeComments || options.formatDescription) ? compileWithFormat : compile)(this.tokens, new Scope(null ,{ compiler: this }), this.pass === 2 ? pass2 : pass1); } catch (e) { if (e.lineStart != null) { - var message = this.prettifyMessage(e, "ERROR"); -#ifdef BROWSER - console.log(message); -#else - if (exports.outputFormatInXML) - { - var dict = new CFMutableDictionary(); - dict.addValueForKey('line', e.line); - dict.addValueForKey('sourcePath', this.URL.path()); - dict.addValueForKey('message', message); - - print(CFPropertyListCreateXMLData([dict], kCFPropertyListXMLFormat_v1_0).rawString()); - } - else - { - print(message); - } -#endif + e.messageForLine = aString.substring(e.lineStart, e.lineEnd); } - - throw e; + this.addWarning(e); + return; } - this.dependencies = []; - this.flags = flags & (ObjJAcornCompiler.Flags.IncludeDebugSymbols | ObjJAcornCompiler.Flags.InlineMsgSend | ObjJAcornCompiler.Flags.IncludeTypeSignatures); - this.classDefs = classDefs ? classDefs : Object.create(null); - this.protocolDefs = protocolDefs ? protocolDefs : Object.create(null); - this.typeDefs = typeDefs ? typeDefs : Object.create(null); - this.lastPos = 0; - this.generate = true; // Before there was an option to generate the code or copy & paste it from the source. Today we always generate the code. - - compile(this.tokens, new Scope(null ,{ compiler: this }), pass === 2 ? pass2 : pass1); + this.setCompiledCode(this.jsBuffer); } -ObjJAcornCompiler.Flags = { }; - -ObjJAcornCompiler.Flags.IncludeDebugSymbols = 1 << 0; -ObjJAcornCompiler.Flags.IncludeTypeSignatures = 1 << 1; -ObjJAcornCompiler.Flags.Generate = 1 << 2; -ObjJAcornCompiler.Flags.InlineMsgSend = 1 << 3; - -var currentCompilerFlags = ObjJAcornCompiler.Flags.IncludeTypeSignatures; -var currentGccCompilerFlags = ""; - -exports.ObjJAcornCompiler = ObjJAcornCompiler; - -exports.ObjJAcornCompiler.compileToExecutable = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags) +ObjJAcornCompiler.prototype.setCompiledCode = function(stringBuffer) { - ObjJAcornCompiler.currentCompileFile = aURL; - return new ObjJAcornCompiler(aString, aURL, flags, 2).executable(); + if (this.createSourceMap) + { + var s = stringBuffer.toString(); + this.compiledCode = s.code; + this.sourceMap = s.map; + } + else + { + this.compiledCode = stringBuffer.toString(); + } } -exports.ObjJAcornCompiler.compileToIMBuffer = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, classDefs, protocolDefs, typeDefs) +// This might not be used +exports.compileToExecutable = function(/*String*/ aString, /*CFURL*/ aURL, options) { - return new ObjJAcornCompiler(aString, aURL, flags, 2, classDefs, protocolDefs, typeDefs).IMBuffer(); + exports.currentCompileFile = aURL; + return new ObjJAcornCompiler(aString, aURL, options).executable(); } -exports.ObjJAcornCompiler.compileFileDependencies = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags) +exports.compileToIMBuffer = function(/*String*/ aString, /*CFURL*/ aURL, options) { - ObjJAcornCompiler.currentCompileFile = aURL; - return new ObjJAcornCompiler(aString, aURL, flags, 1).executable(); + return new ObjJAcornCompiler(aString, aURL, options).IMBuffer(); +} + +exports.compile = function(/*String*/ aString, /*CFURL*/ aURL, options) +{ + return new ObjJAcornCompiler(aString, aURL, options); +} + +exports.compileFileDependencies = function(/*String*/ aString, /*CFURL*/ aURL, options) +{ + exports.currentCompileFile = aURL; + (options || (options = {})).pass = 1; + return new ObjJAcornCompiler(aString, aURL, options); } ObjJAcornCompiler.prototype.compilePass2 = function() { - var warnings = []; + exports.currentCompileFile = this.URL; + this.pass = this.options.pass = 2; + this.jsBuffer = new StringBuffer(this.createSourceMap, this.URL); - ObjJAcornCompiler.currentCompileFile = this.URL; - this.pass = 2; - this.jsBuffer = new StringBuffer(); - this.warnings = []; - //print(this.URL + ": Compiling"); - compile(this.tokens, new Scope(null ,{ compiler: this }), pass2); - for (var i = 0; i < this.warnings.length; i++) - { - var warning = this.warnings[i], - type = "WARNING"; + // To get the source mapping correct when the new Function construtor is used we add a + // new line as first thing in the code. + if (this.createSourceMap) + this.jsBuffer.concat("\n"); - var message = this.prettifyMessage(warning, type); -#ifdef BROWSER - console.log(message); -#else - if (exports.outputFormatInXML) - { - var dict = new CFMutableDictionary(); - dict.addValueForKey('line', warning.line) - dict.addValueForKey('sourcePath', this.URL.path()) - dict.addValueForKey('message', message) - - warnings.push(dict); - } - else - { - print(message); - } -#endif + this.warningsAndErrors = []; + try { + compile(this.tokens, new Scope(null ,{ compiler: this }), pass2); + } catch (e) { + this.addWarning(e); + return null; } - if (warnings.length && exports.outputFormatInXML) - print(CFPropertyListCreateXMLData(warnings, kCFPropertyListXMLFormat_v1_0).rawString()); + this.setCompiledCode(this.jsBuffer); - //print(this.URL + ": " + this.jsBuffer.toString()); - return this.jsBuffer.toString(); -} - -exports.setCurrentGccCompilerFlags = function(/*String*/ compilerFlags) -{ - if (currentGccCompilerFlags === compilerFlags) return; - - currentGccCompilerFlags = compilerFlags; - - var args = compilerFlags.split(" "), - count = args.length, - objjcFlags = ObjJAcornCompiler.Flags.IncludeTypeSignatures; - - for (var index = 0; index < count; ++index) - { - var argument = args[index]; - - if (argument.indexOf("-g") === 0) - objjcFlags |= ObjJAcornCompiler.Flags.IncludeDebugSymbols; - else if (argument.indexOf("-O") === 0) { - objjcFlags |= ObjJAcornCompiler.Flags.Compress; - // FIXME: currently we are sending in '-O2' when we want InlineMsgSend. Here we only check if it is '-O...'. - // Maybe we should have some other option for this - if (argument.length > 2) - objjcFlags |= ObjJAcornCompiler.Flags.InlineMsgSend; - } - else if (argument.indexOf("-G") === 0) - objjcFlags |= ObjJAcornCompiler.Flags.Generate; - else if (argument.indexOf("-T") === 0) - objjcFlags &= ~ObjJAcornCompiler.Flags.IncludeTypeSignatures; - } - - currentCompilerFlags = objjcFlags; -} - -exports.currentGccCompilerFlags = function(/*String*/ compilerFlags) -{ - return currentGccCompilerFlags; -} - -exports.setCurrentCompilerFlags = function(/*String*/ compilerFlags) -{ - currentCompilerFlags = compilerFlags; -} - -exports.currentCompilerFlags = function(/*String*/ compilerFlags) -{ - return currentCompilerFlags; + return this.compiledCode; } +/*! + Add warning or error to the list + */ ObjJAcornCompiler.prototype.addWarning = function(/* Warning */ aWarning) { - this.warnings.push(aWarning); + if (aWarning.path == null) + aWarning.path = this.URL; + + this.warningsAndErrors.push(aWarning); } ObjJAcornCompiler.prototype.getIvarForClass = function(/* String */ ivarName, /* Scope */ scope) @@ -569,13 +852,11 @@ ObjJAcornCompiler.prototype.getIvarForClass = function(/* String */ ivarName, /* ObjJAcornCompiler.prototype.getClassDef = function(/* String */ aClassName) { - if (!aClassName) - return null; + if (!aClassName) return null; var c = this.classDefs[aClassName]; - if (c) - return c; + if (c) return c; if (typeof objj_getClass === 'function') { @@ -619,13 +900,11 @@ ObjJAcornCompiler.prototype.getClassDef = function(/* String */ aClassName) ObjJAcornCompiler.prototype.getProtocolDef = function(/* String */ aProtocolName) { - if (!aProtocolName) - return null; + if (!aProtocolName) return null; var p = this.protocolDefs[aProtocolName]; - if (p) - return p; + if (p) return p; if (typeof objj_getProtocol === 'function') { @@ -696,6 +975,7 @@ ObjJAcornCompiler.methodDefsFromMethodList = function(/* Array */ methodList) return myMethods; } +//FIXME: Does not work anymore ObjJAcornCompiler.prototype.executable = function() { if (!this._executable) @@ -708,31 +988,44 @@ ObjJAcornCompiler.prototype.IMBuffer = function() return this.imBuffer; } -ObjJAcornCompiler.prototype.JSBuffer = function() +ObjJAcornCompiler.prototype.code = function() { - return this.jsBuffer; + return this.compiledCode; } -ObjJAcornCompiler.prototype.prettifyMessage = function(/* Message */ aMessage, /* String */ messageType) +ObjJAcornCompiler.prototype.ast = function() { - var line = this.source.substring(aMessage.lineStart, aMessage.lineEnd), + return JSON.stringify(this.tokens, null, indentationSpaces); +} + +ObjJAcornCompiler.prototype.map = function() +{ + return JSON.stringify(this.sourceMap); +} + +ObjJAcornCompiler.prototype.prettifyMessage = function(/* Message */ aMessage) +{ + var line = aMessage.messageForLine, message = "\n" + line; - message += (new Array(aMessage.column + 1)).join(" "); + message += (new Array(aMessage.messageOnColumn + 1)).join(" "); message += (new Array(Math.min(1, line.length) + 1)).join("^") + "\n"; - message += messageType + " line " + aMessage.line + " in " + this.URL + ": " + aMessage.message; + message += aMessage.messageType + " line " + aMessage.messageOnLine + " in " + this.URL + ": " + aMessage.message; return message; } ObjJAcornCompiler.prototype.error_message = function(errorMessage, node) { - var pos = exports.acorn.getLineInfo(this.source, node.start), - syntaxErrorData = {message: errorMessage, line: pos.line, column: pos.column, lineStart: pos.lineStart, lineEnd: pos.lineEnd}, - syntaxError = new SyntaxError(this.prettifyMessage(syntaxErrorData, "ERROR")); + var pos = acorn.getLineInfo(this.source, node.start), + syntaxError = new SyntaxError(errorMessage); - syntaxError.line = pos.line; - syntaxError.path = this.URL.path(); + syntaxError.messageOnLine = pos.line; + syntaxError.messageOnColumn = pos.column; + syntaxError.path = this.URL; + syntaxError.messageForNode = node; + syntaxError.messageType = "ERROR"; + syntaxError.messageForLine = this.source.substring(pos.lineStart, pos.lineEnd); return syntaxError; } @@ -751,21 +1044,59 @@ ObjJAcornCompiler.prototype.popImport = function() function createMessage(/* String */ aMessage, /* SpiderMonkey AST node */ node, /* String */ code) { - var message = exports.acorn.getLineInfo(code, node.start); + var message = acorn.getLineInfo(code, node.start); message.message = aMessage; + // As a SyntaxError object can't change the property 'line' we also set the property 'messageOnLine' + message.messageOnLine = message.line; + message.messageOnColumn = message.column; + message.messageForNode = node; + message.messageType = "WARNING"; + message.messageForLine = code.substring(message.lineStart, message.lineEnd); return message; } function compile(node, state, visitor) { function c(node, st, override) { - //print("c: " + (override ? override + ", " : "") + node.type + ", " + exports.acorn.getLineInfo(st.compiler.source, node.start).line); visitor[override || node.type](node, st, c); - //print("cc: " + (override ? override + ", " : "") + node.type + ", " + exports.acorn.getLineInfo(st.compiler.source, node.end).line); } c(node, state); -}; +} + +function compileWithFormat(node, state, visitor) { + var lastNode, lastComment; + function c(node, st, override) { + var compiler = st.compiler, + includeComments = compiler.includeComments, + parentNode = st.currentNode(), + localLastNode = lastNode, + sameNode = localLastNode === node; + //console.log(override || node.type); + lastNode = node; + if (includeComments && !sameNode && node.commentsBefore && node.commentsBefore !== lastComment) { + for (var i = 0; i < node.commentsBefore.length; i++) + compiler.jsBuffer.concat(node.commentsBefore[i]); + } + st.pushNode(node, override); + var formatDescription = st.formatDescription(); + //console.log("formatDescription: " + JSON.stringify(formatDescription) + ", node.type: " + node.type + ", override: " + override); + if (!sameNode && formatDescription && formatDescription.before) + compiler.jsBuffer.concatFormat(formatDescription.before); + visitor[override || node.type](node, st, c, formatDescription); + if (!sameNode && formatDescription && formatDescription.after) + compiler.jsBuffer.concatFormat(formatDescription.after); + st.popNode(); + if (includeComments && !sameNode && node.commentsAfter) { + for (var i = 0; i < node.commentsAfter.length; i++) + compiler.jsBuffer.concat(node.commentsAfter[i]); + lastComment = node.commentsAfter; + } else { + lastComment = null; + } + } + c(node, state); +} function isIdempotentExpression(node) { switch (node.type) { @@ -843,9 +1174,9 @@ function checkCanDereference(st, node) { // Surround expression with parentheses function surroundExpression(c) { - return function(node, st, override) { + return function(node, st, override, format) { st.compiler.jsBuffer.concat("("); - c(node, st, override); + c(node, st, override, format); st.compiler.jsBuffer.concat(")"); } } @@ -898,23 +1229,32 @@ function nodePrecedence(node, subNode, right) { return nodePrecedence < subNodePrecedence || (nodePrecedence === subNodePrecedence && isLogicalBinary(nodeType) && ((nodeOperatorPrecedence = operatorPrecedence[node.operator]) < (subNodeOperatorPrecedence = operatorPrecedence[subNode.operator]) || (right && nodeOperatorPrecedence === subNodeOperatorPrecedence))); } -var pass1 = exports.acorn.walk.make({ +var pass1 = walk.make({ ImportStatement: function(node, st, c) { var urlString = node.filename.value; - st.compiler.dependencies.push(new FileDependency(new CFURL(urlString), node.localfilepath)); + st.compiler.dependencies.push({url: urlString, isLocal: node.localfilepath}); + //st.compiler.dependencies.push(typeof FileDependency !== 'undefined' ? new FileDependency(typeof CFURL !== 'undefined' ? new CFURL(urlString) : urlString, node.localfilepath) : urlString); } }); +var indentType = " "; var indentationSpaces = 4; -var indentStep = Array(indentationSpaces + 1).join(" "); +var indentationSize = indentationSpaces * indentType.length; +var indentStep = Array(indentationSpaces + 1).join(indentType); var indentation = ""; -var pass2 = exports.acorn.walk.make({ +var pass2 = walk.make({ Program: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate; + + indentType = compiler.options.indentationType; + indentationSpaces = compiler.options.indentationSpaces; + indentationSize = indentationSpaces * indentType.length; + indentStep = Array(indentationSpaces + 1).join(indentType); indentation = ""; + for (var i = 0; i < node.body.length; ++i) { c(node.body[i], st, "Statement"); } @@ -929,7 +1269,7 @@ Program: function(node, st, c) { } } }, -BlockStatement: function(node, st, c) { +BlockStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, endOfScopeBody = st.endOfScopeBody, @@ -939,10 +1279,18 @@ BlockStatement: function(node, st, c) { delete st.endOfScopeBody; if (generate) { - st.indentBlockLevel = typeof st.indentBlockLevel === "undefined" ? 0 : st.indentBlockLevel + 1; + var skipIndentation = st.skipIndentation; buffer = compiler.jsBuffer; - buffer.concat(indentation.substring(indentationSpaces)); - buffer.concat("{\n"); + if (format) { + buffer.concat("{", node); + buffer.concatFormat(format.afterLeftBrace); + } else { + if (skipIndentation) + delete st.skipIndentation; + else + buffer.concat(indentation.substring(indentationSize)); + buffer.concat("{\n", node); + } } for (var i = 0; i < node.body.length; ++i) { c(node.body[i], st, "Statement"); @@ -960,46 +1308,73 @@ BlockStatement: function(node, st, c) { buffer.concat(";\n"); } - buffer.concat(indentation.substring(indentationSpaces)); - buffer.concat("}"); - if (st.isDecl || st.indentBlockLevel > 0) - buffer.concat("\n"); - st.indentBlockLevel--; + //Simulate a node for the last curly bracket + var endNode = node.loc && { loc: { start: { line : node.loc.end.line, column: node.loc.end.column-1}}, source: node.loc.source}; + if (format) { + buffer.concatFormat(format.beforeRightBrace); + buffer.concat("}", endNode); + } else { + buffer.concat(indentation.substring(indentationSize)); + buffer.concat("}", endNode); + if (!skipIndentation && st.isDecl !== false) + buffer.concat("\n"); + st.indentBlockLevel--; + } } }, -ExpressionStatement: function(node, st, c) { +ExpressionStatement: function(node, st, c, format) { var compiler = st.compiler, - generate = compiler.generate; + generate = compiler.generate && !format; if (generate) compiler.jsBuffer.concat(indentation); c(node.expression, st, "Expression"); if (generate) compiler.jsBuffer.concat(";\n"); }, -IfStatement: function(node, st, c) { +IfStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - if (!st.superNodeIsElse) - buffer.concat(indentation); - else - delete st.superNodeIsElse; - buffer.concat("if ("); + if (format) { + buffer.concat("if", node); + buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("("); + } else { + // Keep the 'else' and 'if' on the same line if it is an 'else if' + if (!st.superNodeIsElse) + buffer.concat(indentation); + else + delete st.superNodeIsElse; + buffer.concat("if (", node); + } } c(node.test, st, "Expression"); - // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... - if (generate) buffer.concat(node.consequent.type === "EmptyStatement" ? ");\n" : ")\n"); + if (generate) { + if (format) { + buffer.concat(")"); + buffer.concatFormat(format.afterRightParenthesis); + } else { + // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... + buffer.concat(node.consequent.type === "EmptyStatement" ? ");\n" : ")\n"); + } + } indentation += indentStep; c(node.consequent, st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); var alternate = node.alternate; if (alternate) { var alternateNotIf = alternate.type !== "IfStatement"; if (generate) { - var emptyStatement = alternate.type === "EmptyStatement"; - buffer.concat(indentation); - // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... - buffer.concat(alternateNotIf ? emptyStatement ? "else;\n" : "else\n" : "else "); + if (format) { + buffer.concatFormat(format.beforeElse); // Do we need this? + buffer.concat("else"); + buffer.concatFormat(format.afterElse); + } else { + var emptyStatement = alternate.type === "EmptyStatement"; + buffer.concat(indentation); + // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... + buffer.concat(alternateNotIf ? emptyStatement ? "else;\n" : "else\n" : "else "); + } } if (alternateNotIf) indentation += indentStep; @@ -1007,229 +1382,384 @@ IfStatement: function(node, st, c) { st.superNodeIsElse = true; c(alternate, st, "Statement"); - if (alternateNotIf) indentation = indentation.substring(indentationSpaces); + if (alternateNotIf) indentation = indentation.substring(indentationSize); } }, -LabeledStatement: function(node, st, c) { +LabeledStatement: function(node, st, c, format) { var compiler = st.compiler; if (compiler.generate) { var buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat(node.label.name); - buffer.concat(": "); + if (!format) buffer.concat(indentation); + c(node.label, st, "IdentifierName"); + if (format) { + buffer.concat(":"); + buffer.concatFormat(format.afterColon); + } else { + buffer.concat(": "); + } } c(node.body, st, "Statement"); }, -BreakStatement: function(node, st, c) { +BreakStatement: function(node, st, c, format) { var compiler = st.compiler; if (compiler.generate) { - compiler.jsBuffer.concat(indentation); - if (node.label) { - compiler.jsBuffer.concat("break "); - compiler.jsBuffer.concat(node.label.name); - compiler.jsBuffer.concat(";\n"); + var label = node.label, + buffer = compiler.jsBuffer; + if (!format) buffer.concat(indentation); + if (label) { + if (format) { + buffer.concat("break", node); + buffer.concatFormat(format.beforeLabel); + } else { + buffer.concat("break ", node); + } + c(label, st, "IdentifierName"); + if (!format) buffer.concat(";\n"); } else - compiler.jsBuffer.concat("break;\n"); + buffer.concat(format ? "break" : "break;\n", node); } }, -ContinueStatement: function(node, st, c) { +ContinueStatement: function(node, st, c, format) { var compiler = st.compiler; if (compiler.generate) { - var buffer = compiler.jsBuffer; - buffer.concat(indentation); - if (node.label) { - buffer.concat("continue "); - buffer.concat(node.label.name); - buffer.concat(";\n"); + var label = node.label, + buffer = compiler.jsBuffer; + if (!format) buffer.concat(indentation); + if (label) { + if (format) { + buffer.concat("continue", node); + buffer.concatFormat(format.beforeLabel); + } else { + buffer.concat("continue ", node); + } + c(label, st, "IdentifierName"); + if (!format) buffer.concat(";\n"); } else - buffer.concat("continue;\n"); + buffer.concat(format ? "continue" : "continue;\n", node); } }, -WithStatement: function(node, st, c) { +WithStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("with("); + if (format) { + buffer.concat("with", node); + buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("("); + } else { + buffer.concat(indentation); + buffer.concat("with(", node); + } } c(node.object, st, "Expression"); - if (generate) buffer.concat(")\n"); + if (generate) + if (format) { + buffer.concat(")"); + buffer.concatFormat(format.afterRightParenthesis); + } else { + buffer.concat(")\n"); + } indentation += indentStep; c(node.body, st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); }, -SwitchStatement: function(node, st, c) { +SwitchStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("switch("); + if (format) { + buffer.concat("switch", node); + buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("(", node); + } else { + buffer.concat(indentation); + buffer.concat("switch(", node); + } } c(node.discriminant, st, "Expression"); - if (generate) buffer.concat(") {\n"); + if (generate) + if (format) { + buffer.concat(")"); + buffer.concatFormat(format.afterRightParenthesis); + buffer.concat("{"); + buffer.concatFormat(format.afterLeftBrace); + } else { + buffer.concat(") {\n"); + } + indentation += indentStep; for (var i = 0; i < node.cases.length; ++i) { var cs = node.cases[i]; if (cs.test) { if (generate) { - buffer.concat(indentation); - buffer.concat("case "); + if (format) { + buffer.concatFormat(format.beforeCase); + buffer.concat("case", node); + buffer.concatFormat(format.afterCase); + } else { + buffer.concat(indentation); + buffer.concat("case "); + } } c(cs.test, st, "Expression"); - if (generate) buffer.concat(":\n"); + if (generate) + if (format) { + buffer.concat(":"); + buffer.concatFormat(format.afterColon); + } else { + buffer.concat(":\n"); + } } else - if (generate) buffer.concat("default:\n"); + if (generate) + if (format) { + buffer.concatFormat(format.beforeCase); + buffer.concat("default"); + buffer.concatFormat(format.afterCase); + buffer.concat(":"); + buffer.concatFormat(format.afterColon); + } else { + buffer.concat("default:\n"); + } indentation += indentStep; for (var j = 0; j < cs.consequent.length; ++j) c(cs.consequent[j], st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); } + indentation = indentation.substring(indentationSize); if (generate) { - buffer.concat(indentation); - buffer.concat("}\n"); + if (format) { + buffer.concatFormat(format.beforeRightBrace); + buffer.concat("}"); + } else { + buffer.concat(indentation); + buffer.concat("}\n"); + } } }, -ReturnStatement: function(node, st, c) { +ReturnStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("return"); + if (!format) buffer.concat(indentation); + buffer.concat("return", node); } if (node.argument) { - if (generate) buffer.concat(" "); + if (generate) buffer.concatFormat(format ? format.beforeExpression : " "); c(node.argument, st, "Expression"); } - if (generate) buffer.concat(";\n"); + if (generate && !format) buffer.concat(";\n"); }, -ThrowStatement: function(node, st, c) { +ThrowStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("throw "); + if (!format) buffer.concat(indentation); + buffer.concat("throw", node); + buffer.concatFormat(format ? format.beforeExpression : " "); } c(node.argument, st, "Expression"); - if (generate) buffer.concat(";\n"); + if (generate && !format) buffer.concat(";\n"); }, -TryStatement: function(node, st, c) { +TryStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("try"); + if (!format) buffer.concat(indentation); + buffer.concat("try", node); + buffer.concatFormat(format ? format.beforeStatement : " "); } indentation += indentStep; + if (!format) st.skipIndentation = true; c(node.block, st, "Statement"); - indentation = indentation.substring(indentationSpaces); - for (var i = 0; i < node.handlers.length; ++i) { - var handler = node.handlers[i], inner = new Scope(st), + indentation = indentation.substring(indentationSize); + if (node.handler) { + var handler = node.handler, + inner = new Scope(st), param = handler.param, name = param.name; inner.vars[name] = {type: "catch clause", node: param}; if (generate) { - buffer.concat(indentation); - buffer.concat("catch("); - buffer.concat(name); - buffer.concat(") "); + if (format) { + buffer.concatFormat(format.beforeCatch); + buffer.concat("catch"); + buffer.concatFormat(format.afterCatch); + buffer.concat("("); + c(param, st, "IdentifierName"); + buffer.concat(")"); + buffer.concatFormat(format.beforeCatchStatement); + } else { + buffer.concat("\n"); + buffer.concat(indentation); + buffer.concat("catch("); + buffer.concat(name); + buffer.concat(") "); + } } indentation += indentStep; + inner.skipIndentation = true; inner.endOfScopeBody = true; c(handler.body, inner, "ScopeBody"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); inner.copyAddedSelfToIvarsToParent(); } if (node.finalizer) { if (generate) { - buffer.concat(indentation); - buffer.concat("finally "); + if (format) { + buffer.concatFormat(format.beforeCatch); + buffer.concat("finally"); + buffer.concatFormat(format.beforeCatchStatement); + } else { + buffer.concat("\n"); + buffer.concat(indentation); + buffer.concat("finally "); + } } indentation += indentStep; + st.skipIndentation = true; c(node.finalizer, st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); } + if (generate && !format) + buffer.concat("\n"); }, -WhileStatement: function(node, st, c) { +WhileStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, body = node.body, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("while ("); + if (format) { + buffer.concat("while", node); + buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("("); + } else { + buffer.concat(indentation); + buffer.concat("while (", node); + } } c(node.test, st, "Expression"); - if (generate) buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + if (generate) + if (format) { + buffer.concat(")"); + buffer.concatFormat(format.afterRightParenthesis); + } else { + // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... + buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + } indentation += indentStep; c(body, st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); }, -DoWhileStatement: function(node, st, c) { +DoWhileStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("do\n"); + if (format) { + buffer.concat("do", node); + buffer.concatFormat(format.beforeStatement); + } else { + buffer.concat(indentation); + buffer.concat("do\n", node); + } } indentation += indentStep; c(node.body, st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); if (generate) { - buffer.concat(indentation); - buffer.concat("while ("); + if (format) { + buffer.concat("while"); + buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("("); + } else { + buffer.concat(indentation); + buffer.concat("while ("); + } } c(node.test, st, "Expression"); - if (generate) buffer.concat(");\n"); + if (generate) buffer.concatFormat(format ? ")" : ");\n"); }, -ForStatement: function(node, st, c) { +ForStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, body = node.body, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("for ("); + if (format) { + buffer.concat("for", node); + buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("("); + } else { + buffer.concat(indentation); + buffer.concat("for (", node); + } } if (node.init) c(node.init, st, "ForInit"); - if (generate) buffer.concat("; "); + if (generate) buffer.concat(format ? ";" : "; "); if (node.test) c(node.test, st, "Expression"); - if (generate) buffer.concat("; "); + if (generate) buffer.concat(format ? ";" : "; "); if (node.update) c(node.update, st, "Expression"); - if (generate) buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + if (generate) + if (format) { + buffer.concat(")"); + buffer.concatFormat(format.afterRightParenthesis); + } else { + // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... + buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + } indentation += indentStep; c(body, st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); }, -ForInStatement: function(node, st, c) { +ForInStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, body = node.body, buffer; if (generate) { buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("for ("); + if (format) { + buffer.concat("for", node); + buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("("); + } else { + buffer.concat(indentation); + buffer.concat("for (", node); + } } c(node.left, st, "ForInit"); - if (generate) buffer.concat(" in "); + if (generate) + if (format) { + buffer.concatFormat(format.beforeIn); + buffer.concat("in"); + buffer.concatFormat(format.afterIn); + } else { + buffer.concat(" in "); + } c(node.right, st, "Expression"); - if (generate) buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + if (generate) + if (format) { + buffer.concat(")"); + buffer.concatFormat(format.afterRightParenthesis); + } else { + // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... + buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + } indentation += indentStep; c(body, st, "Statement"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); }, ForInit: function(node, st, c) { var compiler = st.compiler, @@ -1241,160 +1771,231 @@ ForInit: function(node, st, c) { } else c(node, st, "Expression"); }, -DebuggerStatement: function(node, st, c) { +DebuggerStatement: function(node, st, c, format) { var compiler = st.compiler; if (compiler.generate) { var buffer = compiler.jsBuffer; - buffer.concat(indentation); - buffer.concat("debugger;\n"); + if (format) { + buffer.concat("debugger", node); + } else { + buffer.concat(indentation); + buffer.concat("debugger;\n", node); + } } }, -Function: function(node, st, c) { +Function: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, - buffer = compiler.jsBuffer; + buffer = compiler.jsBuffer, inner = new Scope(st), - decl = node.type == "FunctionDeclaration"; + decl = node.type == "FunctionDeclaration", + id = node.id; - inner.isDecl = decl; + inner.isDecl = decl; for (var i = 0; i < node.params.length; ++i) inner.vars[node.params[i].name] = {type: "argument", node: node.params[i]}; - if (node.id) { - (decl ? st : inner).vars[node.id.name] = - {type: decl ? "function" : "function name", node: node.id}; - if (generate) { - buffer.concat(node.id.name); - buffer.concat(" = "); - } else { - buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); - buffer.concat(node.id.name); - buffer.concat(" = function"); - compiler.lastPos = node.id.end; + if (generate && !format) + buffer.concat(indentation); + if (id) { + var name = id.name; + (decl ? st : inner).vars[name] = {type: decl ? "function" : "function name", node: id}; + if (compiler.transformNamedFunctionDeclarationToAssignment) { + if (generate) { + buffer.concat(name); + buffer.concat(" = "); + } else { + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(name); + buffer.concat(" = function"); + compiler.lastPos = id.end; + } } } if (generate) { - buffer.concat("function("); + buffer.concat("function", node); + if (!compiler.transformNamedFunctionDeclarationToAssignment && id) + { + if (!format) buffer.concat(" "); + c(id, st, "IdentifierName"); + } + if (format) buffer.concatFormat(format.beforeLeftParenthesis); + buffer.concat("("); for (var i = 0; i < node.params.length; ++i) { if (i) - buffer.concat(", "); - buffer.concat(node.params[i].name); + buffer.concat(format ? "," : ", "); + c(node.params[i], st, "IdentifierName"); + } + if (format) { + buffer.concat(")"); + buffer.concatFormat(format.afterRightParenthesis); + } else { + buffer.concat(")\n"); } - buffer.concat(")\n"); } indentation += indentStep; inner.endOfScopeBody = true; c(node.body, inner, "ScopeBody"); - indentation = indentation.substring(indentationSpaces); + indentation = indentation.substring(indentationSize); inner.copyAddedSelfToIvarsToParent(); }, -VariableDeclaration: function(node, st, c) { +VariableDeclaration: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, buffer; if (generate) { buffer = compiler.jsBuffer; - if (!st.isFor) buffer.concat(indentation); - buffer.concat("var "); + if (!st.isFor && !format) buffer.concat(indentation); + buffer.concat(format ? "var" : "var ", node); } for (var i = 0; i < node.declarations.length; ++i) { var decl = node.declarations[i], identifier = decl.id.name; if (i) if (generate) { - if (st.isFor) - buffer.concat(", "); - else { - buffer.concat(",\n"); - buffer.concat(indentation); - buffer.concat(" "); + if (format) { + buffer.concat(","); + } else { + if (st.isFor) + buffer.concat(", "); + else { + buffer.concat(",\n"); + buffer.concat(indentation); + buffer.concat(" "); + } } } st.vars[identifier] = {type: "var", node: decl.id}; - if (generate) buffer.concat(identifier); + c(decl.id, st, "IdentifierName"); if (decl.init) { - if (generate) buffer.concat(" = "); + if (generate) { + if (format) { + buffer.concatFormat(format.beforeEqual); + buffer.concat("="); + buffer.concatFormat(format.afterEqual); + } else { + buffer.concat(" = "); + } + } c(decl.init, st, "Expression"); } // FIXME: Extract to function + // Here we check back if a ivar with the same name exists and if we have prefixed 'self.' on previous uses. + // If this is the case we have to remove the prefixes and issue a warning that the variable hides the ivar. if (st.addedSelfToIvars) { var addedSelfToIvar = st.addedSelfToIvars[identifier]; if (addedSelfToIvar) { - var buffer = st.compiler.jsBuffer.atoms; - for (var i = 0; i < addedSelfToIvar.length; i++) { + var atoms = st.compiler.jsBuffer.atoms; + for (var i = 0, size = addedSelfToIvar.length; i < size; i++) { var dict = addedSelfToIvar[i]; - buffer[dict.index] = ""; + atoms[dict.index] = ""; compiler.addWarning(createMessage("Local declaration of '" + identifier + "' hides instance variable", dict.node, compiler.source)); } st.addedSelfToIvars[identifier] = []; } } } - if (generate && !st.isFor) compiler.jsBuffer.concat(";\n"); // Don't add ';' if this is a for statement but do it if this is a statement + if (generate && !format && !st.isFor) buffer.concat(";\n"); // Don't add ';' if this is a for statement but do it if this is a statement }, ThisExpression: function(node, st, c) { var compiler = st.compiler; - if (compiler.generate) compiler.jsBuffer.concat("this"); -}, -ArrayExpression: function(node, st, c) { - var compiler = st.compiler, - generate = compiler.generate; - if (generate) compiler.jsBuffer.concat("["); - for (var i = 0; i < node.elements.length; ++i) { - var elt = node.elements[i]; - if (i !== 0) - if (generate) compiler.jsBuffer.concat(", "); - if (elt) c(elt, st, "Expression"); - } - if (generate) compiler.jsBuffer.concat("]"); + if (compiler.generate) compiler.jsBuffer.concat("this", node); }, -ObjectExpression: function(node, st, c) { +ArrayExpression: function(node, st, c, format) { var compiler = st.compiler, - generate = compiler.generate; - if (generate) compiler.jsBuffer.concat("{"); - for (var i = 0; i < node.properties.length; ++i) + generate = compiler.generate, + buffer; + + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat("[", node); + } + + for (var i = 0; i < node.elements.length; ++i) { + var elt = node.elements[i]; + + if (generate && i !== 0) + if (format) { + buffer.concatFormat(format.beforeComma); + buffer.concat(","); + buffer.concatFormat(format.afterComma); + } else + buffer.concat(", "); + + if (elt) c(elt, st, "Expression"); + } + if (generate) buffer.concat("]"); +}, +ObjectExpression: function(node, st, c, format) { + var compiler = st.compiler, + generate = compiler.generate, + properties = node.properties, + buffer = compiler.jsBuffer; + if (generate) buffer.concat("{", node); + for (var i = 0, size = properties.length; i < size; ++i) { - var prop = node.properties[i]; + var prop = properties[i]; if (generate) { if (i) - compiler.jsBuffer.concat(", "); + if (format) { + buffer.concatFormat(format.beforeComma); + buffer.concat(","); + buffer.concatFormat(format.afterComma); + } else + buffer.concat(", "); st.isPropertyKey = true; c(prop.key, st, "Expression"); delete st.isPropertyKey; - compiler.jsBuffer.concat(": "); + if (format) { + buffer.concatFormat(format.beforeColon); + buffer.concat(":"); + buffer.concatFormat(format.afterColon); + } else { + buffer.concat(": "); + } } else if (prop.key.raw && prop.key.raw.charAt(0) === "@") { - compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, prop.key.start)); + buffer.concat(compiler.source.substring(compiler.lastPos, prop.key.start)); compiler.lastPos = prop.key.start + 1; } c(prop.value, st, "Expression"); } - if (generate) compiler.jsBuffer.concat("}"); + if (generate) buffer.concat("}"); }, -SequenceExpression: function(node, st, c) { +SequenceExpression: function(node, st, c, format) { var compiler = st.compiler, - generate = compiler.generate; - if (generate) compiler.jsBuffer.concat("("); + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat("("); + } for (var i = 0; i < node.expressions.length; ++i) { if (generate && i !== 0) - compiler.jsBuffer.concat(", "); + if (format) { + buffer.concatFormat(format.beforeComma); + buffer.concat(","); + buffer.concatFormat(format.afterComma); + } else + buffer.concat(", "); c(node.expressions[i], st, "Expression"); } - if (generate) compiler.jsBuffer.concat(")"); + if (generate) buffer.concat(")"); }, UnaryExpression: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, argument = node.argument; if (generate) { + var buffer = compiler.jsBuffer; if (node.prefix) { - compiler.jsBuffer.concat(node.operator); + buffer.concat(node.operator, node); if (wordPrefixOperators(node.operator)) - compiler.jsBuffer.concat(" "); + buffer.concat(" "); (nodePrecedence(node, argument) ? surroundExpression(c) : c)(argument, st, "Expression"); } else { (nodePrecedence(node, argument) ? surroundExpression(c) : c)(argument, st, "Expression"); - compiler.jsBuffer.concat(node.operator); + buffer.concat(node.operator); } } else { c(argument, st, "Expression"); @@ -1402,26 +2003,27 @@ UnaryExpression: function(node, st, c) { }, UpdateExpression: function(node, st, c) { var compiler = st.compiler, - generate = compiler.generate; + generate = compiler.generate, + buffer = compiler.jsBuffer; if (node.argument.type === "Dereference") { checkCanDereference(st, node.argument); // @deref(x)++ and ++@deref(x) require special handling. - if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); // Output the dereference function, "(...)(z)" - compiler.jsBuffer.concat((node.prefix ? "" : "(") + "("); + buffer.concat((node.prefix ? "" : "(") + "("); // The thing being dereferenced. if (!generate) compiler.lastPos = node.argument.expr.start; c(node.argument.expr, st, "Expression"); - if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.argument.expr.end)); - compiler.jsBuffer.concat(")("); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.argument.expr.end)); + buffer.concat(")("); if (!generate) compiler.lastPos = node.argument.start; c(node.argument, st, "Expression"); - if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.argument.end)); - compiler.jsBuffer.concat(" " + node.operator.substring(0, 1) + " 1)" + (node.prefix ? "" : node.operator == '++' ? " - 1)" : " + 1)")); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.argument.end)); + buffer.concat(" " + node.operator.substring(0, 1) + " 1)" + (node.prefix ? "" : node.operator == '++' ? " - 1)" : " + 1)")); if (!generate) compiler.lastPos = node.end; return; @@ -1429,42 +2031,42 @@ UpdateExpression: function(node, st, c) { if (node.prefix) { if (generate) { - compiler.jsBuffer.concat(node.operator); + buffer.concat(node.operator, node); if (wordPrefixOperators(node.operator)) - compiler.jsBuffer.concat(" "); + buffer.concat(" "); } (generate && nodePrecedence(node, node.argument) ? surroundExpression(c) : c)(node.argument, st, "Expression"); } else { (generate && nodePrecedence(node, node.argument) ? surroundExpression(c) : c)(node.argument, st, "Expression"); - if (generate) compiler.jsBuffer.concat(node.operator); + if (generate) buffer.concat(node.operator); } }, -BinaryExpression: function(node, st, c) { +BinaryExpression: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, operatorType = isInInstanceof(node.operator); (generate && nodePrecedence(node, node.left) ? surroundExpression(c) : c)(node.left, st, "Expression"); if (generate) { var buffer = compiler.jsBuffer; - buffer.concat(" "); + buffer.concatFormat(format ? format.beforeOperator : " "); buffer.concat(node.operator); - buffer.concat(" "); + buffer.concatFormat(format ? format.afterOperator : " "); } (generate && nodePrecedence(node, node.right, true) ? surroundExpression(c) : c)(node.right, st, "Expression"); }, -LogicalExpression: function(node, st, c) { +LogicalExpression: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate; (generate && nodePrecedence(node, node.left) ? surroundExpression(c) : c)(node.left, st, "Expression"); if (generate) { var buffer = compiler.jsBuffer; - buffer.concat(" "); + buffer.concatFormat(format ? format.beforeOperator : " "); buffer.concat(node.operator); - buffer.concat(" "); + buffer.concatFormat(format ? format.afterOperator : " "); } (generate && nodePrecedence(node, node.right, true) ? surroundExpression(c) : c)(node.right, st, "Expression"); }, -AssignmentExpression: function(node, st, c) { +AssignmentExpression: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, saveAssignment = st.assignment, @@ -1505,6 +2107,7 @@ AssignmentExpression: function(node, st, c) { var saveAssignment = st.assignment, nodeLeft = node.left; + st.assignment = true; if (nodeLeft.type === "Identifier" && nodeLeft.name === "self") { var lVar = st.getLvar("self", true); @@ -1516,44 +2119,67 @@ AssignmentExpression: function(node, st, c) { } (generate && nodePrecedence(node, nodeLeft) ? surroundExpression(c) : c)(nodeLeft, st, "Expression"); if (generate) { - buffer.concat(" "); + buffer.concatFormat(format ? format.beforeOperator : " "); buffer.concat(node.operator); - buffer.concat(" "); + buffer.concatFormat(format ? format.afterOperator : " "); } st.assignment = saveAssignment; (generate && nodePrecedence(node, node.right, true) ? surroundExpression(c) : c)(node.right, st, "Expression"); if (st.isRootScope() && nodeLeft.type === "Identifier" && !st.getLvar(nodeLeft.name)) st.vars[nodeLeft.name] = {type: "global", node: nodeLeft}; }, -ConditionalExpression: function(node, st, c) { - var compiler = st.compiler, - generate = compiler.generate; - (generate && nodePrecedence(node, node.test) ? surroundExpression(c) : c)(node.test, st, "Expression"); - if (generate) - compiler.jsBuffer.concat(" ? "); - c(node.consequent, st, "Expression"); - if (generate) compiler.jsBuffer.concat(" : "); - c(node.alternate, st, "Expression"); -}, -NewExpression: function(node, st, c) { - var compiler = st.compiler, - generate = compiler.generate; - if (generate) compiler.jsBuffer.concat("new "); - (generate && nodePrecedence(node, node.callee) ? surroundExpression(c) : c)(node.callee, st, "Expression"); - if (generate) compiler.jsBuffer.concat("("); - if (node.arguments) { - for (var i = 0; i < node.arguments.length; ++i) { - if (generate && i) - compiler.jsBuffer.concat(", "); - c(node.arguments[i], st, "Expression"); - } - } - if (generate) compiler.jsBuffer.concat(")"); -}, -CallExpression: function(node, st, c) { +ConditionalExpression: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, - callee = node.callee; + buffer; + (generate && nodePrecedence(node, node.test) ? surroundExpression(c) : c)(node.test, st, "Expression"); + if (generate) { + buffer = compiler.jsBuffer; + if (format) { + buffer.concatFormat(format.beforeOperator); + buffer.concat("?"); + buffer.concatFormat(format.afterOperator); + } else { + buffer.concat(" ? "); + } + } + c(node.consequent, st, "Expression"); + if (generate) + if (format) { + buffer.concatFormat(format.beforeOperator); + buffer.concat(":"); + buffer.concatFormat(format.afterOperator); + } else { + buffer.concat(" : "); + } + c(node.alternate, st, "Expression"); +}, +NewExpression: function(node, st, c, format) { + var compiler = st.compiler, + nodeArguments = node.arguments, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat("new ", node); + } + (generate && nodePrecedence(node, node.callee) ? surroundExpression(c) : c)(node.callee, st, "Expression"); + if (generate) buffer.concat("("); + if (nodeArguments) { + for (var i = 0, size = nodeArguments.length; i < size; ++i) { + if (i && generate) + buffer.concatFormat(format ? "," : ", "); + c(nodeArguments[i], st, "Expression"); + } + } + if (generate) buffer.concat(")"); +}, +CallExpression: function(node, st, c, format) { + var compiler = st.compiler, + nodeArguments = node.arguments, + generate = compiler.generate, + callee = node.callee, + buffer; // If call to function 'eval' we assume that 'self' can be altered and from this point // we check if 'self' is null before 'objj_msgSend' is called with 'self' as receiver. @@ -1568,27 +2194,26 @@ CallExpression: function(node, st, c) { } (generate && nodePrecedence(node, callee) ? surroundExpression(c) : c)(callee, st, "Expression"); - if (generate) compiler.jsBuffer.concat("("); - if (node.arguments) { - for (var i = 0; i < node.arguments.length; ++i) { - if (generate && i) - compiler.jsBuffer.concat(", "); - c(node.arguments[i], st, "Expression"); + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat("("); + } + if (nodeArguments) { + for (var i = 0, size = nodeArguments.length; i < size; ++i) { + if (i && generate) + buffer.concat(format ? "," : ", "); + c(nodeArguments[i], st, "Expression"); } } - if (generate) compiler.jsBuffer.concat(")"); + if (generate) buffer.concat(")"); }, MemberExpression: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, computed = node.computed; (generate && nodePrecedence(node, node.object) ? surroundExpression(c) : c)(node.object, st, "Expression"); - if (generate) { - if (computed) - compiler.jsBuffer.concat("["); - else - compiler.jsBuffer.concat("."); - } + if (generate) + compiler.jsBuffer.concat(computed ? "[" : ".", node); st.secondMemberExpression = !computed; // No parentheses when it is computed, '[' amd ']' are the same thing. (generate && !computed && nodePrecedence(node, node.property) ? surroundExpression(c) : c)(node.property, st, "Expression"); @@ -1619,12 +2244,12 @@ Identifier: function(node, st, c) { } while (compiler.source.substr(nodeStart++, 1) === "(") // Save the index in where the "self." string is stored and the node. // These will be used if we find a variable declaration that is hoisting this identifier. - ((st.addedSelfToIvars || (st.addedSelfToIvars = Object.create(null)))[identifier] || (st.addedSelfToIvars[identifier] = [])).push({node: node, index: compiler.jsBuffer.atoms.length}); - compiler.jsBuffer.concat("self."); + ((st.addedSelfToIvars || (st.addedSelfToIvars = Object.create(null)))[identifier] || (st.addedSelfToIvars[identifier] = [])).push({node: node, index: compiler.jsBuffer.length()}); + compiler.jsBuffer.concat("self.", node); } } else if (!reservedIdentifiers(identifier)) { // Don't check for warnings if it is a reserved word like self, localStorage, _cmd, etc... var message, - classOrGlobal = typeof global[identifier] !== "undefined" || typeof window[identifier] !== "undefined" || compiler.getClassDef(identifier), + classOrGlobal = typeof global[identifier] !== "undefined" || (typeof window !== 'undefined' && typeof window[identifier] !== "undefined") || compiler.getClassDef(identifier), globalVar = st.getLvar(identifier); if (classOrGlobal && (!globalVar || globalVar.type !== "class")) { // It can't be declared with a @class statement. /* Turned off this warning as there are many many warnings when compiling the Cappuccino frameworks - Martin @@ -1644,16 +2269,31 @@ Identifier: function(node, st, c) { st.addMaybeWarning(message); } } - if (generate) compiler.jsBuffer.concat(identifier); + if (generate) compiler.jsBuffer.concat(identifier, node); +}, +// Use this when there should not be a look up to issue warnings or add 'self.' before ivars +IdentifierName: function(node, st, c) { + var compiler = st.compiler; + if (compiler.generate) + compiler.jsBuffer.concat(node.name, node); }, Literal: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate; if (generate) { - if (node.raw && node.raw.charAt(0) === "@") - compiler.jsBuffer.concat(node.raw.substring(1)); - else - compiler.jsBuffer.concat(node.raw); + if (node.raw) + if (node.raw.charAt(0) === "@") + compiler.jsBuffer.concat(node.raw.substring(1), node); + else + compiler.jsBuffer.concat(node.raw, node); + else { + var value = node.value, + doubleQuote = value.indexOf('"') !== -1; + compiler.jsBuffer.concat(doubleQuote ? "'" : '"', node); + compiler.jsBuffer.concat(value); + compiler.jsBuffer.concat(doubleQuote ? "'" : '"'); + } + } else if (node.raw.charAt(0) === "@") { compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.start + 1; @@ -1662,8 +2302,9 @@ Literal: function(node, st, c) { ArrayLiteral: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, - buffer = compiler.jsBuffer; - + buffer = compiler.jsBuffer, + generateObjJ = compiler.options.generateObjJ, + elementLength = node.elements.length; if (!generate) { buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.start; @@ -1671,8 +2312,10 @@ ArrayLiteral: function(node, st, c) { if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. if (!st.receiverLevel) st.receiverLevel = 0; - if (!node.elements.length) { - if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + if (generateObjJ) { + buffer.concat("@["); + } else if (!elementLength) { + if (compiler.options.inlineMsgSendFunctions) { buffer.concat("(___r"); buffer.concat(++st.receiverLevel + ""); buffer.concat(" = (CPArray.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPArray, \"alloc\"), ___r"); @@ -1681,7 +2324,7 @@ ArrayLiteral: function(node, st, c) { buffer.concat(st.receiverLevel + ""); buffer.concat(".isa.method_msgSend[\"init\"] || _objj_forward)(___r"); buffer.concat(st.receiverLevel + ""); - buffer.concat(", \"init\"))"); + buffer.concat(", \"init\"))"); } else { buffer.concat("(___r"); buffer.concat(++st.receiverLevel + ""); @@ -1697,7 +2340,7 @@ ArrayLiteral: function(node, st, c) { if (!(st.maxReceiverLevel >= st.receiverLevel)) st.maxReceiverLevel = st.receiverLevel; } else { - if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + if (compiler.options.inlineMsgSendFunctions) { buffer.concat("(___r"); buffer.concat(++st.receiverLevel + ""); buffer.concat(" = (CPArray.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPArray, \"alloc\"), ___r"); @@ -1721,8 +2364,9 @@ ArrayLiteral: function(node, st, c) { if (!(st.maxReceiverLevel >= st.receiverLevel)) st.maxReceiverLevel = st.receiverLevel; - - for (var i = 0; i < node.elements.length; i++) { + } + if (elementLength) { + for (var i = 0; i < elementLength; i++) { var elt = node.elements[i]; if (i) @@ -1732,18 +2376,22 @@ ArrayLiteral: function(node, st, c) { c(elt, st, "Expression"); if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, elt.end)); } - buffer.concat("], " + node.elements.length + "))"); + if (!generateObjJ) buffer.concat("], " + elementLength + "))"); } - st.receiverLevel--; + if (generateObjJ) + buffer.concat("]"); + else + st.receiverLevel--; + if (!generate) compiler.lastPos = node.end; }, DictionaryLiteral: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, buffer = compiler.jsBuffer, - noOfKeys = node.keys.length; - + generateObjJ = compiler.options.generateObjJ, + keyLength = node.keys.length; if (!generate) { buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.start; @@ -1751,8 +2399,17 @@ DictionaryLiteral: function(node, st, c) { if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. if (!st.receiverLevel) st.receiverLevel = 0; - if (!noOfKeys) { - if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + if (generateObjJ) { + buffer.concat("@{"); + for (var i = 0; i < keyLength; i++) { + if (i !== 0) buffer.concat(","); + c(node.keys[i], st, "Expression"); + buffer.concat(":"); + c(node.values[i], st, "Expression"); + } + buffer.concat("}"); + } else if (!keyLength) { + if (compiler.options.inlineMsgSendFunctions) { buffer.concat("(___r"); buffer.concat(++st.receiverLevel + ""); buffer.concat(" = (CPDictionary.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPDictionary, \"alloc\"), ___r"); @@ -1777,7 +2434,7 @@ DictionaryLiteral: function(node, st, c) { if (!(st.maxReceiverLevel >= st.receiverLevel)) st.maxReceiverLevel = st.receiverLevel; } else { - if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + if (compiler.options.inlineMsgSendFunctions) { buffer.concat("(___r"); buffer.concat(++st.receiverLevel + ""); buffer.concat(" = (CPDictionary.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPDictionary, \"alloc\"), ___r"); @@ -1802,7 +2459,7 @@ DictionaryLiteral: function(node, st, c) { if (!(st.maxReceiverLevel >= st.receiverLevel)) st.maxReceiverLevel = st.receiverLevel; - for (var i = 0; i < noOfKeys; i++) { + for (var i = 0; i < keyLength; i++) { var value = node.values[i]; if (i) buffer.concat(", "); @@ -1813,10 +2470,11 @@ DictionaryLiteral: function(node, st, c) { buffer.concat("], ["); - for (var i = 0; i < noOfKeys; i++) { + for (var i = 0; i < keyLength; i++) { var key = node.keys[i]; if (i) buffer.concat(", "); + if (!generate) compiler.lastPos = key.start; c(key, st, "Expression"); if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, key.end)); @@ -1824,21 +2482,31 @@ DictionaryLiteral: function(node, st, c) { buffer.concat("]))"); } - st.receiverLevel--; + if (!generateObjJ) + st.receiverLevel--; if (!generate) compiler.lastPos = node.end; }, ImportStatement: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, - buffer = compiler.jsBuffer; + buffer = compiler.jsBuffer, + localfilepath = node.localfilepath, + generateObjJ = compiler.options.generateObjJ; if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); - buffer.concat("objj_executeFile(\""); - buffer.concat(node.filename.value); - buffer.concat(node.localfilepath ? "\", YES);" : "\", NO);"); + if (generateObjJ) { + buffer.concat("@import "); + buffer.concat(localfilepath ? "\"" : "<"); + buffer.concat(node.filename.value); + buffer.concat(localfilepath ? "\"" : ">"); + } else { + buffer.concat("objj_executeFile(\"", node); + buffer.concat(node.filename.value); + buffer.concat(localfilepath ? "\", YES);" : "\", NO);"); + } if (!generate) compiler.lastPos = node.end; }, -ClassDeclarationStatement: function(node, st, c) { +ClassDeclarationStatement: function(node, st, c, format) { var compiler = st.compiler, generate = compiler.generate, saveJSBuffer = compiler.jsBuffer, @@ -1846,15 +2514,17 @@ ClassDeclarationStatement: function(node, st, c) { classDef = compiler.getClassDef(className), classScope = new Scope(st), isInterfaceDeclaration = node.type === "InterfaceDeclarationStatement", - protocols = node.protocols; + protocols = node.protocols, + generateObjJ = compiler.options.generateObjJ; - compiler.imBuffer = new StringBuffer(); - compiler.cmBuffer = new StringBuffer(); - compiler.classBodyBuffer = new StringBuffer(); // TODO: Check if this is needed + compiler.imBuffer = new StringBuffer(compiler.createSourceMap, compiler.URL); + compiler.cmBuffer = new StringBuffer(compiler.createSourceMap), compiler.URL; + compiler.classBodyBuffer = new StringBuffer(compiler.createSourceMap, compiler.URL); // TODO: Check if this is needed if (compiler.getTypeDef(className)) throw compiler.error_message(className + " is already declared as a type", node.classname); + if (!generate) saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); // First we declare the class @@ -1875,14 +2545,14 @@ ClassDeclarationStatement: function(node, st, c) { if (!superClassDef) { var errorMessage = "Can't find superclass " + node.superclassname.name; - for (var i = ObjJAcornCompiler.importStack.length; --i >= 0;) + if (ObjJAcornCompiler.importStack) for (var i = ObjJAcornCompiler.importStack.length; --i >= 0;) errorMessage += "\n" + Array((ObjJAcornCompiler.importStack.length - i) * 2 + 1).join(" ") + "Imported by: " + ObjJAcornCompiler.importStack[i]; throw compiler.error_message(errorMessage, node.superclassname); } classDef = new ClassDef(!isInterfaceDeclaration, className, superClassDef, Object.create(null)); - saveJSBuffer.concat("{var the_class = objj_allocateClassPair(" + node.superclassname.name + ", \"" + className + "\"),\nmeta_class = the_class.isa;"); + if (!generateObjJ) saveJSBuffer.concat("\n{var the_class = objj_allocateClassPair(" + node.superclassname.name + ", \"" + className + "\"),\nmeta_class = the_class.isa;", node); } else if (node.categoryname) { @@ -1890,25 +2560,50 @@ ClassDeclarationStatement: function(node, st, c) { if (!classDef) throw compiler.error_message("Class " + className + " not found ", node.classname); - saveJSBuffer.concat("{\nvar the_class = objj_getClass(\"" + className + "\")\n"); - saveJSBuffer.concat("if(!the_class) throw new SyntaxError(\"*** Could not find definition for class \\\"" + className + "\\\"\");\n"); - saveJSBuffer.concat("var meta_class = the_class.isa;"); + if (!generateObjJ) { + saveJSBuffer.concat("{\nvar the_class = objj_getClass(\"" + className + "\")\n", node); + saveJSBuffer.concat("if(!the_class) throw new SyntaxError(\"*** Could not find definition for class \\\"" + className + "\\\"\");\n"); + saveJSBuffer.concat("var meta_class = the_class.isa;"); + } } else { classDef = new ClassDef(!isInterfaceDeclaration, className, null, Object.create(null)); - saveJSBuffer.concat("{var the_class = objj_allocateClassPair(Nil, \"" + className + "\"),\nmeta_class = the_class.isa;"); + if (!generateObjJ) + saveJSBuffer.concat("{var the_class = objj_allocateClassPair(Nil, \"" + className + "\"),\nmeta_class = the_class.isa;", node); } - if (protocols) - for (var i = 0, size = protocols.length; i < size; i++) - { - saveJSBuffer.concat("\nvar aProtocol = objj_getProtocol(\"" + protocols[i].name + "\");"); + if (generateObjJ) { + saveJSBuffer.concat(isInterfaceDeclaration ? "@interface " : "@implementation "); + saveJSBuffer.concat(className); + if (node.superclassname) { + saveJSBuffer.concat(" : "); + c(node.superclassname, st, "IdentifierName"); + } else if (node.categoryname) { + saveJSBuffer.concat(" ("); + c(node.categoryname, st, "IdentifierName"); + saveJSBuffer.concat(")"); + } + } + + if (protocols) for (var i = 0, size = protocols.length; i < size; i++) + { + if (generateObjJ) { + if (i) + saveJSBuffer.concat(", "); + else + saveJSBuffer.concat(" <"); + c(protocols[i], st, "IdentifierName"); + if (i === size - 1) + saveJSBuffer.concat(">"); + } else { + saveJSBuffer.concat("\nvar aProtocol = objj_getProtocol(\"" + protocols[i].name + "\");", protocols[i]); saveJSBuffer.concat("\nif (!aProtocol) throw new SyntaxError(\"*** Could not find definition for protocol \\\"" + protocols[i].name + "\\\"\");"); saveJSBuffer.concat("\nclass_addProtocol(the_class, aProtocol);"); } - /* + } +/* if (isInterfaceDeclaration) classDef.interfaceDeclaration = true; */ @@ -1922,13 +2617,19 @@ ClassDeclarationStatement: function(node, st, c) { hasAccessors = false; // Then we add all ivars - if (node.ivardeclarations) + if (node.ivardeclarations) { + if (generateObjJ) { + saveJSBuffer.concat("{"); + indentation += indentStep; + } + for (var i = 0; i < node.ivardeclarations.length; ++i) { var ivarDecl = node.ivardeclarations[i], ivarType = ivarDecl.ivartype ? ivarDecl.ivartype.name : null, ivarTypeIsClass = ivarDecl.ivartype ? ivarDecl.ivartype.typeisclass : false, - ivarName = ivarDecl.id.name, + ivarIdentifier = ivarDecl.id, + ivarName = ivarIdentifier.name, ivar = {"type": ivarType, "name": ivarName}, accessors = ivarDecl.accessors; @@ -1946,20 +2647,24 @@ ClassDeclarationStatement: function(node, st, c) { || compiler.getClassDef(ivarType) || compiler.getTypeDef(ivarType) || ivarType == classDef.name; if (!isTypeDefined) - compiler.addWarning(createMessage("Unknown type '" + ivarType + "' for ivar '" + ivarName + "'", ivarDecl.id, compiler.source)); + compiler.addWarning(createMessage("Unknown type '" + ivarType + "' for ivar '" + ivarName + "'", ivarDecl.ivartype, compiler.source)); - if (firstIvarDeclaration) - { - firstIvarDeclaration = false; - saveJSBuffer.concat("class_addIvars(the_class, ["); + if (generateObjJ) { + c(ivarDecl, st, "IvarDeclaration"); + } else { + if (firstIvarDeclaration) + { + firstIvarDeclaration = false; + saveJSBuffer.concat("class_addIvars(the_class, ["); + } + else + saveJSBuffer.concat(", "); + + if (compiler.options.includeIvarTypeSignatures) + saveJSBuffer.concat("new objj_ivar(\"" + ivarName + "\", \"" + ivarType + "\")", node); + else + saveJSBuffer.concat("new objj_ivar(\"" + ivarName + "\")", node); } - else - saveJSBuffer.concat(", "); - - if (compiler.flags & ObjJAcornCompiler.Flags.IncludeTypeSignatures) - saveJSBuffer.concat("new objj_ivar(\"" + ivarName + "\", \"" + ivarType + "\")"); - else - saveJSBuffer.concat("new objj_ivar(\"" + ivarName + "\")"); if (ivarDecl.outlet) ivar.outlet = true; @@ -1969,18 +2674,17 @@ ClassDeclarationStatement: function(node, st, c) { if (!classScope.ivars) classScope.ivars = Object.create(null); - classScope.ivars[ivarName] = {type: "ivar", name: ivarName, node: ivarDecl.id, ivar: ivar}; + classScope.ivars[ivarName] = {type: "ivar", name: ivarName, node: ivarIdentifier, ivar: ivar}; - if (accessors) - { + if (accessors) { + // Declare the accessor methods in the class definition. // TODO: This next couple of lines for getting getterName and setterName are duplicated from below. Create functions for this. var property = (accessors.property && accessors.property.name) || ivarName, getterName = (accessors.getter && accessors.getter.name) || property; classDef.addInstanceMethod(new MethodDef(getterName, [ivarType])); - if (!accessors.readonly) - { + if (!accessors.readonly) { var setterName = accessors.setter ? accessors.setter.name : null; if (!setterName) @@ -1994,14 +2698,17 @@ ClassDeclarationStatement: function(node, st, c) { hasAccessors = true; } } - - if (!firstIvarDeclaration) + } + if (generateObjJ) { + indentation = indentation.substring(indentationSize); + saveJSBuffer.concatFormat("\n}"); + } else if (!firstIvarDeclaration) saveJSBuffer.concat("]);"); // If we have accessors add get and set methods for them - if (!isInterfaceDeclaration && hasAccessors) + if (!generateObjJ && !isInterfaceDeclaration && hasAccessors) { - var getterSetterBuffer = new StringBuffer(); + var getterSetterBuffer = new StringBuffer(compiler.createSourceMap, compiler.URL); // Add the class declaration to compile accessors correctly // Remove all protocols from class declaration @@ -2050,7 +2757,7 @@ ClassDeclarationStatement: function(node, st, c) { // Remove all @accessors or we will get a recursive loop in infinity var b = getterSetterBuffer.toString().replace(/@accessors(\(.*\))?/g, ""); - var imBuffer = ObjJAcornCompiler.compileToIMBuffer(b, "Accessors", compiler.flags, compiler.classDefs, compiler.protocolDefs, compiler.typeDefs); + var imBuffer = exports.compileToIMBuffer(b, "Accessors", compiler.options); // Add the accessors methods first to instance method buffer. // This will allow manually added set and get methods to override the compiler generated @@ -2074,45 +2781,46 @@ ClassDeclarationStatement: function(node, st, c) { if (bodyLength > 0) { - if (!generate) - compiler.lastPos = bodies[0].start; + if (!generate) compiler.lastPos = bodies[0].start; // And last add methods and other statements for (var i = 0; i < bodyLength; ++i) { var body = bodies[i]; c(body, classScope, "Statement"); } - if (!generate) - saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, body.end)); + if (!generate) saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, body.end)); } + // We must make a new class object for our class definition if it's not a category - if (!isInterfaceDeclaration && !node.categoryname) { + if (!generateObjJ && !isInterfaceDeclaration && !node.categoryname) { saveJSBuffer.concat("objj_registerClassPair(the_class);\n"); } // Add instance methods - if (compiler.imBuffer.isEmpty()) + if (!generateObjJ && compiler.imBuffer.isEmpty()) { saveJSBuffer.concat("class_addMethods(the_class, ["); - saveJSBuffer.atoms.push.apply(saveJSBuffer.atoms, compiler.imBuffer.atoms); // FIXME: Move this append to StringBuffer + saveJSBuffer.appendStringBuffer(compiler.imBuffer); saveJSBuffer.concat("]);\n"); } // Add class methods - if (compiler.cmBuffer.isEmpty()) + if (!generateObjJ && compiler.cmBuffer.isEmpty()) { saveJSBuffer.concat("class_addMethods(meta_class, ["); - saveJSBuffer.atoms.push.apply(saveJSBuffer.atoms, compiler.cmBuffer.atoms); // FIXME: Move this append to StringBuffer + saveJSBuffer.appendStringBuffer(compiler.cmBuffer); saveJSBuffer.concat("]);\n"); } - saveJSBuffer.concat("}"); + if (!generateObjJ) saveJSBuffer.concat("}\n"); compiler.jsBuffer = saveJSBuffer; // Skip the "@end" - if (!generate) - compiler.lastPos = node.end; + if (!generate) compiler.lastPos = node.end; + + if (generateObjJ) + saveJSBuffer.concat("\n@end"); // If the class conforms to protocols check that all required methods are implemented if (protocols) @@ -2133,8 +2841,8 @@ ClassDeclarationStatement: function(node, st, c) { var unimplementedMethods = classDef.listOfNotImplementedMethodsForProtocols(protocolDefs); if (unimplementedMethods && unimplementedMethods.length > 0) - for (var i = 0, size = unimplementedMethods.length; i < size; i++) { - var unimplementedMethod = unimplementedMethods[i], + for (var j = 0, unimpSize = unimplementedMethods.length; j < unimpSize; j++) { + var unimplementedMethod = unimplementedMethods[j], methodDef = unimplementedMethod.methodDef, protocolDef = unimplementedMethod.protocolDef; @@ -2150,35 +2858,55 @@ ProtocolDeclarationStatement: function(node, st, c) { protocolDef = compiler.getProtocolDef(protocolName), protocols = node.protocols, protocolScope = new Scope(st), - inheritFromProtocols = []; + inheritFromProtocols = [], + generateObjJ = compiler.options.generateObjJ; if (protocolDef) throw compiler.error_message("Duplicate protocol " + protocolName, node.protocolname); - compiler.imBuffer = new StringBuffer(); - compiler.cmBuffer = new StringBuffer(); + compiler.imBuffer = new StringBuffer(compiler.createSourceMap, compiler.URL); + compiler.cmBuffer = new StringBuffer(compiler.createSourceMap), compiler.URL; - if (!generate) - buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); - buffer.concat("{var the_protocol = objj_allocateProtocol(\"" + protocolName + "\");"); + if (generateObjJ) { + buffer.concat("@protocol "); + c(node.protocolname, st, "IdentifierName"); + } else { + buffer.concat("{var the_protocol = objj_allocateProtocol(\"" + protocolName + "\");", node); + } + + if (protocols) { + if (generateObjJ) + buffer.concat(" <"); - if (protocols) for (var i = 0, size = protocols.length; i < size; i++) { var protocol = protocols[i], - inheritFromProtocolName = protocol.name; + inheritFromProtocolName = protocol.name, inheritProtocolDef = compiler.getProtocolDef(inheritFromProtocolName); if (!inheritProtocolDef) throw compiler.error_message("Can't find protocol " + inheritFromProtocolName, protocol); - buffer.concat("\nvar aProtocol = objj_getProtocol(\"" + inheritFromProtocolName + "\");"); - buffer.concat("\nif (!aProtocol) throw new SyntaxError(\"*** Could not find definition for protocol \\\"" + protocolName + "\\\"\");"); - buffer.concat("\nprotocol_addProtocol(the_protocol, aProtocol);"); + if (generateObjJ) { + if (i) + buffer.concat(", "); + + c(protocol, st, "IdentifierName"); + } else { + buffer.concat("\nvar aProtocol = objj_getProtocol(\"" + inheritFromProtocolName + "\");", node); + buffer.concat("\nif (!aProtocol) throw new SyntaxError(\"*** Could not find definition for protocol \\\"" + protocolName + "\\\"\");", node); + buffer.concat("\nprotocol_addProtocol(the_protocol, aProtocol);", node); + } + inheritFromProtocols.push(inheritProtocolDef); } + if (generateObjJ) + buffer.concat(">"); + } + protocolDef = new ProtocolDef(protocolName, inheritFromProtocols); compiler.protocolDefs[protocolName] = protocolDef; protocolScope.protocolDef = protocolDef; @@ -2191,109 +2919,168 @@ ProtocolDeclarationStatement: function(node, st, c) { if (requiredLength > 0) { // We only add the required methods - for (var i = 0; i < requiredLength; ++i) - { + for (var i = 0; i < requiredLength; ++i) { var required = someRequired[i]; - if (!generate) - compiler.lastPos = required.start; + if (!generate) compiler.lastPos = required.start; c(required, protocolScope, "Statement"); } - if (!generate) - buffer.concat(compiler.source.substring(compiler.lastPos, required.end)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, required.end)); } } - buffer.concat("\nobjj_registerProtocol(the_protocol);\n"); + if (generateObjJ) { + buffer.concatFormat("\n@end"); + } else { + buffer.concat("\nobjj_registerProtocol(the_protocol);\n"); - // Add instance methods - if (compiler.imBuffer.isEmpty()) - { - buffer.concat("protocol_addMethodDescriptions(the_protocol, ["); - buffer.atoms.push.apply(buffer.atoms, compiler.imBuffer.atoms); // FIXME: Move this append to StringBuffer - buffer.concat("], true, true);\n"); + // Add instance methods + if (compiler.imBuffer.isEmpty()) + { + buffer.concat("protocol_addMethodDescriptions(the_protocol, ["); + buffer.appendStringBuffer(compiler.imBuffer); + buffer.concat("], true, true);\n"); + } + + // Add class methods + if (compiler.cmBuffer.isEmpty()) + { + buffer.concat("protocol_addMethodDescriptions(the_protocol, ["); + buffer.appendStringBuffer(compiler.cmBuffer); + buffer.concat("], true, false);\n"); + } + + buffer.concat("}"); } - // Add class methods - if (compiler.cmBuffer.isEmpty()) - { - buffer.concat("protocol_addMethodDescriptions(the_protocol, ["); - buffer.atoms.push.apply(buffer.atoms, compiler.cmBuffer.atoms); // FIXME: Move this append to StringBuffer - buffer.concat("], true, false);\n"); - } - - buffer.concat("}"); - compiler.jsBuffer = buffer; // Skip the "@end" - if (!generate) - compiler.lastPos = node.end; + if (!generate) compiler.lastPos = node.end; +}, +IvarDeclaration: function(node, st, c, format) { + var compiler = st.compiler, + buffer = compiler.jsBuffer; + + if (node.outlet) + buffer.concat("@outlet "); + c(node.ivartype, st, "IdentifierName"); + buffer.concat(" "); + c(node.id, st, "IdentifierName"); + if (node.accessors) + buffer.concat(" @accessors"); }, MethodDeclarationStatement: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, saveJSBuffer = compiler.jsBuffer, methodScope = new Scope(st), - isInstanceMethodType = node.methodtype === '-'; + isInstanceMethodType = node.methodtype === '-', selectors = node.selectors, nodeArguments = node.arguments, returnType = node.returntype, - types = [returnType ? returnType.name : (node.action ? "void" : "id")], - returnTypeProtocols = returnType ? returnType.protocols : null; - selector = selectors[0].name; // There is always at least one selector + types = [returnType ? returnType.name : (node.action ? "void" : "id")], // Return type is 'id' as default except if it is an action declared method, then it's 'void' + returnTypeProtocols = returnType ? returnType.protocols : null, + selector = selectors[0].name, // There is always at least one selector + generateObjJ = compiler.options.generateObjJ; - if (returnTypeProtocols) - for (var i = 0, size = returnTypeProtocols.length; i < size; i++) { - var returnTypeProtocol = returnTypeProtocols[i]; - if (!compiler.getProtocolDef(returnTypeProtocol.name)) { - compiler.addWarning(createMessage("Cannot find protocol declaration for '" + returnTypeProtocol.name + "'", returnTypeProtocol, compiler.source)); - } + if (returnTypeProtocols) for (var i = 0, size = returnTypeProtocols.length; i < size; i++) { + var returnTypeProtocol = returnTypeProtocols[i]; + if (!compiler.getProtocolDef(returnTypeProtocol.name)) { + compiler.addWarning(createMessage("Cannot find protocol declaration for '" + returnTypeProtocol.name + "'", returnTypeProtocol, compiler.source)); } - - if (!generate) - saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); - - compiler.jsBuffer = isInstanceMethodType ? compiler.imBuffer : compiler.cmBuffer; - - // Put together the selector. Maybe this should be done in the parser... - for (var i = 0; i < nodeArguments.length; i++) { - var argument = nodeArguments[i], - argumentType = argument.type, - argumentTypeName = argumentType ? argumentType.name : "id", - argumentProtocols = argumentType ? argumentType.protocols : null; - - types.push(argumentType ? argumentType.name : "id"); - - if (argumentProtocols) for (var j = 0, size = argumentProtocols.length; j < size; j++) - { - var argumentProtocol = argumentProtocols[j]; - if (!compiler.getProtocolDef(argumentProtocol.name)) - compiler.addWarning(createMessage("Cannot find protocol declaration for '" + argumentProtocol.name + "'", argumentProtocol, compiler.source)); - } - - if (i === 0) - selector += ":"; - else - selector += (selectors[i] ? selectors[i].name : "") + ":"; } - if (compiler.jsBuffer.isEmpty()) // Add comma separator if this is not first method in this buffer - compiler.jsBuffer.concat(", "); + if (!generate) saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); - compiler.jsBuffer.concat("new objj_method(sel_getUid(\""); - compiler.jsBuffer.concat(selector); - compiler.jsBuffer.concat("\"), "); + // If we are generating objective-J code write everything directly to the regular buffer + // Otherwise we have one for instance methods and one for class methods. + if (generateObjJ) { + compiler.jsBuffer.concat(isInstanceMethodType ? "- (" : "+ ("); + compiler.jsBuffer.concat(types[0]); + compiler.jsBuffer.concat(")"); + } else { + compiler.jsBuffer = isInstanceMethodType ? compiler.imBuffer : compiler.cmBuffer; + } - if (node.body) - { - compiler.jsBuffer.concat("function"); + // Put together the selector. Maybe this should be done in the parser... + // Or maybe we should do it here as when genereting Objective-J code it's kind of handy + var size = nodeArguments.length; + if (size > 0) { + for (var i = 0; i < nodeArguments.length; i++) { + var argument = nodeArguments[i], + argumentType = argument.type, + argumentTypeName = argumentType ? argumentType.name : "id", + argumentProtocols = argumentType ? argumentType.protocols : null; - if (compiler.flags & ObjJAcornCompiler.Flags.IncludeDebugSymbols) - { - compiler.jsBuffer.concat(" $" + st.currentClassName() + "__" + selector.replace(/:/g, "_")); + types.push(argumentTypeName); + + if (i === 0) + selector += ":"; + else + selector += (selectors[i] ? selectors[i].name : "") + ":"; + + if (argumentProtocols) for (var j = 0, size = argumentProtocols.length; j < size; j++) { + var argumentProtocol = argumentProtocols[j]; + if (!compiler.getProtocolDef(argumentProtocol.name)) { + compiler.addWarning(createMessage("Cannot find protocol declaration for '" + argumentProtocol.name + "'", argumentProtocol, compiler.source)); + } + } + + if (generateObjJ) { + var aSelector = selectors[i]; + + if (i) + compiler.jsBuffer.concat(" "); + + compiler.jsBuffer.concat((aSelector ? aSelector.name : "") + ":"); + compiler.jsBuffer.concat("("); + compiler.jsBuffer.concat(argumentTypeName); + if (argumentProtocols) { + compiler.jsBuffer.concat(" <"); + for (var j = 0, size = argumentProtocols.length; j < size; j++) { + var argumentProtocol = argumentProtocols[j]; + + if (j) + compiler.jsBuffer.concat(", "); + + compiler.jsBuffer.concat(argumentProtocol.name); + } + + compiler.jsBuffer.concat(">"); + } + compiler.jsBuffer.concat(")"); + c(argument.identifier, st, "IdentifierName"); + } } + } else if (generateObjJ) { + var selectorNode = selectors[0]; + compiler.jsBuffer.concat(selectorNode.name, selectorNode); + } - compiler.jsBuffer.concat("(self, _cmd"); + if (generateObjJ) { + if (node.parameters) { + compiler.jsBuffer.concat(", ..."); + } + } else { + if (compiler.jsBuffer.isEmpty()) // Add comma separator if this is not first method in this buffer + compiler.jsBuffer.concat(", "); + + compiler.jsBuffer.concat("new objj_method(sel_getUid(\"", node); + compiler.jsBuffer.concat(selector); + compiler.jsBuffer.concat("\"), "); + } + + if (node.body) { + if (!generateObjJ) { + compiler.jsBuffer.concat("function"); + + if (compiler.options.includeMethodFunctionNames) + { + compiler.jsBuffer.concat(" $" + st.currentClassName() + "__" + selector.replace(/:/g, "_")); + } + + compiler.jsBuffer.concat("(self, _cmd"); + } methodScope.methodType = node.methodtype; methodScope.vars["self"] = {type: "method base", scope: methodScope}; @@ -2304,35 +3091,40 @@ MethodDeclarationStatement: function(node, st, c) { var argument = nodeArguments[i], argumentName = argument.identifier.name; - compiler.jsBuffer.concat(", "); - compiler.jsBuffer.concat(argumentName); + if (!generateObjJ) { + compiler.jsBuffer.concat(", "); + compiler.jsBuffer.concat(argumentName, argument.identifier); + } methodScope.vars[argumentName] = {type: "method argument", node: argument}; } - compiler.jsBuffer.concat(")\n"); + if (!generateObjJ) + compiler.jsBuffer.concat(")\n"); - if (!generate) - compiler.lastPos = node.startOfBody; + if (!generate) compiler.lastPos = node.startOfBody; indentation += indentStep; methodScope.endOfScopeBody = true; c(node.body, methodScope, "Statement"); - indentation = indentation.substring(indentationSpaces); - if (!generate) - compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.body.end)); + indentation = indentation.substring(indentationSize); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.body.end)); - compiler.jsBuffer.concat("\n"); + if (!generateObjJ) + compiler.jsBuffer.concat("\n"); } else { // It is a interface or protocol declatartion and we don't have a method implementation - compiler.jsBuffer.concat("Nil\n"); + if (generateObjJ) + compiler.jsBuffer.concat(";"); + else + compiler.jsBuffer.concat("Nil\n"); } - if (compiler.flags & ObjJAcornCompiler.Flags.IncludeTypeSignatures) - compiler.jsBuffer.concat(","+JSON.stringify(types)); + if (!generateObjJ) { + if (compiler.options.includeMethodArgumentTypeSignatures) + compiler.jsBuffer.concat(","+JSON.stringify(types)); + compiler.jsBuffer.concat(")"); + compiler.jsBuffer = saveJSBuffer; + } - compiler.jsBuffer.concat(")"); - compiler.jsBuffer = saveJSBuffer; - - if (!generate) - compiler.lastPos = node.end; + if (!generate) compiler.lastPos = node.end; // Add the method to the class or protocol definition var def = st.classDef, @@ -2345,7 +3137,7 @@ MethodDeclarationStatement: function(node, st, c) { def = st.protocolDef; if (!def) - throw "InternalError: MethodDeclaration without ClassDeclaration or ProtocolDeclaration at line: " + exports.acorn.getLineInfo(compiler.source, node.start).line; + throw "InternalError: MethodDeclaration without ClassDeclaration or ProtocolDeclaration at line: " + acorn.getLineInfo(compiler.source, node.start).line; // Create warnings if types does not corresponds to method declaration in superclass or interface declarations // If we don't find the method in superclass or interface declarations above or if it is a protocol @@ -2353,14 +3145,13 @@ MethodDeclarationStatement: function(node, st, c) { if (!alreadyDeclared) { var protocols = def.protocols; - if (protocols) - for (var i = 0, size = protocols.length; i < size; i++) { - var protocol = protocols[i], - alreadyDeclared = isInstanceMethodType ? protocol.getInstanceMethod(selector) : protocol.getClassMethod(selector); + if (protocols) for (var i = 0, size = protocols.length; i < size; i++) { + var protocol = protocols[i], + alreadyDeclared = isInstanceMethodType ? protocol.getInstanceMethod(selector) : protocol.getClassMethod(selector); - if (alreadyDeclared) - break; - } + if (alreadyDeclared) + break; + } } if (alreadyDeclared) { @@ -2398,21 +3189,26 @@ MethodDeclarationStatement: function(node, st, c) { MessageSendExpression: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, - inlineMsgSend = compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend, + inlineMsgSend = compiler.options.inlineMsgSendFunctions, buffer = compiler.jsBuffer, nodeObject = node.object, selectors = node.selectors, - arguments = node.arguments, - argumentsLength = arguments.length, + nodeArguments = node.arguments, + argumentsLength = nodeArguments.length, firstSelector = selectors[0], - selector = firstSelector ? firstSelector.name : ""; // There is always at least one selector + selector = firstSelector ? firstSelector.name : "", // There is always at least one selector + parameters = node.parameters, + generateObjJ = compiler.options.generateObjJ; // Put together the selector. Maybe this should be done in the parser... - for (var i = 0; i < argumentsLength; i++) - if (i === 0) - selector += ":"; - else - selector += (selectors[i] ? selectors[i].name : "") + ":"; + for (var i = 0; i < argumentsLength; i++) { + if (i !== 0) { + var nextSelector = selectors[i]; + if (nextSelector) + selector += nextSelector.name; + } + selector += ":"; + } if (!generate) { buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); @@ -2421,24 +3217,28 @@ MessageSendExpression: function(node, st, c) { // Find out the total number of arguments so we can choose appropriate msgSend function. Only needed if call the function and not inline it var totalNoOfParameters = argumentsLength; - if (node.parameters) - totalNoOfParameters += node.parameters.length; + if (parameters) + totalNoOfParameters += parameters.length; } if (node.superObject) { if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. - if (inlineMsgSend) { - buffer.concat("("); - buffer.concat(st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass); - buffer.concat(".method_dtable[\""); - buffer.concat(selector); - buffer.concat("\"] || _objj_forward)(self"); + if (generateObjJ) { + buffer.concat("[super "); } else { - buffer.concat("objj_msgSendSuper"); - if (totalNoOfParameters < 4) { - buffer.concat("" + totalNoOfParameters); + if (inlineMsgSend) { + buffer.concat("("); + buffer.concat(st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass); + buffer.concat(".method_dtable[\""); + buffer.concat(selector); + buffer.concat("\"] || _objj_forward)(self"); + } else { + buffer.concat("objj_msgSendSuper"); + if (totalNoOfParameters < 4) { + buffer.concat("" + totalNoOfParameters); + } + buffer.concat("({ receiver:self, super_class:" + (st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass ) + " }"); } - buffer.concat("({ receiver:self, super_class:" + (st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass ) + " }"); } } else @@ -2498,129 +3298,182 @@ MessageSendExpression: function(node, st, c) { } } - if (generate && !node.superObject) { - if (!inlineMsgSend) { - if (totalNoOfParameters < 4) { - buffer.concat("" + totalNoOfParameters); + if (generateObjJ) { + for (var i = 0; i < argumentsLength || (argumentsLength === 0 && i === 0); i++) { + var selector = selectors[i]; + + buffer.concat(" "); + buffer.concat(selector ? selector.name : ""); + + if (argumentsLength > 0) { + var argument = nodeArguments[i]; + + buffer.concat(":"); + c(argument, st, "Expression"); } } - if (receiverIsIdentifier) { - buffer.concat("("); - c(nodeObject, st, "Expression"); - } else { - buffer.concat("(___r"); - buffer.concat(st.receiverLevel + ""); + if (parameters) for (var i = 0, size = parameters.length; i < size; ++i) + { + var parameter = parameters[i]; + + buffer.concat(", "); + c(parameter, st, "Expression"); } - } + buffer.concat("]"); + } else { + if (generate && !node.superObject) { + if (!inlineMsgSend) { + if (totalNoOfParameters < 4) { + buffer.concat("" + totalNoOfParameters); + } + } - buffer.concat(", \""); - buffer.concat(selector); // FIXME: sel_getUid(selector + "") ? This FIXME is from the old preprocessor compiler - buffer.concat("\""); - - if (node.arguments) for (var i = 0; i < node.arguments.length; i++) - { - var argument = node.arguments[i]; - - buffer.concat(", "); - if (!generate) - compiler.lastPos = argument.start; - c(argument, st, "Expression"); - if (!generate) { - buffer.concat(compiler.source.substring(compiler.lastPos, argument.end)); - compiler.lastPos = argument.end; + if (receiverIsIdentifier) { + buffer.concat("("); + c(nodeObject, st, "Expression"); + } else { + buffer.concat("(___r"); + buffer.concat(st.receiverLevel + ""); + } } - } - // TODO: Move this 'if' with body up inside the node.argument 'if' - if (node.parameters) for (var i = 0; i < node.parameters.length; ++i) - { - var parameter = node.parameters[i]; + buffer.concat(", \""); + buffer.concat(selector); // FIXME: sel_getUid(selector + "") ? This FIXME is from the old preprocessor compiler + buffer.concat("\""); - buffer.concat(", "); - if (!generate) - compiler.lastPos = parameter.start; - c(parameter, st, "Expression"); - if (!generate) { - buffer.concat(compiler.source.substring(compiler.lastPos, parameter.end)); - compiler.lastPos = parameter.end; + if (nodeArguments) for (var i = 0; i < nodeArguments.length; i++) + { + var argument = nodeArguments[i]; + + buffer.concat(", "); + if (!generate) + compiler.lastPos = argument.start; + c(argument, st, "Expression"); + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, argument.end)); + compiler.lastPos = argument.end; + } } + + if (parameters) for (var i = 0; i < parameters.length; ++i) + { + var parameter = parameters[i]; + + buffer.concat(", "); + if (!generate) + compiler.lastPos = parameter.start; + c(parameter, st, "Expression"); + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, parameter.end)); + compiler.lastPos = parameter.end; + } + } + + if (generate && !node.superObject) { + if (receiverIsNotSelf) + buffer.concat(")"); + if (!receiverIsIdentifier) + st.receiverLevel--; + } + + buffer.concat(")"); } - if (generate && !node.superObject) { - if (receiverIsNotSelf) - buffer.concat(")"); - if (!receiverIsIdentifier) - st.receiverLevel--; - } - - buffer.concat(")"); if (!generate) compiler.lastPos = node.end; }, SelectorLiteralExpression: function(node, st, c) { var compiler = st.compiler, buffer = compiler.jsBuffer, - generate = compiler.generate; + generate = compiler.generate, + generateObjJ = compiler.options.generateObjJ; + if (!generate) { buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); buffer.concat(" "); // Add an extra space if it looks something like this: "return(@selector(a:))". No space between return and expression. } - buffer.concat("sel_getUid(\""); + + buffer.concat(generateObjJ ? "@selector(" : "sel_getUid(\"", node); buffer.concat(node.selector); - buffer.concat("\")"); + buffer.concat(generateObjJ ? ")" : "\")"); + if (!generate) compiler.lastPos = node.end; }, ProtocolLiteralExpression: function(node, st, c) { var compiler = st.compiler, buffer = compiler.jsBuffer, - generate = compiler.generate; + generate = compiler.generate, + generateObjJ = compiler.options.generateObjJ; + if (!generate) { buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); buffer.concat(" "); // Add an extra space if it looks something like this: "return(@protocol(a))". No space between return and expression. } - buffer.concat("objj_getProtocol(\""); - buffer.concat(node.id.name); - buffer.concat("\")"); + buffer.concat(generateObjJ ? "@protocol(" : "objj_getProtocol(\"", node); + c(node.id, st, "IdentifierName"); + buffer.concat(generateObjJ ? ")" : "\")"); if (!generate) compiler.lastPos = node.end; }, Reference: function(node, st, c) { var compiler = st.compiler, buffer = compiler.jsBuffer, - generate = compiler.generate; + generate = compiler.generate, + generateObjJ = compiler.options.generateObjJ; + if (!generate) { buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. } - buffer.concat("function(__input) { if (arguments.length) return "); - c(node.element, st, "Expression"); - buffer.concat(" = __input; return "); - c(node.element, st, "Expression"); - buffer.concat("; }"); + if (generateObjJ) { + buffer.concat("@ref(", node); + buffer.concat(node.element.name, node.element); + buffer.concat(")", node); + } else { + buffer.concat("function(__input) { if (arguments.length) return ", node); + c(node.element, st, "Expression"); + buffer.concat(" = __input; return "); + c(node.element, st, "Expression"); + buffer.concat("; }"); + } + if (!generate) compiler.lastPos = node.end; }, Dereference: function(node, st, c) { var compiler = st.compiler, - generate = compiler.generate; + buffer = compiler.jsBuffer, + generate = compiler.generate, + generateObjJ = compiler.options.generateObjJ; checkCanDereference(st, node.expr); // @deref(y) -> y() // @deref(@deref(y)) -> y()() if (!generate) { - compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.expr.start; } + if (generateObjJ) + buffer.concat("@deref("); c(node.expr, st, "Expression"); - if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.expr.end)); - compiler.jsBuffer.concat("()"); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.expr.end)); + if (generateObjJ) + buffer.concat(")"); + else + buffer.concat("()"); if (!generate) compiler.lastPos = node.end; }, ClassStatement: function(node, st, c) { - var compiler = st.compiler; + var compiler = st.compiler, + buffer = compiler.jsBuffer, + generateObjJ = compiler.options.generateObjJ; if (!compiler.generate) { - compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.start; - compiler.jsBuffer.concat("//"); + buffer.concat("//"); + } + if (generateObjJ) { + buffer.concat("@class "); + c(node.id, st, "IdentifierName"); } var className = node.id.name; @@ -2628,17 +3481,22 @@ ClassStatement: function(node, st, c) { throw compiler.error_message(className + " is already declared as a type", node.id); if (!compiler.getClassDef(className)) { - classDef = new ClassDef(false, className); - compiler.classDefs[className] = classDef; + compiler.classDefs[className] = new ClassDef(false, className); } st.vars[node.id.name] = {type: "class", node: node.id}; }, GlobalStatement: function(node, st, c) { - var compiler = st.compiler; + var compiler = st.compiler, + buffer = compiler.jsBuffer, + generateObjJ = compiler.options.generateObjJ; if (!compiler.generate) { - compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.start; - compiler.jsBuffer.concat("//"); + buffer.concat("//"); + } + if (generateObjJ) { + buffer.concat("@global "); + c(node.id, st, "IdentifierName"); } st.rootScope().vars[node.id.name] = {type: "global", node: node.id}; }, @@ -2651,7 +3509,6 @@ PreprocessStatement: function(node, st, c) { } }, TypeDefStatement: function(node, st, c) { - var compiler = st.compiler, generate = compiler.generate, buffer = compiler.jsBuffer, @@ -2665,9 +3522,6 @@ TypeDefStatement: function(node, st, c) { if (compiler.getClassDef(typeDefName)) throw compiler.error_message(typeDefName + " is already declared as class", node.typedefname); - compiler.imBuffer = new StringBuffer(); - compiler.cmBuffer = new StringBuffer(); - if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); @@ -2681,10 +3535,10 @@ TypeDefStatement: function(node, st, c) { buffer.concat("}"); - compiler.jsBuffer = buffer; - - // Skip the "@end" + // Skip to the end if (!generate) compiler.lastPos = node.end; } }); + +}); diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js index 2229a6e82..5fabc9c0d 100644 --- a/Objective-J/Runtime.js +++ b/Objective-J/Runtime.js @@ -322,7 +322,7 @@ GLOBAL(class_addProtocol) = function(/*Class*/ aClass, /*Protocol*/ aProtocol) return; } - (aClass.protocol_list || (aClass.protocol_list == [])).push(aProtocol); + (aClass.protocol_list || (aClass.protocol_list = [])).push(aProtocol); return true; } diff --git a/Objective-J/acorn.js b/Objective-J/acorn.js index 594111ee0..feb02694c 100644 --- a/Objective-J/acorn.js +++ b/Objective-J/acorn.js @@ -13,28 +13,28 @@ // // [ghbt]: https://github.com/marijnh/acorn/issues // +// Objective-J extensions made by Martin Carlberg +// +// Git repositories for Acorn with Objective-J extension is available at +// +// https://github.com/mrcarlberg/acorn.git +// // This file defines the main parser interface. The library also comes // with a [error-tolerant parser][dammit] and an // [abstract syntax tree walker][walk], defined in other files. // // [dammit]: acorn_loose.js // [walk]: util/walk.js -// -// Objective-J extensions made by Martin Carlberg -// -// Git repositories for Acorn with Objective-J extension is available at -// -// https://github.com/mrcarlberg/acorn.git if (typeof exports != "undefined" && !exports.acorn) { exports.acorn = {}; exports.acorn.walk = {}; } -(function(exports) { +(function(exports, walk) { "use strict"; - exports.version = "0.1.01"; + exports.version = "0.3.3-objj-3"; // The main exported interface (under `self.acorn` when in the // browser) is a `parse` function that takes a code string and @@ -49,6 +49,9 @@ if (typeof exports != "undefined" && !exports.acorn) { exports.parse = function(inpt, opts) { input = String(inpt); inputLen = input.length; setOptions(opts); + initPreprocessorState(); + if (options.macros) + defineMacros(options.macros); initTokenState(); return parseTopLevel(options.program); }; @@ -78,6 +81,10 @@ if (typeof exports != "undefined" && !exports.acorn) { // after and before it), but never twice in the before (or after) // array of different nodes. trackComments: false, + // When `trackCommentsIncludeLineBreak` is turned on, the parser will + // include, if present, the line break before the comment and all + // the whitespace in between. + trackCommentsIncludeLineBreak: false, // When `trackSpaces` is turned on, the parser will attach // `spacesBefore` and `spacesAfter` properties to AST nodes // holding arrays of strings. The same spaces may appear in both @@ -90,6 +97,16 @@ if (typeof exports != "undefined" && !exports.acorn) { // line being 1-based and column 0-based) will be attached to the // nodes. locations: false, + // A function can be passed as `onComment` option, which will + // cause Acorn to call that function with `(block, text, start, + // end)` parameters whenever a comment is skipped. `block` is a + // boolean indicating whether this is a block (`/* */`) comment, + // `text` is the content of the comment, and `start` and `end` are + // character offsets that denote the start and end of the comment. + // When the `locations` option is on, two more parameters are + // passed, the full `{line, column}` locations of the start and + // end of the comments. + onComment: null, // Nodes have their start and end characters offsets recorded in // `start` and `end` properties (directly on the node, rather than // the `loc` object, which holds line/column data. To also add a @@ -125,12 +142,20 @@ if (typeof exports != "undefined" && !exports.acorn) { // Preprocess undefine macro function. To delete a macro preprocessUndefineMacro: defaultUndefineMacro, // Preprocess is macro function - preprocessIsMacro: defaultIsMacro + preprocessIsMacro: defaultIsMacro, + // An array of macro objects and/or text definitions may be passed in. + // Definitions may be in one of two forms: + // macro + // macro=body + macros: null, + // Turn off lineNoInErrorMessage to exclude line number in error messages + // Needs to be on to run test cases + lineNoInErrorMessage: true }; function setOptions(opts) { options = opts || {}; - for (var opt in defaultOptions) if (!options.hasOwnProperty(opt)) + for (var opt in defaultOptions) if (!Object.prototype.hasOwnProperty.call(options, opt)) options[opt] = defaultOptions[opt]; sourceFile = options.sourceFile || null; } @@ -138,6 +163,14 @@ if (typeof exports != "undefined" && !exports.acorn) { var macros; var macrosIsPredicate; + var macrosMakeBuiltin = function(name, macro, endPos) {return new Macro(name, macro, null, endPos - name.length)} + + var macrosBuiltinMacros = { + __OBJJ__: function() {return macrosMakeBuiltin("__OBJJ__", options.objj ? "1" : null, tokPos)}, + __BROWSER__: function() {return macrosMakeBuiltin("__BROWSER__", typeof(window) !== "undefined" ? "1" : null, tokPos)}, + __LINE__: function() {return macrosMakeBuiltin("__LINE__", String(options.locations ? tokCurLine : getLineInfo(input, tokPos).line), tokPos)}, + } + function defaultAddMacro(macro) { macros[macro.identifier] = macro; macrosIsPredicate = null; @@ -153,8 +186,40 @@ if (typeof exports != "undefined" && !exports.acorn) { } function defaultIsMacro(macroIdentifier) { - var x = Object.keys(macros).join(" "); - return (macrosIsPredicate || (macrosIsPredicate = makePredicate(x)))(macroIdentifier); + return (macrosIsPredicate || (macrosIsPredicate = makePredicate(Object.keys(macros).concat(Object.keys(macrosBuiltinMacros).filter(function(key) {return this[key]().macro != null}, macrosBuiltinMacros)).join(" "))))(macroIdentifier); + } + + function preprocessBuiltinMacro(macroIdentifier) { + var builtinMacro = macrosBuiltinMacros[macroIdentifier]; + return builtinMacro ? builtinMacro() : null; + } + + function defineMacros(macroArray) { + for (var i = 0, size = macroArray.length; i < size; i++) { + var savedInput = input; + var macroDefinition = macroArray[i].trim(); + var pos = macroDefinition.indexOf("="); + if (pos === 0) + raise(0, "Invalid macro definition: '" + macroDefinition + "'"); + // If there is no macro body, define the name with the value 1 + var name, body; + if (pos > 0) { + name = macroDefinition.slice(0, pos); + body = macroDefinition.slice(pos + 1); + } + else { + name = macroDefinition; + } + if (macrosBuiltinMacros.hasOwnProperty(name)) + raise(0, "'" + name + "' is a predefined macro name"); + + input = name + (body != null ? " " + body : ""); + inputLen = input.length; + initTokenState(); + preprocessParseDefine(); + input = savedInput; + inputLen = input.length; + } } // The `getLineInfo` function is mostly useful when the @@ -186,6 +251,7 @@ if (typeof exports != "undefined" && !exports.acorn) { input = String(inpt); inputLen = input.length; setOptions(opts); initTokenState(); + initPreprocessorState(); var t = {}; function getToken(forceRegexp) { @@ -198,14 +264,14 @@ if (typeof exports != "undefined" && !exports.acorn) { getToken.jumpTo = function(pos, reAllowed) { tokPos = pos; if (options.locations) { - tokCurLine = tokLineStart = lineBreak.lastIndex = 0; + tokCurLine = 1; + tokLineStart = lineBreak.lastIndex = 0; var match; while ((match = lineBreak.exec(input)) && match.index < pos) { ++tokCurLine; tokLineStart = match.index + match[0].length; } } - var ch = input.charAt(pos - 1); tokRegexpAllowed = reAllowed; skipSpace(); }; @@ -220,8 +286,13 @@ if (typeof exports != "undefined" && !exports.acorn) { var tokPos; // The start and end offsets of the current token. + // First tokstart is the same as tokStart except when the preprocessor finds a macro. + // Then the tokFirstStart points to the start of the token that will be replaced by the macro. + // tokStart then points at the macros first + // tokMacroOffset is the offset to the current macro for the current token + // tokPosMacroOffset is the offset to the current macro for the current tokPos - var tokStart, tokEnd; + var tokFirstStart, tokStart, tokEnd, tokMacroOffset, tokPosMacroOffset, lastTokMacroOffset; // When `options.locations` is true, these hold objects // containing the tokens start and end line/column pairs. @@ -261,27 +332,21 @@ if (typeof exports != "undefined" && !exports.acorn) { // track of the current line, and know when a new line has been // entered. - var tokCurLine, tokLineStart, tokLineStartNext; + var tokCurLine, tokLineStart; // Same as input but for the current token. If options.preprocess is used // this can differ due to macros. - var tokInput, preTokInput; + var tokInput, preTokInput, tokFirstInput; // These store the position of the previous token, which is useful // when finishing a node and assigning its `end` position. var lastStart, lastEnd, lastEndLoc; - // This is the tokenizer's state for Objective-J. `afterImport` is used - // to make the part between '<' and '>' to be one token if it comes after - // a @import token. - - var tokAfterImport; - // This is the tokenizer's state for Objective-J. 'nodeMessageSendObjectExpression' // is used to store the expression that is already parsed when a subscript was - // not really a subscript + // not really a subscript. var nodeMessageSendObjectExpression; @@ -296,8 +361,24 @@ if (typeof exports != "undefined" && !exports.acorn) { var preTokPos, preTokType, preTokVal, preTokStart, preTokEnd; var preLastStart, preLastEnd; - var preprocessStack = []; - var preprocessMacroParamterListMode = false; + var preprocessStack; + var preprocessStackLastItem; + var preprocessOnlyTransformArgumentsForLastToken; + var preprocessMacroParameterListMode; + var preprocessIsParsingPreprocess; + var preprocessParameterScope; + var preTokParameterScope; + var preprocessOverrideTokEndLoc; + + // True if we are concatenating two tokens. This is needed to handle when the second part is an empty macro + // This is also used when stingifying tokens to get an empty macro + + var preConcatenating; + + // True if we are skipping token when finding #else or #endif after and #if + + var preNotSkipping; + var preIfLevel; // This function is used to raise exceptions on parse errors. It // takes either a `{line, column}` object or an offset integer (into @@ -307,9 +388,11 @@ if (typeof exports != "undefined" && !exports.acorn) { function raise(pos, message) { if (typeof pos == "number") pos = getLineInfo(input, pos); + if (options.lineNoInErrorMessage) + message += " (" + pos.line + ":" + pos.column + ")"; var syntaxError = new SyntaxError(message); - syntaxError.line = pos.line; - syntaxError.column = pos.column; + syntaxError.messageOnLine = pos.line; + syntaxError.messageOnColumn = pos.column; syntaxError.lineStart = pos.lineStart; syntaxError.lineEnd = pos.lineEnd; syntaxError.fileName = sourceFile; @@ -317,6 +400,10 @@ if (typeof exports != "undefined" && !exports.acorn) { throw syntaxError; } + // Reused empty array added for node fields that are always empty. + + var empty = []; + // ## Token types // The assignment of fine-grained, information-carrying type objects @@ -369,7 +456,7 @@ if (typeof exports != "undefined" && !exports.acorn) { // Objective-J @ keywords var _implementation = {keyword: "implementation"}, _outlet = {keyword: "outlet"}, _accessors = {keyword: "accessors"}; - var _end = {keyword: "end"}, _import = {keyword: "import", afterImport: true}; + var _end = {keyword: "end"}, _import = {keyword: "import"}; var _action = {keyword: "action"}, _selector = {keyword: "selector"}, _class = {keyword: "class"}, _global = {keyword: "global"}; var _dictionaryLiteral = {keyword: "{"}, _arrayLiteral = {keyword: "["}; var _ref = {keyword: "ref"}, _deref = {keyword: "deref"}; @@ -396,11 +483,15 @@ if (typeof exports != "undefined" && !exports.acorn) { var _preElse = {keyword: "else"}; var _preEndif = {keyword: "endif"}; var _preElseIf = {keyword: "elif"}; + var _preElseIfTrue = {keyword: "elif (True)"}; + var _preElseIfFalse = {keyword: "elif (false)"}; var _prePragma = {keyword: "pragma"}; var _preDefined = {keyword: "defined"}; var _preBackslash = {keyword: "\\"} - + var _preError = {keyword: "error"}; + var _preWarning = {keyword: "warning"}; var _preprocessParamItem = {type: "preprocessParamItem"} + var _preprocessSkipLine = {type: "skipLine"} // Map keyword names to token types. @@ -430,9 +521,9 @@ if (typeof exports != "undefined" && !exports.acorn) { // Map Preprocessor keyword names to token types. - var keywordTypesPreprocess = {"define": _preDefine, "pragma": _prePragma, "ifdef": _preIfdef, "ifndef": _preIfndef, + var keywordTypesPreprocessor = {"define": _preDefine, "pragma": _prePragma, "ifdef": _preIfdef, "ifndef": _preIfndef, "undef": _preUndef, "if": _preIf, "endif": _preEndif, "else": _preElse, "elif": _preElseIf, - "defined": _preDefined}; + "defined": _preDefined, "warning": _preWarning, "error": _preError}; // Punctuation token types. Again, the `type` property is purely for debugging. @@ -463,7 +554,7 @@ if (typeof exports != "undefined" && !exports.acorn) { var _slash = {binop: 10, beforeExpr: true, preprocess: true}, _eq = {isAssign: true, beforeExpr: true, preprocess: true}; var _assign = {isAssign: true, beforeExpr: true}, _plusmin = {binop: 9, prefix: true, beforeExpr: true, preprocess: true}; - var _incdec = {postfix: true, prefix: true, isUpdate: true}, _prefix = {prefix: true, beforeExpr: true}; + var _incdec = {postfix: true, prefix: true, isUpdate: true}, _prefix = {prefix: true, beforeExpr: true, preprocess: true}; var _bin1 = {binop: 1, beforeExpr: true, preprocess: true}, _bin2 = {binop: 2, beforeExpr: true, preprocess: true}; var _bin3 = {binop: 3, beforeExpr: true, preprocess: true}, _bin4 = {binop: 4, beforeExpr: true, preprocess: true}; var _bin5 = {binop: 5, beforeExpr: true, preprocess: true}, _bin6 = {binop: 6, beforeExpr: true, preprocess: true}; @@ -477,7 +568,7 @@ if (typeof exports != "undefined" && !exports.acorn) { parenL: _parenL, parenR: _parenR, comma: _comma, semi: _semi, colon: _colon, dot: _dot, question: _question, slash: _slash, eq: _eq, name: _name, eof: _eof, num: _num, regexp: _regexp, string: _string}; - for (var kw in keywordTypes) exports.tokTypes[kw] = keywordTypes[kw]; + for (var kw in keywordTypes) exports.tokTypes["_" + kw] = keywordTypes[kw]; // This is a trick taken from Esprima. It turns out that, on // non-Chrome browsers, to check whether a string is in a set, a @@ -555,7 +646,7 @@ if (typeof exports != "undefined" && !exports.acorn) { // The preprocessor keywords. - var isKeywordPreprocess = makePredicate("define pragma if ifdef ifndef else elif endif defined"); + var isKeywordPreprocessor = makePredicate("define undef pragma if ifdef ifndef else elif endif defined error warning"); // ## Character categories @@ -567,7 +658,7 @@ if (typeof exports != "undefined" && !exports.acorn) { var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/; var nonASCIIwhitespaceNoNewLine = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; - var nonASCIIidentifierChars = "\u0371-\u0374\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + var nonASCIIidentifierChars = "\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); @@ -582,17 +673,17 @@ if (typeof exports != "undefined" && !exports.acorn) { // Test whether a given character code starts an identifier. - function isIdentifierStart(code) { + var isIdentifierStart = exports.isIdentifierStart = function(code) { if (code < 65) return code === 36; if (code < 91) return true; if (code < 97) return code === 95; if (code < 123)return true; return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); - } + }; // Test whether a given character is part of an identifier. - function isIdentifierChar(code) { + var isIdentifierChar = exports.isIdentifierChar = function(code) { if (code < 48) return code === 36; if (code < 58) return true; if (code < 65) return false; @@ -600,7 +691,7 @@ if (typeof exports != "undefined" && !exports.acorn) { if (code < 97) return code === 95; if (code < 123)return true; return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); - } + }; // ## Tokenizer @@ -610,73 +701,119 @@ if (typeof exports != "undefined" && !exports.acorn) { function line_loc_t() { this.line = tokCurLine; this.column = tokPos - tokLineStart; + if (preprocessStackLastItem) { + var macro = preprocessStackLastItem.macro; + var locationOffset = macro.locationOffset; + if (locationOffset) { + var macroCurrentLine = locationOffset.line; + if (macroCurrentLine) this.line += macroCurrentLine; + var macroCurrentLineStart = locationOffset.column; + // Only add column offset if we are on the first line + if (macroCurrentLineStart) this.column += tokPosMacroOffset - (tokCurLine === 0 ? macroCurrentLineStart : 0); + } + } + } + + function PositionOffset(line, column) { + this.line = line; + this.column = column; + if (preprocessStackLastItem) { + var macro = preprocessStackLastItem.macro; + var locationOffset = macro.locationOffset; + if (locationOffset) { + var macroCurrentLine = locationOffset.line; + if (macroCurrentLine) this.line += macroCurrentLine; + var macroCurrentLineStart = locationOffset.column; + if (macroCurrentLineStart) this.column += macroCurrentLineStart; + } + } } // Reset the token state. Used at the start of a parse. function initTokenState() { - macros = Object.create(null); tokCurLine = 1; - tokPos = tokLineStart = 0; + tokPos = tokLineStart = lastTokMacroOffset = tokMacroOffset = tokPosMacroOffset = 0; tokRegexpAllowed = true; tokComments = null; tokSpaces = null; skipSpace(); } + // Reset the token state. Used at the start of a parse. + + function initPreprocessorState() { + macros = Object.create(null); + macrosIsPredicate = null; + preprocessParameterScope = null; + preTokParameterScope = null; + preprocessMacroParameterListMode = false; + preprocessIsParsingPreprocess = false; + preprocessStack = []; + preprocessStackLastItem = null; + preprocessOnlyTransformArgumentsForLastToken = null; + preNotSkipping = true; + preConcatenating = false; + preIfLevel = []; + } + // Called at the end of every token. Sets `tokEnd`, `tokVal`, // `tokCommentsAfter`, `tokSpacesAfter`, and `tokRegexpAllowed`, and skips the space // after the token, so that the next one's `tokStart` will point at // the right position. -var preprocessTokens = [_preIf, _preIfdef, _preIfndef, _preElse, _preElseIf, _preEndif]; - - function finishToken(type, val) { - // If we get any of these preprocess tokens skip it and read next - if (type in preprocessTokens) return readToken(); - tokEnd = tokPos; - if (options.locations) tokEndLoc = new line_loc_t; + function finishToken(type, val, overrideTokEnd) { + if (overrideTokEnd) { + tokEnd = overrideTokEnd; + if (options.locations) tokEndLoc = preprocessOverrideTokLoc; + } else { + tokEnd = tokPos; + if (options.locations) tokEndLoc = new line_loc_t; + } tokType = type; skipSpace(); if (options.preprocess && input.charCodeAt(tokPos) === 35 && input.charCodeAt(tokPos + 1) === 35) { // '##' - var val1 = type === _name ? val : type.keyword; + var val1 = val != null ? val : type.keyword || type.type; tokPos += 2; - if (val1) { + if (val1 != null) { + // Save current line and current line start. This is needed when option.locations is true + var positionOffset = options.locations && new PositionOffset(tokCurLine, tokLineStart); + // Save positions on first token to get start and end correct on node if cancatenated token is invalid + var saveTokInput = tokInput, saveTokEnd = tokEnd, saveTokStart = tokStart, start = tokStart + tokMacroOffset, variadicName = preprocessStackLastItem && preprocessStackLastItem.macro && preprocessStackLastItem.macro.variadicName; skipSpace(); - readToken(); - var val2 = tokType === _name ? tokVal : tokType.keyword; - if (val2) { - var concat = "" + val1 + val2, - code = concat.charCodeAt(0), - tok; - if (isIdentifierStart(code)) - tok = readWord(concat) !== false; - - // We might got a word token from the concatenation - if (tok) return tok; - // FIXME: Is not using the concatenated token - tok = getTokenFromCode(code, finishToken); - if (tok === false) { - unexpected(); - } - // We have now got another type of token from the concatenation - return tok; - } else { - // FIXME: Second token was not of right type. Save second token and return the first. When readToken is called again return the second. + if (variadicName && variadicName === input.slice(tokPos, tokPos + variadicName.length)) var isVariadic = true; + preConcatenating = true; + readToken(null, 2); // Don't transform macros + preConcatenating = false; + var val2 = tokVal != null ? tokVal : tokType.keyword || tokType.type; + if (val2 != null) { + // Skip token if it is a ',' concatenated with an empty variadic parameter + if (isVariadic && val1 === "," && val2 === "") return readToken(); + var concat = "" + val1 + val2, val2TokStart = tokStart + tokPosMacroOffset; + // If the macro defines anything add it to the preprocess input stack + var concatMacro = new Macro(null, concat, null, start, false, null, false, positionOffset); + var r = readTokenFromMacro(concatMacro, tokPosMacroOffset, preprocessStackLastItem ? preprocessStackLastItem.parameterDict : null, null, tokPos, next, null); + // Consumed the whole macro in one bite? If not the tokenizer can't create a single token from the two concatenated tokens + if (preprocessStackLastItem && preprocessStackLastItem.macro === concatMacro) { + tokType = type; + tokStart = saveTokStart; + tokEnd = saveTokEnd; + tokInput = saveTokInput; + tokPosMacroOffset = val2TokStart - val1.length; // reset the macro offset to the second token to get start and end correct on node + if (!isVariadic) /*raise(tokStart,*/console.log("Warning: pasting formed '" + concat + "', an invalid preprocessing token"); + } else return r; } } } - tokVal = val; lastTokCommentsAfter = tokCommentsAfter; lastTokSpacesAfter = tokSpacesAfter; tokCommentsAfter = tokComments; tokSpacesAfter = tokSpaces; tokRegexpAllowed = type.beforeExpr; - tokAfterImport = type.afterImport; } - function skipBlockComment() { + function skipBlockComment(lastIsNewlinePos, dontTrack) { var startLoc = options.onComment && options.locations && new line_loc_t; var start = tokPos, end = input.indexOf("*/", tokPos += 2); if (end === -1) raise(tokPos - 2, "Unterminated comment"); @@ -689,26 +826,30 @@ var preprocessTokens = [_preIf, _preIfdef, _preIfndef, _preElse, _preElseIf, _pr tokLineStart = match.index + match[0].length; } } - if (options.onComment) - options.onComment(true, input.slice(start + 2, end), start, tokPos, - startLoc, options.locations && new line_loc_t); - if (options.trackComments) - (tokComments || (tokComments = [])).push(input.slice(start, end)); + if (!dontTrack) { + if (options.onComment) + options.onComment(true, input.slice(start + 2, end), start, tokPos, + startLoc, options.locations && new line_loc_t); + if (options.trackComments) + (tokComments || (tokComments = [])).push(input.slice(lastIsNewlinePos != null && options.trackCommentsIncludeLineBreak ? lastIsNewlinePos : start, tokPos)); + } } - function skipLineComment() { + function skipLineComment(lastIsNewlinePos, dontTrack) { var start = tokPos; var startLoc = options.onComment && options.locations && new line_loc_t; var ch = input.charCodeAt(tokPos+=2); - while (tokPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8329) { + while (tokPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) { ++tokPos; ch = input.charCodeAt(tokPos); } - if (options.onComment) - options.onComment(false, input.slice(start + 2, tokPos), start, tokPos, - startLoc, options.locations && new line_loc_t); - if (options.trackComments) - (tokComments || (tokComments = [])).push(input.slice(start, tokPos)); + if (!dontTrack) { + if (options.onComment) + options.onComment(false, input.slice(start + 2, tokPos), start, tokPos, + startLoc, options.locations && new line_loc_t); + if (options.trackComments) + (tokComments || (tokComments = [])).push(input.slice(lastIsNewlinePos != null && options.trackCommentsIncludeLineBreak ? lastIsNewlinePos : start, tokPos)); + } } function preprocesSkipRestOfLine() { @@ -717,11 +858,15 @@ var preprocessTokens = [_preIf, _preIfdef, _preIfndef, _preElse, _preElseIf, _pr // If the last none whitespace character is a '\' the line will continue on the the next line. // Here we break the way gcc works as it joins the lines first and then tokenize it. Because of // this we can't have a newline in the middle of a word. - while (tokPos < inputLen && ((ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8329) || last === 92)) { // White space and '\' + while (tokPos < inputLen && ((ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) || last === 92)) { // White space and '\' if (ch != 32 && ch != 9 && ch != 160 && (ch < 5760 || !nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch)))) last = ch; ch = input.charCodeAt(++tokPos); } + if (options.locations) { + ++tokCurLine; + tokLineStart = tokPos; + } } // Called at the start of the parse and after every token. Skips @@ -733,53 +878,90 @@ var preprocessTokens = [_preIf, _preIfdef, _preIfndef, _preElse, _preElseIf, _pr function skipSpace() { tokComments = null; tokSpaces = null; - var spaceStart = tokPos; + onlySkipSpace(); + } + + function onlySkipSpace(dontSkipEOL, dontSkipMacroBoundary, dontSkipComments) { + var spaceStart = tokPos, + lastIsNewlinePos; for(;;) { var ch = input.charCodeAt(tokPos); if (ch === 32) { // ' ' ++tokPos; - } else if(ch === 13) { + } else if (ch === 13 && !dontSkipEOL) { + lastIsNewlinePos = tokPos; ++tokPos; var next = input.charCodeAt(tokPos); - if(next === 10) { + if (next === 10) { ++tokPos; } - if(options.locations) { + if (options.locations) { ++tokCurLine; tokLineStart = tokPos; } - } else if (ch === 10) { + } else if (ch === 10 && !dontSkipEOL) { + lastIsNewlinePos = tokPos; ++tokPos; - ++tokCurLine; - tokLineStart = tokPos; - } else if(ch < 14 && ch > 8) { + if (options.locations) { + ++tokCurLine; + tokLineStart = tokPos; + } + } else if (ch === 9) { ++tokPos; - } else if (ch === 47) { // '/' + } else if (ch === 47 && !dontSkipComments) { // '/' var next = input.charCodeAt(tokPos+1); if (next === 42) { // '*' if (options.trackSpaces) (tokSpaces || (tokSpaces = [])).push(input.slice(spaceStart, tokPos)); - skipBlockComment(); + skipBlockComment(lastIsNewlinePos); spaceStart = tokPos; } else if (next === 47) { // '/' if (options.trackSpaces) (tokSpaces || (tokSpaces = [])).push(input.slice(spaceStart, tokPos)); - skipLineComment(); + skipLineComment(lastIsNewlinePos); spaceStart = tokPos; } else break; - } else if (ch === 160) { // '\xa0' - ++tokPos; - } else if (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + } else if (ch === 160 || ch === 11 || ch === 12 || (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch)))) { // '\xa0', VT, FF, Unicode whitespaces ++tokPos; } else if (tokPos >= inputLen) { - if (options.preprocess && preprocessStack.length) { + if (options.preprocess) { + if (dontSkipMacroBoundary) return true; + if (!preprocessStack.length) break; // If we are at the end of the input inside a macro continue at last position var lastItem = preprocessStack.pop(); tokPos = lastItem.end; input = lastItem.input; inputLen = lastItem.inputLen; - lastEnd = lastItem.lastEnd; - lastStart = lastItem.lastStart; + tokCurLine = lastItem.currentLine; + tokLineStart = lastItem.currentLineStart; + /*tokStart = *///tokFirstStart = lastItem.tokStart; + //lastEnd = lastItem.lastEnd; + //lastStart = lastItem.lastStart; + preprocessOnlyTransformArgumentsForLastToken = lastItem.onlyTransformArgumentsForLastToken; + preprocessParameterScope = lastItem.parameterScope; + tokPosMacroOffset = lastItem.macroOffset; + // Set the last item + var lastIndex = preprocessStack.length; + preprocessStackLastItem = lastIndex ? preprocessStack[lastIndex - 1] : null; + onlySkipSpace(dontSkipEOL); + } else { + break; + } + } else if (ch === 92 && options.preprocess) { // '\' + // Check if we have an escaped newline. We are using a relaxed treatment of escaped newlines like gcc. + // We allow spaces, horizontal and vertical tabs, and form feeds between the backslash and the subsequent newline + var pos = tokPos + 1; + ch = input.charCodeAt(pos); + while (pos < inputLen && (ch === 32 || ch === 9 || ch === 11 || ch === 12 || (ch >= 5760 && nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch))))) + ch = input.charCodeAt(++pos); + lineBreak.lastIndex = 0; + var match = lineBreak.exec(input.slice(pos, pos + 2)); + if (match && match.index === 0) { + tokPos = pos + match[0].length; + if (options.locations) { + ++tokCurLine; + tokLineStart = tokPos; + } } else { break; } @@ -801,202 +983,216 @@ var preprocessTokens = [_preIf, _preIfdef, _preIfndef, _preElse, _preElseIf, _pr // The `forceRegexp` parameter is used in the one case where the // `tokRegexpAllowed` trick does not work. See `parseStatement`. - function readToken_dot(code, finishToken) { + function readToken_dot(code, finisher) { var next = input.charCodeAt(tokPos+1); - if (next >= 48 && next <= 57) return readNumber(String.fromCharCode(code), finishToken); + if (next >= 48 && next <= 57) return readNumber(String.fromCharCode(code), finisher); if (next === 46 && options.objj && input.charCodeAt(tokPos+2) === 46) { //'.' tokPos += 3; - return finishToken(_dotdotdot); + return finisher(_dotdotdot); } ++tokPos; - return finishToken(_dot); + return finisher(_dot); } - function readToken_slash(finishToken) { // '/' + function readToken_slash(finisher) { // '/' var next = input.charCodeAt(tokPos+1); if (tokRegexpAllowed) {++tokPos; return readRegexp();} - if (next === 61) return finishOp(_assign, 2, finishToken); - return finishOp(_slash, 1, finishToken); + if (next === 61) return finishOp(_assign, 2, finisher); + return finishOp(_slash, 1, finisher); } - function readToken_mult_modulo(finishToken) { // '%*' + function readToken_mult_modulo(finisher) { // '%*' var next = input.charCodeAt(tokPos+1); - if (next === 61) return finishOp(_assign, 2, finishToken); - return finishOp(_bin10, 1, finishToken); + if (next === 61) return finishOp(_assign, 2, finisher); + return finishOp(_bin10, 1, finisher); } - function readToken_pipe_amp(code, finishToken) { // '|&' + function readToken_pipe_amp(code, finisher) { // '|&' var next = input.charCodeAt(tokPos+1); - if (next === code) return finishOp(code === 124 ? _bin1 : _bin2, 2, finishToken); - if (next === 61) return finishOp(_assign, 2, finishToken); - return finishOp(code === 124 ? _bin3 : _bin5, 1, finishToken); + if (next === code) return finishOp(code === 124 ? _bin1 : _bin2, 2, finisher); + if (next === 61) return finishOp(_assign, 2, finisher); + return finishOp(code === 124 ? _bin3 : _bin5, 1, finisher); } - function readToken_caret(finishToken) { // '^' + function readToken_caret(finisher) { // '^' var next = input.charCodeAt(tokPos+1); - if (next === 61) return finishOp(_assign, 2, finishToken); - return finishOp(_bin4, 1, finishToken); + if (next === 61) return finishOp(_assign, 2, finisher); + return finishOp(_bin4, 1, finisher); } - function readToken_plus_min(code, finishToken) { // '+-' + function readToken_plus_min(code, finisher) { // '+-' var next = input.charCodeAt(tokPos+1); - if (next === code) return finishOp(_incdec, 2, finishToken); - if (next === 61) return finishOp(_assign, 2, finishToken); - return finishOp(_plusmin, 1, finishToken); + if (next === code) return finishOp(_incdec, 2, finisher); + if (next === 61) return finishOp(_assign, 2, finisher); + return finishOp(_plusmin, 1, finisher); } - function readToken_lt_gt(code, finishToken) { // '<>' - if (tokAfterImport && options.objj && code === 60) { // '<' - var str = []; - for (;;) { - if (tokPos >= inputLen) raise(tokStart, "Unterminated import statement"); + function readToken_lt_gt(code, finisher) { // '<>' + if (tokType === _import && options.objj && code === 60) { // '<' + for (var start = tokPos + 1;;) { var ch = input.charCodeAt(++tokPos); - if (ch === 62) { // '>' - ++tokPos; - return finishToken(_filename, String.fromCharCode.apply(null, str)); - } - str.push(ch); + if (ch === 62) // '>' + return finisher(_filename, input.slice(start, tokPos++)); + if (tokPos >= inputLen || ch === 13 || ch === 10 || ch === 8232 || ch === 8233) + raise(tokStart, "Unterminated import statement"); } } var next = input.charCodeAt(tokPos+1); var size = 1; if (next === code) { size = code === 62 && input.charCodeAt(tokPos+2) === 62 ? 3 : 2; - if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1, finishToken); - return finishOp(_bin8, size, finishToken); + if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1, finisher); + return finishOp(_bin8, size, finisher); } if (next === 61) size = input.charCodeAt(tokPos+2) === 61 ? 3 : 2; - return finishOp(_bin7, size, finishToken); + return finishOp(_bin7, size, finisher); } - function readToken_eq_excl(code, finishToken) { // '=!' + function readToken_eq_excl(code, finisher) { // '=!' var next = input.charCodeAt(tokPos+1); - if (next === 61) return finishOp(_bin6, input.charCodeAt(tokPos+2) === 61 ? 3 : 2, finishToken); - return finishOp(code === 61 ? _eq : _prefix, 1, finishToken); + if (next === 61) return finishOp(_bin6, input.charCodeAt(tokPos+2) === 61 ? 3 : 2, finisher); + return finishOp(code === 61 ? _eq : _prefix, 1, finisher); } - function readToken_at(code, finishToken) { // '@' + function readToken_at(code, finisher) { // '@' var next = input.charCodeAt(++tokPos); if (next === 34 || next === 39) // Read string if "'" or '"' - return readString(next, finishToken); + return readString(next, finisher); if (next === 123) // Read dictionary literal if "{" - return finishToken(_dictionaryLiteral); - if (next === 91) // Ready array literal if "[" - return finishToken(_arrayLiteral); + return finisher(_dictionaryLiteral); + if (next === 91) // Read array literal if "[" + return finisher(_arrayLiteral); var word = readWord1(), token = objJAtKeywordTypes[word]; - if (!token) raise(tokPos, "Unrecognized Objective-J keyword '@" + word + "'"); - return finishToken(token); + if (!token) raise(tokStart, "Unrecognized Objective-J keyword '@" + word + "'"); + return finisher(token); } -// True if we are skipping token when finding #else or #endif after and #if - -var preNotSkipping = true; -var preIfLevel = 0; - - function readToken_preprocess(finishTokenFunction) { // '#' + function readToken_preprocess(finisher) { // '#' ++tokPos; - preprocessReadToken(); + preprocessSkipSpace(); + preprocessReadToken(false, true); // Dont track and it is a preprocessToken switch (preTokType) { case _preDefine: - preprocessReadToken(); - var macroIdentifierEnd = preTokEnd; - var macroIdentifier = preprocessGetIdent(); - // '(' Must follow directly after identifier to be a valid macro with parameters - if (input.charCodeAt(macroIdentifierEnd) === 40) { // '(' - preprocessExpect(_parenL); - var parameters = []; - var first = true; - while (!preprocessEat(_parenR)) { - if (!first) preprocessExpect(_comma, "Expected ',' between macro parameters"); else first = false; - parameters.push(preprocessGetIdent()); - } + if (preNotSkipping) { + preprocessParseDefine(); + } else { + return finisher(_preDefine); } - var start = tokPos = preTokStart; - preprocesSkipRestOfLine(); - var macroString = input.slice(start, tokPos); - macroString = macroString.replace(/\\/g, " "); - options.preprocessAddMacro(new Macro(macroIdentifier, macroString, parameters)); break; case _preUndef: preprocessReadToken(); options.preprocessUndefineMacro(preprocessGetIdent()); - preprocesSkipRestOfLine(); break; case _preIf: if (preNotSkipping) { - preIfLevel++; - preprocessReadToken(); - var expr = preprocessParseExpression(); + // We dont't allow regex when parsing preprocess expression + var saveTokRegexpAllowed = tokRegexpAllowed; + tokRegexpAllowed = false; + preIfLevel.push(_preIf); + preprocessReadToken(false, false, true); + var expr = preprocessParseExpression(true); // Process macros var test = preprocessEvalExpression(expr); - if (!test) - preNotSkipping = false - preprocessSkipToElseOrEndif(!test); + if (!test) { + preNotSkipping = false; + preprocessSkipToElseOrEndif(); + } + tokRegexpAllowed = saveTokRegexpAllowed; } else { - return finishTokenFunction(_preIf); + return finisher(_preIf); } break; case _preIfdef: if (preNotSkipping) { - preIfLevel++; + preIfLevel.push(_preIf); preprocessReadToken(); var ident = preprocessGetIdent(); - var test = options.preprocessGetMacro(ident); - if (!test) + var test = options.preprocessIsMacro(ident); + if (!test) { preNotSkipping = false - //preprocessExpect(_eol); - preprocessSkipToElseOrEndif(!test); + preprocessSkipToElseOrEndif(); + } } else { - //preprocesSkipRestOfLine(); - return finishTokenFunction(_preIfdef); + return finisher(_preIfdef); } break; case _preIfndef: if (preNotSkipping) { - preIfLevel++; + preIfLevel.push(_preIf); preprocessReadToken(); var ident = preprocessGetIdent(); - var test = options.preprocessGetMacro(ident); - if (test) + var test = options.preprocessIsMacro(ident); + if (test) { preNotSkipping = false - //preprocessExpect(_eol); - preprocessSkipToElseOrEndif(test); + preprocessSkipToElseOrEndif(); + } } else { //preprocesSkipRestOfLine(); - return finishTokenFunction(_preIfndef); + return finisher(_preIfndef); } break; case _preElse: - if (preIfLevel) { + if (preIfLevel.length) { if (preNotSkipping) { - preNotSkipping = false; - finishTokenFunction(_preElse); - preprocessReadToken(); - preprocessSkipToElseOrEndif(true, true); // no else + if(preIfLevel[preIfLevel.length - 1] === _preIf) { + preIfLevel[preIfLevel.length - 1] = _preElse; + preNotSkipping = false; + finisher(_preElse); + preprocessReadToken(); + preprocessSkipToElseOrEndif(true); // no else + } else + raise(preTokStart, "#else after #else"); } else { - return finishTokenFunction(_preElse); + preIfLevel[preIfLevel.length - 1] = _preElse; + return finisher(_preElse); } } else raise(preTokStart, "#else without #if"); break; - case _preEndif: - if (preIfLevel) { + case _preElseIf: + if (preIfLevel.length) { if (preNotSkipping) { - preIfLevel--; + if(preIfLevel[preIfLevel.length - 1] === _preIf) { + preNotSkipping = false; + finisher(_preElseIf); + preprocessReadToken(); + preprocessSkipToElseOrEndif(true); // no else + } else + raise(preTokStart, "#elsif after #else"); + } else { + // We dont't allow regex when parsing preprocess expression + var saveTokRegexpAllowed = tokRegexpAllowed; + tokRegexpAllowed = false; + preNotSkipping = true; + preprocessReadToken(false, false, true); + var expr = preprocessParseExpression(true); + preNotSkipping = false; + tokRegexpAllowed = saveTokRegexpAllowed; + var test = preprocessEvalExpression(expr); + return finisher(test ? _preElseIfTrue : _preElseIfFalse); + } + } else + raise(preTokStart, "#elif without #if"); + break; + + case _preEndif: + if (preIfLevel.length) { + if (preNotSkipping) { + preIfLevel.pop(); break; } } else { raise(preTokStart, "#endif without #if"); } - return finishTokenFunction(_preEndif); + return finisher(_preEndif); break; case _prePragma: @@ -1007,20 +1203,88 @@ var preIfLevel = 0; preprocesSkipRestOfLine(); break; + case _preWarning: + preprocessReadToken(false, false, true); + var expr = preprocessParseExpression(); + console.log("Warning: " + String(preprocessEvalExpression(expr))); + break; + + case _preError: + var start = preTokStart; + preprocessReadToken(false, false, true); + var expr = preprocessParseExpression(); + raise(start, "Error: " + String(preprocessEvalExpression(expr))); + break; + default: + if (preprocessStackLastItem) { + // If the current macro has parameters check if this word is one of them and should be stringifyed + if (preprocessStackLastItem.parameterDict && preprocessStackLastItem.macro.isParameterFunction()(preTokVal)) { + var macro = preprocessStackLastItem.parameterDict[preTokVal]; + if (macro) { + return finishToken(_string, macro.macro); + } + } + } raise(preTokStart, "Invalid preprocessing directive"); preprocesSkipRestOfLine(); // Return the complete line as a token to make it possible to create a PreProcessStatement if we are between two statements - return finishTokenFunction(_preprocess); + return finisher(_preprocess); //raise(tokPos, "Invalid preprocessing directive '" + (preTokType.keyword || preTokVal) + "' " + input.slice(tokStart, tokPos)); } - // Drop this token and read next non preprocess token - finishToken(_preprocess); + // Drop the regular token as this was a preprocess token and then read next token + //tokPos = preTokStart; + if (preTokType === _eol && options.trackSpaces) { + if (tokSpaces && tokSpaces.length) + tokSpaces.push("\n" + tokSpaces.pop()); + else + tokSpaces = ["\n"]; + } + preprocessFinishToken(_preprocess, null, null, true); // skipEOL return readToken(); } + function preprocessParseDefine() { + preprocessIsParsingPreprocess = true; + preprocessReadToken(); + var macroIdentifierEnd = preTokEnd; + var macroIdentifier = preprocessGetIdent(); + // '(' Must follow directly after identifier to be a valid macro with parameters + if (input.charCodeAt(macroIdentifierEnd) === 40) { // '(' + preprocessExpect(_parenL); + var parameters = []; + var variadic = false; + var first = true; + while (!preprocessEat(_parenR)) { + if (variadic) raise(preTokStart, "Variadic parameter must be last"); + if (!first) preprocessExpect(_comma, "Expected ',' between macro parameters"); else first = false; + parameters.push(preprocessEat(_dotdotdot) ? variadic = true && "__VA_ARGS__" : preprocessGetIdent()); + if (preprocessEat(_dotdotdot)) variadic = true; + } + } + var start = preTokStart; + var positionOffset = options.locations && new PositionOffset(tokCurLine, tokLineStart); + while(preTokType !== _eol && preTokType !== _eof) + preprocessReadToken(); + + var macroString = input.slice(start, preTokStart); + macroString = macroString.replace(/\\/g, " "); + // If variadic get the last parameter for the variadic parameter name + options.preprocessAddMacro(new Macro(macroIdentifier, macroString, parameters, start, false, null, variadic && parameters[parameters.length - 1], positionOffset)); + preprocessIsParsingPreprocess = false; + } + function preprocessEvalExpression(expr) { - return exports.walk.recursive(expr, {}, { + return walk.recursive(expr, {}, { + LogicalExpression: function(node, st, c) { + var left = node.left, right = node.right; + switch (node.operator) { + case "||": + return c(left, st) || c(right, st); + case "&&": + return c(left, st) && c(right, st); + } + }, BinaryExpression: function(node, st, c) { var left = node.left, right = node.right; switch(node.operator) { @@ -1038,65 +1302,97 @@ var preIfLevel = 0; return c(left, st) < c(right, st); case ">": return c(left, st) > c(right, st); - case "=": + case "^": + return c(left, st) ^ c(right, st); + case "&": + return c(left, st) & c(right, st); + case "|": + return c(left, st) | c(right, st); case "==": + return c(left, st) == c(right, st); case "===": return c(left, st) === c(right, st); + case "!=": + return c(left, st) != c(right, st); + case "!==": + return c(left, st) !== c(right, st); case "<=": return c(left, st) <= c(right, st); case ">=": return c(left, st) >= c(right, st); - case "&&": - return c(left, st) && c(right, st); - case "||": - return c(left, st) || c(right, st); + case ">>": + return c(left, st) >> c(right, st); + case ">>>": + return c(left, st) >>> c(right, st); + case "<<": + return c(left, st) << c(right, st); + } + }, + UnaryExpression: function(node, st, c) { + var arg = node.argument; + switch (node.operator) { + case "-": + return -c(arg, st); + case "+": + return +c(arg, st); + case "!": + return !c(arg, st); + case "~": + return ~c(arg, st); } }, Literal: function(node, st, c) { return node.value; }, Identifier: function(node, st, c) { - var name = node.name, - macro = options.preprocessGetMacro(name); - return (macro && parseInt(macro.macro)) || 0; + // If it is not macro expanded it should be counted as a zero + return 0; }, DefinedExpression: function(node, st, c) { - return !!options.preprocessGetMacro(node.id.name); + var objectNode = node.object; + if (objectNode.type === "Identifier") { + // If the macro has parameters it will not expand and we have to check here if it exists + var name = objectNode.name, + macro = options.preprocessGetMacro(name) || preprocessBuiltinMacro(name); + return macro || 0; + } else { + return c(objectNode, st); + } } }, {}); } - function getTokenFromCode(code, finishToken, allowEndOfLineToken) { + function getTokenFromCode(code, finisher, allowEndOfLineToken) { switch(code) { // The interpretation of a dot depends on whether it is followed // by a digit. case 46: // '.' - return readToken_dot(code, finishToken); + return readToken_dot(code, finisher); // Punctuation tokens. - case 40: ++tokPos; return finishToken(_parenL); - case 41: ++tokPos; return finishToken(_parenR); - case 59: ++tokPos; return finishToken(_semi); - case 44: ++tokPos; return finishToken(_comma); - case 91: ++tokPos; return finishToken(_bracketL); - case 93: ++tokPos; return finishToken(_bracketR); - case 123: ++tokPos; return finishToken(_braceL); - case 125: ++tokPos; return finishToken(_braceR); - case 58: ++tokPos; return finishToken(_colon); - case 63: ++tokPos; return finishToken(_question); + case 40: ++tokPos; return finisher(_parenL); + case 41: ++tokPos; return finisher(_parenR); + case 59: ++tokPos; return finisher(_semi); + case 44: ++tokPos; return finisher(_comma); + case 91: ++tokPos; return finisher(_bracketL); + case 93: ++tokPos; return finisher(_bracketR); + case 123: ++tokPos; return finisher(_braceL); + case 125: ++tokPos; return finisher(_braceR); + case 58: ++tokPos; return finisher(_colon); + case 63: ++tokPos; return finisher(_question); // '0x' is a hexadecimal number. case 48: // '0' var next = input.charCodeAt(tokPos+1); - if (next === 120 || next === 88) return readHexNumber(finishToken); + if (next === 120 || next === 88) return readHexNumber(finisher); // Anything else beginning with a digit is an integer, octal // number, or float. case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9 - return readNumber(false, finishToken); + return readNumber(false, finisher); // Quotes produce strings. case 34: case 39: // '"', "'" - return readString(code, finishToken); + return readString(code, finisher); // Operators are parsed inline in tiny state machines. '=' (61) is // often referred to. `finishOp` simply skips the amount of @@ -1104,116 +1400,203 @@ var preIfLevel = 0; // of the type given by its first argument. case 47: // '/' - return readToken_slash(finishToken); + return readToken_slash(finisher); case 37: case 42: // '%*' - return readToken_mult_modulo(finishToken); + return readToken_mult_modulo(finisher); case 124: case 38: // '|&' - return readToken_pipe_amp(code, finishToken); + return readToken_pipe_amp(code, finisher); case 94: // '^' - return readToken_caret(finishToken); + return readToken_caret(finisher); case 43: case 45: // '+-' - return readToken_plus_min(code, finishToken); + return readToken_plus_min(code, finisher); case 60: case 62: // '<>' - return readToken_lt_gt(code, finishToken, finishToken); + return readToken_lt_gt(code, finisher); case 61: case 33: // '=!' - return readToken_eq_excl(code, finishToken); + return readToken_eq_excl(code, finisher); case 126: // '~' - return finishOp(_prefix, 1, finishToken); + return finishOp(_prefix, 1, finisher); case 64: // '@' if (options.objj) - return readToken_at(code, finishToken); + return readToken_at(code, finisher); return false; case 35: // '#' if (options.preprocess) { - return readToken_preprocess(finishToken); + if (preprocessIsParsingPreprocess) { + ++tokPos; + return finisher(_preprocess); + } + // Check if it is the first token on the line + lineBreak.lastIndex = 0; + var match = lineBreak.exec(input.slice(lastEnd, tokPos)); + if (lastEnd !== 0 && lastEnd !== tokPos && !match) { + if (preprocessStackLastItem) { + // Stringify next token + return preprocessStringify(); + } else { + raise(tokPos, "Preprocessor directives may only be used at the beginning of a line"); + } + } + + return readToken_preprocess(finisher); } return false; case 92: // '\' if (options.preprocess) { - return finishOp(_preBackslash, 1, finishToken); + return finishOp(_preBackslash, 1, finisher); } return false; } - if (allowEndOfLineToken && newline.test(String.fromCharCode(code))) { - return finishOp(_eol, 1, finishToken); + if (allowEndOfLineToken) { + var r; + if (code === 13) { + r = finishOp(_eol, input.charCodeAt(tokPos+1) === 10 ? 2 : 1, finisher); + } else if (code === 10 || code === 8232 || code === 8233) { + r = finishOp(_eol, 1, finisher); + } else { + return false; + } + if (options.locations) { + ++tokCurLine; + tokLineStart = tokPos; + } + return r; } return false; -} + } -// Returns true if it stops at a line break + // Stringify next token and return with it as a literal string. - function preprocessSkipSpace() { - while (tokPos < inputLen) { - var ch = input.charCodeAt(tokPos); - if (ch === 32 || ch === 9 || ch === 160 || (ch >= 5760 && nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch)))) { - ++tokPos; - } else if (ch === 92) { // '\' - // Check if we have an escaped newline. We are using a relaxed treatment of escaped newlines like gcc. - // We allow spaces, horizontal and vertical tabs, and form feeds between the backslash and the subsequent newline - var pos = tokPos + 1; - ch = input.charCodeAt(pos); - while (pos < inputLen && (ch === 32 || ch === 9 || ch === 11 || ch === 12 || (ch >= 5760 && nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch))))) - ch = input.charCodeAt(++pos); - lineBreak.lastIndex = 0; - var match = lineBreak.exec(input.slice(pos, pos + 2)); - if (match && match.index === 0) { - tokPos = pos + match[0].length; - } else { - return false; - } + function preprocessStringify() { + var saveStackLength = preprocessStack.length, saveLastItem = preprocessStackLastItem; + tokPos++; // Skip '#' + preConcatenating = true; // To get empty sting if macro is empty + next(false, 2); // Don't prescan arguments + preConcatenating = false; + var start = tokStart + tokMacroOffset; + var positionOffset = options.locations && new PositionOffset(tokCurLine, tokLineStart); + var string; + if (tokType === _string) { + var quote = tokInput.slice(tokStart, tokStart + 1); + var escapedQuote = quote === '"' ? '\\"' : "'"; + string = escapedQuote; + string += preprocessStringifyEscape(tokVal); + string += escapedQuote; + } else { + string = tokVal != null ? tokVal : tokType.keyword || tokType.type; + } + while (preprocessStack.length > saveStackLength && saveLastItem === preprocessStack[saveStackLength - 1]) { + preConcatenating = true; // To get empty sting if macro is empty + next(false, 2); // Don't prescan arguments + preConcatenating = false; + // Add a space if there is one or more withespaces + if (lastEnd !== tokStart) string += " "; + if (tokType === _string) { + var quote = tokInput.slice(tokStart, tokStart + 1); + var escapedQuote = quote === '"' ? '\\"' : "'"; + string += escapedQuote; + string += preprocessStringifyEscape(tokVal); + string += escapedQuote; } else { - lineBreak.lastIndex = 0; - var match = lineBreak.exec(input.slice(tokPos, tokPos + 2)); - return match && match.index === 0; + string += tokVal != null ? tokVal : tokType.keyword || tokType.type; } } + var stringifyMacro = new Macro(null, '"' + string + '"', null, start, false, null, false, positionOffset); + return readTokenFromMacro(stringifyMacro, tokPosMacroOffset, null, null, tokPos, next); } - function preprocessSkipToElseOrEndif(test, skipElse) { - if (test) { - var ifLevel = 0; - while (ifLevel > 0 || (preTokType != _preEndif && (preTokType != _preElse || skipElse))) { - switch (preTokType) { - case _preIf: - case _preIfdef: - case _preIfndef: - ifLevel++; - break; + // Escape characters in stringify string. - case _preEndif: - ifLevel--; - break; - - case _eof: - preNotSkipping = true; - raise(preTokStart, "Missing #endif"); - } - preprocessReadToken(); + function preprocessStringifyEscape(aString) { + for (var escaped = "", pos = 0, size = aString.length, ch = aString.charCodeAt(pos); pos < size; ch = aString.charCodeAt(++pos)) { + switch (ch) { + case 34: escaped += '\\\\\\"'; break; // " + case 10: escaped += "\\\\n"; break; // LF (\n) + case 13: escaped += "\\\\r"; break; // CR (\r) + case 9: escaped += "\\\\t"; break; // TAB (\t) + case 8: escaped += "\\\\b"; break; // BS (\b) + case 11: escaped += "\\\\v"; break; // VT (\v) + case 0x00A0: escaped += "\\\\u00A0"; break; // CR (\r) + case 0x2028: escaped += "\\\\u2028"; break; // LINE SEPARATOR + case 0x2029: escaped += "\\\\u2029"; break; // PARAGRAPH SEPARATOR + case 92: escaped += "\\\\"; break; // BACKSLASH + default: escaped += aString.charAt(pos); break; } - preNotSkipping = true; - if (preTokType === _preEndif) - preIfLevel--; } + return escaped; } - function preprocessReadToken() { + // Skip whitespaces sometimes without line breaks + // Returns true if it stops at a line break. + + function preprocessSkipSpace(skipComments, skipEOL) { + onlySkipSpace(!skipEOL); + lineBreak.lastIndex = 0; + var match = lineBreak.exec(input.slice(tokPos, tokPos + 2)); + return match && match.index === 0; + } + + function preprocessSkipToElseOrEndif(skipElse) { + var ifLevel = []; + while (ifLevel.length > 0 || (preTokType !== _preEndif && ((preTokType !== _preElse && preTokType !== _preElseIfTrue) || skipElse))) { + switch (preTokType) { + case _preIf: + case _preIfdef: + case _preIfndef: + ifLevel.push(_preIf); + break; + + case _preElse: + if (ifLevel[ifLevel.length - 1] !== _preIf) + raise(preTokStart, "#else after #else"); + else + ifLevel[ifLevel.length - 1] = _preElse; + break; + + case _preElseIf: + if (ifLevel[ifLevel.length - 1] !== _preIf) + raise(preTokStart, "#elif after #else"); + break; + + case _preEndif: + ifLevel.pop(); + break; + + case _eof: + preNotSkipping = true; + raise(preTokStart, "Missing #endif"); + } + preprocessReadToken(true); + } + preNotSkipping = true; + if (preTokType === _preEndif) + preIfLevel.pop(); + } + +// preprocessToken is used to cancel preNotSkipping when calling from readToken_preprocess. +// FIXME: Refactor to not use this parameter preprocessToken. It is kind of confusing and it should be possible to do in another way + function preprocessReadToken(skipComments, preprocessToken, processMacros) { preTokStart = tokPos; preTokInput = input; - if (tokPos >= inputLen) return _eof; + preTokParameterScope = preprocessParameterScope; + if (tokPos >= inputLen) return preprocessFinishToken(_eof); var code = input.charCodeAt(tokPos); - if (preprocessMacroParamterListMode && code !== 41 && code !== 44) { // ')', ',' + if (!preprocessToken && !preNotSkipping && code !== 35) { // '#' + // If we are skipping take the whole line if the token does not start with '#' (preprocess tokens) + preprocesSkipRestOfLine(); + return preprocessFinishToken(_preprocessSkipLine, input.slice(preTokStart, tokPos++)); + } else if (preprocessMacroParameterListMode && code !== 41 && code !== 44) { // ')', ',' var parenLevel = 0; // If we are parsing a macro parameter list parentheses within each argument must balance while(tokPos < inputLen && (parenLevel || (code !== 41 && code !== 44))) { // ')', ',' @@ -1221,47 +1604,76 @@ var preIfLevel = 0; parenLevel++; if (code === 41) // ')' parenLevel--; + if (code === 34 || code === 39) {// '"' "'" We have a quote so go all the way to the end of the quote + var quote = code; + code = input.charCodeAt(++tokPos); + while(tokPos < inputLen && code !== quote) { + if (code === 92) { // '\' + code = input.charCodeAt(++tokPos); + if (code !== quote) continue; + } + code = input.charCodeAt(++tokPos); + } + } code = input.charCodeAt(++tokPos); } return preprocessFinishToken(_preprocessParamItem, input.slice(preTokStart, tokPos)); } - if (isIdentifierStart(code) || (code === 92 /* '\' */ && input.charCodeAt(tokPos +1) === 117 /* 'u' */)) return preprocessReadWord(); - if (getTokenFromCode(code, preprocessFinishToken, true) === false) { + if (isIdentifierStart(code) || (code === 92 /* '\' */ && input.charCodeAt(tokPos +1) === 117 /* 'u' */)) return preprocessReadWord(processMacros); + if (getTokenFromCode(code, skipComments ? preprocessFinishTokenSkipComments : preprocessFinishToken, true) === false) { // Allow _eol token // If we are here, we either found a non-ASCII identifier // character, or something that's entirely disallowed. var ch = String.fromCharCode(code); - if (ch === "\\" || nonASCIIidentifierStart.test(ch)) return preprocessReadWord(); + if (ch === "\\" || nonASCIIidentifierStart.test(ch)) return preprocessReadWord(processMacros); raise(tokPos, "Unexpected character '" + ch + "'"); } } - function preprocessReadWord() { + function preprocessReadWord(processMacros) { var word = readWord1(); - preprocessFinishToken(isKeywordPreprocess(word) ? keywordTypesPreprocess[word] : _name, word); + var type = _name; + if (processMacros && options.preprocess) { + var readMacroWordReturn = readMacroWord(word, preprocessNext); + if (readMacroWordReturn === true) + return true; + } + + if (!containsEsc && isKeywordPreprocessor(word)) type = keywordTypesPreprocessor[word]; + preprocessFinishToken(type, word, readMacroWordReturn); // If readMacroWord returns anything except 'true' it is the real tokEndPos } - function preprocessFinishToken(type, val) { + function preprocessFinishToken(type, val, overrideTokEnd, skipEOL) { + preTokType = type; + preTokVal = val; + preTokEnd = overrideTokEnd || tokPos; + //tokRegexpAllowed = type.beforeExpr; + preprocessSkipSpace(false, skipEOL); // Dont skip comments + } + +// FIXME: Find out if this is really used? + function preprocessFinishTokenSkipComments(type, val) { preTokType = type; preTokVal = val; preTokEnd = tokPos; - preprocessSkipSpace(); + preprocessSkipSpace(true); // 'true' for skip comments } // Continue to the next token. - function preprocessNext() { - preLastStart = tokStart; - preLastEnd = tokEnd; - //lastEndLoc = tokEndLoc; - return preprocessReadToken(); + function preprocessNext(stealth, onlyTransformArguments, forceRegexp, processMacros) { + if (!stealth) { + preLastStart = tokStart; + preLastEnd = tokEnd; + } + return preprocessReadToken(false, false, processMacros); } // Predicate that tests whether the next token is of the given // type, and if yes, consumes it as a side effect. - function preprocessEat(type) { + function preprocessEat(type, processMacros) { if (preTokType === type) { - preprocessNext(); + preprocessNext(false, false, null, processMacros); return true; } } @@ -1269,35 +1681,40 @@ var preIfLevel = 0; // Expect a token of a given type. If found, consume it, otherwise, // raise with errorMessage or an unexpected token error. - function preprocessExpect(type, errorMessage) { - if (preTokType === type) preprocessReadToken(); + function preprocessExpect(type, errorMessage, processMacros) { + if (preTokType === type) preprocessReadToken(processMacros); else raise(preTokStart, errorMessage || "Unexpected token"); } - function preprocessGetIdent() { - var ident = preTokType === _name ? preTokVal : ((!options.forbidReserved || preTokType.okAsIdent) && preTokType.keyword) || raise(preTokStart, "Expected Macro identifier"); - preprocessNext(); + function debug() { + // debugger; + } + function preprocessGetIdent(processMacros) { + var ident = preTokType === _name ? preTokVal : ((!options.forbidReserved || preTokType.okAsIdent) && preTokType.keyword) || debug(); //raise(preTokStart, "Expected Macro identifier"); + //tokRegexpAllowed = false; + preprocessNext(false, false, null, processMacros); return ident; } - function preprocessParseIdent() { + function preprocessParseIdent(processMacros) { var node = startNode(); - node.name = preprocessGetIdent(); + node.name = preprocessGetIdent(processMacros); return preprocessFinishNode(node, "Identifier"); } // Parse an expression — either a single token that is an // expression, an expression started by a keyword like `defined`, // or an expression wrapped in punctuation like `()`. + // When `processMacros` is true any macros will we transformed to its definition - function preprocessParseExpression() { - return preprocessParseExprOps(); + function preprocessParseExpression(processMacros) { + return preprocessParseExprOps(processMacros); } // Start the precedence parser. - function preprocessParseExprOps() { - return preprocessParseExprOp(preprocessParseMaybeUnary(), -1); + function preprocessParseExprOps(processMacros) { + return preprocessParseExprOp(preprocessParseMaybeUnary(processMacros), -1, processMacros); } // Parse binary operators with the operator precedence parsing @@ -1306,7 +1723,7 @@ var preIfLevel = 0; // defer further parser to one of its callers when it encounters an // operator that has a lower precedence than the set it is parsing. - function preprocessParseExprOp(left, minPrec) { + function preprocessParseExprOp(left, minPrec, processMacros) { var prec = preTokType.binop; if (prec) { if (!preTokType.preprocess) raise(preTokStart, "Unsupported macro operator"); @@ -1314,10 +1731,10 @@ var preIfLevel = 0; var node = startNodeFrom(left); node.left = left; node.operator = preTokVal; - preprocessNext(); - node.right = preprocessParseExprOp(preprocessParseMaybeUnary(), prec); - var node = preprocessFinishNode(node, /*/&&|\|\|/.test(node.operator) ? "LogicalExpression" : */"BinaryExpression"); - return preprocessParseExprOp(node, minPrec); + preprocessNext(false, false, null, processMacros); + node.right = preprocessParseExprOp(preprocessParseMaybeUnary(processMacros), prec, processMacros); + var node = preprocessFinishNode(node, /&&|\|\|/.test(node.operator) ? "LogicalExpression" : "BinaryExpression"); + return preprocessParseExprOp(node, minPrec, processMacros); } } return left; @@ -1325,43 +1742,43 @@ var preIfLevel = 0; // Parse an unary expression if possible - function preprocessParseMaybeUnary() { + function preprocessParseMaybeUnary(processMacros) { if (preTokType.preprocess && preTokType.prefix) { var node = startNode(); - node.operator = tokVal; + node.operator = preTokVal; node.prefix = true; - preprocessNext(); - node.argument = preprocessParseMaybeUnary(); + preprocessNext(false, false, null, processMacros); + node.argument = preprocessParseMaybeUnary(processMacros); return preprocessFinishNode(node, "UnaryExpression"); } - return preprocessParseExprAtom(); + return preprocessParseExprAtom(processMacros); } // Parse an atomic macro expression — either a single token that is an // expression, an expression started by a keyword like `defined`, // or an expression wrapped in punctuation like `()`. - function preprocessParseExprAtom() { + function preprocessParseExprAtom(processMacros) { switch (preTokType) { case _name: - return preprocessParseIdent(); + return preprocessParseIdent(processMacros); case _num: case _string: - return preprocessParseStringNumLiteral(); + return preprocessParseStringNumLiteral(processMacros); case _parenL: var tokStart1 = preTokStart; - preprocessNext(); - var val = preprocessParseExpression(); + preprocessNext(false, false, null, processMacros); + var val = preprocessParseExpression(processMacros); val.start = tokStart1; val.end = preTokEnd; - preprocessExpect(_parenR, "Expected closing ')' in macro expression"); + preprocessExpect(_parenR, "Expected closing ')' in macro expression", processMacros); return val; case _preDefined: var node = startNode(); - preprocessNext(); - node.id = preprocessParseIdent(); + preprocessNext(false, false, null, processMacros); + node.object = preprocessParseDefinedExpression(processMacros); return preprocessFinishNode(node, "DefinedExpression"); default: @@ -1369,11 +1786,36 @@ var preIfLevel = 0; } } - function preprocessParseStringNumLiteral() { + // Parse an 'Defined' macro expression — either a single token that is an + // identifier, number, string or an expression wrapped in punctuation like `()`. + + function preprocessParseDefinedExpression(processMacros) { + switch (preTokType) { + case _name: + return preprocessParseIdent(processMacros); + + case _num: case _string: + return preprocessParseStringNumLiteral(processMacros); + + case _parenL: + var tokStart1 = preTokStart; + preprocessNext(false, false, null, processMacros); + var val = preprocessParseDefinedExpression(processMacros); + val.start = tokStart1; + val.end = preTokEnd; + preprocessExpect(_parenR, "Expected closing ')' in macro expression", processMacros); + return val; + + default: + unexpected(); + } + } + + function preprocessParseStringNumLiteral(processMacros) { var node = startNode(); node.value = preTokVal; node.raw = preTokInput.slice(preTokStart, preTokEnd); - preprocessNext(); + preprocessNext(false, false, null, processMacros); return preprocessFinishNode(node, "Literal"); } @@ -1383,20 +1825,26 @@ var preIfLevel = 0; return node; } - function readToken(forceRegexp) { - tokStart = tokPos; - tokInput = input; - if (options.locations) tokStartLoc = new line_loc_t; + function readToken(forceRegexp, onlyTransformMacroArguments, stealth) { tokCommentsBefore = tokComments; tokSpacesBefore = tokSpaces; + if (!forceRegexp) tokStart = tokPos; + else tokPos = tokStart + 1; + if (!stealth) { + tokFirstStart = tokStart; + tokFirstInput = input; + } + tokInput = input; + tokMacroOffset = tokPosMacroOffset; + preTokParameterScope = preprocessParameterScope; + if (options.locations) tokStartLoc = new line_loc_t; if (forceRegexp) return readRegexp(); - if (tokPos >= inputLen) - return finishToken(_eof); + if (tokPos >= inputLen) return finishToken(_eof); var code = input.charCodeAt(tokPos); // Identifier or keyword. '\uXXXX' sequences are allowed in // identifiers, so '\' also dispatches to that. - if (isIdentifierStart(code) || code === 92 /* '\' */) return readWord(); + if (isIdentifierStart(code) || code === 92 /* '\' */) return readWord(null, onlyTransformMacroArguments, forceRegexp); var tok = getTokenFromCode(code, finishToken); @@ -1404,16 +1852,16 @@ var preIfLevel = 0; // If we are here, we either found a non-ASCII identifier // character, or something that's entirely disallowed. var ch = String.fromCharCode(code); - if (ch === "\\" || nonASCIIidentifierStart.test(ch)) return readWord(); + if (ch === "\\" || nonASCIIidentifierStart.test(ch)) return readWord(null, onlyTransformMacroArguments, forceRegexp); raise(tokPos, "Unexpected character '" + ch + "'"); } return tok; } - function finishOp(type, size, finishToken) { + function finishOp(type, size, finisher) { var str = input.slice(tokPos, tokPos + size); tokPos += size; - finishToken(type, str); + finisher(type, str); } // Parse a regular expression. Some context-awareness is necessary, @@ -1463,17 +1911,17 @@ var preIfLevel = 0; return total; } - function readHexNumber(finishToken) { + function readHexNumber(finisher) { tokPos += 2; // 0x var val = readInt(16); if (val == null) raise(tokStart + 2, "Expected hexadecimal number"); if (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, "Identifier directly after number"); - return finishToken(_num, val); + return finisher(_num, val); } // Read an integer, octal integer, or floating-point number. - function readNumber(startsWithDot, finishToken) { + function readNumber(startsWithDot, finisher) { var start = tokPos, isFloat = false, octal = input.charCodeAt(tokPos) === 48; if (!startsWithDot && readInt(10) === null) raise(start, "Invalid number"); if (input.charCodeAt(tokPos) === 46) { @@ -1485,7 +1933,7 @@ var preIfLevel = 0; if (next === 69 || next === 101) { // 'eE' next = input.charCodeAt(++tokPos); if (next === 43 || next === 45) ++tokPos; // '+-' - if (readInt(10) === null) raise(start, "Invalid number") + if (readInt(10) === null) raise(start, "Invalid number"); isFloat = true; } if (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, "Identifier directly after number"); @@ -1495,22 +1943,20 @@ var preIfLevel = 0; else if (!octal || str.length === 1) val = parseInt(str, 10); else if (/[89]/.test(str) || strict) raise(start, "Invalid number"); else val = parseInt(str, 8); - return finishToken(_num, val); + return finisher(_num, val); } // Read a string value, interpreting backslash-escapes. - var rs_str = []; - - function readString(quote, finishToken) { + function readString(quote, finisher) { tokPos++; - rs_str.length = 0; + var out = ""; for (;;) { if (tokPos >= inputLen) raise(tokStart, "Unterminated string constant"); var ch = input.charCodeAt(tokPos); if (ch === quote) { ++tokPos; - return finishToken(_string, String.fromCharCode.apply(null, rs_str)); + return finisher(_string, out); } if (ch === 92) { // '\' ch = input.charCodeAt(++tokPos); @@ -1521,30 +1967,30 @@ var preIfLevel = 0; ++tokPos; if (octal) { if (strict) raise(tokPos - 2, "Octal literal in strict mode"); - rs_str.push(parseInt(octal, 8)); + out += String.fromCharCode(parseInt(octal, 8)); tokPos += octal.length - 1; } else { switch (ch) { - case 110: rs_str.push(10); break; // 'n' -> '\n' - case 114: rs_str.push(13); break; // 'r' -> '\r' - case 120: rs_str.push(readHexChar(2)); break; // 'x' - case 117: rs_str.push(readHexChar(4)); break; // 'u' - case 85: rs_str.push(readHexChar(8)); break; // 'U' - case 116: rs_str.push(9); break; // 't' -> '\t' - case 98: rs_str.push(8); break; // 'b' -> '\b' - case 118: rs_str.push(11); break; // 'v' -> '\u000b' - case 102: rs_str.push(12); break; // 'f' -> '\f' - case 48: rs_str.push(0); break; // 0 -> '\0' + case 110: out += "\n"; break; // 'n' -> '\n' + case 114: out += "\r"; break; // 'r' -> '\r' + case 120: out += String.fromCharCode(readHexChar(2)); break; // 'x' + case 117: out += String.fromCharCode(readHexChar(4)); break; // 'u' + case 85: out += String.fromCharCode(readHexChar(8)); break; // 'U' + case 116: out += "\t"; break; // 't' -> '\t' + case 98: out += "\b"; break; // 'b' -> '\b' + case 118: out += "\u000b"; break; // 'v' -> '\u000b' + case 102: out += "\f"; break; // 'f' -> '\f' + case 48: out += "\0"; break; // 0 -> '\0' case 13: if (input.charCodeAt(tokPos) === 10) ++tokPos; // '\r\n' case 10: // ' \n' if (options.locations) { tokLineStart = tokPos; ++tokCurLine; } break; - default: rs_str.push(ch); break; + default: out += String.fromCharCode(ch); break; } } } else { - if (ch === 13 || ch === 10 || ch === 8232 || ch === 8329) raise(tokStart, "Unterminated string constant"); - rs_str.push(ch); // '\' + if (ch === 13 || ch === 10 || ch === 8232 || ch === 8233) raise(tokStart, "Unterminated string constant"); + out += String.fromCharCode(ch); // '\' ++tokPos; } } @@ -1602,63 +2048,13 @@ var preIfLevel = 0; // words when necessary. Argument preReadWord is used to concatenate // The word is then passed in from caller. - function readWord(preReadWord) { + function readWord(preReadWord, onlyTransformMacroArguments, forceRegexp) { var word = preReadWord || readWord1(); var type = _name; - var reservedError; if (options.preprocess) { - var macro; - var i = preprocessStack.length; - if (i > 0) { - var lastItem = preprocessStack[i - 1]; - // If the current macro has parameters check if this word is one of them and should be translated - if (lastItem.parameterDict && lastItem.macro.isParameterFunction()(word)) { - macro = lastItem.parameterDict[word]; - } - } - // Does the word match agains any of the know macro names - if (!macro && options.preprocessIsMacro(word)) - macro = options.preprocessGetMacro(word); - if (macro) { - var macroStart = tokStart; - var parameters; - var hasParameters = macro.parameters; - var nextIsParenL; - if (hasParameters) - nextIsParenL = tokPos < inputLen && input.charCodeAt(tokPos) === 40; // '(' - if (!hasParameters || nextIsParenL) { - // Now we know that we have a matching macro. Get parameters if needed - var macroString = macro.macro; - var lastTokPos = tokPos; - if (nextIsParenL) { - var first = true; - var noParams = 0; - parameters = Object.create(null); - preprocessReadToken(); - preprocessMacroParamterListMode = true; - preprocessExpect(_parenL); - lastTokPos = tokPos; - while (!preprocessEat(_parenR)) { - if (!first) preprocessExpect(_comma, "Expected ',' between macro parameters"); else first = false; - var ident = hasParameters[noParams++]; - var val = preTokVal; - preprocessExpect(_preprocessParamItem); - parameters[ident] = new Macro(ident, val); - lastTokPos = tokPos; - } - preprocessMacroParamterListMode = false; - } - // If the macro defines anything add it to the preprocess input stack - if (macroString) { - preprocessStack.push({macro: macro, parameterDict: parameters, start: macroStart, end:lastTokPos, input: input, inputLen: inputLen, lastStart: tokStart, lastEnd: lastTokPos}); - input = macroString; - inputLen = macroString.length; - tokPos = 0; - } - // Now read the next token - return next(); - } - } + var readMacroWordReturn = readMacroWord(word, next, onlyTransformMacroArguments, forceRegexp); + if (readMacroWordReturn === true) + return true; } if (!containsEsc) { @@ -1669,18 +2065,273 @@ var preIfLevel = 0; strict && isStrictReservedWord(word)) raise(tokStart, "The keyword '" + word + "' is reserved"); } - return finishToken(type, word); + return finishToken(type, word, readMacroWordReturn); // If readMacroWord returns anything except 'true' it is the real tokEndPos } - function Macro(ident, macro, parameters) { + // If the word is a macro return true as the token is already finished. If not just return 'undefined'. + + function readMacroWord(word, nextFinisher, onlyTransformArguments, forceRegexp) { + var macro, + lastStackItem = preprocessStackLastItem, + oldParameterScope = preprocessParameterScope; + if (lastStackItem) { + var scope = preTokParameterScope || preprocessStackLastItem; + // If the current macro has parameters check if this word is one of them and should be translated + if (scope.parameterDict && scope.macro.isParameterFunction()(word)) { + macro = scope.parameterDict[word]; + // If it is a variadic macro and we can't find anything in the variadic parameter just get next token + if (!macro && scope.macro.variadicName === word) { + // Don't do this if we are stringifying or concatenating as we then want an empty string + if (preConcatenating) { + finishToken(_name, ""); + return true; + } else { + onlySkipSpace(); + nextFinisher(true, onlyTransformArguments, forceRegexp, true); // Stealth and Preprocess macros. + } + return true; + } + // Lets look ahead to find out if we find a '##' for token concatenate + // We don't want to prescan spaces across macro boundary as the macro stack will fall apart + // So we do a special prescan if we have to cross a boundary all in the name of speed + if (onlySkipSpace(true, true)) { // don't skip EOL and don't skip macro boundary. + if (preprocessPrescanFor(35, 35)) // Prescan across boundary for '##' as we crossed a boundary + onlyTransformArguments = 2; + } else if (input.charCodeAt(tokPos) === 35 && input.charCodeAt(tokPos + 1) === 35) { // '##' + onlyTransformArguments = 2; + } + preprocessParameterScope = macro && macro.parameterScope; + onlyTransformArguments--; + } + } + // Does the word match against any of the known macro names + // Don't match if: + // 1. We already has found a argument macro + // 2. We are doing concatenating. Here it is only valid for the last token. + if (!macro && (!onlyTransformArguments && !preprocessOnlyTransformArgumentsForLastToken || tokPos < inputLen) && options.preprocessIsMacro(word)) { + preprocessParameterScope = null; + macro = options.preprocessGetMacro(word); + if (macro) { + // Check if this macro is already referenced by looking in the stack + // Don't do it if the input in the stack is an argument. We want to simulate 'expand arguments first' + if (!preprocessStackLastItem || !preprocessStackLastItem.macro.isArgument) { + var i = preprocessStack.length, + lastMacroItem; + while (i > 0) { + var item = preprocessStack[--i], + macroItem = item.macro; + if (macroItem.identifier === word && !(lastMacroItem && lastMacroItem.isArgument)) { + macro = null; + } + lastMacroItem = macroItem; + } + } + } else { + macro = preprocessBuiltinMacro(word); + } + } + if (macro) { + var macroStart = tokStart; + var parameters; + var hasParameters = macro.parameters; + var nextIsParenL; + if (hasParameters) { + // Ok, we should have parameters for the macro. Lets look ahead to find out if we find a '(' + // First save current position and loc for tokEndPos + var pos = tokPos; + var loc; + if (options.locations) loc = new line_loc_t; + if ((onlySkipSpace(true, true) && preprocessPrescanFor(40)) || input.charCodeAt(tokPos) === 40) { // '(' + nextIsParenL = true; + } else { + // We didn't find a '(' so don't transform to the macro. Return the real tokEndPos so we get correct token end values. + preprocessOverrideTokEndLoc = loc; + return pos; + } + } + if (!hasParameters || nextIsParenL) { + // Now we know that we have a matching macro. Get parameters if needed + var macroString = macro.macro; + //var lastTokPos = tokPos; + if (nextIsParenL) { + var variadicName = macro.variadicName; + var first = true; + var noParams = 0; + parameters = Object.create(null); + onlySkipSpace(true); + //preprocessReadToken(); + //preprocessMacroParameterListMode = true; + //preprocessExpect(_parenL); + //lastTokPos = tokPos; + if (input.charCodeAt(tokPos++) !== 40) raise(tokPos - 1, "Expected '(' before macro prarameters"); + onlySkipSpace(true, true, true); + var code = input.charCodeAt(tokPos++); + while (tokPos < inputLen && code !== 41) { + if (first) + first = false; + else + if (code === 44) { // ',' + onlySkipSpace(true, true, true); + code = input.charCodeAt(tokPos++); + } else + raise(tokPos - 1, "Expected ',' between macro parameters"); + var ident = hasParameters[noParams++]; + var variadicAndLastParameter = variadicName && hasParameters.length === noParams; + var paramStart = tokPos - 1, parenLevel = 0; + // Calculate current line and current line start. + var positionOffset = options.locations && new PositionOffset(tokCurLine, tokLineStart); + // When parsing a macro parameter list parentheses within each argument must balance + // If it is variadic and we are on the last paramter collect all the rest of the parameters + while(tokPos < inputLen && (parenLevel || (code !== 41 && (code !== 44 || variadicAndLastParameter)))) { // ')', ',' + if (code === 40) // '(' + parenLevel++; + if (code === 41) // ')' + parenLevel--; + if (code === 34 || code === 39) {// '"' "'" We have a quote so go all the way to the end of the quote + var quote = code; + code = input.charCodeAt(tokPos++); + while(tokPos < inputLen && code !== quote) { + if (code === 92) { // '\' + code = input.charCodeAt(tokPos++); + if (code !== quote) continue; + } + code = input.charCodeAt(tokPos++); + } + } + code = input.charCodeAt(tokPos++); + } + var val = input.slice(paramStart, tokPos - 1); + //var val = preTokType === _preprocessParamItem ? preTokVal : ""; + parameters[ident] = new Macro(ident, val, null, paramStart + tokMacroOffset, true, preTokParameterScope || preprocessStackLastItem, false, positionOffset); // true = 'Is argument', false = 'Not varadic' + } + if (code !== 41) raise(tokPos, "Expected ')' after macro prarameters"); + onlySkipSpace(true, true); // Don't skip EOL and don't skip macro boundary + //preprocessMacroParameterListMode = false; + //preprocessExpect(_parenR); + } + // If the macro defines anything add it to the preprocess input stack + return readTokenFromMacro(macro, tokPosMacroOffset, parameters, oldParameterScope, tokPos, nextFinisher, onlyTransformArguments, forceRegexp); + } + } + } + + // Here we pre scan for first and second character. + // The first thing should be to skip spaces and comments + // Return true if the first characters after spaces are first and second + // This is very simular to the function onlySkipSpace. Maybe the same + // function can be used with some refactoring? + function preprocessPrescanFor(first, second) { + var i = preprocessStack.length; + stackloop: + while (i-- > 0) { + var stackItem = preprocessStack[i], + scanPos = stackItem.end, + scanInput = stackItem.input, + scanInputLen = stackItem.inputLen; + + for(;;) { + var ch = scanInput.charCodeAt(scanPos); + if (ch === 32) { // ' ' + ++scanPos; + } else if (ch === 13) { + ++scanPos; + var next = scanInput.charCodeAt(scanPos); + if (next === 10) { + ++scanPos; + } + } else if (ch === 10) { + ++scanPos; + } else if (ch === 9) { + ++scanPos; + } else if (ch === 47) { // '/' + var next = scanInput.charCodeAt(scanPos+1); + if (next === 42) { // '*' + var end = scanInput.indexOf("*/", scanPos += 2); + if (end === -1) raise(scanPos - 2, "Unterminated comment"); + scanPos = end + 2; + } else if (next === 47) { // '/' + ch = scanInput.charCodeAt(scanPos += 2); + while (scanPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) { + ++scanPos; + ch = scanInput.charCodeAt(scanPos); + } + } else break stackloop; + } else if (ch === 160 || ch === 11 || ch === 12 || (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch)))) { // '\xa0', VT, FF, Unicode whitespaces + ++scanPos; + } else if (scanPos >= scanInputLen) { + continue stackloop; + } else if (ch === 92) { // '\' + // Check if we have an escaped newline. We are using a relaxed treatment of escaped newlines like gcc. + // We allow spaces, horizontal and vertical tabs, and form feeds between the backslash and the subsequent newline + var pos = scanPos + 1; + ch = scanInput.charCodeAt(pos); + while (pos < scanInputLen && (ch === 32 || ch === 9 || ch === 11 || ch === 12 || (ch >= 5760 && nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch))))) + ch = scanInput.charCodeAt(++pos); + lineBreak.lastIndex = 0; + var match = lineBreak.exec(scanInput.slice(pos, pos + 2)); + if (match && match.index === 0) { + scanPos = pos + match[0].length; + } else { + break stackloop; + } + } else { + break stackloop; + } + } + } + return scanInput.charCodeAt(scanPos) === first && (second == null || scanInput.charCodeAt(scanPos + 1) === second); + } + + // Push macro to stack and start read from it. + // Just read next token if the macro is empty + function readTokenFromMacro(macro, macroOffset, parameters, parameterScope, end, nextFinisher, onlyTransformArguments, forceRegexp) { + var macroString = macro.macro; + // If we are evaluation a macro expresion an empty macro definition means true or '1' + if(!macroString && nextFinisher === preprocessNext) macroString = "1"; + if (macroString) { + preprocessStackLastItem = {macro: macro, macroOffset: macroOffset, parameterDict: parameters, /*start: macroStart,*/ end:end, inputLen: inputLen, tokStart: tokStart, onlyTransformArgumentsForLastToken: preprocessOnlyTransformArgumentsForLastToken, currentLine: tokCurLine, currentLineStart: tokLineStart/*, lastStart: lastStart, lastEnd: lastEnd*/}; + if (parameterScope) preprocessStackLastItem.parameterScope = parameterScope; + preprocessStackLastItem.input = input; + preprocessStack.push(preprocessStackLastItem); + preprocessOnlyTransformArgumentsForLastToken = onlyTransformArguments; + input = macroString; + inputLen = macroString.length; + tokPosMacroOffset = macro.start; + tokPos = 0; + tokCurLine = 0; + tokLineStart = 0; + } else if (preConcatenating) { + // If we are concatenating or stringifying and the macro is empty just make an empty string. + finishToken(_name, ""); + return true; + } + // Now read the next token + onlySkipSpace(); + nextFinisher(true, onlyTransformArguments, forceRegexp, true); // Stealth and Preprocess macros + return true; + } + + // ident is the identifier name for the macro + // macro is the macro string + // parameters is an array with the parameters for the macro + // start is the offset to where the macro is defined + // isArgument is true if the macro is a parameter + // parameterScope is the parameter scope + // varadicName is the name of the varadic parameter if it is a varadic macro + // locationOffset is the current line that the macro starts at and the position on the line + var Macro = exports.Macro = function Macro(ident, macro, parameters, start, isArgument, parameterScope, variadicName, locationOffset) { this.identifier = ident; - if (macro) this.macro = macro; + if (macro != null) this.macro = macro; if (parameters) this.parameters = parameters; + if (start != null) this.start = start; + if (isArgument) this.isArgument = true; + if (parameterScope) this.parameterScope = parameterScope; + if (variadicName) this.variadicName = variadicName; + if (locationOffset) this.locationOffset = locationOffset; } Macro.prototype.isParameterFunction = function() { - var y = (this.parameters || []).join(" "); - return this.isParameterFunctionVar || (this.isParameterFunctionVar = makePredicate(y)); + return this.isParameterFunctionVar || (this.isParameterFunctionVar = makePredicate((this.parameters || []).join(" "))); } // ## Parser @@ -1706,13 +2357,18 @@ var preIfLevel = 0; // ### Parser utilities // Continue to the next token. + // Stealth is to preserve lastEnd etc to get correct end positions on nodes when the + // preprocessor needs to drop one token and read next - function next() { - lastStart = tokStart; - lastEnd = tokEnd; - lastEndLoc = tokEndLoc; + function next(stealth, onlyTransformArguments, forceRegexp) { + if (!stealth) { + lastStart = tokStart; + lastEnd = tokEnd; + lastEndLoc = tokEndLoc; + lastTokMacroOffset = tokMacroOffset; + } nodeMessageSendObjectExpression = null; - return readToken(); + readToken(forceRegexp, onlyTransformArguments, stealth); } // Enter strict mode. Re-reads the next token to please pedantic @@ -1721,6 +2377,10 @@ var preIfLevel = 0; function setStrict(strct) { strict = strct; tokPos = lastEnd; + while (tokPos < tokLineStart) { + tokLineStart = input.lastIndexOf("\n", tokLineStart - 2) + 1; + --tokCurLine; + } skipSpace(); readToken(); } @@ -1730,7 +2390,7 @@ var preIfLevel = 0; function node_t() { this.type = null; - this.start = tokStart; + this.start = tokStart + tokMacroOffset; this.end = null; } @@ -1795,12 +2455,13 @@ var preIfLevel = 0; var lastFinishedNode; function finishNode(node, type) { + var nodeEnd = lastEnd + lastTokMacroOffset; node.type = type; - node.end = lastEnd; + node.end = nodeEnd; if (options.trackComments) { if (lastTokCommentsAfter) { node.commentsAfter = lastTokCommentsAfter; - tokCommentsAfter = null; + lastTokCommentsAfter = null; } else if (lastFinishedNode && lastFinishedNode.end === lastEnd && lastFinishedNode.commentsAfter) { node.commentsAfter = lastFinishedNode.commentsAfter; @@ -1823,7 +2484,7 @@ var preIfLevel = 0; if (options.locations) node.loc.end = lastEndLoc; if (options.ranges) - node.range[1] = lastEnd; + node.range[1] = nodeEnd; return node; } @@ -1848,7 +2509,7 @@ var preIfLevel = 0; function canInsertSemicolon() { return !options.strictSemicolons && - (tokType === _eof || tokType === _braceR || newline.test(tokInput.slice(lastEnd, tokStart)) || + (tokType === _eof || tokType === _braceR || newline.test(tokFirstInput.slice(lastEnd, tokFirstStart)) || (nodeMessageSendObjectExpression && options.objj)); } @@ -1918,7 +2579,7 @@ var preIfLevel = 0; // does not help. function parseStatement() { - if (tokType === _slash) + if (tokType === _slash || tokType === _assign && tokVal == "/=") readToken(true); var starttype = tokType, node = startNode(); @@ -2065,8 +2726,8 @@ var preIfLevel = 0; case _try: next(); node.block = parseBlock(); - node.handlers = []; - while (tokType === _catch) { + node.handler = null; + if (tokType === _catch) { var clause = startNode(); next(); expect(_parenL, "Expected '(' after 'catch'"); @@ -2076,10 +2737,11 @@ var preIfLevel = 0; expect(_parenR, "Expected closing ')' after catch"); clause.guard = null; clause.body = parseBlock(); - node.handlers.push(finishNode(clause, "CatchClause")); + node.handler = finishNode(clause, "CatchClause"); } + node.guardedHandlers = empty; node.finalizer = eat(_finally) ? parseBlock() : null; - if (!node.handlers.length && !node.finalizer) + if (!node.handler && !node.finalizer) raise(node.start, "Missing catch or finally clause"); return finishNode(node, "TryStatement"); @@ -2111,7 +2773,7 @@ var preIfLevel = 0; next(); return finishNode(node, "EmptyStatement"); - // This is a Objective-J statement + // Objective-J case _interface: if (options.objj) { next(); @@ -2152,7 +2814,7 @@ var preIfLevel = 0; } break; - // This is a Objective-J statement + // Objective-J case _implementation: if (options.objj) { next(); @@ -2176,19 +2838,6 @@ var preIfLevel = 0; } next(); } - if (tokVal === '<') { - next(); - var protocols = [], - first = true; - node.protocols = protocols; - while (tokVal !== '>') { - if (!first) - expect(_comma, "Expected ',' between protocol names"); - else first = false; - protocols.push(parseIdent(true)); - } - next(); - } if (eat(_braceL)) { node.ivardeclarations = []; for (;;) { @@ -2206,9 +2855,9 @@ var preIfLevel = 0; } break; - // This is a Objective-J statement + // Objective-J case _protocol: - // If next token is a left parenthesis it is a ProtocolLiternal expression so bail out + // If next token is a left parenthesis it is a ProtocolLiteral expression so bail out if (options.objj && input.charCodeAt(tokPos) !== 40) { // '(' next(); node.protocolname = parseIdent(true); @@ -2240,7 +2889,7 @@ var preIfLevel = 0; } break; - // This is a Objective-J statement + // Objective-J case _import: if (options.objj) { next(); @@ -2256,7 +2905,7 @@ var preIfLevel = 0; } break; - // This is a Objective-J statement + // Objective-J case _preprocess: if (options.objj) { next(); @@ -2264,7 +2913,7 @@ var preIfLevel = 0; } break; - // This is a Objective-J statement + // Objective-J case _class: if (options.objj) { next(); @@ -2273,7 +2922,7 @@ var preIfLevel = 0; } break; - // This is a Objective-J statement + // Objective-J case _global: if (options.objj) { next(); @@ -2290,7 +2939,6 @@ var preIfLevel = 0; return finishNode(node, "TypeDefStatement"); } break; - } // The indentation is one step to the right here to make sure it @@ -2331,7 +2979,6 @@ var preIfLevel = 0; if (outlet) decl.outlet = outlet; decl.ivartype = type; - // print("keyword: " + type.name + " is class " + type.typeisclass) decl.id = parseIdent(); if (strict && isStrictBadIdWord(decl.id.name)) raise(decl.id.start, "Binding " + decl.id.name + " in strict mode"); @@ -2470,11 +3117,11 @@ var preIfLevel = 0; while (!eat(_braceR)) { var stmt = parseStatement(); node.body.push(stmt); - if (first && isUseStrict(stmt)) { + if (first && allowStrict && isUseStrict(stmt)) { oldStrict = strict; setStrict(strict = true); } - first = false + first = false; } if (strict && !oldStrict) setStrict(false); return finishNode(node, "BlockStatement"); @@ -2582,7 +3229,7 @@ var preIfLevel = 0; // Start the precedence parser. function parseExprOps(noIn) { - return parseExprOp(parseMaybeUnary(noIn), -1, noIn); + return parseExprOp(parseMaybeUnary(), -1, noIn); } // Parse binary operators with the operator precedence parsing @@ -2599,7 +3246,7 @@ var preIfLevel = 0; node.left = left; node.operator = tokVal; next(); - node.right = parseExprOp(parseMaybeUnary(noIn), prec, noIn); + node.right = parseExprOp(parseMaybeUnary(), prec, noIn); var node = finishNode(node, /&&|\|\|/.test(node.operator) ? "LogicalExpression" : "BinaryExpression"); return parseExprOp(node, minPrec, noIn); } @@ -2609,13 +3256,14 @@ var preIfLevel = 0; // Parse unary operators, both prefix and postfix. - function parseMaybeUnary(noIn) { + function parseMaybeUnary() { if (tokType.prefix) { var node = startNode(), update = tokType.isUpdate; node.operator = tokVal; node.prefix = true; + tokRegexpAllowed = true; next(); - node.argument = parseMaybeUnary(noIn); + node.argument = parseMaybeUnary(); if (update) checkLVal(node.argument); else if (strict && node.operator === "delete" && node.argument.type === "Identifier") @@ -2697,17 +3345,17 @@ var preIfLevel = 0; return finishNode(node, "Literal"); case _parenL: - var tokStartLoc1 = tokStartLoc, tokStart1 = tokStart; + var tokStartLoc1 = tokStartLoc, macroOffset = tokMacroOffset, tokStart1 = tokStart + macroOffset; next(); var val = parseExpression(); val.start = tokStart1; - val.end = tokEnd; + val.end = tokEnd + macroOffset; if (options.locations) { val.loc.start = tokStartLoc1; val.loc.end = tokEndLoc; } if (options.ranges) - val.range = [tokStart1, tokEnd]; + val.range = [tokStart1, tokEnd + lastTokMacroOffset]; expect(_parenR, "Expected closing ')' in expression"); return val; @@ -2789,7 +3437,7 @@ var preIfLevel = 0; return finishNode(node, "Dereference"); default: - if(tokType.okAsIdent) + if (tokType.okAsIdent) return parseIdent(); unexpected(); @@ -2862,7 +3510,7 @@ var preIfLevel = 0; node.callee = parseSubscripts(parseExprAtom(false), true); if (eat(_parenL)) node.arguments = parseExprList(_parenR, tokType === _parenR ? null : parseExpression(true), false); - else node.arguments = []; + else node.arguments = empty; return finishNode(node, "NewExpression"); } @@ -3009,6 +3657,7 @@ var preIfLevel = 0; function parseIdent(liberal) { var node = startNode(); node.name = tokType === _name ? tokVal : (((liberal && !options.forbidReserved) || tokType.okAsIdent) && tokType.keyword) || unexpected(); + tokRegexpAllowed = false; next(); return finishNode(node, "Identifier"); } @@ -3029,11 +3678,12 @@ var preIfLevel = 0; // 'int' can be followed by an optinal 'long'. 'long' can be followed by an optional extra 'long' function parseObjectiveJType(startFrom) { - var node = startFrom ? startNodeFrom(startFrom) : startNode(); + var node = startFrom ? startNodeFrom(startFrom) : startNode(), allowProtocol = false; if (tokType === _name) { // It should be a class name node.name = tokVal; node.typeisclass = true; + allowProtocol = true; next(); } else { node.typeisclass = false; @@ -3041,59 +3691,65 @@ var preIfLevel = 0; // Do nothing more if it is 'void' if (!eat(_void)) { if (eat(_id)) { - // Is it 'id' followed by a '<' parse protocols. Do nothing more if it is only 'id' - if (tokVal === '<') { - var first = true, - protocols = []; - node.protocols = protocols; - do { - next(); - if (first) - first = false; - else - eat(_comma); - protocols.push(parseIdent(true)); - } while (tokVal !== '>'); - next(); - } + allowProtocol = true; } else { // Now check if it is some basic type or an approved combination of basic types var nextKeyWord; if (eat(_float) || eat(_boolean) || eat(_SEL) || eat(_double)) - nextKeyWord = tokType.keyword; + { + nextKeyWord = tokType.keyword; + } else { - if (eat(_signed) || eat(_unsigned)) - nextKeyWord = tokType.keyword || true; - if (eat(_char) || eat(_byte) || eat(_short)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; - } else { - if (eat(_int)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; - } - if (eat(_long)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; - if (eat(_long)) { - node.name += " " + nextKeyWord; - } - } - } - if (!nextKeyWord) { - // It must be a class name if it was not a basic type. // FIXME: This is not true - node.name = (!options.forbidReserved && tokType.keyword) || unexpected(); - node.typeisclass = true; - next(); - } + if (eat(_signed) || eat(_unsigned)) + nextKeyWord = tokType.keyword || true; + if (eat(_char) || eat(_byte) || eat(_short)) { + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + } else { + if (eat(_int)) { + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + } + if (eat(_long)) { + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + if (eat(_long)) { + node.name += " " + nextKeyWord; + } + } + } + if (!nextKeyWord) { + // It must be a class name if it was not a basic type. // FIXME: This is not true + node.name = (!options.forbidReserved && tokType.keyword) || unexpected(); + node.typeisclass = true; + allowProtocol = true; + next(); + } } } } } - return finishNode(node, "ObjectiveJType"); + if (allowProtocol) { + // Is it 'id' or classname followed by a '<' then parse protocols. + if (tokVal === '<') { + var first = true, + protocols = []; + node.protocols = protocols; + do { + next(); + if (first) + first = false; + else + eat(_comma); + protocols.push(parseIdent(true)); + } while (tokVal !== '>'); + next(); + } + } + return finishNode(node, "ObjectiveJType"); } -})(typeof exports === "undefined" ? (self.acorn = {}) : exports.acorn); +})(exports.acorn, exports.acorn.walk); diff --git a/Objective-J/acornwalk.js b/Objective-J/acornwalk.js index 8d5666529..456fec8a4 100644 --- a/Objective-J/acornwalk.js +++ b/Objective-J/acornwalk.js @@ -101,8 +101,7 @@ if (!exports.acorn) { }; exports.TryStatement = function(node, st, c) { c(node.block, st, "Statement"); - for (var i = 0; i < node.handlers.length; ++i) - c(node.handlers[i].body, st, "ScopeBody"); + if (node.handler) c(node.handler.body, st, "ScopeBody"); if (node.finalizer) c(node.finalizer, st, "Statement"); }; exports.WhileStatement = function(node, st, c) { @@ -267,10 +266,10 @@ if (!exports.acorn) { }, TryStatement: function(node, scope, c) { c(node.block, scope, "Statement"); - for (var i = 0; i < node.handlers.length; ++i) { - var handler = node.handlers[i], inner = makeScope(scope); - inner.vars[handler.param.name] = {type: "catch clause", node: handler.param}; - c(handler.body, inner, "ScopeBody"); + if (node.handler) { + var inner = makeScope(scope); + inner.vars[node.handler.param.name] = {type: "catch clause", node: node.handler.param}; + c(node.handler.body, inner, "ScopeBody"); } if (node.finalizer) c(node.finalizer, scope, "Statement"); }, diff --git a/README.markdown b/README.markdown index 87e7b9a50..eb1a3ef25 100644 --- a/README.markdown +++ b/README.markdown @@ -19,8 +19,11 @@ For more information, see . Follow [@cappuccino]( System Requirements ------------------- -To run Cappuccino applications, all you need is a web browser that understands -JavaScript. +To run Cappuccino applications, all you need is a HTML5 compliant web browser. + +To develop Cappuccino applications, all you need is a simple text editor and the starter package. + +However, Cappuccino's build system and the Xcode integration bring the eases of Cocoa development to web development. To build Cappuccino itself, please read below. More information is available here: [Getting and Building the Source](http://wiki.github.com/cappuccino/cappuccino/getting-and-building-the-source>). diff --git a/Rakefile b/Rakefile deleted file mode 100644 index ebd27ab18..000000000 --- a/Rakefile +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env ruby - -puts <<-eos - Building with rake is no longer supported, use "jake" instead. - - The commands are all the same (e.g. rake install -> jake install). - - If you do not have jake, you can run sudo ./bootstrap.sh to install jake and it's dependencies. - - PLEASE remove your Build folder ($CAPP_BUILD if it's set) when switching from rake to jake. -eos - -exit(1); diff --git a/Tests/AppKit/BundleTest/Info.plist b/Tests/AppKit/BundleTest/Info.plist new file mode 100644 index 000000000..bb4429725 --- /dev/null +++ b/Tests/AppKit/BundleTest/Info.plist @@ -0,0 +1,10 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + BundleTest + + diff --git a/Tests/AppKit/BundleTest/Resources/NSViewController.cib b/Tests/AppKit/BundleTest/Resources/NSViewController.cib new file mode 100644 index 000000000..45f5c8599 --- /dev/null +++ b/Tests/AppKit/BundleTest/Resources/NSViewController.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;19E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;20E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;18E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;21E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;22E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;24E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;25E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;26E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;27E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;27E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;28E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;29E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;2;30E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;2;31E;E;S;16;CPViewControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;viewS;13;CPApplicationd;1;0S;20;{{0, 0}, {480, 272}}d;2;12S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;NSViewS;6;CPViewE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/AppKit/BundleTest/Resources/NSViewController.xib b/Tests/AppKit/BundleTest/Resources/NSViewController.xib new file mode 100644 index 000000000..9a80f715c --- /dev/null +++ b/Tests/AppKit/BundleTest/Resources/NSViewController.xib @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Tests/AppKit/CPCollectionViewTest.j b/Tests/AppKit/CPCollectionViewTest.j index 2f73fd9e7..7f676150c 100644 --- a/Tests/AppKit/CPCollectionViewTest.j +++ b/Tests/AppKit/CPCollectionViewTest.j @@ -62,6 +62,49 @@ [self assert:[CPIndexSet indexSet] equals:[_collectionView selectionIndexes]]; } +- (void)_testCollectionViewItemIsSelected +{ + var itemPrototype = [[CPCollectionViewItem alloc] init]; + [_collectionView setItemPrototype:itemPrototype]; + [_collectionView setContent:[1, 2, 3]]; + + [_collectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:1]]; + [self assertTrue:[[_collectionView itemAtIndex:1] isSelected]]; + + [_collectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:0]]; + [self assertTrue:[[_collectionView itemAtIndex:0] isSelected]]; + // The item is correctly deselected when the selection indexes changes. + [self assertFalse:[[_collectionView itemAtIndex:1] isSelected]]; +} + +- (void)testBindingSupport +{ + var content = [1,2,3]; + var ac = [[CPArrayController alloc] initWithContent:content]; + [ac setSelectsInsertedObjects:YES]; + [_collectionView bind:CPContentBinding toObject:ac withKeyPath:@"arrangedObjects" options:nil]; + [_collectionView bind:CPSelectionIndexesBinding toObject:ac withKeyPath:@"selectionIndexes" options:nil]; + + [self assert:[1,2,3] equals:[_collectionView content]]; + + [ac setContent:[6,7]]; + [self assert:[6,7] equals:[_collectionView content]]; + + [ac setSelectionIndexes:[CPIndexSet indexSetWithIndex:1]]; + [self assert:[CPIndexSet indexSetWithIndex:1] equals:[_collectionView selectionIndexes]]; + + [ac insertObject:4 atArrangedObjectIndex:2]; + [self assert:[CPIndexSet indexSetWithIndex:2] equals:[_collectionView selectionIndexes]]; + + // collection view selection is reflected on the array controller selection + [_collectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:0]]; + [self assert:[CPIndexSet indexSetWithIndex:0] equals:[ac selectionIndexes]]; + + // collection view content is reflected on the array controller content + //[_collectionView setContent:[8,9]]; + //[self assert:[8,9] equals:[ac content]]; +} + - (void)testSetContentAndSelectionIndexes { // Changing the content does not automatically clear the selection indexes. The previous diff --git a/Tests/AppKit/CPPopUpButtonTest.j b/Tests/AppKit/CPPopUpButtonTest.j index a66ec0088..d18db9bb2 100644 --- a/Tests/AppKit/CPPopUpButtonTest.j +++ b/Tests/AppKit/CPPopUpButtonTest.j @@ -324,6 +324,36 @@ [self assert:2 equals:[[self button] indexOfSelectedItem]]; } +- (void)testSimpleObjectBindingArrayControllerWithLateContent +{ + var arrayController = [[CPArrayController alloc] init], + objectController = [[CPObjectController alloc] init], + testObject = [CPMutableDictionary dictionary], + martin = [CPDictionary dictionaryWithJSObject:{@"name": @"Martin"}], + malte = [CPDictionary dictionaryWithJSObject:{@"name": @"Malte"}], + johan = [CPDictionary dictionaryWithJSObject:{@"name": @"Johan"}], + menuObjects = [martin, malte, johan]; + + [testObject setObject:@"I'm a testObject" forKey:@"Who am I"]; + [objectController setContent:testObject]; + + [button bind:CPContentBinding toObject:arrayController withKeyPath:@"arrangedObjects" options:nil]; + [button bind:CPContentValuesBinding toObject:arrayController withKeyPath:@"arrangedObjects.name" options:nil]; + [button bind:CPSelectedObjectBinding toObject:objectController withKeyPath:@"selection.xxx" options:nil]; + + [testObject setObject:martin forKey:@"xxx"]; + [arrayController setContent:menuObjects]; + [self assert:0 equals:[[self button] indexOfSelectedItem]]; + [arrayController setContent:nil]; + [testObject setObject:malte forKey:@"xxx"]; + [arrayController setContent:menuObjects]; + [self assert:1 equals:[[self button] indexOfSelectedItem]]; + [arrayController setContent:nil]; + [testObject setObject:johan forKey:@"xxx"]; + [arrayController setContent:menuObjects]; + [self assert:2 equals:[[self button] indexOfSelectedItem]]; +} + - (void)testObjectBindingNullPlaceholderOption { var arrayController = [[CPArrayController alloc] init], diff --git a/Tests/AppKit/CPPredicateEditorTest.j b/Tests/AppKit/CPPredicateEditorTest.j index 32f040cc5..02d39a5fa 100644 --- a/Tests/AppKit/CPPredicateEditorTest.j +++ b/Tests/AppKit/CPPredicateEditorTest.j @@ -57,4 +57,31 @@ } } +- (void)testObjectValueWithRightWildcard +{ + [self _testAttribute:CPDateAttributeType value:[CPDate date]]; + [self _testAttribute:CPInteger16AttributeType value:2.0]; + [self _testAttribute:CPDoubleAttributeType value:2.5]; + [self _testAttribute:CPFloatAttributeType value:2.5]; + [self _testAttribute:CPStringAttributeType value:@"toto"]; + [self _testAttribute:CPBooleanAttributeType value:1]; +} + +- (void)_testAttribute:(int)attr value:(id)value +{ + var leftExp = [CPExpression expressionForKeyPath:@"keypath"], + rightExp = [CPExpression expressionForConstantValue:value], + predicate = [CPComparisonPredicate predicateWithLeftExpression:leftExp rightExpression:rightExp modifier:0 type:CPEqualToPredicateOperatorType options:0], + compound = [[CPCompoundPredicate alloc] initWithType:CPAndPredicateType subpredicates:@[predicate]]; + + var t1 = [[CPPredicateEditorRowTemplate alloc] initWithCompoundTypes:[0,1,2]], + t2 = [[CPPredicateEditorRowTemplate alloc] initWithLeftExpressions:@[leftExp] rightExpressionAttributeType:attr modifier:0 operators:@[CPEqualToPredicateOperatorType] options:0]; + + [_editor setRowTemplates:@[t1, t2]]; + + [_editor setObjectValue:compound]; + [_editor reloadPredicate]; + [self assert:compound equals:[_editor objectValue]]; +} + @end diff --git a/Tests/AppKit/CPTabViewTest.j b/Tests/AppKit/CPTabViewTest.j index a8e13ff71..fe149ab60 100644 --- a/Tests/AppKit/CPTabViewTest.j +++ b/Tests/AppKit/CPTabViewTest.j @@ -138,4 +138,16 @@ [self assert:[_tabView selectedTabViewItem] equals:_tabItem2]; } +- (void)testTabViewItemSelectionNotEmpty +{ + // after insertion from empty and no explicit selection. + [self assert:[_tabView numberOfTabViewItems] equals:2]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem1]; + + // Removes selected Item. + [_tabView removeTabViewItem:_tabItem1]; + [self assert:[_tabView numberOfTabViewItems] equals:1]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem2]; +} + @end diff --git a/Tests/AppKit/CPTextViewTest.j b/Tests/AppKit/CPTextViewTest.j new file mode 100644 index 000000000..343b28dbc --- /dev/null +++ b/Tests/AppKit/CPTextViewTest.j @@ -0,0 +1,87 @@ +@import +@import + +@implementation CPTextViewTest : OJTestCase +{ + CPWindow theWindow; + CPTextView textView; + + CPString stringValue; + + OJMoqSpy delegateSpy +} + +- (void)setUp +{ + // This will init the global var CPApp which are used internally in the AppKit + [[CPApplication alloc] init]; + + // setup a reasonable table + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0) styleMask:CPWindowNotSizable]; + + textView = [[CPTextView alloc] initWithFrame:CGRectMake(0,0,300,300)]; + + stringValue = @"My string is here"; + + [textView setString:stringValue]; + [textView setDelegate:self]; + + [[theWindow contentView] addSubview:textView]; + + delegateSpy = spy(self); +} + +- (void)tearDown +{ + [delegateSpy reset]; +} + +- (void)testMakeCPTextViewInstance +{ + [self assertNotNull:textView]; +} + +- (void)testTextViewSetStringMethod +{ + [self assert:stringValue equals:[textView stringValue]]; +} + +- (void)testTextViewSelectionRange +{ + //TODO : uncomment once ojtest will be up to date on travis + var range; + // + //[delegateSpy selector:@selector(textView:willChangeSelectionFromCharacterRange:toCharacterRange:) times:1 arguments:[textView, CPMakeRange(0,0), CPMakeRange(0, 18)]]; + //[delegateSpy selector:@selector(textViewDidChangeSelection:) times:1]; + //[textView selectAll:self]; + //range = [[textView selectedRanges] firstObject]; + //[self assert:0 equals:range.location]; + //[self assert:18 equals:range.length]; + // [delegateSpy verifyThatAllExpectationsHaveBeenMet]; + // + // + // [delegateSpy reset]; + // [delegateSpy selector:@selector(textView:willChangeSelectionFromCharacterRange:toCharacterRange:) times:1 arguments:[textView, CPMakeRange(0, 18), CPMakeRange(3, 6)]]; + // [delegateSpy selector:@selector(textViewDidChangeSelection:) times:1]; + //[textView setSelectedRange:CPMakeRange(3, 6)]; + //range = [[textView selectedRanges] firstObject]; + //[self assert:3 equals:range.location]; + //[self assert:6 equals:range.length]; + // [delegateSpy verifyThatAllExpectationsHaveBeenMet]; +} + +@end + +@implementation CPTextViewTest (CPTextViewTestDelegate) + +- (CPRange)textView:(CPTextView)aTextView willChangeSelectionFromCharacterRange:(CPRange)oldSelectedCharRange toCharacterRange:(CPRange)newSelectedCharRange +{ + return newSelectedCharRange; +} + +- (void)textViewDidChangeSelection:(CPNotification)aNotification +{ + +} + +@end \ No newline at end of file diff --git a/Tests/AppKit/CPViewControllerTest.j b/Tests/AppKit/CPViewControllerTest.j new file mode 100644 index 000000000..7ebed52fc --- /dev/null +++ b/Tests/AppKit/CPViewControllerTest.j @@ -0,0 +1,89 @@ +@import +@import + +var methodsCalled; + +@implementation CPViewControllerTest : OJTestCase +{ + CPBundle bundle; +} + +- (void)setUp +{ + bundle = [CPBundle bundleWithPath:@"Tests/AppKit/BundleTest"]; + [bundle loadWithDelegate:self]; +} + +- (void)bundleDidFinishLoading:(CPBundle)aBundle +{ + +} + +- (void)testViewControllerCallbacks +{ + methodsCalled = @[]; + + var expectedResult = @[@"viewDidLoad", + @"viewWillAppear", + @"viewDidAppear", + @"viewWillDisappear", + @"viewDidDisappear"]; + + [self assertTrue:[bundle isLoaded]]; + var viewController = [[ViewController alloc] initWithCibName:@"NSViewController.cib" bundle:bundle]; + [self assertNotNull:viewController]; + + var superview = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + var view = [viewController view]; + + [superview addSubview:view]; + [view removeFromSuperview]; + [self assert:expectedResult equals:methodsCalled]; + + // Explicitely change the view. + methodsCalled = []; + expectedResult = @[@"viewWillAppear", + @"viewDidAppear", + @"viewWillDisappear", + @"viewDidDisappear"]; + + var newView = [[CPView alloc] initWithFrame:CGRectMake(0,0,100,100)]; + [viewController setView:newView]; + + [superview addSubview:newView]; + [newView removeFromSuperview]; + // Checks that with receive notifs from the new view and not from the old view. + [self assert:expectedResult equals:methodsCalled]; +} + +@end + +@implementation ViewController : CPViewController +{ +} + +- (void)viewDidLoad +{ + [methodsCalled addObject:_cmd]; +} + +- (void)viewDidAppear +{ + [methodsCalled addObject:_cmd]; +} + +- (void)viewWillAppear +{ + [methodsCalled addObject:_cmd]; +} + +- (void)viewDidDisappear +{ + [methodsCalled addObject:_cmd]; +} + +- (void)viewWillDisappear +{ + [methodsCalled addObject:_cmd]; +} +@end diff --git a/Tests/AppKit/CPViewTest.j b/Tests/AppKit/CPViewTest.j index 383db1a99..93edeb549 100644 --- a/Tests/AppKit/CPViewTest.j +++ b/Tests/AppKit/CPViewTest.j @@ -895,70 +895,184 @@ var updateTrackingAreasCalls, [self assert:nil equals:[view effectiveAppearance]]; } +- (void)testViewDidHideDidUnhide +{ + var expectedResult = [@"viewDidHide_view1", @"viewDidUnhide_view1"]; + + [view1 setHidden:YES]; + [view1 setHidden:NO]; + + [self assert:expectedResult equals:methodCalled]; +} + +- (void)testAddViewRemoveView +{ + var expectedResult = [@"viewWillMoveToSuperview_view2", + @"viewDidMoveToSuperview_view2", + @"viewWillMoveToSuperview_view2", + @"viewDidMoveToSuperview_view2", + @"viewWillMoveToWindow_view2", + @"viewDidMoveToWindow_view2"]; + + [view1 addSubview:view2]; + [view2 removeFromSuperview]; + + [self assert:expectedResult equals:methodCalled]; +} + +- (void)testViewGainedHiddenAncestor +{ + var expectedResult = [@"viewDidHide_view1", + @"viewWillMoveToSuperview_view3", + @"viewDidMoveToSuperview_view3", + @"viewWillMoveToSuperview_view2", + @"viewDidHide_view2", + @"viewDidHide_view3", + @"viewDidMoveToSuperview_view2"]; + + [view1 setHidden:YES]; + [view2 addSubview:view3]; + CPLog.warn("will add view2"); + [view1 addSubview:view2]; + + [self assertTrue: [view2 isHiddenOrHasHiddenAncestor] message:@"Expected " + [view2 identifier] + "isHiddenOrHasHiddenAncestor = YES"]; + [self assertTrue: [view3 isHiddenOrHasHiddenAncestor] message:@"Expected isHiddenOrHasHiddenAncestor = YES"]; + + [self assertFalse:[view2 isHidden]]; + [self assertFalse:[view3 isHidden]]; + + [self assert:expectedResult equals:methodCalled]; +} + +- (void)testRemoveViewsHiddenByAncestor +{ + var expectedResult = @[ + @"viewWillMoveToSuperview_view2", + @"viewDidUnhide_view2", + @"viewDidUnhide_view3", + @"viewDidMoveToSuperview_view2", + @"viewWillMoveToWindow_view2", + @"viewWillMoveToWindow_view3", + @"viewDidMoveToWindow_view3", + @"viewDidMoveToWindow_view2" +]; + + [view1 setHidden:YES]; + [view1 addSubview:view2]; + [view2 addSubview:view3]; + + [self assertTrue: [view2 isHiddenOrHasHiddenAncestor] message:@"Expected isHiddenOrHasHiddenAncestor = YES" ]; + [self assertFalse:[view2 isHidden]]; + + [self assertTrue: [view3 isHiddenOrHasHiddenAncestor] message:@"Expected isHiddenOrHasHiddenAncestor = YES" ]; + [self assertFalse:[view3 isHidden]]; + + methodCalled = []; + + [view2 removeFromSuperview]; + + [self assertFalse: [view2 isHiddenOrHasHiddenAncestor] message:@"Expected isHiddenOrHasHiddenAncestor = NO" ]; + [self assertFalse: [view3 isHiddenOrHasHiddenAncestor] message:@"Expected isHiddenOrHasHiddenAncestor = NO" ]; + + [self assert:expectedResult equals:methodCalled]; +} + +- (void)testRemoveHiddenView +{ + var expectedResult = [@"viewWillMoveToSuperview_view2", @"viewDidMoveToSuperview_view2", @"viewWillMoveToWindow_view2", @"viewDidMoveToWindow_view2"]; + + [view1 addSubview:view2]; + [view2 setHidden:YES]; + + methodCalled = []; + + [view2 removeFromSuperview]; + [self assertTrue: [view2 isHiddenOrHasHiddenAncestor] message:@"Expected isHiddenOrHasHiddenAncestor = YES" ]; + [self assert:expectedResult equals:methodCalled]; +} + +- (void)testLostHiddenAncestorAfterMovingToNewSuperview +{ + var expectedResult = @[ + @"viewWillMoveToSuperview_view2", + @"viewDidMoveToSuperview_view2", + @"viewDidHide_view1", + @"viewDidHide_view2", + @"viewWillMoveToSuperview_view2", + @"viewDidUnhide_view2", + @"viewDidMoveToSuperview_view2" +]; + + [view1 addSubview:view2]; + [view1 setHidden:YES]; + [view3 addSubview:view2]; + + [self assert:expectedResult equals:methodCalled]; +} // TrackingAreaAdditions - (void)testTrackingAreas { var trackingArea = [[CPTrackingArea alloc] initWithRect:CGRectMakeZero() options:CPTrackingMouseEnteredAndExited | CPTrackingActiveInKeyWindow | CPTrackingInVisibleRect owner:self userInfo:nil]; - + [self assert:0 equals:[[view trackingAreas] count] message:@"Initially, a view has no tracking area"]; // - + [view addTrackingArea:trackingArea]; [self assert:1 equals:[[view trackingAreas] count] message:@"After adding a tracking area"]; [self assert:view equals:[trackingArea view] message:@"Tracking area should be linked to view"]; // - + [view removeTrackingArea:trackingArea]; [self assert:0 equals:[[view trackingAreas] count] message:@"After removing the only tracking area"]; [self assert:nil equals:[trackingArea view] message:@"Tracking area should be unlinked"]; - + // - + [view addTrackingArea:trackingArea]; [view addTrackingArea:trackingArea]; [view addTrackingArea:trackingArea]; [self assert:1 equals:[[view trackingAreas] count] message:@"Adding the same tracking area multiple times should add it once"]; [self assert:view equals:[trackingArea view] message:@"Tracking area should be linked to view"]; - + var trackingArea2 = [[CPTrackingArea alloc] initWithRect:CGRectMakeZero() options:CPTrackingMouseEnteredAndExited | CPTrackingActiveInKeyWindow owner:self userInfo:nil]; // - + [view addTrackingArea:trackingArea2]; [self assert:2 equals:[[view trackingAreas] count] message:@"After adding a second tracking area"]; [self assert:view equals:[trackingArea2 view] message:@"Tracking area should be linked to view"]; // - + [view removeAllTrackingAreas]; [self assert:0 equals:[[view trackingAreas] count] message:@"After removing all tracking areas"]; [self assert:nil equals:[trackingArea view] message:@"Tracking area should be unlinked"]; [self assert:nil equals:[trackingArea2 view] message:@"Tracking area should be unlinked"]; // - + [view addTrackingArea:trackingArea]; - + var contentView = [window contentView]; [contentView addSubview:view]; [self assert:0 equals:updateTrackingAreasCalls message:@"Putting a view with a CPTrackingAreaInVisibleRect in a window should not call updateTrackingAreas"]; - + [view removeFromSuperview]; // - + [view addTrackingArea:trackingArea2]; [contentView addSubview:view]; [self assert:1 equals:updateTrackingAreasCalls message:@"Putting a view with a non CPTrackingAreaInVisibleRect in a window should call updateTrackingAreas"]; - + [view removeAllTrackingAreas]; - + // - + var viewTA = [[CPTrackingAreaView alloc] initWithFrame:CGRectMakeZero()]; updateTrackingAreasCalls = 0; @@ -966,17 +1080,17 @@ var updateTrackingAreasCalls, [self assert:1 equals:updateTrackingAreasCalls message:@"Putting a view with no tracking areas in a window should call updateTrackingAreas"]; // - + updateTrackingAreasCalls = 0; [viewTA addTrackingArea:trackingArea]; [viewTA setFrame:CGRectMake(10, 10, 10, 10)]; [self assert:0 equals:updateTrackingAreasCalls message:@"Changing geometry of a view with a CPTrackingAreaInVisibleRect should not call updateTrackingAreas"]; - + // - + updateTrackingAreasCalls = 0; - + [viewTA addTrackingArea:trackingArea2]; [viewTA setFrame:CGRectMake(20, 20, 20, 20)]; [self assert:1 equals:updateTrackingAreasCalls message:@"Changing geometry of a view with a non CPTrackingAreaInVisibleRect should call updateTrackingAreas"]; @@ -1048,7 +1162,7 @@ var updateTrackingAreasCalls, [viewTA removeAllTrackingAreas]; [viewTA addTrackingArea:trackingAreaAllWithDrag]; - + // Mouse enters the tracking area while dragging (option set) [self moveMouseAtPoint:CGPointMake(21, 21) dragging:YES]; @@ -1103,7 +1217,7 @@ var updateTrackingAreasCalls, [self assert:0 equals:mouseExitedCalls message:@"Mouse entering inner tracking area should not call mouseExited"]; [self assert:1 equals:mouseMovedCalls message:@"Mouse entering inner tracking area should call mouseMoved"]; [self assert:1 equals:cursorUpdateCalls message:@"Mouse entering inner tracking area should call cursorUpdate"]; - + // Mouse moves in inner view [self moveMouseAtPoint:CGPointMake(27, 27) dragging:NO]; @@ -1112,7 +1226,7 @@ var updateTrackingAreasCalls, [self assert:0 equals:mouseExitedCalls message:@"Mouse moving in inner tracking area should not call mouseExited"]; [self assert:2 equals:mouseMovedCalls message:@"Mouse moving in inner tracking area should call mouseMoved for both views"]; [self assert:0 equals:cursorUpdateCalls message:@"Mouse moving in inner tracking area should not call cursorUpdate"]; - + // Mouse leaves inner view but remains in outer view [self moveMouseAtPoint:CGPointMake(36, 36) dragging:NO]; @@ -1121,7 +1235,7 @@ var updateTrackingAreasCalls, [self assert:1 equals:mouseExitedCalls message:@"Mouse moving from inner to outer tracking area should call mouseExited (for inner)"]; [self assert:1 equals:mouseMovedCalls message:@"Mouse moving from inner to outer tracking area should call mouseMoved (for outer)"]; [self assert:1 equals:cursorUpdateCalls message:@"Mouse moving from inner to outer tracking area should call cursorUpdate (for outer)"]; - + [self assert:innerViewTA equals:involvedViewForMouseExited message:@"Inner view should receive mouseExited"]; [self assert:viewTA equals:involvedViewForCursorUpdate message:@"Outer view should receive cursorUpdate"]; @@ -1278,7 +1392,7 @@ var updateTrackingAreasCalls, [self mouseUpAtPoint:CGPointMake(10, 10)]; [self assert:[CPCursor arrowCursor] equals:[CPCursor currentCursor] message:@"Step 1.7 : cursor should be an arrow"]; - + // [self moveMouseAtPoint:CGPointMake(1, 1) dragging:NO]; @@ -1292,7 +1406,7 @@ var updateTrackingAreasCalls, [self moveMouseAtPoint:CGPointMake(5, 5) dragging:NO]; [self assert:[CPCursor arrowCursor] equals:[CPCursor currentCursor] message:@"Step 2.1 : cursor should be an arrow"]; - + // Step 2.2 : inside the superview / outside the subview [self moveMouseAtPoint:CGPointMake(15, 15) dragging:NO]; @@ -1310,7 +1424,7 @@ var updateTrackingAreasCalls, [self moveMouseAtPoint:CGPointMake(15, 15) dragging:NO]; [self assert:[CPCursor crosshairCursor] equals:[CPCursor currentCursor] message:@"Step 2.4 : cursor should be a crosshair"]; - + // Step 2.5 : outside the superview [self moveMouseAtPoint:CGPointMake(5, 5) dragging:NO]; @@ -1355,14 +1469,14 @@ var updateTrackingAreasCalls, [self moveMouseAtPoint:CGPointMake(5, 5) dragging:NO]; [self assert:[CPCursor arrowCursor] equals:[CPCursor currentCursor] message:@"Step 3.5 : cursor should be an arrow"]; - + } - (void)testTrackingAreasLiveViewHierarchyModification { // 1. viewB inside viewA with mouseEntered removing itself - var viewA = [[CPTrackingAreaViewWithCursorUpdate alloc] initWithFrame:CGRectMake(20, 20, 40, 40)] + var viewA = [[CPTrackingAreaViewWithCursorUpdate alloc] initWithFrame:CGRectMake(20, 20, 40, 40)], viewB = [[CPTrackingAreaViewLiveRemoval alloc] initWithFrame:CGRectMake(10, 10, 20, 20)]; [[window contentView] setSubviews:[CPArray arrayWithObject:viewA]]; @@ -1691,6 +1805,18 @@ var updateTrackingAreasCalls, [methodCalled addObject:string]; } +- (void)viewDidUnhide +{ + var string = _cmd + @"_" + [self identifier]; + [methodCalled addObject:string]; +} + +- (void)viewDidHide +{ + var string = _cmd + @"_" + [self identifier]; + [methodCalled addObject:string]; +} + - (BOOL)acceptsFirstResponder { return YES; diff --git a/Tests/CucumberTests/CPAnimationContextTest/AppController.j b/Tests/CucumberTests/CPAnimationContextTest/AppController.j new file mode 100644 index 000000000..99fb0c244 --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/AppController.j @@ -0,0 +1,228 @@ +/* + * AppController.j + * AdvancedHelloWorld + * + * Created by You on December 8, 2011. + * Copyright 2011, Your Company All rights reserved. + */ +/* + This Cucapp tests the following: + • CPAnimationContext -setCompletionHandler: is called and the end value is correct when the frame of a view is animated. + Tested for a vanilla view (no drawing, no layout), a view with custom drawing, with custom layout, with both. + • CPAnimationContext CPView special keyPaths CPAnimationTriggerOrderIn and CPAnimationTriggerOrderOut. + Checks that adding or removing the animator to/from the superview does not throw an error and the superview final value is correct. +*/ + +@import + +@import "CPResponder+Cucapp.j" + +@class ColorView + +var ANIMATION_DURATION = 0.9; + +@implementation AppController : CPObject +{ + /* this "outlet" is connected automatically by the Cib */ + CPWindow theWindow; + + /* We create the outlets of the textfields here */ + @outlet DrawView drawView; + @outlet CustomLayoutView layoutView; + @outlet CustomLayoutDrawView layoutDrawView; + + CPInteger testNumber; + CPString passed; +} + +- (void)awakeFromCib +{ + [theWindow setFullPlatformWindow:YES]; + [layoutView setNeedsLayout]; + [layoutDrawView setNeedsLayout]; + testNumber = 0; + passed = ""; +} + +- (void)testDidPass +{ + passed = "true"; + testNumber++; +} + +- (IBAction)test:(id)sender +{ + passed = "false"; + [self performSelector:CPSelectorFromString("test" + testNumber)]; +} + +- (void)test0 +{ + vanillaView = [[ColorView alloc] initWithFrame:CGRectMake(30,30,148,115)]; + [vanillaView setBackgroundColor:[vanillaView color]]; + + var fadeOut = [CABasicAnimation animationWithKeyPath:@"alphaValue"]; + [fadeOut setFromValue:1]; + [fadeOut setToValue:0]; + [fadeOut setDuration:ANIMATION_DURATION]; + + [vanillaView setAnimations:@{@"CPAnimationTriggerOrderOut":fadeOut}]; + + var ctx = [CPAnimationContext currentContext]; + [ctx setCompletionHandler:function() + { + if ([vanillaView superview] == [theWindow contentView] && [vanillaView alphaValue] == 1) + [self testDidPass]; + }]; + + [[theWindow contentView] addSubview:vanillaView]; +} + +- (void)test1 +{ + [self move:vanillaView]; +} + +- (void)test2 +{ + [self move:drawView]; +} + +- (void)test3 +{ + [self move:layoutView]; +} + +- (void)test4 +{ + [self move:layoutDrawView]; +} + +- (void)test5 +{ + var ctx = [CPAnimationContext currentContext]; + [ctx setCompletionHandler:function() + { + if ([vanillaView superview] == nil && [vanillaView alphaValue] == 1) + [self testDidPass]; + }]; + + [[vanillaView animator] removeFromSuperview]; +} + +- (void)move:(CPView)view +{ + var destinationRect = CGRectMake(200 *testNumber,200,200,200); + var ctx = [CPAnimationContext currentContext]; + [ctx setDuration:ANIMATION_DURATION]; + [ctx setCompletionHandler:function() + { + if (CGRectEqualToRect([view frame], destinationRect)) + [self testDidPass]; + }]; + + [[view animator] setFrame:destinationRect]; +} + +@end + + +@implementation ColorView : CPView +{ + CPColor color @accessors; +} + +- (id)initWithFrame:(CGRect)aFrame +{ + self = [super initWithFrame:aFrame]; + + color = [CPColor randomColor]; + + return self; +} + +- (void)viewDidMoveToSuperview +{ + [self setBackgroundColor:color]; +} + +@end + +@implementation DrawView : CPView +{ + CPColor color; +} + +- (id)initWithFrame:(CGRect)aFrame +{ + self = [super initWithFrame:aFrame]; + + color = [CPColor randomColor]; + + return self; +} + +- (void)drawRect:(CGRect)aRect +{ + var context = [[CPGraphicsContext currentContext] graphicsPort], + bounds = [self bounds]; + + CGContextSetLineWidth(context, 2); + CGContextSetStrokeColor(context, [CPColor blackColor]); + CGContextSetFillColor(context, color); + + CGContextBeginPath(context); + CGContextFillRect(context, bounds); + + var height = CGRectGetHeight(bounds), + width = CGRectGetWidth(bounds); + + CGContextStrokeLineSegments(context, [CGPointMake(10,0), CGPointMake(10, height), + CGPointMake(0, 10), CGPointMake(CGRectGetWidth(aRect), 10), + CGPointMake(width - 10, 0), CGPointMake(width - 10, height), + CGPointMake(0, height - 10), CGPointMake(width, height - 10)], 8); +} + +@end + +@implementation CustomLayoutView : ColorView +{ +} + +- (void)layoutSubviews +{ + [self setBackgroundColor:color]; + + var subviews = [self subviews], + count = [subviews count] - 1; + + var dx = (CGRectGetWidth([self frame]) - 100) / count, + dy = (CGRectGetHeight([self frame]) - 26) / count + + [subviews enumerateObjectsUsingBlock:function(view, idx, stop) + { + [view setFrameOrigin:CGPointMake(dx * idx, dy * idx)]; + }]; +} + +@end + +@implementation CustomLayoutDrawView : DrawView +{ +} + +- (void)layoutSubviews +{ + var subviews = [self subviews], + count = [subviews count] - 1; + + var dx = (CGRectGetWidth([self frame]) - 100) / count, + dy = (CGRectGetHeight([self frame]) - 26) / count + + [subviews enumerateObjectsUsingBlock:function(view, idx, stop) + { + [view setFrameOrigin:CGPointMake(dx * idx, dy * idx)]; + }]; +} + +@end diff --git a/Tests/CucumberTests/CPAnimationContextTest/CPResponder+CuCapp.j b/Tests/CucumberTests/CPAnimationContextTest/CPResponder+CuCapp.j new file mode 100644 index 000000000..8b2a7a250 --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/CPResponder+CuCapp.j @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2014 Nuage Networks +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + + +// Import this Categories from your application +// You can now user -(void)setCucappIdentifier: and -(CPString)cucappIdentifier +// to set and get your cucapp IDs. +// Then from a test, you can use it as a selector like //CPView[cucappIdentifier="my-button"] + +@import +@import + +@implementation CPResponder (cucappAdditions) + +- (void)setCucappIdentifier:(CPString)anIdentifier +{ + self.__cucappIdentifier = anIdentifier; +} + +- (CPString)cucappIdentifier +{ + return self.__cucappIdentifier; +} + +@end + +@implementation CPMenuItem (cucappAdditionsMenu) + +- (void)setCucappIdentifier:(CPString)anIdentifier +{ + [[self _menuItemView] setCucappIdentifier:anIdentifier]; +} + +- (CPString)cucappIdentifier +{ + [[self _menuItemView] cucappIdentifier]; +} + +@end + +function load_cucapp_CLI(path) +{ + if (!path) + path = "Cucapp/lib/Cucumber.j" + + try { + objj_importFile(path, true, function() { + [Cucumber stopCucumber]; + CPLog.debug("Cucapp CLI has been well loaded"); + _addition_cpapplication_send_event_method(); + }); + + } + catch(e) + { + [CPException raise:CPInvalidArgumentException reason:@"Invalid path for the lib Cucumber"]; + } +} + + +function load_cucapp_record(path) +{ + if (!path) + path = "CuCapp+Record.j" + + try { + objj_importFile(path, true, function() { + CPLog.debug("Cucapp record has been well loaded"); + }); + } + catch(e) + { + [CPException raise:CPInvalidArgumentException reason:@"Invalid path for the lib Cucapp+Record.j"]; + } +} diff --git a/Tests/CucumberTests/CPAnimationContextTest/CuCapp+Record.j b/Tests/CucumberTests/CPAnimationContextTest/CuCapp+Record.j new file mode 100644 index 000000000..5975dae5c --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/CuCapp+Record.j @@ -0,0 +1,591 @@ +@import + +function start_record(path) +{ + [CPWindow start_record]; +} + +function stop_record() +{ + [CPWindow stop_record]; +} + +function save_record(fileName) +{ + if (!fileName) + fileName = @"record" + + var eventRecords = [CPWindow eventRecords], + JSONEvents = []; + + for (var i = 0; i < [eventRecords count]; i++) + { + var eventRecord = eventRecords[i]; + [JSONEvents addObject:[eventRecord objectToJSON]]; + } + + var pom = document.createElement('a'); + pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(JSONEvents, null, 4))); + pom.setAttribute('download', fileName + ".json"); + pom.click(); +} + +function play_record(file_name, cucumber_path) +{ + if (!cucumber_path) + cucumber_path = path = "../../Cucapp/lib/Cucumber.j"; + + load_cucapp_CLI(cucumber_path); + + setTimeout(function(){ + _load_javascript_file(file_name) + },1000); +} + +function _load_javascript_file(file_name) +{ + var AJAX_req = new XMLHttpRequest(); + AJAX_req.open( "GET", file_name, true ); + AJAX_req.setRequestHeader("Content-type", "application/json"); + + AJAX_req.onreadystatechange = function() + { + if (AJAX_req.readyState == 4) + { + var recordingEvents = JSON.parse(AJAX_req.responseText); + + for (var i = 0; i < [recordingEvents count]; i++) + { + var recordingEvent = JSON.parse(recordingEvents[i]), + type = recordingEvent["event"]["type"]; + + if (type == CPLeftMouseDown && i < [recordingEvents count] - 1) + { + var nextRecordingEvent = JSON.parse(recordingEvents[i + 1]), + nextType = nextRecordingEvent["event"]["type"]; + + if (nextType == CPMouseMoved) + { + for (var j = i; j < [recordingEvents count]; j++) + { + var tmpRecordingEvent = JSON.parse(recordingEvents[j]), + tmpType = tmpRecordingEvent["event"]["type"]; + + if (tmpType == CPLeftMouseUp) + { + setTimeout(_simulate_drag_event, recordingEvent["event"]["timestamp"] * 1000, recordingEvent, tmpRecordingEvent); + i = j; + break; + } + } + + continue; + } + } + + setTimeout(_simulate_event, recordingEvent["event"]["timestamp"] * 1000, recordingEvent); + } + } + } + + AJAX_req.send(); +} + +function _simulate_drag_event(event1, event2) +{ + var keyView1 = event1["keyView"], + valueView1 = event1["valueView"], + keyView2 = event2["keyView"], + valueView2 = event2["valueView"], + locationInWindow1 = CGPointMake(event1["event"]["locationInWindow"]["x"], event1["event"]["locationInWindow"]["y"]); + locationInWindow2 = CGPointMake(event2["event"]["locationInWindow"]["x"], event2["event"]["locationInWindow"]["y"]); + + if (keyView1 && valueView1 && keyView2 && valueView2) + simulate_dragged_click_view_to_view(keyView1, valueView1, keyView2, valueView2); + else if (keyView1 && valueView1) + simulate_dragged_click_view_to_point(keyView1, valueView1, locationInWindow1.x, locationInWindow1.y); + else + simulate_dragged_click_point_to_point(locationInWindow1.x, locationInWindow1.y, locationInWindow2.x, locationInWindow2.y); +} + +function _simulate_event(event) +{ + var type = event["event"]["type"], + keyView = event["keyView"], + valueView = event["valueView"], + characters = event["event"]["characters"], + deltaX = event["event"]["deltaX"], + deltaY = event["event"]["deltaY"], + deltaZ = event["event"]["deltaZ"], + deltaZ = event["event"]["deltaZ"], + locationInWindow = CGPointMake(event["event"]["locationInWindow"]["x"], event["event"]["locationInWindow"]["y"]); + + switch (type) + { + case CPScrollWheel: + + if (keyView && valueView) + simulate_scroll_wheel_on_view(keyView, valueView, deltaX, deltaY) + + break; + + case CPLeftMouseDown: + + if (keyView && valueView) + simulate_left_click_on_view(keyView, valueView); + else + simulate_left_click_on_point(locationInWindow.x, locationInWindow.y) + + break; + + case CPRightMouseDown: + + if (keyView && valueView) + simulate_right_click_on_view(keyView, valueView); + else + simulate_right_click_on_point(locationInWindow.x, locationInWindow.y) + + break; + + case CPKeyDown: + simulate_keyboard_event(characters); + break; + } +} + + +var eventRecords, + recording = NO; + +@implementation CPWindow (cucappRecord) + ++ (CPArray)eventRecords +{ + return eventRecords; +} + ++ (void)start_record +{ + eventRecords = []; + recording = YES; +} + ++ (void)stop_record +{ + recording = NO; +} + +/*! + Dispatches events that are sent to it from CPApplication. + @param anEvent the event to be dispatched +*/ +- (void)sendEvent:(CPEvent)anEvent +{ + var type = [anEvent type], + sheet = [self attachedSheet], + recordingEvent = [[RecordingEvent alloc] initWithEvent:anEvent]; + + if (recordingEvent && type != CPFlagsChanged && type != CPMouseMoved) + [eventRecords addObject:recordingEvent]; + + // If a sheet is attached events get filtered here. + // It is not clear what events should be passed to the view, perhaps all? + // CPLeftMouseDown is needed for window moving and resizing to work. + // CPMouseMoved is needed for rollover effects on title bar buttons. + + if (sheet) + { + switch (type) + { + case CPLeftMouseDown: + + // This is needed when a doubleClick occurs when the sheet is closing or opening + if (!_parentWindow) + return; + + [recordingEvent setView:_windowView]; + + [_windowView mouseDown:anEvent]; + + // -dw- if the window is clicked, the sheet should come to front, and become key, + // and the window should be immediately behind + [sheet makeKeyAndOrderFront:self]; + + return; + + case CPMouseMoved: + // Allow these through to the parent + break; + + default: + // Everything else is filtered + return; + } + } + + var point = [anEvent locationInWindow]; + + switch (type) + { + case CPFlagsChanged: + return [[self firstResponder] flagsChanged:anEvent]; + + case CPKeyUp: + return [[self firstResponder] keyUp:anEvent]; + + case CPKeyDown: + if ([anEvent charactersIgnoringModifiers] === CPTabCharacter) + { + if ([anEvent modifierFlags] & CPShiftKeyMask) + [self selectPreviousKeyView:self]; + else + [self selectNextKeyView:self]; + + // Make sure the browser doesn't try to do its own tab handling. + // This is important or the browser might blur the shared text field or token field input field, + // even that we just moved it to a new first responder. + [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:NO] + return; + } + else if ([anEvent charactersIgnoringModifiers] === CPBackTabCharacter) + { + var didTabBack = [self selectPreviousKeyView:self]; + + if (didTabBack) + { + // Make sure the browser doesn't try to do its own tab handling. + // This is important or the browser might blur the shared text field or token field input field, + // even that we just moved it to a new first responder. + [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:NO] + } + return didTabBack; + } + else if ([anEvent charactersIgnoringModifiers] == CPEscapeFunctionKey && [self _processKeyboardUIKey:anEvent]) + { + return; + } + + [[self firstResponder] keyDown:anEvent]; + + // Trigger the default button if needed + // FIXME: Is this only applicable in a sheet? See isse: #722. + if (![self disableKeyEquivalentForDefaultButton]) + { + var defaultButton = [self defaultButton], + keyEquivalent = [defaultButton keyEquivalent], + modifierMask = [defaultButton keyEquivalentModifierMask]; + + if ([anEvent _triggersKeyEquivalent:keyEquivalent withModifierMask:modifierMask]) + [[self defaultButton] performClick:self]; + } + + return; + + case CPScrollWheel: + [recordingEvent setView:[_windowView hitTest:point]]; + + return [[_windowView hitTest:point] scrollWheel:anEvent]; + + case CPLeftMouseUp: + case CPRightMouseUp: + var hitTestedView = _leftMouseDownView, + selector = type == CPRightMouseUp ? @selector(rightMouseUp:) : @selector(mouseUp:); + + if (!hitTestedView) + hitTestedView = [_windowView hitTest:point]; + + [recordingEvent setView:hitTestedView]; + + [hitTestedView performSelector:selector withObject:anEvent]; + + _leftMouseDownView = nil; + + return; + + case CPLeftMouseDown: + case CPRightMouseDown: + // This will return _windowView if it is within a resize region + _leftMouseDownView = [_windowView hitTest:point]; + + [recordingEvent setView:_leftMouseDownView]; + + if (_leftMouseDownView !== _firstResponder && [_leftMouseDownView acceptsFirstResponder]) + [self makeFirstResponder:_leftMouseDownView]; + + [CPApp activateIgnoringOtherApps:YES]; + + var theWindow = [anEvent window], + selector = type == CPRightMouseDown ? @selector(rightMouseDown:) : @selector(mouseDown:); + + if ([theWindow isKeyWindow] || ([theWindow becomesKeyOnlyIfNeeded] && ![_leftMouseDownView needsPanelToBecomeKey])) + return [_leftMouseDownView performSelector:selector withObject:anEvent]; + else + { + // FIXME: delayed ordering? + [self makeKeyAndOrderFront:self]; + + if ([_leftMouseDownView acceptsFirstMouse:anEvent]) + return [_leftMouseDownView performSelector:selector withObject:anEvent]; + } + break; + + case CPLeftMouseDragged: + case CPRightMouseDragged: + if (!_leftMouseDownView) + { + [recordingEvent setView:[_windowView hitTest:point]]; + return [[_windowView hitTest:point] mouseDragged:anEvent]; + } + + [recordingEvent setView:_leftMouseDownView]; + + var selector; + + if (type == CPRightMouseDragged) + { + selector = @selector(rightMouseDragged:) + if (![_leftMouseDownView respondsToSelector:selector]) + selector = nil; + } + + if (!selector) + selector = @selector(mouseDragged:) + + return [_leftMouseDownView performSelector:selector withObject:anEvent]; + + case CPMouseMoved: + [_windowView setCursorForLocation:point resizing:NO]; + + // Ignore mouse moves for parents of sheets + if (!_acceptsMouseMovedEvents || sheet) + return; + + if (!_mouseEnteredStack) + _mouseEnteredStack = []; + + var hitTestView = [_windowView hitTest:point]; + + if ([_mouseEnteredStack count] && [_mouseEnteredStack lastObject] === hitTestView) + return [hitTestView mouseMoved:anEvent]; + + var view = hitTestView, + mouseEnteredStack = []; + + while (view) + { + mouseEnteredStack.unshift(view); + + view = [view superview]; + } + + var deviation = MIN(_mouseEnteredStack.length, mouseEnteredStack.length); + + while (deviation--) + if (_mouseEnteredStack[deviation] === mouseEnteredStack[deviation]) + break; + + var index = deviation + 1, + count = _mouseEnteredStack.length; + + if (index < count) + { + var event = [CPEvent mouseEventWithType:CPMouseExited location:point modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]; + + for (; index < count; ++index) + [_mouseEnteredStack[index] mouseExited:event]; + } + + index = deviation + 1; + count = mouseEnteredStack.length; + + if (index < count) + { + var event = [CPEvent mouseEventWithType:CPMouseEntered location:point modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]; + + for (; index < count; ++index) + [mouseEnteredStack[index] mouseEntered:event]; + } + + _mouseEnteredStack = mouseEnteredStack; + + [hitTestView mouseMoved:anEvent]; + } +} + +@end + + +@implementation RecordingEvent : CPObject +{ + CPEvent _event @accessors(property=event); + CPString _keyView @accessors(property=keyView); + CPString _valueView @accessors(property=valueView); + CGPoint _offsetView @accessors(property=offsetView); + int _offsetXPercentage @accessors(property=offsetXPercentage); + int _offsetYPercentage @accessors(property=offsetYPercentage); +} + +- (id)initWithEvent:(CPEvent)anEvent +{ + if (self = [super init]) + { + _event = anEvent; + _offsetView = CGPointMakeZero(); + _keyView = @""; + _valueView = @""; + } + + return self; +} + +- (void)setView:(CPView)aView +{ + if ([aView respondsToSelector:@selector(cucappIdentifier)]) + { + _keyView = @"cucappIdentifier"; + _valueView = [aView cucappIdentifier]; + } + else if ([aView respondsToSelector:@selector(identifier)]) + { + _keyView = @"identifier"; + _valueView = [aView identifier]; + } + else if ([aView respondsToSelector:@selector(title)]) + { + _keyView = @"title"; + _valueView = [aView title]; + } + else if ([aView respondsToSelector:@selector(placeholderString)]) + { + _keyView = @"placeholderString"; + _valueView = [aView placeholderString]; + } + else if ([aView respondsToSelector:@selector(text)]) + { + _keyView = @"text"; + _valueView = [aView text]; + } + else if ([aView respondsToSelector:@selector(tag)]) + { + _keyView = @"tag"; + _valueView = [aView tag]; + } + else if ([aView respondsToSelector:@selector(label)]) + { + _keyView = @"label"; + _valueView = [aView label]; + } + else if ([aView respondsToSelector:@selector(objectValue)]) + { + _keyView = @"objectValue"; + _valueView = [aView objectValue]; + } + + var globalPoint = [[aView superview] convertPointToBase:[aView frameOrigin]], + globalEventPoint = [_event locationInWindow]; + + _offsetView = CGPointMake(globalEventPoint.x - globalPoint.x, globalEventPoint.y - globalPoint.y); + + _offsetXPercentage = _offsetView.x * 100 / [aView frameSize].width; + _offsetYPercentage = _offsetView.y * 100 / [aView frameSize].height; +} + +- (CPString)objectToJSON +{ + var json = {}; + + json["keyView"] = _keyView; + json["valueView"] = _valueView; + json["offsetXPercentage"] = _offsetXPercentage; + json["offsetYPercentage"] = _offsetYPercentage; + json["offsetView"] = {"x" : _offsetView.x, "y" : _offsetView.y}; + + var event = {}; + event["type"] = [_event type]; + event["deltaX"] = [_event deltaX]; + event["deltaY"] = [_event deltaY]; + event["deltaZ"] = [_event deltaZ]; + event["characters"] = [_event characters]; + event["charactersIgnoringModifiers"] = [_event charactersIgnoringModifiers]; + event["clickCount"] = [_event clickCount]; + event["modifierFlags"] = [_event modifierFlags]; + event["locationInWindow"] = {"x" : [_event locationInWindow].x, "y" : [_event locationInWindow].y}; + event["keyCode"] = [_event keyCode]; + event["timestamp"] = [_event timestamp]; + + json["event"] = event; + + return JSON.stringify(json, null, 4); +} + +@end + + +@implementation CPApplication (cucappRecord) + +/*! + Dispatches events to other objects. + @param anEvent the event to dispatch +*/ +- (void)sendEvent:(CPEvent)anEvent +{ + _currentEvent = anEvent; + CPEventModifierFlags = [anEvent modifierFlags]; + + var theWindow = [anEvent window]; + + // Check if this is a candidate for key equivalent... + if ([anEvent _couldBeKeyEquivalent] && [self _handleKeyEquivalent:anEvent]) + // The key equivalent was handled. + return; + + if ([anEvent type] == CPMouseMoved) + { + if (theWindow !== _lastMouseMoveWindow) + [_lastMouseMoveWindow _mouseExitedResizeRect]; + + _lastMouseMoveWindow = theWindow; + } + + /* + Event listeners are processed from back to front so that newer event listeners normally take + precedence. If during the execution of a callback a new event listener is added, it should + be inserted after the current callback but before any higher priority callbacks. This makes + repeating event listeners (those that reinsert themselves) stable relative to each other. + */ + for (var i = _eventListeners.length - 1; i >= 0; i--) + { + var listener = _eventListeners[i]; + + if (listener._mask & (1 << [anEvent type])) + { + _eventListeners.splice(i, 1); + // In case the callback wants to add more listeners. + _eventListenerInsertionIndex = i; + listener._callback(anEvent); + + var type = [anEvent type], + recordingEvent = [[RecordingEvent alloc] initWithEvent:anEvent]; + + if (recordingEvent && type != CPFlagsChanged && type != CPMouseMoved) + [eventRecords addObject:recordingEvent]; + + if (theWindow) + [recordingEvent setView:[theWindow._windowView hitTest:[anEvent locationInWindow]]]; + + if (listener._dequeue) + { + // Don't process the event normally and don't send it to any other listener. + _eventListenerInsertionIndex = _eventListeners.length; + return; + } + } + } + + _eventListenerInsertionIndex = _eventListeners.length; + + if (theWindow) + [theWindow sendEvent:anEvent]; +} + +@end diff --git a/Tests/CucumberTests/CPAnimationContextTest/Info.plist b/Tests/CucumberTests/CPAnimationContextTest/Info.plist new file mode 100644 index 000000000..bf0cc4942 --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPAnimationContextTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2016, Your Company All rights reserved. + + diff --git a/Tests/CucumberTests/CPAnimationContextTest/Jakefile b/Tests/CucumberTests/CPAnimationContextTest/Jakefile new file mode 100644 index 000000000..d6d64a29a --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/Jakefile @@ -0,0 +1,194 @@ +/* + * Jakefile + * CPAnimationContextTest + * + * Created by You on May 6, 2016. + * Copyright 2016, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "CPAnimationContextTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPAnimationContextTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPAnimationContextTest"); + task.setIdentifier("com.yourcompany.CPAnimationContextTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPAnimationContextTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O2"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPAnimationContextTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPAnimationContextTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} + +task ("cucumber-test", function() +{ + var SYSTEM = require("system"); + + OS.system("ln -s " + SYSTEM.prefix + "/packages/cucapp/Cucapp Cucapp") + var code = OS.system("cucumber"); + OS.system("rm -f Cucapp; rm -f cucumber.html") + OS.exit(code); +}); \ No newline at end of file diff --git a/Tests/CucumberTests/CPAnimationContextTest/Resources/MainMenu.cib b/Tests/CucumberTests/CPAnimationContextTest/Resources/MainMenu.cib new file mode 100644 index 000000000..92be8d56b --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;217E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;223E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;224E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;225E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;223E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;223E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;214E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;227E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;223E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;219E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;223E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;215E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;229E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;223E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;208E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;230E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;203E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;231E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;200E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;233E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;104E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;110E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;114E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;237E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;238E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;111E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;239E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;240E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;206E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;243E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;96E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;83E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;245E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;246E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;247E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;148E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;248E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;147E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;249E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;122E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;250E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;125E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;121E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;137E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;253E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;124E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;254E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;123E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;136E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;256E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;259E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;260E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;138E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;201E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;196E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;263E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;197E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;264E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;139E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;265E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;142E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;266E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;143E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;267E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;144E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;268E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;186E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;269E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;187E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;270E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;188E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;189E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;191E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;273E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;192E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;274E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;193E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;156E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;276E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;180E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;182E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;278E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;183E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;279E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;280E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;175E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;281E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;176E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;282E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;177E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;283E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;178E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;284E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;169E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;285E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;170E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;286E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;171E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;287E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;288E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;164E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;289E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;165E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;166E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;212E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;223E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;292E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;224E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;293E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;294E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;295E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;296E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;88E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;88E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;296E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;299E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;300E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;301E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;305E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;306E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;94E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;94E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;307E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;308E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;310E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;311E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;312E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;311E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;314E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;315E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;88E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;316E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;317E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;102E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;102E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;317E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;318E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;319E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;320E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;321E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;322E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;323E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;106E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;106E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;323E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;324E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;325E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;326E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;327E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;328E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;329E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;330E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;331E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;332E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;334E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;335E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;336E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;337E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;338E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;339E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;339E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;341E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;342E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;343E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;344E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;345E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;346E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;347E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;348E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;349E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;350E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;351E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;352E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;353E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;354E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;128E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;128E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;354E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;356E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;357E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;128E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;358E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;359E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;360E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;128E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;361E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;362E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;363E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;128E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;364E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;365E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;366E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;128E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;367E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;368E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;128E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;369E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;370E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;135E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;135E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;370E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;371E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;372E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;135E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;373E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;374E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;135E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;375E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;376E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;135E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;377E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;135E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;378E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;141E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;141E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;378E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;379E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;380E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;357E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;141E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;358E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;381E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;360E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;141E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;361E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;363E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;141E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;364E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;383E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;146E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;146E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;383E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;384E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;385E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;386E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;387E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;150E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;150E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;387E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;388E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;389E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;152E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;152E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;389E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;390E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;391E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;392E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;393E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;360E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;395E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;396E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;357E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;397E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;398E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;399E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;400E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;363E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;401E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;402E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;403E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;404E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;405E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;162E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;162E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;405E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;406E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;407E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;408E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;409E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;410E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;411E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;168E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;168E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;411E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;412E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;407E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;408E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;413E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;414E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;173E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;414E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;415E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;407E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;416E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;417E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;418E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;419E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;420E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;421E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;422E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;348E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;423E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;350E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;424E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;185E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;424E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;425E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;426E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;427E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;428E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;429E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;430E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;431E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;432E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;433E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;434E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;348E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;436E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;185E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;350E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;437E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;195E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;195E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;437E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;438E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;439E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;393E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;440E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;441E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;199E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;199E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;441E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;442E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;443E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;444E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;199E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;445E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;446E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;302E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;304E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;447E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;448E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;205E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;297E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;205E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;448E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;449E;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;450E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;205E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;451E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;298E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;207E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;452E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;453E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;454E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;455E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;456E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;366E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;441E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;210E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;209E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;458E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;458E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;459E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;462E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;211E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;210E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;463E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;464E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;210E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;466E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;467E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;457E;K;6;$afontD;K;6;CP$UIDd;3;469E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;457E;K;11;$aalignmentD;K;6;CP$UIDd;3;360E;K;7;$aimageD;K;6;CP$UIDd;3;471E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;472E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;473E;K;17;CPHuggingPriorityD;K;6;CP$UIDd;3;474E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;457E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;403E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;457E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;475E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;476E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;303E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;304E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;477E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;478E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;302E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;360E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;457E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;210E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;479E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;480E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;210E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;481E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;482E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;483E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;210E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;484E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;480E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;485E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;210E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;486E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;487E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;488E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;215E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;489E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;490E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;215E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;491E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;492E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;493E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;215E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;494E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;490E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;215E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;491E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;495E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;493E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;215E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;496E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;490E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;215E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;491E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;497E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;493E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;210E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;498E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;480E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;499E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;210E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;500E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;501E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;502E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;219E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;503E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;490E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;219E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;491E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;504E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;493E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;219E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;505E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;490E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;219E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;491E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;506E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;493E;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;219E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;457E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;507E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;490E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;219E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;460E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;491E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;461E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;461E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;508E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;304E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;493E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;509E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;208E;E;E;S;8;delegateS;8;drawViewS;14;layoutDrawViewS;10;layoutViewS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;14;runPageLayout:S;6;print:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;5;hide:S;10;terminate:S;22;hideOtherApplications:S;22;unhideAllApplications:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;10;alignLeft:S;12;alignCenter:S;15;alignJustified:S;11;alignRight:S;12;toggleRuler:S;10;copyRuler:S;11;pasteRuler:S;10;underline:S;21;orderFrontColorPanel:S;9;copyFont:S;10;pasteFont:S;9;unscript:S;12;superscript:S;10;subscript:S;14;raiseBaseline:S;14;lowerBaseline:S;21;useStandardLigatures:S;17;turnOffLigatures:S;16;useAllLigatures:S;19;useStandardKerning:S;15;turnOffKerning:S;15;tightenKerning:S;14;loosenKerning:S;5;test:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;204E;E;E;S;14;NewApplicationS;14;submenuAction:d;7;1048576S;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;E;E;S;20;About NewApplicationT;S;0;F;S;12;Preferences…S;1;,S;8;ServicesS;15;_CPServicesMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;Hide NewApplicationS;1;hS;11;Hide Othersd;7;1572864S;8;Show AllS;19;Quit NewApplicationS;1;qS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;E;E;S;3;NewS;1;nS;5;Open…S;1;oS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;107E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;4;SaveS;1;sS;8;Save As…S;1;Sd;7;1179648S;15;Revert to SavedS;13;Page Setup...S;1;PS;6;Print…S;1;pS;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;145E;E;E;S;4;UndoS;1;zS;4;RedoS;1;ZS;3;CutS;1;xS;4;CopyS;1;cS;5;PasteS;1;vS;6;DeleteS;10;Select AllS;1;aS;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;E;E;S;5;Find…d;1;1S;1;fS;9;Find Nextd;1;2S;1;gS;13;Find Previousd;1;3S;1;GS;22;Use Selection for Findd;1;7S;1;eS;17;Jump to SelectionS;1;jS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;E;E;S;14;Show Spelling…S;1;:S;14;Check SpellingS;1;;S;27;Check Spelling While TypingS;27;Check Grammar With SpellingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;E;E;S;14;Start SpeakingS;13;Stop SpeakingS;6;FormatD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;184E;E;E;S;4;FontS;11;_CPFontMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;E;E;S;10;Show FontsS;1;tS;4;BoldS;1;bS;6;ItalicS;1;iS;9;UnderlineS;1;uS;6;BiggerS;1;+S;7;Smallerd;1;4S;1;-S;4;KernD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;166E;E;E;S;11;Use DefaultS;8;Use NoneS;7;TightenS;6;LoosenS;8;LigatureD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;E;E;S;7;Use AllS;8;BaselineD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;E;E;S;11;SuperscriptS;9;SubscriptS;5;RaiseS;5;LowerS;11;Show ColorsS;1;CS;10;Copy StyleS;11;Paste StyleS;4;TextD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;E;E;S;10;Align LeftS;1;{S;6;CenterS;1;|S;7;JustifyS;11;Align RightS;1;}S;10;Show RulerS;10;Copy Rulerd;7;1310720S;11;Paste RulerS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;E;E;S;12;Show ToolbarS;18;Customize Toolbar…S;6;WindowS;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;E;E;S;8;MinimizeS;1;mS;4;ZoomS;18;Bring All to FrontS;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;206E;E;E;S;19;NewApplication HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879048192S;26;{{335, -402}, {940, 1040}}S;22;{{0, 0}, {1680, 1028}}d;1;0S;21;{{0, 0}, {940, 1040}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;219E;E;E;S;6;normalS;6;{1, 1}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{338, 13}, {122, 25}}S;19;{{0, 0}, {122, 25}}d;2;36S;6;buttonS;27;bordered+controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;468E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;510E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;475E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;302E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;304E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;302E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;470E;K;4;nameD;K;6;CP$UIDd;3;511E;K;12;defaultValueD;K;6;CP$UIDd;3;513E;K;5;stateD;K;6;CP$UIDd;3;514E;K;5;valueD;K;6;CP$UIDd;3;515E;E;S;3;runD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;10;{250, 750}d;2;-1S;15;Start Animationd;2;14d;2;12S;23;{{29, 156}, {148, 115}}S;20;{{0, 0}, {148, 115}}S;4;drawD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;8;DrawViewS;23;{{29, 288}, {148, 115}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;217E;D;K;6;CP$UIDd;3;216E;E;E;S;6;layoutD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;CustomLayoutViewS;20;{{20, 20}, {53, 43}}S;18;{{0, 0}, {53, 43}}S;7;vanillaD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;9;ColorViewS;20;{{86, 20}, {53, 43}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{48, 66}, {53, 43}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;23;{{29, 426}, {148, 115}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;220E;E;E;S;10;drawLayoutD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;CustomLayoutDrawViewS;20;{{12, 11}, {53, 43}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{84, 11}, {53, 43}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{48, 62}, {53, 43}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;13;AppControllerS;28;_CPFontSystemFacePlaceholderS;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;512E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;468E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;516E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;517E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;304E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;304E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;304E;E;S;18;.AppleSystemUIFontd;2;13E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/CucumberTests/CPAnimationContextTest/Resources/MainMenu.xib b/Tests/CucumberTests/CPAnimationContextTest/Resources/MainMenu.xib new file mode 100644 index 000000000..ce15d744e --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/Resources/MainMenu.xib @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/step_definitions/steps.rb b/Tests/CucumberTests/CPAnimationContextTest/features/step_definitions/steps.rb new file mode 100644 index 000000000..074e336fb --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/step_definitions/steps.rb @@ -0,0 +1,177 @@ +# Given the application is lauched +Given /^the application is launched$/ do + launched = app.gui.command "launched" + + if !launched + raise "The application was not launched" + end +end + +# Given I wait for n seconds +Given /^I wait for (\d+) seconds?$/ do |n| + sleep(eval("#{n.to_i}")) +end + +# When I close the popover +When /^I close the popover$/ do + step "I hit the key escape" +end + + +# When I hit the key c +When /^I hit the key (.*)$/ do |key| + step "I hit the mask none and the key #{key}" +end + + +# When I hit the mask shif and the key c +When /^I hit the mask (.*) and the key (.*)$/ do |mask, key| + simulate_keyboard_event(key, mask) +end + + +# When the keys cucapp +When /^I hit the keys (.*)$/ do |keys| + step "I hit the mask none and keys #{keys}" +end + + +# When I hit the mask shif and the keys cucapp +When /^I hit the mask (.*) and keys (.*)$/ do |mask, keys| + simulate_keyboard_event(keys, mask) +end + + +# When I select all +When /^I select all$/ do + app.gui.simulate_keyboard_event "a", [$CPCommandKeyMask] +end + + +# When I save the document +When /^I save the document$/ do + app.gui.simulate_keyboard_event "s", [$CPCommandKeyMask] +end + + +# When I (click|right click|double click) on the field with the value cucapp +When /^I (click|right click|double click) on the (\w*\-*\w*) with the value (.*)$/ do |click_type, element, value| + step "I #{click_type} on the #{element} with the property object-value set to #{value}" +end + + +# When I click on the field with the property cucapp-identifier set to cucapp-identifier-button-add +When /^I (click|right click|double click) on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |click_type, element, property, property_value| + step "I #{click_type} with the key mask none on the #{element} with the property #{property} set to #{property_value}" +end + + +# When I click with the mask shift on the field with the property cucapp-identifier set to cucapp-identifier-button-add +When /^I (click|right click|double click) with the key mask (.*) on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |click_type, mask, element, property, property_value| + + type = $mouse_left_click + + if click_type == "right click" + type = $mouse_right_click + end + + if click_type == "double click" + type = $mouse_double_click + end + + simulate_click(type, element, property, property_value, mask) +end + + +# When I do a drag and drop from the field with the value cucapp to the field with the value cappuccino +When /^I do a drag and drop from the (\w*\-*\w*) with the value (.*) to the (\w*\-*\w*) with the value (.*)$/ do |element, value, second_element, second_value| + step "I do a drag and drop from the #{element} with the property object-value set to #{value} to the #{second_element} with the property object-value set to #{second_value}" +end + + +# When I do a drag and drop from the field with the property title set to cucapp to the field with the property title set to cappuccino +When /^I do a drag and drop from the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) to the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |element, property, property_value, second_element, second_property, second_property_value| + step "I do a drag and drop with the key mask none from the #{element} with the property #{property} set to #{property_value} to the #{second_element} with the property #{second_property} set to #{second_property_value}" +end + + +# When I do a drag and drop with the key mask shift from the field with the property title set to cucapp to the field with the property title set to cappuccino +When /^I do a drag and drop with the key mask (.*) from the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) to the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |mask, element, property, property_value, second_element, second_property, second_property_value| + simulate_drag_and_drop(element, property, property_value, second_element, second_property, second_property_value, mask) +end + + +# When I vertically|horizontally scroll on the field with the value cappuccino +When /^I (vertically|horizontally) scroll on the (\w*\-*\w*) with the value (.*)$/ do |direction, element, value| + step "When I #{direction} scroll 10 times on the #{element} with the value #{value}" +end + + +# When I vertically|horizontally scroll 10 times on the field with the value cappuccino +When /^I (vertically|horizontally) scroll ([0-9]*) times on the (\w*\-*\w*) with the value (.*)$/ do |direction, times, element, value| + step "I #{direction} scroll #{times} times on the #{element} with the property object-value set to #{value}" +end + + +# When I vertically|horizontally scroll 10 times on the field with the property title set to cappuccino +When /^I (vertically|horizontally) scroll ([0-9]*) times on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |direction, times, element, property, property_value| + step "I #{direction} scroll #{times} times with the key mask none on the #{element} with the property #{property} set to #{property_value}" +end + + +# When I vertically|horizontally scroll 10 times on the field with the property title set to cappuccino +When /^I (vertically|horizontally) scroll ([0-9]*) times with the key mask (.*) on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |direction, times, mask, element, property, property_value| + + vertically = false + horizontally = false + + if direction == "vertically" + vertically = true + end + + if direction == "horizontally" + horizontally = true + end + + simulate_scroll(element, property, property_value, times, mask, horizontally, vertically) +end + + +# When I select the item name of the pop-up-button with the property cucapp-identifier set to cucappIdentifierPopUpButton +When /^I select the item (.*) of the pop-up-button with the property (\w*\-*\w*) set to (.*)$/ do |item_name, property, property_value| + select_pop_up_button_item(item_name, property, property_value) +end + + +# Then the field with the property title set to name should be focused +Then /^the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) should be focused$/ do |element, property, property_value| + app.gui.is_control_focused(create_xpath(element, property, property_value)) +end + + +# Then the field should not have a value +Then /^the (\w*\-*\w*) should not have a value$/ do |element| + step "the #{element} with the property object-value set to #{value} should have the value #{value}" +end + + +# Then the field with the property cucapp-identifier set to cucapp-identifier-textfield-description should not have a value +Then /^the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) should not have a value$/ do |element, property, property_value| + check_value_control(element, property, property_value, nil) +end + + +# Then the field should have the value cucapp +Then /^the (\w*\-*\w*) should have the value (.*)$/ do |element, value| + step "the #{element} with the property object-value set to #{value} should have the value #{value}" +end + + +# Then the field with the property cucapp-identifier set to cucapp-identifier-textfield-description should have the value cucapp +Then /^the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) should have the value (.*)$/ do |element, property, property_value, value| + check_value_control(element, property, property_value, value) +end + +Then /^the delegate property (\w*) should have the value (.*)$/ do |property, value| + check_delegate_property(property, value) +end diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/support/Cucumber+Extensions.j b/Tests/CucumberTests/CPAnimationContextTest/features/support/Cucumber+Extensions.j new file mode 100644 index 000000000..99c1b446b --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/support/Cucumber+Extensions.j @@ -0,0 +1,30 @@ +@import + +@implementation Cucumber (CuCapp) + +- (CPString)valueIsEqual:(CPArray)params +{ + var obj = cucumber_objects[params[0]], + value = params[1]; + + if (!obj) + return '{"result" : "__CUKE_ERROR__"}'; + + if ([obj respondsToSelector:@selector(stringValue)] && value === [obj stringValue]) + return '{"result" : "OK"}'; + + return '{"result" : "__CUKE_ERROR__"}'; +} + +- (CPString)delegatePropertyIsEqual:(CPArray)params +{ + var property = params[0], + value = params[1]; + + if (property == nil || value !== [[[CPApplication sharedApplication] delegate] valueForKey:property]) + return '{"result" : "__CUKE_ERROR__"}'; + + return '{"result" : "OK"}'; +} + +@end diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/support/cappuccino_mappings.rb b/Tests/CucumberTests/CPAnimationContextTest/features/support/cappuccino_mappings.rb new file mode 100644 index 000000000..fd8dfddba --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/support/cappuccino_mappings.rb @@ -0,0 +1,62 @@ +$cappuccino_control_mappings = { + "image-view-text" => "_CPImageAndTextView", + "menu-item" => "_CPMenuItemView", + "tool-bar-item" => "_CPToolbarItemView", + "box" => "CPBox", + "button" => "CPButton", + "button-bar" => "CPButtonBar", + "collection-view" => "CPCollectionView", + "combo-box" => "CPComboBox", + "control" => "CPControl", + "check-box" => "CPCheckBox", + "date-picker" => "CPDatePicker", + "image-view" => "CPImageView", + "level-indicator" => "CPLevelIndicator", + "outline-view" => "CPOutlineView", + "pop-up-button" => "CPPopUpButton", + "predicate-editor" => "CPPredicateEditor", + "radio-button" => "CPRadio", + "rule-editor" => "CPRuleEditor", + "scroller" => "CPScroller", + "scroll-view" => "CPScrollView", + "search-field" => "CPSearchField", + "secure-field" => "CPSecureTextField", + "segemented-control" => "CPSegmentedControl", + "slider" => "CPSlider", + "stepper" => "CPStepper", + "tab-view" => "CPTabView", + "table" => "CPTableView", + "field" => "CPTextField", + "token-field" => "CPTokenField", + "view" => "CPView", + "none" => nil +} + +$property_mappings = { + "cucapp-identifier" => "cucappIdentifier", + "id" => "id", + "identifier" => "identifier", + "label" => "label", + "object-value" => "objectValue", + "placeholder" => "placeholderString", + "tag" => "tag", + "title" => "title", + "text" => "text", + "none" => nil +} + +$key_mappings = { + "command" => $CPCommandKeyMask, + "shift" => $CPShiftKeyMask, + "option" => $CPAlternateKeyMask, + "control" => $CPControlKeyMask, + "delete" => $CPDeleteCharacter, + "escape" => $CPEscapeFunctionKey, + "enter" => $CPNewlineCharacter, + "left-arrow" => $CPLeftArrowFunctionKey, + "right-arrow" => $CPRightArrowFunctionKey, + "top-arrow" => $CPTopArrowFunctionKey, + "down-arrow" => $CPDownArrowFunctionKey, + "tab" => $CPTabCharacter, + "none" => nil +} \ No newline at end of file diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/support/encumber_category.rb b/Tests/CucumberTests/CPAnimationContextTest/features/support/encumber_category.rb new file mode 100644 index 000000000..5f647cbba --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/support/encumber_category.rb @@ -0,0 +1,20 @@ +module Encumber + + class GUI + def value_is_equal(xpath, value) + + if !value + value = "" + end + + result = command 'valueIsEqual', id_for_element(xpath), value + raise "Value #{value} not found" if result["result"] != "OK" + end + + def delegate_property_is_equal(property, value) + result = command 'delegatePropertyIsEqual', property, value + raise "Value #{value} not found" if result["result"] != "OK" + end + + end +end diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/support/env.rb b/Tests/CucumberTests/CPAnimationContextTest/features/support/env.rb new file mode 100644 index 000000000..949cb9b72 --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/support/env.rb @@ -0,0 +1,20 @@ +$: << File.join(File.dirname(__FILE__), '..', '..', 'Cucapp') + +require 'cucapp.rb' +require 'logger' + +module AppHelper + + def app + @app ||= Cucapp.new + end + + def log + @log ||= ENV['log'] + end + +end + +World( + AppHelper +) \ No newline at end of file diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/support/hooks.rb b/Tests/CucumberTests/CPAnimationContextTest/features/support/hooks.rb new file mode 100644 index 000000000..cb022d6e5 --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/support/hooks.rb @@ -0,0 +1,7 @@ +Before do + app.reset() +end + +After do + app.quit() +end \ No newline at end of file diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/support/steps_helpers.rb b/Tests/CucumberTests/CPAnimationContextTest/features/support/steps_helpers.rb new file mode 100644 index 000000000..311fd53bf --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/support/steps_helpers.rb @@ -0,0 +1,97 @@ + +def check_delegate_property(property, value) + app.gui.delegate_property_is_equal property, value +end + +def check_value_control(element, property, property_value, value) + xpath = create_xpath(element, property, property_value) + + app.gui.wait_for xpath + app.gui.value_is_equal xpath, value +end + +def simulate_keyboard_event(keys, mask) + app.gui.simulate_keyboard_events cappuccino_key(keys), [cappuccino_key(mask)] +end + +def simulate_click(type, element, property, property_value, mask) + xpath = create_xpath(element, property, property_value) + + app.gui.wait_for xpath + + if type == $mouse_double_click + app.gui.simulate_double_click xpath, [cappuccino_key(mask)] + elsif type == $mouse_right_click + app.gui.simulate_right_click xpath, [cappuccino_key(mask)] + else + app.gui.simulate_left_click xpath, [cappuccino_key(mask)] + end +end + +def simulate_drag_and_drop(element, property, property_value, second_element, second_property, second_property_value, mask) + + xpath1 = create_xpath(element, property, property_value) + xpath2 = create_xpath(second_element, second_property, second_property_value) + + app.gui.simulate_dragged_click_view_to_view xpath1, xpath2, [cappuccino_key(mask)] +end + +def simulate_scroll(element, property, property_value, times, mask, horizontal, vertical) + xpath = create_xpath(element, property, property_value) + delta_x = 0 + delta_y = 0 + + if horizontal + delta_x = 1 + end + + if vertical + delta_y = 1 + end + + for i in 0..times.to_i + app.gui.simulate_scroll_wheel xpath, delta_x, delta_y, [cappuccino_key(mask)] + end +end + +def select_pop_up_button_item(item_name, property, property_value) + simulate_click($mouse_left_click, "pop-up-button", property, property_value, []) + + pop_up_button_xpath = create_xpath("pop-up-button", property, property_value) + + pop_up_button_item_xpath = create_xpath("image-view-text", "text", item_name) + + while !app.gui.wait_for_element(pop_up_button_item_xpath, 0.05) && app.gui.pop_up_button_can_scroll_up(pop_up_button_xpath) + simulate_keyboard_event("up-arrow", []) + end + + while !app.gui.wait_for_element(pop_up_button_item_xpath, 0.05) && app.gui.pop_up_button_can_scroll_down(pop_up_button_xpath) + simulate_keyboard_event("down-arrow", []) + end + + if not app.gui.wait_for(pop_up_button_item_xpath) + raise "Menu item #{item_name} not found !" + end + + simulate_click($mouse_left_click, "image-view-text", "text", item_name, []) +end + +def cappuccino_key(key) + if $key_mappings.has_key?(key) + key = $key_mappings[key] + end + + return key +end + +def create_xpath(element, property, property_value) + if !$cappuccino_control_mappings.has_key?(element) + raise "Element #{element} not found in the hash cappuccino_control_mappings. You should complete the hash $cappuccino_control_mappings in env.rb" + end + + if !$property_mappings.has_key?(property) + raise "Property #{property} not found in the hash $property_mappings. You should complete the hash $property_mappings in env.rb" + end + + return "//" + $cappuccino_control_mappings[element] + "["+ $property_mappings[property] +"='#{property_value}']" +end diff --git a/Tests/CucumberTests/CPAnimationContextTest/features/test_application.feature b/Tests/CucumberTests/CPAnimationContextTest/features/test_application.feature new file mode 100644 index 000000000..d213dc4b9 --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/features/test_application.feature @@ -0,0 +1,23 @@ +Feature: Cappuccino animations +Cappuccino animations powered by css animations + + Scenario: Check if the demo application works + Given the application is launched + When I click on the button with the property identifier set to run + When I wait for 1 second + Then the delegate property passed should have the value true + When I click on the button with the property identifier set to run + When I wait for 1 second + Then the delegate property passed should have the value true + When I click on the button with the property identifier set to run + When I wait for 1 second + Then the delegate property passed should have the value true + When I click on the button with the property identifier set to run + When I wait for 1 second + Then the delegate property passed should have the value true + When I click on the button with the property identifier set to run + When I wait for 1 second + Then the delegate property passed should have the value true + When I click on the button with the property identifier set to run + When I wait for 1 second + Then the delegate property passed should have the value true diff --git a/Tests/CucumberTests/CPAnimationContextTest/index-debug.html b/Tests/CucumberTests/CPAnimationContextTest/index-debug.html new file mode 100644 index 000000000..539df851f --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/index-debug.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + CPAnimationContextTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/CucumberTests/CPAnimationContextTest/index.html b/Tests/CucumberTests/CPAnimationContextTest/index.html new file mode 100644 index 000000000..071273cd3 --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + CPAnimationContextTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/CucumberTests/CPAnimationContextTest/main.j b/Tests/CucumberTests/CPAnimationContextTest/main.j new file mode 100644 index 000000000..83c59d28f --- /dev/null +++ b/Tests/CucumberTests/CPAnimationContextTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPAnimationContextTest + * + * Created by You on May 6, 2016. + * Copyright 2016, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/CucumberTests/CPViewControllerTest/AppController.j b/Tests/CucumberTests/CPViewControllerTest/AppController.j new file mode 100644 index 000000000..ba8497c92 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/AppController.j @@ -0,0 +1,46 @@ +/* + * AppController.j + * CPViewControllerTest + * + * Created by You on May 9, 2016. + * Copyright 2016, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPViewController viewController; + BOOL isViewLoaded; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + isViewLoaded = NO; + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; +} + +- (IBAction)load:(id)sender +{ + [viewController loadViewWithCompletionHandler:function(view, error) + { + [view setBackgroundColor:[CPColor redColor]]; + [view setFrameOrigin:CGPointMake(100,100)]; + [[theWindow contentView] addSubview:view]; + }]; +} + +@end diff --git a/Tests/CucumberTests/CPViewControllerTest/CPResponder+CuCapp.j b/Tests/CucumberTests/CPViewControllerTest/CPResponder+CuCapp.j new file mode 100644 index 000000000..8b2a7a250 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/CPResponder+CuCapp.j @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2014 Nuage Networks +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + + +// Import this Categories from your application +// You can now user -(void)setCucappIdentifier: and -(CPString)cucappIdentifier +// to set and get your cucapp IDs. +// Then from a test, you can use it as a selector like //CPView[cucappIdentifier="my-button"] + +@import +@import + +@implementation CPResponder (cucappAdditions) + +- (void)setCucappIdentifier:(CPString)anIdentifier +{ + self.__cucappIdentifier = anIdentifier; +} + +- (CPString)cucappIdentifier +{ + return self.__cucappIdentifier; +} + +@end + +@implementation CPMenuItem (cucappAdditionsMenu) + +- (void)setCucappIdentifier:(CPString)anIdentifier +{ + [[self _menuItemView] setCucappIdentifier:anIdentifier]; +} + +- (CPString)cucappIdentifier +{ + [[self _menuItemView] cucappIdentifier]; +} + +@end + +function load_cucapp_CLI(path) +{ + if (!path) + path = "Cucapp/lib/Cucumber.j" + + try { + objj_importFile(path, true, function() { + [Cucumber stopCucumber]; + CPLog.debug("Cucapp CLI has been well loaded"); + _addition_cpapplication_send_event_method(); + }); + + } + catch(e) + { + [CPException raise:CPInvalidArgumentException reason:@"Invalid path for the lib Cucumber"]; + } +} + + +function load_cucapp_record(path) +{ + if (!path) + path = "CuCapp+Record.j" + + try { + objj_importFile(path, true, function() { + CPLog.debug("Cucapp record has been well loaded"); + }); + } + catch(e) + { + [CPException raise:CPInvalidArgumentException reason:@"Invalid path for the lib Cucapp+Record.j"]; + } +} diff --git a/Tests/CucumberTests/CPViewControllerTest/CuCapp+Record.j b/Tests/CucumberTests/CPViewControllerTest/CuCapp+Record.j new file mode 100644 index 000000000..5975dae5c --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/CuCapp+Record.j @@ -0,0 +1,591 @@ +@import + +function start_record(path) +{ + [CPWindow start_record]; +} + +function stop_record() +{ + [CPWindow stop_record]; +} + +function save_record(fileName) +{ + if (!fileName) + fileName = @"record" + + var eventRecords = [CPWindow eventRecords], + JSONEvents = []; + + for (var i = 0; i < [eventRecords count]; i++) + { + var eventRecord = eventRecords[i]; + [JSONEvents addObject:[eventRecord objectToJSON]]; + } + + var pom = document.createElement('a'); + pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(JSONEvents, null, 4))); + pom.setAttribute('download', fileName + ".json"); + pom.click(); +} + +function play_record(file_name, cucumber_path) +{ + if (!cucumber_path) + cucumber_path = path = "../../Cucapp/lib/Cucumber.j"; + + load_cucapp_CLI(cucumber_path); + + setTimeout(function(){ + _load_javascript_file(file_name) + },1000); +} + +function _load_javascript_file(file_name) +{ + var AJAX_req = new XMLHttpRequest(); + AJAX_req.open( "GET", file_name, true ); + AJAX_req.setRequestHeader("Content-type", "application/json"); + + AJAX_req.onreadystatechange = function() + { + if (AJAX_req.readyState == 4) + { + var recordingEvents = JSON.parse(AJAX_req.responseText); + + for (var i = 0; i < [recordingEvents count]; i++) + { + var recordingEvent = JSON.parse(recordingEvents[i]), + type = recordingEvent["event"]["type"]; + + if (type == CPLeftMouseDown && i < [recordingEvents count] - 1) + { + var nextRecordingEvent = JSON.parse(recordingEvents[i + 1]), + nextType = nextRecordingEvent["event"]["type"]; + + if (nextType == CPMouseMoved) + { + for (var j = i; j < [recordingEvents count]; j++) + { + var tmpRecordingEvent = JSON.parse(recordingEvents[j]), + tmpType = tmpRecordingEvent["event"]["type"]; + + if (tmpType == CPLeftMouseUp) + { + setTimeout(_simulate_drag_event, recordingEvent["event"]["timestamp"] * 1000, recordingEvent, tmpRecordingEvent); + i = j; + break; + } + } + + continue; + } + } + + setTimeout(_simulate_event, recordingEvent["event"]["timestamp"] * 1000, recordingEvent); + } + } + } + + AJAX_req.send(); +} + +function _simulate_drag_event(event1, event2) +{ + var keyView1 = event1["keyView"], + valueView1 = event1["valueView"], + keyView2 = event2["keyView"], + valueView2 = event2["valueView"], + locationInWindow1 = CGPointMake(event1["event"]["locationInWindow"]["x"], event1["event"]["locationInWindow"]["y"]); + locationInWindow2 = CGPointMake(event2["event"]["locationInWindow"]["x"], event2["event"]["locationInWindow"]["y"]); + + if (keyView1 && valueView1 && keyView2 && valueView2) + simulate_dragged_click_view_to_view(keyView1, valueView1, keyView2, valueView2); + else if (keyView1 && valueView1) + simulate_dragged_click_view_to_point(keyView1, valueView1, locationInWindow1.x, locationInWindow1.y); + else + simulate_dragged_click_point_to_point(locationInWindow1.x, locationInWindow1.y, locationInWindow2.x, locationInWindow2.y); +} + +function _simulate_event(event) +{ + var type = event["event"]["type"], + keyView = event["keyView"], + valueView = event["valueView"], + characters = event["event"]["characters"], + deltaX = event["event"]["deltaX"], + deltaY = event["event"]["deltaY"], + deltaZ = event["event"]["deltaZ"], + deltaZ = event["event"]["deltaZ"], + locationInWindow = CGPointMake(event["event"]["locationInWindow"]["x"], event["event"]["locationInWindow"]["y"]); + + switch (type) + { + case CPScrollWheel: + + if (keyView && valueView) + simulate_scroll_wheel_on_view(keyView, valueView, deltaX, deltaY) + + break; + + case CPLeftMouseDown: + + if (keyView && valueView) + simulate_left_click_on_view(keyView, valueView); + else + simulate_left_click_on_point(locationInWindow.x, locationInWindow.y) + + break; + + case CPRightMouseDown: + + if (keyView && valueView) + simulate_right_click_on_view(keyView, valueView); + else + simulate_right_click_on_point(locationInWindow.x, locationInWindow.y) + + break; + + case CPKeyDown: + simulate_keyboard_event(characters); + break; + } +} + + +var eventRecords, + recording = NO; + +@implementation CPWindow (cucappRecord) + ++ (CPArray)eventRecords +{ + return eventRecords; +} + ++ (void)start_record +{ + eventRecords = []; + recording = YES; +} + ++ (void)stop_record +{ + recording = NO; +} + +/*! + Dispatches events that are sent to it from CPApplication. + @param anEvent the event to be dispatched +*/ +- (void)sendEvent:(CPEvent)anEvent +{ + var type = [anEvent type], + sheet = [self attachedSheet], + recordingEvent = [[RecordingEvent alloc] initWithEvent:anEvent]; + + if (recordingEvent && type != CPFlagsChanged && type != CPMouseMoved) + [eventRecords addObject:recordingEvent]; + + // If a sheet is attached events get filtered here. + // It is not clear what events should be passed to the view, perhaps all? + // CPLeftMouseDown is needed for window moving and resizing to work. + // CPMouseMoved is needed for rollover effects on title bar buttons. + + if (sheet) + { + switch (type) + { + case CPLeftMouseDown: + + // This is needed when a doubleClick occurs when the sheet is closing or opening + if (!_parentWindow) + return; + + [recordingEvent setView:_windowView]; + + [_windowView mouseDown:anEvent]; + + // -dw- if the window is clicked, the sheet should come to front, and become key, + // and the window should be immediately behind + [sheet makeKeyAndOrderFront:self]; + + return; + + case CPMouseMoved: + // Allow these through to the parent + break; + + default: + // Everything else is filtered + return; + } + } + + var point = [anEvent locationInWindow]; + + switch (type) + { + case CPFlagsChanged: + return [[self firstResponder] flagsChanged:anEvent]; + + case CPKeyUp: + return [[self firstResponder] keyUp:anEvent]; + + case CPKeyDown: + if ([anEvent charactersIgnoringModifiers] === CPTabCharacter) + { + if ([anEvent modifierFlags] & CPShiftKeyMask) + [self selectPreviousKeyView:self]; + else + [self selectNextKeyView:self]; + + // Make sure the browser doesn't try to do its own tab handling. + // This is important or the browser might blur the shared text field or token field input field, + // even that we just moved it to a new first responder. + [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:NO] + return; + } + else if ([anEvent charactersIgnoringModifiers] === CPBackTabCharacter) + { + var didTabBack = [self selectPreviousKeyView:self]; + + if (didTabBack) + { + // Make sure the browser doesn't try to do its own tab handling. + // This is important or the browser might blur the shared text field or token field input field, + // even that we just moved it to a new first responder. + [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:NO] + } + return didTabBack; + } + else if ([anEvent charactersIgnoringModifiers] == CPEscapeFunctionKey && [self _processKeyboardUIKey:anEvent]) + { + return; + } + + [[self firstResponder] keyDown:anEvent]; + + // Trigger the default button if needed + // FIXME: Is this only applicable in a sheet? See isse: #722. + if (![self disableKeyEquivalentForDefaultButton]) + { + var defaultButton = [self defaultButton], + keyEquivalent = [defaultButton keyEquivalent], + modifierMask = [defaultButton keyEquivalentModifierMask]; + + if ([anEvent _triggersKeyEquivalent:keyEquivalent withModifierMask:modifierMask]) + [[self defaultButton] performClick:self]; + } + + return; + + case CPScrollWheel: + [recordingEvent setView:[_windowView hitTest:point]]; + + return [[_windowView hitTest:point] scrollWheel:anEvent]; + + case CPLeftMouseUp: + case CPRightMouseUp: + var hitTestedView = _leftMouseDownView, + selector = type == CPRightMouseUp ? @selector(rightMouseUp:) : @selector(mouseUp:); + + if (!hitTestedView) + hitTestedView = [_windowView hitTest:point]; + + [recordingEvent setView:hitTestedView]; + + [hitTestedView performSelector:selector withObject:anEvent]; + + _leftMouseDownView = nil; + + return; + + case CPLeftMouseDown: + case CPRightMouseDown: + // This will return _windowView if it is within a resize region + _leftMouseDownView = [_windowView hitTest:point]; + + [recordingEvent setView:_leftMouseDownView]; + + if (_leftMouseDownView !== _firstResponder && [_leftMouseDownView acceptsFirstResponder]) + [self makeFirstResponder:_leftMouseDownView]; + + [CPApp activateIgnoringOtherApps:YES]; + + var theWindow = [anEvent window], + selector = type == CPRightMouseDown ? @selector(rightMouseDown:) : @selector(mouseDown:); + + if ([theWindow isKeyWindow] || ([theWindow becomesKeyOnlyIfNeeded] && ![_leftMouseDownView needsPanelToBecomeKey])) + return [_leftMouseDownView performSelector:selector withObject:anEvent]; + else + { + // FIXME: delayed ordering? + [self makeKeyAndOrderFront:self]; + + if ([_leftMouseDownView acceptsFirstMouse:anEvent]) + return [_leftMouseDownView performSelector:selector withObject:anEvent]; + } + break; + + case CPLeftMouseDragged: + case CPRightMouseDragged: + if (!_leftMouseDownView) + { + [recordingEvent setView:[_windowView hitTest:point]]; + return [[_windowView hitTest:point] mouseDragged:anEvent]; + } + + [recordingEvent setView:_leftMouseDownView]; + + var selector; + + if (type == CPRightMouseDragged) + { + selector = @selector(rightMouseDragged:) + if (![_leftMouseDownView respondsToSelector:selector]) + selector = nil; + } + + if (!selector) + selector = @selector(mouseDragged:) + + return [_leftMouseDownView performSelector:selector withObject:anEvent]; + + case CPMouseMoved: + [_windowView setCursorForLocation:point resizing:NO]; + + // Ignore mouse moves for parents of sheets + if (!_acceptsMouseMovedEvents || sheet) + return; + + if (!_mouseEnteredStack) + _mouseEnteredStack = []; + + var hitTestView = [_windowView hitTest:point]; + + if ([_mouseEnteredStack count] && [_mouseEnteredStack lastObject] === hitTestView) + return [hitTestView mouseMoved:anEvent]; + + var view = hitTestView, + mouseEnteredStack = []; + + while (view) + { + mouseEnteredStack.unshift(view); + + view = [view superview]; + } + + var deviation = MIN(_mouseEnteredStack.length, mouseEnteredStack.length); + + while (deviation--) + if (_mouseEnteredStack[deviation] === mouseEnteredStack[deviation]) + break; + + var index = deviation + 1, + count = _mouseEnteredStack.length; + + if (index < count) + { + var event = [CPEvent mouseEventWithType:CPMouseExited location:point modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]; + + for (; index < count; ++index) + [_mouseEnteredStack[index] mouseExited:event]; + } + + index = deviation + 1; + count = mouseEnteredStack.length; + + if (index < count) + { + var event = [CPEvent mouseEventWithType:CPMouseEntered location:point modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]; + + for (; index < count; ++index) + [mouseEnteredStack[index] mouseEntered:event]; + } + + _mouseEnteredStack = mouseEnteredStack; + + [hitTestView mouseMoved:anEvent]; + } +} + +@end + + +@implementation RecordingEvent : CPObject +{ + CPEvent _event @accessors(property=event); + CPString _keyView @accessors(property=keyView); + CPString _valueView @accessors(property=valueView); + CGPoint _offsetView @accessors(property=offsetView); + int _offsetXPercentage @accessors(property=offsetXPercentage); + int _offsetYPercentage @accessors(property=offsetYPercentage); +} + +- (id)initWithEvent:(CPEvent)anEvent +{ + if (self = [super init]) + { + _event = anEvent; + _offsetView = CGPointMakeZero(); + _keyView = @""; + _valueView = @""; + } + + return self; +} + +- (void)setView:(CPView)aView +{ + if ([aView respondsToSelector:@selector(cucappIdentifier)]) + { + _keyView = @"cucappIdentifier"; + _valueView = [aView cucappIdentifier]; + } + else if ([aView respondsToSelector:@selector(identifier)]) + { + _keyView = @"identifier"; + _valueView = [aView identifier]; + } + else if ([aView respondsToSelector:@selector(title)]) + { + _keyView = @"title"; + _valueView = [aView title]; + } + else if ([aView respondsToSelector:@selector(placeholderString)]) + { + _keyView = @"placeholderString"; + _valueView = [aView placeholderString]; + } + else if ([aView respondsToSelector:@selector(text)]) + { + _keyView = @"text"; + _valueView = [aView text]; + } + else if ([aView respondsToSelector:@selector(tag)]) + { + _keyView = @"tag"; + _valueView = [aView tag]; + } + else if ([aView respondsToSelector:@selector(label)]) + { + _keyView = @"label"; + _valueView = [aView label]; + } + else if ([aView respondsToSelector:@selector(objectValue)]) + { + _keyView = @"objectValue"; + _valueView = [aView objectValue]; + } + + var globalPoint = [[aView superview] convertPointToBase:[aView frameOrigin]], + globalEventPoint = [_event locationInWindow]; + + _offsetView = CGPointMake(globalEventPoint.x - globalPoint.x, globalEventPoint.y - globalPoint.y); + + _offsetXPercentage = _offsetView.x * 100 / [aView frameSize].width; + _offsetYPercentage = _offsetView.y * 100 / [aView frameSize].height; +} + +- (CPString)objectToJSON +{ + var json = {}; + + json["keyView"] = _keyView; + json["valueView"] = _valueView; + json["offsetXPercentage"] = _offsetXPercentage; + json["offsetYPercentage"] = _offsetYPercentage; + json["offsetView"] = {"x" : _offsetView.x, "y" : _offsetView.y}; + + var event = {}; + event["type"] = [_event type]; + event["deltaX"] = [_event deltaX]; + event["deltaY"] = [_event deltaY]; + event["deltaZ"] = [_event deltaZ]; + event["characters"] = [_event characters]; + event["charactersIgnoringModifiers"] = [_event charactersIgnoringModifiers]; + event["clickCount"] = [_event clickCount]; + event["modifierFlags"] = [_event modifierFlags]; + event["locationInWindow"] = {"x" : [_event locationInWindow].x, "y" : [_event locationInWindow].y}; + event["keyCode"] = [_event keyCode]; + event["timestamp"] = [_event timestamp]; + + json["event"] = event; + + return JSON.stringify(json, null, 4); +} + +@end + + +@implementation CPApplication (cucappRecord) + +/*! + Dispatches events to other objects. + @param anEvent the event to dispatch +*/ +- (void)sendEvent:(CPEvent)anEvent +{ + _currentEvent = anEvent; + CPEventModifierFlags = [anEvent modifierFlags]; + + var theWindow = [anEvent window]; + + // Check if this is a candidate for key equivalent... + if ([anEvent _couldBeKeyEquivalent] && [self _handleKeyEquivalent:anEvent]) + // The key equivalent was handled. + return; + + if ([anEvent type] == CPMouseMoved) + { + if (theWindow !== _lastMouseMoveWindow) + [_lastMouseMoveWindow _mouseExitedResizeRect]; + + _lastMouseMoveWindow = theWindow; + } + + /* + Event listeners are processed from back to front so that newer event listeners normally take + precedence. If during the execution of a callback a new event listener is added, it should + be inserted after the current callback but before any higher priority callbacks. This makes + repeating event listeners (those that reinsert themselves) stable relative to each other. + */ + for (var i = _eventListeners.length - 1; i >= 0; i--) + { + var listener = _eventListeners[i]; + + if (listener._mask & (1 << [anEvent type])) + { + _eventListeners.splice(i, 1); + // In case the callback wants to add more listeners. + _eventListenerInsertionIndex = i; + listener._callback(anEvent); + + var type = [anEvent type], + recordingEvent = [[RecordingEvent alloc] initWithEvent:anEvent]; + + if (recordingEvent && type != CPFlagsChanged && type != CPMouseMoved) + [eventRecords addObject:recordingEvent]; + + if (theWindow) + [recordingEvent setView:[theWindow._windowView hitTest:[anEvent locationInWindow]]]; + + if (listener._dequeue) + { + // Don't process the event normally and don't send it to any other listener. + _eventListenerInsertionIndex = _eventListeners.length; + return; + } + } + } + + _eventListenerInsertionIndex = _eventListeners.length; + + if (theWindow) + [theWindow sendEvent:anEvent]; +} + +@end diff --git a/Tests/CucumberTests/CPViewControllerTest/Info.plist b/Tests/CucumberTests/CPViewControllerTest/Info.plist new file mode 100644 index 000000000..b1c37d97c --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPViewControllerTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2016, Your Company All rights reserved. + + diff --git a/Tests/CucumberTests/CPViewControllerTest/Jakefile b/Tests/CucumberTests/CPViewControllerTest/Jakefile new file mode 100644 index 000000000..a74e8bd3f --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/Jakefile @@ -0,0 +1,194 @@ +/* + * Jakefile + * CPViewControllerTest + * + * Created by You on May 9, 2016. + * Copyright 2016, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "CPViewControllerTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPViewControllerTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPViewControllerTest"); + task.setIdentifier("com.yourcompany.CPViewControllerTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPViewControllerTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O2"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPViewControllerTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPViewControllerTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} + +task ("cucumber-test", function() +{ + var SYSTEM = require("system"); + + OS.system("ln -s " + SYSTEM.prefix + "/packages/cucapp/Cucapp Cucapp") + var code = OS.system("cucumber"); + OS.system("rm -f Cucapp; rm -f cucumber.html") + OS.exit(code); +}); \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/Resources/MainMenu.cib b/Tests/CucumberTests/CPViewControllerTest/Resources/MainMenu.cib new file mode 100644 index 000000000..a547b2801 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;37E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;38E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;32E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;39E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;25E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;40E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;41E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;36E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;32E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;31E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;36E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;45E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;46E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;48E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;37E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;49E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;50E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;51E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;52E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;53E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;54E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;55E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;27E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;56E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;57E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;57E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;58E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;59E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;60E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;60E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;61E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;62E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;56E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;63E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;64E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;65E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;66E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;67E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;56E;K;6;$afontD;K;6;CP$UIDd;2;69E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;56E;K;11;$aalignmentD;K;6;CP$UIDd;2;70E;K;7;$aimageD;K;6;CP$UIDd;2;72E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;2;73E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;60E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;60E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;61E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;74E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;56E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;56E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;76E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;77E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;78E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;61E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;79E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;56E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;80E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;70E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;56E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;56E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;81E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;82E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;65E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;83E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;6;$afontD;K;6;CP$UIDd;2;85E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;70E;K;11;$aalignmentD;K;6;CP$UIDd;2;75E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;60E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;60E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;61E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;87E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;80E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;88E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;56E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;76E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;61E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;61E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;61E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;90E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;70E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;75E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;61E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;61E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;91E;E;D;K;10;$classnameS;16;CPViewControllerK;8;$classesA;S;16;CPViewControllerS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;23;CPViewControllerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPViewControllerTitleKeyD;K;6;CP$UIDd;1;0E;K;26;CPViewControllerCibNameKeyD;K;6;CP$UIDd;2;92E;K;25;CPViewControllerBundleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;2;93E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;2;80E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;2;61E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;2;61E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;2;61E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;2;95E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;E;E;S;8;delegateS;9;theWindowS;14;viewControllerS;7;contentS;5;load:S;44;displayPatternValue1: selection.isViewLoadedS;20;displayPatternValue1S;22;selection.isViewLoadedD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;47E;K;10;CP.objectsD;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;2;96E;K;16;CPDisplayPatternD;K;6;CP$UIDd;2;97E;E;E;S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879048192S;24;{{335, 128}, {480, 360}}S;21;{{0, 0}, {1440, 878}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;E;E;S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{26, 20}, {58, 25}}S;18;{{0, 0}, {58, 25}}d;2;36S;6;buttonS;27;bordered+controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;68E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;98E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;76E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;61E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;d;1;2D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;4;nameD;K;6;CP$UIDd;2;99E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;5;stateD;K;6;CP$UIDd;3;102E;K;5;valueD;K;6;CP$UIDd;3;103E;E;S;4;loadD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;4d;2;-1S;4;LoadS;0;d;2;14T;S;22;{{101, 20}, {159, 21}}S;19;{{0, 0}, {159, 21}}S;9;textfieldS;18;controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;2;68E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;98E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;104E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;61E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;61E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;S;6;resultD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;13;isViewLoaded=D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;89E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;106E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;59E;E;S;13;AppControllerS;14;ViewControllerS;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;2;NOS;23;isViewLoaded=%{value1}@S;28;_CPFontSystemFacePlaceholderS;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;100E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;2;68E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;107E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;108E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;61E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;61E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;61E;E;d;2;17D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;E;E;S;5;colorS;18;.AppleSystemUIFontd;2;13f;18;0.6862745098039216d;1;1E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/Resources/MainMenu.xib b/Tests/CucumberTests/CPViewControllerTest/Resources/MainMenu.xib new file mode 100644 index 000000000..3c0c28991 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/Resources/MainMenu.xib @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + isViewLoaded=%{value1}@ + NO + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/CucumberTests/CPViewControllerTest/Resources/ViewController.cib b/Tests/CucumberTests/CPViewControllerTest/Resources/ViewController.cib new file mode 100644 index 000000000..45f5c8599 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/Resources/ViewController.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;19E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;20E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;18E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;21E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;22E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;24E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;25E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;26E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;27E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;27E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;28E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;29E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;2;30E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;2;31E;E;S;16;CPViewControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;viewS;13;CPApplicationd;1;0S;20;{{0, 0}, {480, 272}}d;2;12S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;NSViewS;6;CPViewE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/Resources/ViewController.xib b/Tests/CucumberTests/CPViewControllerTest/Resources/ViewController.xib new file mode 100644 index 000000000..d3c693d46 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/Resources/ViewController.xib @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Tests/CucumberTests/CPViewControllerTest/features/step_definitions/steps.rb b/Tests/CucumberTests/CPViewControllerTest/features/step_definitions/steps.rb new file mode 100644 index 000000000..ca318f6ea --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/step_definitions/steps.rb @@ -0,0 +1,173 @@ +# Given the application is lauched +Given /^the application is launched$/ do + launched = app.gui.command "launched" + + if !launched + raise "The application was not launched" + end +end + +# Given I wait for n seconds +Given /^I wait for (\d+) seconds?$/ do |n| + sleep(eval("#{n.to_i}")) +end + +# When I close the popover +When /^I close the popover$/ do + step "I hit the key escape" +end + + +# When I hit the key c +When /^I hit the key (.*)$/ do |key| + step "I hit the mask none and the key #{key}" +end + + +# When I hit the mask shif and the key c +When /^I hit the mask (.*) and the key (.*)$/ do |mask, key| + simulate_keyboard_event(key, mask) +end + + +# When the keys cucapp +When /^I hit the keys (.*)$/ do |keys| + step "I hit the mask none and keys #{keys}" +end + + +# When I hit the mask shif and the keys cucapp +When /^I hit the mask (.*) and keys (.*)$/ do |mask, keys| + simulate_keyboard_event(keys, mask) +end + + +# When I select all +When /^I select all$/ do + app.gui.simulate_keyboard_event "a", [$CPCommandKeyMask] +end + + +# When I save the document +When /^I save the document$/ do + app.gui.simulate_keyboard_event "s", [$CPCommandKeyMask] +end + + +# When I (click|right click|double click) on the field with the value cucapp +When /^I (click|right click|double click) on the (\w*\-*\w*) with the value (.*)$/ do |click_type, element, value| + step "I #{click_type} on the #{element} with the property object-value set to #{value}" +end + + +# When I click on the field with the property cucapp-identifier set to cucapp-identifier-button-add +When /^I (click|right click|double click) on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |click_type, element, property, property_value| + step "I #{click_type} with the key mask none on the #{element} with the property #{property} set to #{property_value}" +end + + +# When I click with the mask shift on the field with the property cucapp-identifier set to cucapp-identifier-button-add +When /^I (click|right click|double click) with the key mask (.*) on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |click_type, mask, element, property, property_value| + + type = $mouse_left_click + + if click_type == "right click" + type = $mouse_right_click + end + + if click_type == "double click" + type = $mouse_double_click + end + + simulate_click(type, element, property, property_value, mask) +end + + +# When I do a drag and drop from the field with the value cucapp to the field with the value cappuccino +When /^I do a drag and drop from the (\w*\-*\w*) with the value (.*) to the (\w*\-*\w*) with the value (.*)$/ do |element, value, second_element, second_value| + step "I do a drag and drop from the #{element} with the property object-value set to #{value} to the #{second_element} with the property object-value set to #{second_value}" +end + + +# When I do a drag and drop from the field with the property title set to cucapp to the field with the property title set to cappuccino +When /^I do a drag and drop from the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) to the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |element, property, property_value, second_element, second_property, second_property_value| + step "I do a drag and drop with the key mask none from the #{element} with the property #{property} set to #{property_value} to the #{second_element} with the property #{second_property} set to #{second_property_value}" +end + + +# When I do a drag and drop with the key mask shift from the field with the property title set to cucapp to the field with the property title set to cappuccino +When /^I do a drag and drop with the key mask (.*) from the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) to the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |mask, element, property, property_value, second_element, second_property, second_property_value| + simulate_drag_and_drop(element, property, property_value, second_element, second_property, second_property_value, mask) +end + + +# When I vertically|horizontally scroll on the field with the value cappuccino +When /^I (vertically|horizontally) scroll on the (\w*\-*\w*) with the value (.*)$/ do |direction, element, value| + step "When I #{direction} scroll 10 times on the #{element} with the value #{value}" +end + + +# When I vertically|horizontally scroll 10 times on the field with the value cappuccino +When /^I (vertically|horizontally) scroll ([0-9]*) times on the (\w*\-*\w*) with the value (.*)$/ do |direction, times, element, value| + step "I #{direction} scroll #{times} times on the #{element} with the property object-value set to #{value}" +end + + +# When I vertically|horizontally scroll 10 times on the field with the property title set to cappuccino +When /^I (vertically|horizontally) scroll ([0-9]*) times on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |direction, times, element, property, property_value| + step "I #{direction} scroll #{times} times with the key mask none on the #{element} with the property #{property} set to #{property_value}" +end + + +# When I vertically|horizontally scroll 10 times on the field with the property title set to cappuccino +When /^I (vertically|horizontally) scroll ([0-9]*) times with the key mask (.*) on the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*)$/ do |direction, times, mask, element, property, property_value| + + vertically = false + horizontally = false + + if direction == "vertically" + vertically = true + end + + if direction == "horizontally" + horizontally = true + end + + simulate_scroll(element, property, property_value, times, mask, horizontally, vertically) +end + + +# When I select the item name of the pop-up-button with the property cucapp-identifier set to cucappIdentifierPopUpButton +When /^I select the item (.*) of the pop-up-button with the property (\w*\-*\w*) set to (.*)$/ do |item_name, property, property_value| + select_pop_up_button_item(item_name, property, property_value) +end + + +# Then the field with the property title set to name should be focused +Then /^the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) should be focused$/ do |element, property, property_value| + app.gui.is_control_focused(create_xpath(element, property, property_value)) +end + + +# Then the field should not have a value +Then /^the (\w*\-*\w*) should not have a value$/ do |element| + step "the #{element} with the property object-value set to #{value} should have the value #{value}" +end + + +# Then the field with the property cucapp-identifier set to cucapp-identifier-textfield-description should not have a value +Then /^the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) should not have a value$/ do |element, property, property_value| + check_value_control(element, property, property_value, nil) +end + + +# Then the field should have the value cucapp +Then /^the (\w*\-*\w*) should have the value (.*)$/ do |element, value| + step "the #{element} with the property object-value set to #{value} should have the value #{value}" +end + + +# Then the field with the property cucapp-identifier set to cucapp-identifier-textfield-description should have the value cucapp +Then /^the (\w*\-*\w*) with the property (\w*\-*\w*) set to (.*) should have the value (.*)$/ do |element, property, property_value, value| + check_value_control(element, property, property_value, value) +end diff --git a/Tests/CucumberTests/CPViewControllerTest/features/support/Cucumber+Extensions.j b/Tests/CucumberTests/CPViewControllerTest/features/support/Cucumber+Extensions.j new file mode 100644 index 000000000..6c0c74363 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/support/Cucumber+Extensions.j @@ -0,0 +1,19 @@ +@import + +@implementation Cucumber (CuCapp) + +- (CPString)valueIsEqual:(CPArray)params +{ + var obj = cucumber_objects[params[0]], + value = params[1]; + + if (!obj) + return '{"result" : "__CUKE_ERROR__"}'; + + if ([obj respondsToSelector:@selector(stringValue)] && value === [obj stringValue]) + return '{"result" : "OK"}'; + + return '{"result" : "__CUKE_ERROR__"}'; +} + +@end \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/features/support/cappuccino_mappings.rb b/Tests/CucumberTests/CPViewControllerTest/features/support/cappuccino_mappings.rb new file mode 100644 index 000000000..fd8dfddba --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/support/cappuccino_mappings.rb @@ -0,0 +1,62 @@ +$cappuccino_control_mappings = { + "image-view-text" => "_CPImageAndTextView", + "menu-item" => "_CPMenuItemView", + "tool-bar-item" => "_CPToolbarItemView", + "box" => "CPBox", + "button" => "CPButton", + "button-bar" => "CPButtonBar", + "collection-view" => "CPCollectionView", + "combo-box" => "CPComboBox", + "control" => "CPControl", + "check-box" => "CPCheckBox", + "date-picker" => "CPDatePicker", + "image-view" => "CPImageView", + "level-indicator" => "CPLevelIndicator", + "outline-view" => "CPOutlineView", + "pop-up-button" => "CPPopUpButton", + "predicate-editor" => "CPPredicateEditor", + "radio-button" => "CPRadio", + "rule-editor" => "CPRuleEditor", + "scroller" => "CPScroller", + "scroll-view" => "CPScrollView", + "search-field" => "CPSearchField", + "secure-field" => "CPSecureTextField", + "segemented-control" => "CPSegmentedControl", + "slider" => "CPSlider", + "stepper" => "CPStepper", + "tab-view" => "CPTabView", + "table" => "CPTableView", + "field" => "CPTextField", + "token-field" => "CPTokenField", + "view" => "CPView", + "none" => nil +} + +$property_mappings = { + "cucapp-identifier" => "cucappIdentifier", + "id" => "id", + "identifier" => "identifier", + "label" => "label", + "object-value" => "objectValue", + "placeholder" => "placeholderString", + "tag" => "tag", + "title" => "title", + "text" => "text", + "none" => nil +} + +$key_mappings = { + "command" => $CPCommandKeyMask, + "shift" => $CPShiftKeyMask, + "option" => $CPAlternateKeyMask, + "control" => $CPControlKeyMask, + "delete" => $CPDeleteCharacter, + "escape" => $CPEscapeFunctionKey, + "enter" => $CPNewlineCharacter, + "left-arrow" => $CPLeftArrowFunctionKey, + "right-arrow" => $CPRightArrowFunctionKey, + "top-arrow" => $CPTopArrowFunctionKey, + "down-arrow" => $CPDownArrowFunctionKey, + "tab" => $CPTabCharacter, + "none" => nil +} \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/features/support/encumber_category.rb b/Tests/CucumberTests/CPViewControllerTest/features/support/encumber_category.rb new file mode 100644 index 000000000..985d40100 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/support/encumber_category.rb @@ -0,0 +1,14 @@ +module Encumber + + class GUI + def value_is_equal(xpath, value) + + if !value + value = "" + end + + result = command 'valueIsEqual', id_for_element(xpath), value + raise "Value #{value} not found" if result["result"] != "OK" + end + end +end \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/features/support/env.rb b/Tests/CucumberTests/CPViewControllerTest/features/support/env.rb new file mode 100644 index 000000000..949cb9b72 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/support/env.rb @@ -0,0 +1,20 @@ +$: << File.join(File.dirname(__FILE__), '..', '..', 'Cucapp') + +require 'cucapp.rb' +require 'logger' + +module AppHelper + + def app + @app ||= Cucapp.new + end + + def log + @log ||= ENV['log'] + end + +end + +World( + AppHelper +) \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/features/support/hooks.rb b/Tests/CucumberTests/CPViewControllerTest/features/support/hooks.rb new file mode 100644 index 000000000..cb022d6e5 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/support/hooks.rb @@ -0,0 +1,7 @@ +Before do + app.reset() +end + +After do + app.quit() +end \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/features/support/steps_helpers.rb b/Tests/CucumberTests/CPViewControllerTest/features/support/steps_helpers.rb new file mode 100644 index 000000000..701df0cb6 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/support/steps_helpers.rb @@ -0,0 +1,92 @@ +def check_value_control(element, property, property_value, value) + xpath = create_xpath(element, property, property_value) + + app.gui.wait_for xpath + app.gui.value_is_equal xpath, value +end + +def simulate_keyboard_event(keys, mask) + app.gui.simulate_keyboard_events cappuccino_key(keys), [cappuccino_key(mask)] +end + +def simulate_click(type, element, property, property_value, mask) + xpath = create_xpath(element, property, property_value) + + app.gui.wait_for xpath + + if type == $mouse_double_click + app.gui.simulate_double_click xpath, [cappuccino_key(mask)] + elsif type == $mouse_right_click + app.gui.simulate_right_click xpath, [cappuccino_key(mask)] + else + app.gui.simulate_left_click xpath, [cappuccino_key(mask)] + end +end + +def simulate_drag_and_drop(element, property, property_value, second_element, second_property, second_property_value, mask) + + xpath1 = create_xpath(element, property, property_value) + xpath2 = create_xpath(second_element, second_property, second_property_value) + + app.gui.simulate_dragged_click_view_to_view xpath1, xpath2, [cappuccino_key(mask)] +end + +def simulate_scroll(element, property, property_value, times, mask, horizontal, vertical) + xpath = create_xpath(element, property, property_value) + delta_x = 0 + delta_y = 0 + + if horizontal + delta_x = 1 + end + + if vertical + delta_y = 1 + end + + for i in 0..times.to_i + app.gui.simulate_scroll_wheel xpath, delta_x, delta_y, [cappuccino_key(mask)] + end +end + +def select_pop_up_button_item(item_name, property, property_value) + simulate_click($mouse_left_click, "pop-up-button", property, property_value, []) + + pop_up_button_xpath = create_xpath("pop-up-button", property, property_value) + + pop_up_button_item_xpath = create_xpath("image-view-text", "text", item_name) + + while !app.gui.wait_for_element(pop_up_button_item_xpath, 0.05) && app.gui.pop_up_button_can_scroll_up(pop_up_button_xpath) + simulate_keyboard_event("up-arrow", []) + end + + while !app.gui.wait_for_element(pop_up_button_item_xpath, 0.05) && app.gui.pop_up_button_can_scroll_down(pop_up_button_xpath) + simulate_keyboard_event("down-arrow", []) + end + + if not app.gui.wait_for(pop_up_button_item_xpath) + raise "Menu item #{item_name} not found !" + end + + simulate_click($mouse_left_click, "image-view-text", "text", item_name, []) +end + +def cappuccino_key(key) + if $key_mappings.has_key?(key) + key = $key_mappings[key] + end + + return key +end + +def create_xpath(element, property, property_value) + if !$cappuccino_control_mappings.has_key?(element) + raise "Element #{element} not found in the hash cappuccino_control_mappings. You should complete the hash $cappuccino_control_mappings in env.rb" + end + + if !$property_mappings.has_key?(property) + raise "Property #{property} not found in the hash $property_mappings. You should complete the hash $property_mappings in env.rb" + end + + return "//" + $cappuccino_control_mappings[element] + "["+ $property_mappings[property] +"='#{property_value}']" +end \ No newline at end of file diff --git a/Tests/CucumberTests/CPViewControllerTest/features/test_application.feature b/Tests/CucumberTests/CPViewControllerTest/features/test_application.feature new file mode 100644 index 000000000..13b4d5128 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/features/test_application.feature @@ -0,0 +1,8 @@ +Feature: Test the CPViewController asynchronous loading +This test is used to make sure that the isViewLoaded property is true when the loading has ended. + + Scenario: Check if the application is launched + Given the application is launched + When I click on the button with the property identifier set to load + Given I wait for 1 second + Then the field with the property identifier set to result should have the value isViewLoaded=true diff --git a/Tests/CucumberTests/CPViewControllerTest/index-debug.html b/Tests/CucumberTests/CPViewControllerTest/index-debug.html new file mode 100644 index 000000000..a63afc525 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/index-debug.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + CPViewControllerTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/CucumberTests/CPViewControllerTest/index.html b/Tests/CucumberTests/CPViewControllerTest/index.html new file mode 100644 index 000000000..1556ed16a --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + CPViewControllerTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/CucumberTests/CPViewControllerTest/main.j b/Tests/CucumberTests/CPViewControllerTest/main.j new file mode 100644 index 000000000..1ed076b00 --- /dev/null +++ b/Tests/CucumberTests/CPViewControllerTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPViewControllerTest + * + * Created by You on May 9, 2016. + * Copyright 2016, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Foundation/CPKeyValueObservingTest.j b/Tests/Foundation/CPKeyValueObservingTest.j index 59b501b1c..76da13b72 100644 --- a/Tests/Foundation/CPKeyValueObservingTest.j +++ b/Tests/Foundation/CPKeyValueObservingTest.j @@ -265,6 +265,22 @@ var _getCheeseCounter; [self assert:dependantKeyPathTester equals:_lastObject]; } +- (void)testSendNotificationsForMultipleDependantKeyPathsToTheSameObject +{ + var observingTester = [ObservingTester testerWithCheese:@"cheese"], + dependantKeyPathTester = [DependantKeyPathsTester testerWithObservingTester:observingTester], + anotherDependantKeyPathTester = [DependantKeyPathsTester testerWithObservingTester:observingTester]; + + [dependantKeyPathTester addObserver:self forKeyPath:@"observedCheese" options:CPKeyValueObservingOptionNew context:nil]; + [anotherDependantKeyPathTester addObserver:self forKeyPath:@"observedCheese" options:CPKeyValueObservingOptionNew context:nil]; + [observingTester setCheese:@"changed cheese"]; + + [self assert:@"observedCheese" equals:_lastKeyPath]; + [self assert:@"observedCheese" equals:_secondLastKeyPath]; + [self assertTrue:[[dependantKeyPathTester, anotherDependantKeyPathTester] containsObject:_lastObject] message:@"Last observed object must be one of the DependantKeyPathsTester"]; + [self assertTrue:[[dependantKeyPathTester, anotherDependantKeyPathTester] containsObject:_secondLastObject] message:@"Second last observed object must be one of the DependantKeyPathsTester"]; +} + - (void)testOnlyInsertObject_AtKeyIndex_Implemented { var insertSelector = @selector(insertObject:inObjectsAtIndex:), diff --git a/Tests/Foundation/CPObjectTest.j b/Tests/Foundation/CPObjectTest.j index f333ab2c5..1d792db49 100644 --- a/Tests/Foundation/CPObjectTest.j +++ b/Tests/Foundation/CPObjectTest.j @@ -25,6 +25,15 @@ [self assertFalse:[receiver implementsSelector:@selector(notImplementedInSuperNorReceiver)]]; } +- (void)testInstancesImplementSelector +{ + [self assertTrue:[Receiver instancesImplementSelector:@selector(implementedInReceiverAndSuper)]]; + [self assertTrue:[Receiver instancesImplementSelector:@selector(implementedInReceiverOnly)]]; + + [self assertFalse:[Receiver instancesImplementSelector:@selector(implementedInSuperOnly)]]; + [self assertFalse:[Receiver instancesImplementSelector:@selector(notImplementedInSuperNorReceiver)]]; +} + - (void)testVersion { // zero by default diff --git a/Tests/Manual/CGCanvasContext/AppController.j b/Tests/Manual/CGCanvasContext/AppController.j index c65005a7c..1f024b4d4 100644 --- a/Tests/Manual/CGCanvasContext/AppController.j +++ b/Tests/Manual/CGCanvasContext/AppController.j @@ -50,6 +50,10 @@ var innerRect = CGRectInset(aRect, CGRectGetWidth(aRect)/2 - 10, CGRectGetHeight(aRect)/2 - 10); CGContextStrokeRectWithWidth(context, innerRect, 4); + CGContextSetTextPosition(context, innerRect.origin.x + 10, innerRect.origin.x + 10); + CGContextSetFillColor(context, [CPColor blueColor]); + CGContextShowText(context, 'Hello World Canvas!'); + [self unlockFocus]; } @@ -67,7 +71,7 @@ var label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; - [label setStringValue:@"Hello World!"]; + [label setStringValue:@"Do you see the Hello World Canvas?"]; [label setFont:[CPFont boldSystemFontOfSize:24.0]]; [label sizeToFit]; diff --git a/Tests/Manual/CPAnimatablePropertyContainerTest/AppController.j b/Tests/Manual/CPAnimatablePropertyContainerTest/AppController.j index 1ce9f1aa9..537c1491a 100644 --- a/Tests/Manual/CPAnimatablePropertyContainerTest/AppController.j +++ b/Tests/Manual/CPAnimatablePropertyContainerTest/AppController.j @@ -19,7 +19,7 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin @outlet CPBox group1Box; @outlet CPBox group2Box; - @outlet CPView animationSandbox; + @outlet AnimationSandbox animationSandbox; CPView leftView; CPView rightView; @@ -37,6 +37,7 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin CPString timingFunction1 @accessors; CPString timingFunction2 @accessors; + BOOL periodicFrameUpdates; } - (id)init @@ -63,6 +64,8 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin selectedTimingFunction1 = 1; selectedTimingFunction2 = 1; + periodicFrameUpdates = NO; + return self; } @@ -186,6 +189,7 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin { [self setupGroup1:nil]; [self setupGroup2:nil]; + [animationSandbox setNeedsDisplay:YES]; } /* - (IBAction)addSubview:(id)sender @@ -233,6 +237,7 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin size.width += 100; size.height += 100; + [[aView animator] setWantsPeriodicFrameUpdates:periodicFrameUpdates]; [[aView animator] setFrame:frame]; return; } @@ -242,6 +247,7 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin [[aView animations] setObject:[self bounceAnimation:aView] forKey:@"frameOrigin"]; var origin = CGPointMakeCopy([aView frameOrigin]); + [[aView animator] setWantsPeriodicFrameUpdates:periodicFrameUpdates]; [[aView animator] setFrameOrigin:origin]; } else if ([enabledIndexes containsIndex:3]) @@ -251,6 +257,7 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin var origin = CGPointMakeCopy([aView frameOrigin]); origin.x +=550; origin.y +=300; + [[aView animator] setWantsPeriodicFrameUpdates:periodicFrameUpdates]; [[aView animator] setFrameOrigin:origin]; } @@ -315,10 +322,10 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin easein = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], easeout = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; - [anim setKeyTimes:[0, 0.25, 0.5, 0.75, 1]]; + [anim setKeyTimes:[0, 0.2, 0.3, 0.5, 0.7, 0.8]]; var origin = CGPointMakeCopy([aView frameOrigin]); - [anim setValues:[origin, CGPointMake(origin.x, origin.y + 50), origin, CGPointMake(origin.x, origin.y + 25), origin]]; - [anim setTimingFunctions:[easeout, easein, easeout, easein]]; + [anim setValues:[origin, CGPointMake(origin.x, origin.y + 200), origin, CGPointMake(origin.x, origin.y + 100), origin, CGPointMake(origin.x, origin.y + 50)]]; + [anim setTimingFunctions:[easeout, easein, easeout, easein, easeout]]; return anim; } @@ -352,6 +359,7 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin if (leftView) { [leftView setFrame:CGRectMake(0, 0, 200, 200)]; + [leftView setTag:1]; [animationSandbox addSubview:leftView]; } @@ -374,11 +382,15 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin if (rightView) { [rightView setFrame:CGRectMake(250, 0, 200, 200)]; + [rightView setTag:2]; [animationSandbox addSubview:rightView]; } if (leftView) + { + [leftView setTag:1]; [animationSandbox addSubview:leftView]; + } if (hasSubviews) [self addSubviewsToView:rightView autoLayout:!customLayout customDrawSubviews:NO]; @@ -453,6 +465,12 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin return self; } +- (void)setFrameOrigin:(CGPoint)anOrigin +{ + [super setFrameOrigin:anOrigin]; + [[self superview] setNeedsDisplay:YES]; +} + @end @implementation DrawView : CPView @@ -530,4 +548,27 @@ var ANIMATIONS_NAMES = ["Fade In", "Fade Out", "Background Color", "Frame Origin }]; } -@end \ No newline at end of file +@end + +@implementation AnimationSandbox : CPView +{ + +} + +- (void)drawRect:(CGRect)aRect +{ + if ([[self subviews] count] < 2) + return; + + var context = [[CPGraphicsContext currentContext] graphicsPort], + leftViewCenter = [[self viewWithTag:1] center], + rightViewCenter = [[self viewWithTag:2] center]; + + CGContextBeginPath(context); + CGContextMoveToPoint(context, leftViewCenter.x, leftViewCenter.y); + CGContextAddLineToPoint(context, rightViewCenter.x, rightViewCenter.y); + CGContextSetLineWidth(context, 2); + CGContextStrokePath(context); +} + +@end diff --git a/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.cib b/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.cib index 67cd58584..6df719bee 100644 --- a/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;88E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;138E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;139E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;75E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;110E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;97E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;104E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;134E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;99E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;110E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;155E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;156E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;161E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;164E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;156E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;166E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;155E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;167E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;169E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;170E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;172E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;164E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;167E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;79E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;174E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;175E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;176E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;177E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;178E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;82E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;180E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;181E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;182E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;180E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;181E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;183E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;184E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;185E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;134E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;184E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;185E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;132E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;188E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;189E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;190E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;191E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;122E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;132E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;192E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;193E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;194E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;121E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;132E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;195E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;196E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;197E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;132E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;195E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;196E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;198E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;125E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;132E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;199E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;160E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;200E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;138E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;202E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;203E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;204E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;205E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;206E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;207E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;208E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;210E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;210E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;211E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;215E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;216E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;219E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;225E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;224E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;227E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;228E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;229E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;231E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;136E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;233E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;234E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;235E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;236E;K;11;$aalignmentD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;220E;K;6;$afontD;K;6;CP$UIDd;3;237E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;238E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;209E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;63E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;241E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;243E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;63E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;63E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;245E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;63E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;220E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;63E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;248E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;249E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;250E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;251E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;225E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;227E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;252E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;253E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;254E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;10;$classnameS;9;CPStepperK;8;$classesA;S;9;CPStepperS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;255E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;257E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;241E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;259E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;224E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;74E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;260E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;261E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;263E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;264E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;265E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;236E;K;11;$aalignmentD;K;6;CP$UIDd;3;221E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;266E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;267E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;209E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;268E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;265E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;236E;K;11;$aalignmentD;K;6;CP$UIDd;3;221E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;269E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;267E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;209E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;270E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;216E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;219E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;225E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;224E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;227E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;271E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;229E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;231E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;272E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;257E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;241E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;259E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;249E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;250E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;274E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;225E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;227E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;275E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;276E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;254E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;277E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;278E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;219E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;225E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;224E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;227E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;279E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;280E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;281E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;282E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;283E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;284E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;278E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;219E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;225E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;224E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;224E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;227E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;279E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;285E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;281E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;286E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;283E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;137E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;287E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;234E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;235E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;236E;K;11;$aalignmentD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;220E;K;6;$afontD;K;6;CP$UIDd;3;288E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;238E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;209E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;88E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;137E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;88E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;220E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;137E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;88E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;245E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;137E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;243E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;88E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;137E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;88E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;240E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;241E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;137E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;289E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;290E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;291E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;292E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;293E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;290E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;221E;K;6;$afontD;K;6;CP$UIDd;3;294E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;224E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;295E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;232E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;221E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;220E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;224E;E;D;K;10;$classnameS;5;CPBoxK;8;$classesA;S;5;CPBoxS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;96E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;296E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;297E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;298E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;299E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;209E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;241E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;300E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;221E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;301E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;302E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;303E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;301E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;306E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;301E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;307E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;308E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;301E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;309E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;301E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;310E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;311E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;301E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;312E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;301E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;313E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;314E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;301E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;312E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;301E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;315E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;316E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;301E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;317E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;96E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;318E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;319E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;320E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;299E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;209E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;241E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;321E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;221E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;322E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;310E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;311E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;322E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;312E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;322E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;307E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;323E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;322E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;309E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;322E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;302E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;303E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;322E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;230E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;306E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;324E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;325E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;236E;K;11;$aalignmentD;K;6;CP$UIDd;3;221E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;326E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;267E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;209E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;327E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;325E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;236E;K;11;$aalignmentD;K;6;CP$UIDd;3;221E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;326E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;267E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;209E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;328E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;329E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;262E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;236E;K;11;$aalignmentD;K;6;CP$UIDd;3;221E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;330E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;267E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;209E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;221E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;111E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;332E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;333E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;334E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;336E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;337E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;114E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;117E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;338E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;224E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;224E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;224E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;339E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;221E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;209E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;340E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;341E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;343E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;344E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;345E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;112E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;346E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;224E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;347E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;115E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;337E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;348E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;348E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;337E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;349E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;350E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;351E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;343E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;344E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;345E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;112E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;352E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;214E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;353E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;118E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;336E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;354E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;354E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;336E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;356E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;12;$agrid-colorD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;358E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;359E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;360E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;220E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;214E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;224E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;214E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;214E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;214E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;361E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;357E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;209E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;224E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;363E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;3;116E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;364E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;365E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;302E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;367E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;368E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;245E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;214E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;214E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;365E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;365E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;302E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;369E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;370E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;245E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;214E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;224E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;111E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;371E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;372E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;373E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;217E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;334E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;374E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;375E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;129E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;338E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;224E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;224E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;224E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;376E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;221E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;209E;E;D;K;6;$classD;K;6;CP$UIDd;3;118E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;374E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;377E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;374E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;356E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;12;$agrid-colorD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;358E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;359E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;360E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;220E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;214E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;224E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;214E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;214E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;214E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;378E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;357E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;209E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;224E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;379E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;3;128E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;365E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;365E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;302E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;380E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;381E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;245E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;214E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;224E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;382E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;365E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;302E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;383E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;384E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;245E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;214E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;214E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;385E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;386E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;343E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;344E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;345E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;123E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;352E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;214E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;353E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;115E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;375E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;348E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;348E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;375E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;349E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;3;124E;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;387E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;341E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;343E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;344E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;345E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;123E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;346E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;224E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;388E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;389E;E;D;K;10;$classnameS;17;CPArrayControllerK;8;$classesA;S;17;CPArrayControllerS;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;390E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;224E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;214E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;214E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;214E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;224E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;214E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;214E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;214E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;214E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;390E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;224E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;214E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;391E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;391E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;393E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;56E;E;E;S;8;delegateS;16;animationSandboxS;6;buttonS;9;group1BoxS;9;group2BoxS;9;theWindowS;7;contentS;12;setupGroup1:S;12;setupGroup2:S;20;runAnimationsGroup1:S;20;runAnimationsGroup2:S;14;runBothGroups:S;20;removeFromSuperview:S;7;revert:S;46;selectedTag: selection.selectedTimingFunction2S;11;selectedTagS;33;selection.selectedTimingFunction2D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;32;value: selection.timingFunction2S;5;valueS;25;selection.timingFunction2D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;41;hidden: selection.selectedTimingFunction2S;6;hiddenD;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;46;selectedTag: selection.selectedTimingFunction1S;33;selection.selectedTimingFunction1D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;32;value: selection.timingFunction1S;25;selection.timingFunction1D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;41;hidden: selection.selectedTimingFunction1D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;25;value: selection.message2S;18;selection.message2D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;25;value: selection.message1S;18;selection.message1D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;26;value: selection.duration2S;19;selection.duration2D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;26;value: selection.duration1S;19;selection.duration1D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;24;contentArray: animationsS;12;contentArrayS;10;animationsD;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;31;value: arrangedObjects.enabled2S;24;arrangedObjects.enabled2D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;27;value: arrangedObjects.nameS;20;arrangedObjects.nameD;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;31;value: arrangedObjects.enabled1S;24;arrangedObjects.enabled1D;K;6;$classD;K;6;CP$UIDd;3;157E;K;10;CP.objectsD;E;E;S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;26;{{335, -126}, {1319, 763}}S;22;{{0, 0}, {1680, 1027}}d;1;7S;6;Windowd;1;0S;21;{{0, 0}, {1319, 763}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;E;E;S;6;normalS;6;{1, 1}F;S;24;{{1199, 121}, {104, 22}}S;19;{{0, 0}, {104, 22}}d;2;33S;9;textfieldS;47;bezeled+controlSizeRegular+editable+placeholderd;1;4d;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;395E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;T;S;0;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;226E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;396E;E;S;24;{{1058, 129}, {137, 17}}S;19;{{0, 0}, {137, 17}}S;18;controlSizeRegularS;19;Completion message:D;K;6;$classD;K;6;CP$UIDd;3;226E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;397E;E;S;22;{{1145, 94}, {99, 25}}S;18;{{0, 0}, {99, 25}}S;12;popup-buttonS;27;bordered+controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;338E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;d;2;12S;6;LinearS;17;_popUpItemAction:d;1;1d;7;1048576S;7;Ease-inS;8;Ease Outd;1;3S;11;Ease In-OutS;6;CustomS;22;{{1226, 55}, {39, 22}}S;18;{{0, 0}, {39, 22}}S;38;bezeled+controlSizeRegular+placeholderD;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;398E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;22;{{1163, 63}, {60, 17}}S;18;{{0, 0}, {60, 17}}S;9;Duration:S;20;{{1269, 58}, {0, 0}}S;16;{{0, 0}, {0, 0}}S;7;stepperd;5;65540d;3;100S;24;{{20, 243}, {1000, 500}}S;21;{{0, 0}, {1000, 500}}d;2;36S;6;CPViewS;22;{{20, 203}, {172, 25}}S;19;{{0, 0}, {172, 25}}S;21;Remove From Superviewd;2;14S;23;{{216, 203}, {172, 25}}S;6;RevertS;24;{{1199, 463}, {104, 22}}S;24;{{1058, 471}, {137, 17}}S;21;{{1269, 408}, {0, 0}}S;23;{{1225, 405}, {39, 22}}D;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;398E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;23;{{1163, 413}, {59, 17}}S;18;{{0, 0}, {59, 17}}S;22;{{1241, 89}, {62, 22}}S;18;{{0, 0}, {62, 22}}S;7;0,0,1,1S;23;{{1058, 100}, {89, 17}}S;18;{{0, 0}, {89, 17}}D;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;338E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;16;Timing Function:S;23;{{1241, 435}, {62, 22}}S;23;{{1058, 446}, {89, 17}}D;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;338E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;23;{{1145, 440}, {99, 25}}D;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;338E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;22;{{1058, 60}, {89, 18}}S;18;{{0, 0}, {89, 18}}D;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;267E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;7;Group 1S;23;{{1058, 413}, {89, 18}}D;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;267E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;7;Group 2S;21;{{21, 22}, {438, 87}}S;19;{{0, 0}, {438, 87}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;301E;E;E;S;3;boxS;64;Animation group 1 contains a view with the following properties:D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;97E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;436E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;437E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;438E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;97E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;402E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;d;4;1000S;20;{{15, 9}, {138, 21}}S;19;{{0, 0}, {138, 21}}S;9;check-boxS;12;Has Subviewsd;4;1001S;21;{{155, 9}, {138, 21}}S;13;Custom Layoutd;4;1002S;21;{{299, 9}, {138, 21}}S;14;Custom Drawingd;4;1003S;21;{{34, 50}, {138, 21}}d;4;1004S;21;{{34, 29}, {138, 21}}S;11;Auto LayoutS;22;{{21, 126}, {438, 51}}S;19;{{0, 0}, {438, 51}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;322E;E;E;S;64;Animation group 2 contains a view with the following properties:D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;439E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;440E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;441E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;402E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;S;21;{{154, 9}, {138, 21}}S;23;{{468, 140}, {128, 25}}S;19;{{0, 0}, {128, 25}}S;14;Run AnimationsS;22;{{467, 54}, {128, 25}}S;22;{{609, 94}, {135, 25}}S;19;{{0, 0}, {135, 25}}S;15;Run Both GroupsS;25;{{1059, 496}, {240, 247}}S;20;{{0, 0}, {240, 247}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;336E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;337E;D;K;6;CP$UIDd;3;363E;D;K;6;CP$UIDd;3;339E;E;E;S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;335E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;399E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;354E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;400E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;402E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;3;335E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;403E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;404E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;405E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;338E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;406E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;116E;E;d;2;10D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;S;23;{{224, 128}, {15, 102}}S;19;{{0, 0}, {15, 102}}d;1;8d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledS;27;_verticalScrollerDidScroll:f;18;0.8717948717948718S;19;{{0, 0}, {238, 25}}S;14;tableHeaderRowS;21;{{1, 113}, {223, 15}}S;19;{{0, 0}, {223, 15}}S;29;_horizontalScrollerDidScroll:f;16;0.99581589958159S;20;{{0, 0}, {238, 229}}D;K;6;$classD;K;6;CP$UIDd;3;226E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;407E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;226E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;408E;E;d;2;20S;6;{3, 2}d;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;121E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;362E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;409E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;410E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;412E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;d;3;182d;2;40D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;366E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;413E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;416E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;417E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;418E;K;11;$aalignmentD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;220E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;419E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;355E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;220E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;209E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;3;366E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;421E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;422E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;417E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;423E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;424E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;221E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;241E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;425E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;241E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;426E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;427E;E;S;25;{{1059, 154}, {240, 198}}S;20;{{0, 0}, {240, 198}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;374E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;375E;D;K;6;CP$UIDd;3;379E;D;K;6;CP$UIDd;3;376E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;335E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;428E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;429E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;402E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;124E;E;D;K;6;$classD;K;6;CP$UIDd;3;335E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;430E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;404E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;431E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;338E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;406E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;S;20;{{0, 0}, {238, 180}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;362E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;209E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;432E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;410E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;412E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;3;366E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;433E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;422E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;417E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;423E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;424E;K;11;$aalignmentD;K;6;CP$UIDd;3;220E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;221E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;16;$aimage-positionD;K;6;CP$UIDd;3;241E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;221E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;209E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;220E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;425E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;225E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;214E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;241E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;224E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;241E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;209E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;426E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;427E;E;d;3;175D;K;6;$classD;K;6;CP$UIDd;3;366E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;434E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;209E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;416E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;417E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;418E;K;11;$aalignmentD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;220E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;419E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;209E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;214E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;214E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;355E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;220E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;209E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;214E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;214E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;214E;E;S;19;{{1, 1}, {250, 15}}S;19;{{0, 0}, {250, 15}}S;22;{{224, 79}, {15, 102}}f;18;0.9166666666666666S;13;AppControllerS;19;CPMutableDictionaryS;10;OtherViewsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;89E;E;E;S;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;241E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;435E;D;K;6;CP$UIDd;3;435E;D;K;6;CP$UIDd;3;435E;D;K;6;CP$UIDd;3;241E;E;E;d;2;15S;20;{{1, 1}, {238, 229}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;119E;E;E;d;2;18S;6;_NS:11S;21;{{1, 230}, {238, 17}}S;19;{{0, 0}, {238, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;116E;E;E;S;6;_NS:15D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;241E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;442E;D;K;6;CP$UIDd;3;442E;D;K;6;CP$UIDd;3;442E;D;K;6;CP$UIDd;3;241E;E;E;S;22;{{224, 222}, {14, 25}}S;18;{{0, 0}, {14, 25}}S;10;cornerviewS;6;_NS:19D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;444E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;394E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;445E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;214E;E;S;9;AnimationD;K;6;$classD;K;6;CP$UIDd;3;222E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;446E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;238E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;224E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;214E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;224E;E;S;32;controlSizeRegular+tableDataViewS;9;Text Celld;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;447E;E;E;S;3;RunS;17;{{0, 0}, {0, 21}}S;42;controlSizeRegular+roundRect+tableDataViewS;5;Checkf;3;0.5f;4;0.05S;20;{{1, 1}, {238, 180}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;124E;E;E;S;21;{{1, 181}, {238, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;128E;E;E;S;22;{{224, 173}, {14, 25}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;448E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;449E;E;E;f;18;0.6862745098039216S;19;{{1, 9}, {444, 77}}S;19;{{0, 0}, {444, 77}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;S;19;{{1, 9}, {444, 41}}S;19;{{0, 0}, {444, 41}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;E;E;f;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;443E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;367E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;450E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;451E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;367E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;214E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;d;2;11S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;3;443E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;369E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;450E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;451E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;369E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;214E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;3;443E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;380E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;450E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;451E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;380E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;214E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;3;443E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;383E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;450E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;451E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;383E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;401E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;214E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;213E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;214E;E;S;18;{{5, 0}, {-10, 0}}S;18;{{0, 0}, {-10, 0}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;131E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;148E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;149E;E;D;K;10;$classnameS;31;CPCibRuntimeAttributesConnectorK;8;$classesA;S;31;CPCibRuntimeAttributesConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;106E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;150E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;114E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;114E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;152E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;153E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;104E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;106E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;114E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;60E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;144E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;110E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;111E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;117E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;116E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;128E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;139E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;167E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;169E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;172E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;173E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;174E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;175E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;176E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;177E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;179E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;180E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;174E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;121E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;182E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;173E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;183E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;185E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;186E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;188E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;180E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;183E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;189E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;190E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;191E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;193E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;194E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;196E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;197E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;198E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;196E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;197E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;199E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;200E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;201E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;200E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;201E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;144E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;204E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;205E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;206E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;142E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;140E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;208E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;209E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;210E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;211E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;142E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;212E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;213E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;142E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;215E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;216E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;217E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;71E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;142E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;215E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;216E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;142E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;219E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;168E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;220E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;221E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;148E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;222E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;223E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;224E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;225E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;226E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;227E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;228E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;62E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;230E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;230E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;231E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;235E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;63E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;236E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;237E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;238E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;240E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;241E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;66E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;242E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;74E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;73E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;243E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;243E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;243E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;243E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;244E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;244E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;244E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;245E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;246E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;229E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;247E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;248E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;249E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;252E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;253E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;68E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;66E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;254E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;254E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;66E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;252E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;255E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;12;$agrid-colorD;K;6;CP$UIDd;3;256E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;257E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;259E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;260E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;261E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;258E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;234E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;244E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;234E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;234E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;234E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;262E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;256E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;229E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;244E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;264E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;76E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;265E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;265E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;266E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;268E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;269E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;270E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;234E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;244E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;271E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;265E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;266E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;272E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;273E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;270E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;234E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;234E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;274E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;275E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;276E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;277E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;278E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;279E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;280E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;64E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;234E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;282E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;283E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;284E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;276E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;277E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;278E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;279E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;285E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;64E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;286E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;244E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;287E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;242E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;288E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;288E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;242E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;290E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;63E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;291E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;292E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;293E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;240E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;294E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;78E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;295E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;83E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;82E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;243E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;243E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;243E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;243E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;244E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;244E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;244E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;296E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;246E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;229E;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;297E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;298E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;299E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;252E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;300E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;78E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;301E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;301E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;78E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;252E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;255E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;12;$agrid-colorD;K;6;CP$UIDd;3;256E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;302E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;259E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;260E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;261E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;258E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;234E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;244E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;234E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;234E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;234E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;303E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;256E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;229E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;244E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;304E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;84E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;265E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;265E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;266E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;305E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;306E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;270E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;234E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;244E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;271E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;265E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;266E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;307E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;308E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;270E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;234E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;234E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;309E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;310E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;276E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;277E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;278E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;279E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;311E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;77E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;234E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;282E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;312E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;284E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;276E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;277E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;278E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;279E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;313E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;77E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;286E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;244E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;314E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;295E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;288E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;288E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;315E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;79E;E;D;K;10;$classnameS;9;CPStepperK;8;$classesA;S;9;CPStepperS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;316E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;318E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;320E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;321E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;282E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;322E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;244E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;323E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;324E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;326E;K;6;$afontD;K;6;CP$UIDd;3;328E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;329E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;330E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;331E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;332E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;318E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;333E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;321E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;282E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;322E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;334E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;324E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;326E;K;6;$afontD;K;6;CP$UIDd;3;335E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;336E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;330E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;331E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;337E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;338E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;339E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;341E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;330E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;244E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;331E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;342E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;343E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;344E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;345E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;347E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;338E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;339E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;348E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;330E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;244E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;331E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;343E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;350E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;345E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;351E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;353E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;354E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;355E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;356E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;357E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;354E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;358E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;359E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;339E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;360E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;330E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;244E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;331E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;361E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;362E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;363E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;364E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;365E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;366E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;367E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;368E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;370E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;371E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;372E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;246E;K;7;$aimageD;K;6;CP$UIDd;3;374E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;375E;K;17;CPHuggingPriorityD;K;6;CP$UIDd;3;376E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;377E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;229E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;379E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;368E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;370E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;371E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;372E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;246E;K;7;$aimageD;K;6;CP$UIDd;3;380E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;381E;K;17;CPHuggingPriorityD;K;6;CP$UIDd;3;376E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;377E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;229E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;382E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;383E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;370E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;371E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;372E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;246E;K;7;$aimageD;K;6;CP$UIDd;3;384E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;385E;K;17;CPHuggingPriorityD;K;6;CP$UIDd;3;376E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;386E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;229E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;103E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;387E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;388E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;389E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;390E;E;D;K;10;$classnameS;5;CPBoxK;8;$classesA;S;5;CPBoxS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;391E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;392E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;393E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;229E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;394E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;395E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;229E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;282E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;396E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;246E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;K;16;CPBoxContentViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;106E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;397E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;398E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;399E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;106E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;400E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;107E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;266E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;401E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;402E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;107E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;404E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;405E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;107E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;406E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;407E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;402E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;107E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;408E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;409E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;107E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;410E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;411E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;402E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;107E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;412E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;413E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;107E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;414E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;415E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;416E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;107E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;417E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;418E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;107E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;419E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;420E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;402E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;107E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;421E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;422E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;424E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;425E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;229E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;394E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;426E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;229E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;282E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;427E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;246E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;K;16;CPBoxContentViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;114E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;428E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;429E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;430E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;114E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;431E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;115E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;410E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;411E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;402E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;115E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;432E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;413E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;115E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;406E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;433E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;402E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;115E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;434E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;409E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;115E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;266E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;401E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;402E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;115E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;435E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;405E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;436E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;437E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;370E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;371E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;372E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;246E;K;7;$aimageD;K;6;CP$UIDd;3;438E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;439E;K;17;CPHuggingPriorityD;K;6;CP$UIDd;3;376E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;440E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;229E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;146E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;441E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;442E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;443E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;371E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;444E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;258E;K;11;$aalignmentD;K;6;CP$UIDd;3;229E;K;7;$aimageD;K;6;CP$UIDd;3;445E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;446E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;447E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;229E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;448E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;121E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;282E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;282E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;451E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;121E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;246E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;452E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;121E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;270E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;453E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;121E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;258E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;454E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;121E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;455E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;437E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;370E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;371E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;372E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;246E;K;7;$aimageD;K;6;CP$UIDd;3;456E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;457E;K;17;CPHuggingPriorityD;K;6;CP$UIDd;3;376E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;458E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;229E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;459E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;359E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;339E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;460E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;330E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;244E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;244E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;331E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;361E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;461E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;363E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;462E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;463E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;366E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;147E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;464E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;442E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;443E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;371E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;258E;K;11;$aalignmentD;K;6;CP$UIDd;3;229E;K;7;$aimageD;K;6;CP$UIDd;3;466E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;467E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;447E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;229E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;448E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;131E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;282E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;282E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;451E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;131E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;246E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;452E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;131E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;270E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;453E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;131E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;258E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;454E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;131E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;449E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;468E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;469E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;470E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;471E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;472E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;473E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;469E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;6;$afontD;K;6;CP$UIDd;3;474E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;475E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;476E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;346E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;246E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;258E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;477E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;478E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;369E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;319E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;479E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;480E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;481E;E;D;K;10;$classnameS;17;CPArrayControllerK;8;$classesA;S;17;CPArrayControllerS;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;482E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;244E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;234E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;3;234E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;3;234E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;484E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;234E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;234E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;244E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;234E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;234E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;234E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;234E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;143E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;482E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;244E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;234E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;3;234E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;3;234E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;485E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;145E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;486E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;487E;E;D;K;6;$classD;K;6;CP$UIDd;3;145E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;486E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;488E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;489E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;234E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;489E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;234E;E;E;S;8;delegateS;16;animationSandboxS;9;group1BoxS;9;group2BoxS;9;theWindowS;7;contentS;12;setupGroup1:S;12;setupGroup2:S;20;runAnimationsGroup1:S;20;runAnimationsGroup2:S;14;runBothGroups:S;20;removeFromSuperview:S;7;revert:S;37;value: selection.periodicFrameUpdatesS;5;valueS;30;selection.periodicFrameUpdatesD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;46;selectedTag: selection.selectedTimingFunction2S;11;selectedTagS;33;selection.selectedTimingFunction2D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;32;value: selection.timingFunction2S;25;selection.timingFunction2D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;41;hidden: selection.selectedTimingFunction2S;6;hiddenD;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;46;selectedTag: selection.selectedTimingFunction1S;33;selection.selectedTimingFunction1D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;32;value: selection.timingFunction1S;25;selection.timingFunction1D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;41;hidden: selection.selectedTimingFunction1D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;25;value: selection.message2S;18;selection.message2D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;25;value: selection.message1S;18;selection.message1D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;26;value: selection.duration2S;19;selection.duration2D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;26;value: selection.duration1S;19;selection.duration1D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;19;contentObject: selfS;13;contentObjectS;4;selfD;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;24;contentArray: animationsS;12;contentArrayS;10;animationsD;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;31;value: arrangedObjects.enabled2S;24;arrangedObjects.enabled2D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;27;value: arrangedObjects.nameS;20;arrangedObjects.nameD;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;31;value: arrangedObjects.enabled1S;24;arrangedObjects.enabled1D;K;6;$classD;K;6;CP$UIDd;3;170E;K;10;CP.objectsD;E;E;S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879048192S;26;{{335, -126}, {1319, 763}}S;22;{{0, 0}, {1680, 1027}}d;1;7S;6;Windowd;1;0S;21;{{0, 0}, {1319, 763}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;E;E;S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;25;{{1059, 154}, {240, 198}}S;20;{{0, 0}, {240, 198}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;3;245E;E;E;d;2;33S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;490E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;491E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;492E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;493E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;76E;E;d;2;10T;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;494E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;d;1;2S;20;{{1, 1}, {238, 197}}S;20;{{0, 0}, {238, 197}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;68E;E;E;d;2;18D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;251E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;495E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;496E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{0, 0}, {238, 174}}S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;251E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;497E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;496E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;4d;2;20S;6;{3, 2}d;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;263E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;498E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;498E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;499E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;500E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;267E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;501E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;502E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;6;$afontD;K;6;CP$UIDd;3;503E;K;12;$atext-colorD;K;6;CP$UIDd;3;504E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;505E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;506E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;503E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;507E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;507E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;508E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;509E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;510E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;511E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;512E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;513E;E;d;1;3d;3;192D;K;6;$classD;K;6;CP$UIDd;3;267E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;514E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;502E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;6;$afontD;K;6;CP$UIDd;3;503E;K;12;$atext-colorD;K;6;CP$UIDd;3;504E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;515E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;516E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;503E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;517E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;258E;K;11;$aalignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;518E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;519E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;520E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;252E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;258E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;229E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;234E;E;S;19;{{1, 1}, {250, 15}}S;19;{{0, 0}, {250, 15}}d;1;8d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:d;1;1S;22;{{224, 79}, {15, 102}}S;19;{{0, 0}, {15, 102}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:f;18;0.8954545454545455S;19;{{0, 0}, {238, 25}}S;14;tableHeaderRowD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;25;{{1059, 496}, {240, 247}}S;20;{{0, 0}, {240, 247}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;3;295E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;3;296E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;521E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;491E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;522E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;523E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;524E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;S;20;{{1, 1}, {238, 246}}S;20;{{0, 0}, {238, 246}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;79E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{0, 0}, {238, 223}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;263E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;229E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;498E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;498E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;499E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;525E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;3;267E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;526E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;502E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;6;$afontD;K;6;CP$UIDd;3;503E;K;12;$atext-colorD;K;6;CP$UIDd;3;504E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;527E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;506E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;503E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;507E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;507E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;403E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;508E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;246E;K;6;$afontD;K;6;CP$UIDd;3;509E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;258E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;528E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;258E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;511E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;330E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;234E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;244E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;246E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;229E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;512E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;513E;E;D;K;6;$classD;K;6;CP$UIDd;3;267E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;529E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;502E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;6;$afontD;K;6;CP$UIDd;3;503E;K;12;$atext-colorD;K;6;CP$UIDd;3;504E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;530E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;516E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;503E;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;317E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;517E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;258E;K;11;$aalignmentD;K;6;CP$UIDd;3;229E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;531E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;519E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;520E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;229E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;261E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;234E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;234E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;252E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;258E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;229E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;234E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;234E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;234E;E;S;21;{{1, 113}, {223, 15}}S;19;{{0, 0}, {223, 15}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;23;{{224, 128}, {15, 102}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;f;18;0.9144981412639405D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{1269, 58}, {0, 0}}S;16;{{0, 0}, {0, 0}}S;7;stepperS;18;controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;5;65540d;3;100S;22;{{1226, 55}, {39, 22}}S;18;{{0, 0}, {39, 22}}S;9;textfieldS;38;bezeled+controlSizeRegular+placeholderD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;533E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;0;D;K;6;$classD;K;6;CP$UIDd;3;251E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;534E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;496E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;E;S;21;{{1269, 408}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;23;{{1225, 405}, {39, 22}}D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;533E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;24;{{1199, 121}, {104, 22}}S;19;{{0, 0}, {104, 22}}S;47;bezeled+controlSizeRegular+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;261E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;536E;E;E;S;24;{{1058, 129}, {137, 17}}S;19;{{0, 0}, {137, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;Completion message:D;K;6;$classD;K;6;CP$UIDd;3;251E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;537E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;496E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;E;S;24;{{1199, 463}, {104, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;538E;E;E;S;24;{{1058, 471}, {137, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{1163, 63}, {60, 17}}S;18;{{0, 0}, {60, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;9;Duration:S;23;{{1163, 413}, {59, 17}}S;18;{{0, 0}, {59, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{1241, 89}, {62, 22}}S;18;{{0, 0}, {62, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;E;E;S;7;0,0,1,1S;23;{{1058, 100}, {89, 17}}S;18;{{0, 0}, {89, 17}}D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;243E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;Timing Function:S;22;{{467, 54}, {128, 25}}S;19;{{0, 0}, {128, 25}}d;2;36S;6;buttonS;27;bordered+controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;261E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;244E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;4;nameD;K;6;CP$UIDd;3;540E;K;12;defaultValueD;K;6;CP$UIDd;3;542E;K;5;stateD;K;6;CP$UIDd;3;543E;K;5;valueD;K;6;CP$UIDd;3;544E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;10;{250, 750}S;14;Run Animationsd;2;14S;23;{{468, 140}, {128, 25}}D;K;6;$classD;K;6;CP$UIDd;3;373E;K;4;nameD;K;6;CP$UIDd;3;540E;K;12;defaultValueD;K;6;CP$UIDd;3;542E;K;5;stateD;K;6;CP$UIDd;3;543E;K;5;valueD;K;6;CP$UIDd;3;544E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{609, 94}, {135, 25}}S;19;{{0, 0}, {135, 25}}D;K;6;$classD;K;6;CP$UIDd;3;373E;K;4;nameD;K;6;CP$UIDd;3;540E;K;12;defaultValueD;K;6;CP$UIDd;3;542E;K;5;stateD;K;6;CP$UIDd;3;543E;K;5;valueD;K;6;CP$UIDd;3;544E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;15;Run Both GroupsS;24;{{20, 243}, {1000, 500}}S;21;{{0, 0}, {1000, 500}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;AnimationSandboxS;21;{{21, 22}, {438, 87}}S;19;{{0, 0}, {438, 87}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;107E;E;E;S;3;boxD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;64;Animation group 1 contains a view with the following properties:S;19;{{1, 9}, {444, 77}}S;19;{{0, 0}, {444, 77}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{15, 9}, {138, 21}}S;19;{{0, 0}, {138, 21}}S;9;check-boxD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;12;Has Subviewsd;4;1001S;21;{{155, 9}, {138, 21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;13;Custom Layoutd;4;1002S;21;{{299, 9}, {138, 21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;14;Custom Drawingd;4;1003S;21;{{34, 50}, {164, 21}}S;19;{{0, 0}, {164, 21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;With Custom Drawingd;4;1004S;21;{{34, 29}, {138, 21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;13;With AutosizeS;22;{{21, 126}, {438, 51}}S;19;{{0, 0}, {438, 51}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;115E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;64;Animation group 2 contains a view with the following properties:S;19;{{1, 9}, {444, 41}}S;19;{{0, 0}, {444, 41}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{154, 9}, {138, 21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{20, 203}, {172, 25}}S;19;{{0, 0}, {172, 25}}D;K;6;$classD;K;6;CP$UIDd;3;373E;K;4;nameD;K;6;CP$UIDd;3;540E;K;12;defaultValueD;K;6;CP$UIDd;3;542E;K;5;stateD;K;6;CP$UIDd;3;543E;K;5;valueD;K;6;CP$UIDd;3;544E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;Remove From SuperviewS;22;{{1145, 94}, {99, 25}}S;18;{{0, 0}, {99, 25}}S;12;popup-buttonD;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;243E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;4;nameD;K;6;CP$UIDd;3;540E;K;12;defaultValueD;K;6;CP$UIDd;3;542E;K;5;stateD;K;6;CP$UIDd;3;543E;K;5;valueD;K;6;CP$UIDd;3;545E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;12S;6;LinearS;17;_popUpItemAction:d;7;1048576S;7;Ease-inS;8;Ease OutS;11;Ease In-OutS;6;CustomS;23;{{216, 203}, {172, 25}}D;K;6;$classD;K;6;CP$UIDd;3;373E;K;4;nameD;K;6;CP$UIDd;3;540E;K;12;defaultValueD;K;6;CP$UIDd;3;542E;K;5;stateD;K;6;CP$UIDd;3;543E;K;5;valueD;K;6;CP$UIDd;3;544E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;RevertS;23;{{1241, 435}, {62, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;546E;E;E;S;23;{{1058, 446}, {89, 17}}D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;243E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;23;{{1145, 440}, {99, 25}}D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;243E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;4;nameD;K;6;CP$UIDd;3;540E;K;12;defaultValueD;K;6;CP$UIDd;3;542E;K;5;stateD;K;6;CP$UIDd;3;543E;K;5;valueD;K;6;CP$UIDd;3;545E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{1058, 60}, {89, 18}}S;18;{{0, 0}, {89, 18}}D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;378E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;7;Group 1S;23;{{1058, 413}, {89, 18}}D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;378E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;7;Group 2S;23;{{406, 203}, {200, 21}}S;19;{{0, 0}, {200, 21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;Periodic Frame UpdatesS;13;AppControllerS;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;483E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;483E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;10;OtherViewsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;E;E;S;19;autoresizesSubviewsS;21;{{1, 175}, {238, 23}}S;19;{{0, 0}, {238, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;76E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;547E;D;K;6;CP$UIDd;3;547E;D;K;6;CP$UIDd;3;547E;D;K;6;CP$UIDd;3;282E;E;E;S;18;{{0, 0}, {14, 25}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;549E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;532E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;447E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;244E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;3;251E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;550E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;496E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;3;RunS;17;{{0, 0}, {0, 21}}S;42;controlSizeRegular+roundRect+tableDataViewD;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;551E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;552E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;5;Checkf;3;0.5f;4;0.05D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;553E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;9;AnimationS;32;controlSizeRegular+tableDataViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;9;Text Celld;4;3072S;21;{{1, 224}, {238, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;84E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;554E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;555E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;28;_CPFontSystemFacePlaceholderd;2;15D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;535E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;557E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;558E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;91E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;91E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;559E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;560E;D;K;6;CP$UIDd;3;560E;D;K;6;CP$UIDd;3;560E;D;K;6;CP$UIDd;3;282E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;535E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;561E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;558E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;93E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;93E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;562E;E;D;K;6;$classD;K;6;CP$UIDd;3;535E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;563E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;558E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;97E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;97E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;564E;E;S;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;541E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;551E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;552E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;3;327E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;551E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;243E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;234E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;3;535E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;565E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;558E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;129E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;129E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;566E;E;f;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;548E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;268E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;567E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;568E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;268E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;569E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;570E;D;K;6;CP$UIDd;3;570E;D;K;6;CP$UIDd;3;570E;D;K;6;CP$UIDd;3;282E;E;E;S;18;.AppleSystemUIFontd;2;13D;K;6;$classD;K;6;CP$UIDd;3;548E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;272E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;567E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;568E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;272E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;571E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;3;548E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;305E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;567E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;568E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;305E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;572E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;3;548E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;307E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;567E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;568E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;307E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;232E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;233E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;233E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;234E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;573E;K;32;CPDoNotTranslateAutoresizingMaskD;K;6;CP$UIDd;3;234E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;574E;E;d;2;42D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;575E;E;f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;574E;E;D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;576E;E;D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;577E;E;D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;578E;E;D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;577E;E;D;K;6;$classD;K;6;CP$UIDd;3;556E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;579E;E;S;18;{{5, 0}, {-10, 0}}S;18;{{0, 0}, {-10, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;f;18;0.5019607843137255D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;57;{"origin":{"x":0,"y":1},"size":{"width":104,"height":21}}S;62;{"origin":{"x":1199,"y":122},"size":{"width":104,"height":21}}S;62;{"origin":{"x":1199,"y":464},"size":{"width":104,"height":21}}S;56;{"origin":{"x":0,"y":1},"size":{"width":62,"height":21}}S;60;{"origin":{"x":1241,"y":90},"size":{"width":62,"height":21}}S;61;{"origin":{"x":1241,"y":436},"size":{"width":62,"height":21}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.xib b/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.xib index 7e2e7cf5a..7912d47fb 100644 --- a/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.xib +++ b/Tests/Manual/CPAnimatablePropertyContainerTest/Resources/MainMenu.xib @@ -1,2932 +1,554 @@ - - - - 1050 - 14C109 - 6250 - 1344.72 - 757.30 - - com.apple.InterfaceBuilder.CocoaPlugin - 6250 - - - NSArrayController - NSBox - NSButton - NSButtonCell - NSCustomObject - NSCustomView - NSMenu - NSMenuItem - NSObjectController - NSPopUpButton - NSPopUpButtonCell - NSScrollView - NSScroller - NSStepper - NSStepperCell - NSTableColumn - NSTableHeaderView - NSTableView - NSTextField - NSTextFieldCell - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - 7 - 2 - {{335, 390}, {1319, 763}} - 1946157056 - Window - NSWindow - - - - - 256 - - - - 265 - - - - 2322 - - - - 256 - {238, 180} - - - - _NS:13 - YES - NO - YES - - - 256 - {238, 17} - - - - _NS:16 - - - - - -2147483392 - {{224, 0}, {16, 17}} - - - - _NS:19 - - - - 40 - 40 - 1000 - - 75497536 - 2048 - Run - - YES - 11 - 3100 - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 67108864 - 268435456 - Check - - YES - 13 - 1044 - - _NS:9 - - 1215582464 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - 3 - YES - YES - - - - 175 - 40 - 1000 - - 75497536 - 2048 - Animation - - - - - - 67108928 - 2048 - Text Cell - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - - - 3 - YES - - - - 3 - 2 - - 3 - MQA - - - 6 - System - gridColor - - 3 - MC41AA - - - 20 - 314572800 - - - 4 - 15 - 0 - NO - -1 - 0 - 1 - - - {{1, 17}, {238, 180}} - - - - _NS:11 - - - 4 - YES - - - - -2147483392 - {{224, 17}, {15, 102}} - - - - _NS:58 - NO - _doScroller: - - - _doScroller: - 0.91666666666666663 - - - - -2147483392 - {{1, 182}, {250, 15}} - - - - _NS:60 - NO - _doScroller: - - 1 - - _doScroller: - 0.99581589958159 - - - - 2338 - - - - {{1, 0}, {238, 17}} - - - - _NS:15 - - YES - - - - {{1059, 411}, {240, 198}} - - - - _NS:9 - 133682 - - - - - - QSAAAEEgAABBsAAAQbAAAA - 0.25 - 4 - 1 - - - - 265 - - - - 2322 - - - - 256 - {238, 229} - - - - _NS:13 - YES - NO - YES - - - 256 - {238, 17} - - - - _NS:16 - - - - - -2147483392 - {{224, 0}, {16, 17}} - - - - _NS:19 - - - - 40 - 40 - 1000 - - 75497536 - 2048 - Run - - - 3 - MC4zMzMzMzI5ODU2AA - - - - - 67108864 - 268435456 - Check - - _NS:9 - - 1215582464 - 2 - - - - - 200 - 25 - - 3 - YES - YES - - - - 182 - 40 - 1000 - - 75497536 - 2048 - Animation - - - - - - 67108928 - 2048 - Text Cell - - - - - - 3 - YES - - - - 3 - 2 - - - 20 - 314572800 - - - 4 - 15 - 0 - NO - -1 - 0 - 1 - - - {{1, 17}, {238, 229}} - - - - _NS:11 - - - 4 - YES - - - - -2147483392 - {{224, 17}, {15, 102}} - - - - _NS:58 - NO - _doScroller: - - - _doScroller: - 0.87179487179487181 - - - - -2147483392 - {{1, 119}, {223, 15}} - - - - _NS:60 - NO - _doScroller: - - 1 - - _doScroller: - 0.99581589958159 - - - - 2338 - - - - {{1, 0}, {238, 17}} - - - - _NS:15 - - YES - - - - {{1059, 20}, {240, 247}} - - - - _NS:9 - 133682 - - - - - - QSAAAEEgAABBsAAAQbAAAA - 0.25 - 4 - 1 - - - - 265 - {{1266, 680}, {19, 27}} - - - - _NS:1099 - YES - - 786464 - 0 - _NS:1099 - - 100 - 1 - YES - - NO - - - - 265 - {{1230, 683}, {31, 22}} - - - - _NS:9 - YES - - -2075131840 - 272630784 - - - YES - 15 - 1044 - - _NS:9 - - YES - - 6 - System - textBackgroundColor - - - - 6 - System - textColor - - - - NO - 1 - - - - 265 - {{1266, 330}, {19, 27}} - - - - _NS:1099 - YES - - 786464 - 0 - _NS:1099 - - 100 - 1 - YES - - NO - - - - 265 - {{1229, 333}, {31, 22}} - - - - _NS:9 - YES - - -2075131840 - 272630784 - - - YES - 15 - 1044 - - _NS:9 - - YES - - - - NO - 1 - - - - 265 - {{1203, 617}, {96, 22}} - - - - _NS:9 - YES - - -1804599231 - 272630784 - - - _NS:9 - - YES - - - - NO - 1 - - - - 265 - {{1056, 617}, {141, 17}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Completion message: - - _NS:1535 - - - 6 - System - controlColor - - - - - NO - 1 - - - - 265 - {{1203, 275}, {96, 22}} - - - - _NS:9 - YES - - -1804599231 - 272630784 - - - _NS:9 - - YES - - - - NO - 1 - - - - 265 - {{1056, 275}, {141, 17}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Completion message: - - _NS:1535 - - - - - NO - 1 - - - - 265 - {{1161, 683}, {64, 17}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Duration: - - _NS:1535 - - - - - NO - 1 - - - - 265 - {{1161, 333}, {63, 17}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Duration: - - _NS:1535 - - - - - NO - 1 - - - - 265 - {{1245, 649}, {54, 22}} - - - - _NS:9 - YES - - -1804599231 - 272630784 - - - 0,0,1,1 - _NS:9 - - YES - - - - NO - 1 - - - - 265 - {{1056, 646}, {93, 17}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Timing Function: - - YES - 10 - 1044 - - _NS:1535 - - - - - NO - 1 - - - - 268 - {{461, 681}, {140, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Run Animations - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{462, 595}, {140, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Run Animations - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{603, 641}, {147, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Run Both Groups - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{20, 20}, {1000, 500}} - - - - _NS:9 - NSView - - - - 12 - - - - 274 - - - - 268 - {{16, 49}, {128, 18}} - - - - _NS:9 - 1000 - YES - - 67108864 - 268435456 - Has Subviews - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{156, 49}, {128, 18}} - - - - _NS:9 - 1001 - YES - - 67108864 - 268435456 - Custom Layout - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{300, 49}, {128, 18}} - - - - _NS:9 - 1002 - YES - - 67108864 - 268435456 - Custom Drawing - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{35, 8}, {128, 18}} - - - - _NS:9 - 1003 - YES - - 67108864 - 268435456 - Custom Drawing - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{35, 29}, {128, 18}} - - - - _NS:9 - 1004 - YES - - 67108864 - 268435456 - Auto Layout - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - {{1, 1}, {444, 77}} - - - - _NS:11 - - - {{17, 650}, {446, 93}} - - - - _NS:9 - {0, 0} - - 67108864 - 0 - Animation group 1 contains a view with the following properties: - - - - 6 - System - labelColor - - - - - 1 - 0 - 2 - NO - - 1 - MCAwIDAgMC40MgA - - - 1 - MCAwIDAgMC4xAA - - - - - 12 - - - - 274 - - - - 268 - {{300, 13}, {128, 18}} - - - - _NS:9 - 1002 - YES - - 67108864 - 268435456 - Custom Drawing - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{155, 13}, {128, 18}} - - - - _NS:9 - 1001 - YES - - 67108864 - 268435456 - Custom Layout - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{16, 13}, {128, 18}} - - - - _NS:9 - 1000 - YES - - 67108864 - 268435456 - Has Subviews - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - {{1, 1}, {444, 41}} - - - - _NS:11 - - - {{17, 582}, {446, 57}} - - - - _NS:9 - {0, 0} - - 67108864 - 0 - Animation group 2 contains a view with the following properties: - - - - - - 1 - 0 - 2 - NO - - 3 - MCAwLjEAA - - - - - 268 - {{14, 532}, {184, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Remove From Superview - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 265 - {{1143, 645}, {104, 26}} - - - - _NS:9 - YES - - -2076180416 - 2048 - - YES - 10 - 1044 - - _NS:9 - - 109199360 - 129 - - - 400 - 75 - - - Linear - - 1048576 - 2147483647 - 1 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - _popUpItemAction: - 1 - - - YES - - OtherViews - - - - - Ease-in - - 1048576 - 2147483647 - - - _popUpItemAction: - 2 - - - - - Ease Out - - 1048576 - 2147483647 - - - _popUpItemAction: - 3 - - - - - Ease In-Out - - 1048576 - 2147483647 - - - _popUpItemAction: - 4 - - - - - Custom - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 1 - YES - YES - 2 - - NO - - - - 268 - {{210, 532}, {184, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Revert - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 265 - {{1245, 303}, {54, 22}} - - - - _NS:9 - YES - - -1804599231 - 272630784 - - - 0,0,1,1 - _NS:9 - - YES - - - - NO - 1 - - - - 265 - {{1056, 300}, {93, 17}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Timing Function: - - YES - 10 - 1044 - - _NS:1535 - - - - - NO - 1 - - - - 265 - {{1143, 299}, {104, 26}} - - - - _NS:9 - YES - - -2076180416 - 2048 - - YES - 10 - 1044 - - _NS:9 - - 109199360 - 129 - - - 400 - 75 - - - Linear - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - 1 - - - YES - - OtherViews - - - - - Ease-in - - 1048576 - 2147483647 - - - _popUpItemAction: - 2 - - - - - Ease Out - - 1048576 - 2147483647 - - - _popUpItemAction: - 3 - - - - - Ease In-Out - - 1048576 - 2147483647 - - - _popUpItemAction: - 4 - - - - - Custom - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 1 - YES - YES - 2 - - NO - - - - 265 - {{1056, 685}, {93, 18}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Group 1 - - YES - 14 - 1044 - - _NS:1535 - - - - - NO - 1 - - - - 265 - {{1056, 332}, {93, 18}} - - - - _NS:1535 - YES - - 68157504 - 272630784 - Group 2 - - YES - 14 - 1044 - - _NS:1535 - - - - - NO - 1 - - - {1319, 763} - - - - - {{0, 0}, {1680, 1027}} - {10000000000000, 10000000000000} - YES - - - AppController - - - YES - - YES - - - YES - - - - - - - - delegate - - - - 451 - - - - theWindow - - - - 687 - - - - animationSandbox - - - - 717 - - - - setupGroup1: - - - - 720 - - - - setupGroup1: - - - - 721 - - - - setupGroup1: - - - - 722 - - - - group1Box - - - - 723 - - - - group2Box - - - - 724 - - - - runAnimationsGroup1: - - - - 725 - - - - runAnimationsGroup2: - - - - 726 - - - - runBothGroups: - - - - 727 - - - - removeFromSuperview: - - - - 731 - - - - setupGroup2: - - - - 743 - - - - setupGroup2: - - - - 744 - - - - setupGroup2: - - - - 745 - - - - revert: - - - - 746 - - - - button - - - - 795 - - - - setupGroup1: - - - - 823 - - - - setupGroup1: - - - - 826 - - - - value: arrangedObjects.enabled1 - - - - - - value: arrangedObjects.enabled1 - value - arrangedObjects.enabled1 - 2 - - - 564 - - - - value: arrangedObjects.name - - - - - - value: arrangedObjects.name - value - arrangedObjects.name - 2 - - - 544 - - - - value: arrangedObjects.name - - - - - - value: arrangedObjects.name - value - arrangedObjects.name - 2 - - - 567 - - - - value: arrangedObjects.enabled2 - - - - - - value: arrangedObjects.enabled2 - value - arrangedObjects.enabled2 - 2 - - - 565 - - - - contentArray: animations - - - - - - contentArray: animations - contentArray - animations - 2 - - - 562 - - - - content - - - - 546 - - - - value: selection.duration1 - - - - - - value: selection.duration1 - value - selection.duration1 - 2 - - - 574 - - - - value: selection.duration1 - - - - - - value: selection.duration1 - value - selection.duration1 - 2 - - - 569 - - - - value: selection.duration2 - - - - - - value: selection.duration2 - value - selection.duration2 - 2 - - - 572 - - - - value: selection.duration2 - - - - - - value: selection.duration2 - value - selection.duration2 - 2 - - - 570 - - - - value: selection.message1 - - - - - - value: selection.message1 - value - selection.message1 - 2 - - - 586 - - - - value: selection.message2 - - - - - - value: selection.message2 - value - selection.message2 - 2 - - - 587 - - - - value: selection.timingFunction1 - - - - - - value: selection.timingFunction1 - value - selection.timingFunction1 - 2 - - - 595 - - - - hidden: selection.selectedTimingFunction1 - - - - - - hidden: selection.selectedTimingFunction1 - hidden - selection.selectedTimingFunction1 - 2 - - - 769 - - - - selectedTag: selection.selectedTimingFunction1 - - - - - - selectedTag: selection.selectedTimingFunction1 - selectedTag - selection.selectedTimingFunction1 - 2 - - - 763 - - - - hidden: selection.selectedTimingFunction2 - - - - - - hidden: selection.selectedTimingFunction2 - hidden - selection.selectedTimingFunction2 - 2 - - - 788 - - - - value: selection.timingFunction2 - - - - - - value: selection.timingFunction2 - value - selection.timingFunction2 - 2 - - - 790 - - - - selectedTag: selection.selectedTimingFunction2 - - - - - - selectedTag: selection.selectedTimingFunction2 - selectedTag - selection.selectedTimingFunction2 - 2 - - - 786 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 371 - - - - - - - - 372 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 450 - - - - - 500 - - - - - - - - - - - 501 - - - - - - - - - 502 - - - - - 503 - - - - - 504 - - - - - 505 - - - - - - - - 506 - - - - - - - - 507 - - - - - 518 - - - - - - - - - - - 521 - - - - - 522 - - - - - 523 - - - - - 524 - - - - - - - - - 525 - - - - - - - - 526 - - - - - - - - 528 - - - - - 539 - - - - - 540 - - - - - 541 - - - - - 545 - - - - - 548 - - - - - - - - 549 - - - - - 550 - - - - - - - - 551 - - - - - 555 - - - - - - - - 556 - - - - - - - - 557 - - - - - 558 - - - - - 578 - - - - - - - - 579 - - - - - 580 - - - - - - - - 581 - - - - - 582 - - - - - - - - 583 - - - - - - - - 584 - - - - - 585 - - - - - 589 - - - - - - - - 590 - - - - - 591 - - - - - - - - 592 - - - - - 593 - - - - - - - - 594 - - - - - 596 - - - - - - - - 597 - - - - - 710 - - - - - - - - 711 - - - - - 712 - - - - - - - - 713 - - - - - 714 - - - - - - - - 715 - - - - - 716 - - - - - 718 - - - - - - - - - - - - 700 - - - - - - - - 701 - - - - - 696 - - - - - - - - 697 - - - - - 698 - - - - - - - - 699 - - - - - 719 - - - - - - - - - - 704 - - - - - - - - 707 - - - - - 703 - - - - - - - - 708 - - - - - 705 - - - - - - - - 706 - - - - - 728 - - - - - - - - 729 - - - - - 732 - - - - - - - - 733 - - - - - - - - 734 - - - - - - - - - - - - 735 - - - - - 736 - - - - - 737 - - - - - 738 - - - - - 739 - - - - - 740 - - - - - - - - 741 - - - - - 770 - - - - - - - - 771 - - - - - - - - 772 - - - - - - - - 773 - - - - - - - - 774 - - - - - - - - - - - - 775 - - - - - 776 - - - - - 777 - - - - - 778 - - - - - 779 - - - - - 780 - - - - - 781 - - - - - 791 - - - - - - - - 792 - - - - - 793 - - - - - - - - 794 - - - - - 821 - - - - - - - - 822 - - - - - 824 - - - - - - - - 825 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{303, 221}, {480, 360}} - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 826 - - - - - AppController - NSObject - - id - id - id - id - id - id - id - id - - - - animate: - id - - - removeFromSuperview: - id - - - revert: - id - - - runAnimationsGroup1: - id - - - runAnimationsGroup2: - id - - - runBothGroups: - id - - - setupGroup1: - id - - - setupGroup2: - id - - - - NSView - NSBox - NSBox - NSWindow - - - - animationSandbox - NSView - - - group1Box - NSBox - - - group2Box - NSBox - - - theWindow - NSWindow - - - - IBProjectSource - ../.XcodeSupport/AppController.h - - - - - 0 - IBCocoaFramework - NO - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - {12, 12} - {10, 2} - {15, 15} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/CPSegmentedControlTest/AppController.j b/Tests/Manual/CPSegmentedControlTest/AppController.j index 6269aa996..1073aa53e 100644 --- a/Tests/Manual/CPSegmentedControlTest/AppController.j +++ b/Tests/Manual/CPSegmentedControlTest/AppController.j @@ -118,6 +118,13 @@ CPLogRegister(CPLogConsole); return; } +- (IBAction)enable:(id)sender +{ + var enable = [sender state]; + [segmentedControl1 setEnabled:enable]; + [segmentedControl2 setEnabled:enable]; +} + - (BOOL)assertTrue:(BOOL)value { [passedLabel setStringValue:value?@"Passed":@"Failed"]; diff --git a/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.cib b/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.cib index d75841bbc..7df0a7b57 100644 --- a/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;69E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;55E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;71E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;62E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;76E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;39E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;38E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;44E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;45E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;81E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;47E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;48E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;49E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;50E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;55E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;85E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;86E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;87E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;88E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;89E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;90E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;91E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;36E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;93E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;93E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;94E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;95E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;98E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;99E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;107E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;108E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;97E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;109E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;110E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;103E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;92E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;111E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;99E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;112E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;108E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;97E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;109E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;110E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;103E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;92E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;9;CPStepperK;8;$classesA;S;9;CPStepperS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;113E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;114E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;115E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;2;92E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;117E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;118E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;119E;K;17;CPStepperMinValueD;K;6;CP$UIDd;3;120E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;121E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;110E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;120E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;122E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;126E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;128E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;129E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;99E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;130E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;108E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;97E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;109E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;110E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;103E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;92E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;131E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;99E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;132E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;108E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;97E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;109E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;110E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;103E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;92E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;133E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;114E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;115E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;2;92E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;118E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;120E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;134E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;103E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;135E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;128E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;137E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;114E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;115E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;2;92E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;118E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;120E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;134E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;138E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;139E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;128E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;114E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;115E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;2;92E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;138E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;118E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;120E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;119E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;106E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;141E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;142E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;128E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;143E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;145E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;97E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;146E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;148E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;149E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;97E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;146E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;69E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;150E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;2;92E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;106E;K;6;$afontD;K;6;CP$UIDd;3;153E;K;7;$aimageD;K;6;CP$UIDd;3;155E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;108E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;97E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;156E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;110E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;103E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;92E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;157E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;55E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;158E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;120E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;160E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;55E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;158E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;161E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;55E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;158E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;162E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;163E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;164E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;97E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;146E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;10;$classnameS;18;CPSegmentedControlK;8;$classesA;S;18;CPSegmentedControlS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;165E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;167E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;168E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;169E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;120E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;170E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;120E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;120E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;171E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;167E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;173E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;120E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;120E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;176E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;108E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;97E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;109E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;110E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;103E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;92E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;177E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;178E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;179E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;103E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;110E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;108E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;97E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;97E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;146E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;103E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;106E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;97E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;97E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;180E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;181E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;92E;K;6;$afontD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;96E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;97E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;92E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;182E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;108E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;97E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;109E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;110E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;103E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;92E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;183E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;68E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;108E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;184E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;E;E;S;8;delegateS;11;passedLabelS;17;segmentedControl1S;17;segmentedControl2S;9;theWindowS;11;addSegment:S;14;removeSegment:S;24;addSegmentWithFixedSize:S;12;changeLabel:S;12;changeImage:S;21;takeIntegerValueFrom:S;16;setTrackingMode:S;18;testWidthAndFrame:S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1948778496S;24;{{487, 191}, {745, 482}}S;22;{{0, 0}, {1680, 1027}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {745, 482}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;E;E;S;6;normalS;6;{1, 1}F;S;23;{{131, 229}, {218, 25}}S;19;{{0, 0}, {218, 25}}d;2;36S;6;buttonS;27;bordered+controlSizeRegulard;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;104E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;185E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;186E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;97E;E;d;1;4S;28;Add segment with fixed widthS;0;d;2;14T;S;23;{{131, 262}, {218, 25}}S;16;SetSegmentCount:S;20;{{404, 227}, {0, 0}}S;16;{{0, 0}, {0, 0}}S;7;stepperS;18;controlSizeRegulard;2;50d;5;65540d;2;10d;1;1d;3;200S;22;{{353, 225}, {47, 22}}S;18;{{0, 0}, {47, 22}}S;9;textfieldS;35;bezeled+controlSizeRegular+editableS;2;50D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;187E;E;S;23;{{131, 302}, {218, 25}}S;22;Change label At Index:S;23;{{131, 335}, {218, 25}}S;22;Change image At Index:S;20;{{404, 301}, {0, 0}}d;3;100S;22;{{353, 299}, {47, 22}}S;1;0S;20;{{404, 333}, {0, 0}}d;1;3S;22;{{353, 331}, {47, 22}}S;20;{{404, 260}, {0, 0}}S;22;{{353, 258}, {47, 22}}S;1;3S;20;{{27, 72}, {78, 17}}S;18;{{0, 0}, {78, 17}}S;13;Regular (cib)D;K;6;$classD;K;6;CP$UIDd;3;127E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;188E;E;S;21;{{27, 122}, {65, 17}}S;18;{{0, 0}, {65, 17}}S;11;Small (cib)S;22;{{138, 20}, {139, 25}}S;19;{{0, 0}, {139, 25}}S;12;popup-buttonD;K;6;$classD;K;6;CP$UIDd;3;104E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;185E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;186E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;97E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;4;nameD;K;6;CP$UIDd;3;189E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;190E;K;5;valueD;K;6;CP$UIDd;3;191E;E;d;2;12S;10;Select OneS;17;_popUpItemAction:d;7;1048576S;11;Select ManyS;9;MomentaryS;20;{{27, 22}, {95, 17}}S;18;{{0, 0}, {95, 17}}S;14;Tracking Mode:S;22;{{138, 121}, {-4, 20}}S;18;{{0, 0}, {-4, 20}}S;17;segmented-controlS;16;controlSizeSmallD;K;6;$classD;K;6;CP$UIDd;3;104E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;185E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;192E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;97E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;E;E;S;22;{{138, 70}, {197, 25}}S;19;{{0, 0}, {197, 25}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;E;E;S;23;{{131, 375}, {276, 25}}S;19;{{0, 0}, {276, 25}}S;39;Test width not affected by frame changeS;22;{{429, 377}, {98, 17}}S;18;{{0, 0}, {98, 17}}S;30;controlSizeRegular+placeholderS;23;{{131, 196}, {225, 25}}S;19;{{0, 0}, {225, 25}}S;31;Add segment with flexible widthS;13;AppControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;E;E;S;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;120E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;120E;E;E;S;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;104E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;185E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;186E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;97E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;97E;E;d;2;11D;K;10;$classnameS;14;_CPSegmentItemK;8;$classesA;S;14;_CPSegmentItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;199E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;2;97E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;110E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;2;92E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;200E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;110E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;110E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;120E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;199E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;2;97E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;110E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;2;92E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;200E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;110E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;110E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;120E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;134E;E;f;18;0.6862745098039216S;5;helloS;5;worldE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;72E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;60E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;73E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;76E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;39E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;35E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;42E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;44E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;81E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;45E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;48E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;51E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;53E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;54E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;55E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;69E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;88E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;73E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;89E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;90E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;91E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;92E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;93E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;94E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;95E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;37E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;97E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;102E;E;D;K;10;$classnameS;18;CPSegmentedControlK;8;$classesA;S;18;CPSegmentedControlS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;106E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;107E;K;6;$afontD;K;6;CP$UIDd;3;109E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;111E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;113E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;115E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;113E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;113E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;116E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;117E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;106E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;120E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;121E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;113E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;113E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;2;96E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;122E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;96E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;7;$aimageD;K;6;CP$UIDd;3;127E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;128E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;129E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;131E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;96E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;133E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;134E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;96E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;7;$aimageD;K;6;CP$UIDd;3;135E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;136E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;137E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;131E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;96E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;134E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;96E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;7;$aimageD;K;6;CP$UIDd;3;139E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;140E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;141E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;131E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;96E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;142E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;134E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;96E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;7;$aimageD;K;6;CP$UIDd;3;143E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;144E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;145E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;131E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;96E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;146E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;134E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;96E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;7;$aimageD;K;6;CP$UIDd;3;147E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;148E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;149E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;131E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;96E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;9;CPStepperK;8;$classesA;S;9;CPStepperS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;47E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;150E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;2;96E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;154E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;155E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;156E;K;17;CPStepperMinValueD;K;6;CP$UIDd;3;113E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;157E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;132E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;113E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;158E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;159E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;161E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;163E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;164E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;132E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;166E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;47E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;167E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;2;96E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;168E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;155E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;113E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;169E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;110E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;170E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;159E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;161E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;171E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;172E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;132E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;166E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;47E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;173E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;2;96E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;174E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;155E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;113E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;169E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;175E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;176E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;159E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;161E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;177E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;172E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;132E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;166E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;47E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;178E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;2;96E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;179E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;175E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;155E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;113E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;156E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;112E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;180E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;159E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;161E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;181E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;182E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;132E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;132E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;166E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;183E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;185E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;186E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;101E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;187E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;188E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;189E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;190E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;101E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;187E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;72E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;192E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;193E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;194E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;96E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;11;$aalignmentD;K;6;CP$UIDd;2;96E;K;7;$aimageD;K;6;CP$UIDd;3;195E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;196E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;197E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;96E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;60E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;199E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;113E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;200E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;201E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;60E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;199E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;200E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;60E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;199E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;200E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;203E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;204E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;118E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;205E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;206E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;101E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;187E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;207E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;208E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;96E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;110E;K;7;$aimageD;K;6;CP$UIDd;3;209E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;210E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;211E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;131E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;96E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;212E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;213E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;214E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;215E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;132E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;130E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;101E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;101E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;187E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;110E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;101E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;101E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;132E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;68E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;96E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;216E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;217E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;219E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;96E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;100E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;100E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;101E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;220E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;113E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;96E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;221E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;130E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;101E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;113E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;113E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;132E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;110E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;222E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;130E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;223E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;35E;E;E;S;8;delegateS;11;passedLabelS;17;segmentedControl1S;17;segmentedControl2S;9;theWindowS;11;addSegment:S;14;removeSegment:S;24;addSegmentWithFixedSize:S;12;changeLabel:S;12;changeImage:S;21;takeIntegerValueFrom:S;16;setTrackingMode:S;18;testWidthAndFrame:S;7;enable:S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1881669632S;24;{{487, 191}, {745, 482}}S;22;{{0, 0}, {1680, 1027}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {745, 482}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;69E;E;E;S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{138, 121}, {1, 20}}S;17;{{0, 0}, {1, 20}}d;2;36S;17;segmented-controlS;16;controlSizeSmallD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;224E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;225E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;101E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;101E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;132E;E;d;1;2D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;4d;1;1d;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;228E;E;E;S;22;{{138, 70}, {201, 25}}S;19;{{0, 0}, {201, 25}}S;18;controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;3;108E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;224E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;114E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;132E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;101E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;229E;D;K;6;CP$UIDd;3;230E;E;E;S;23;{{131, 196}, {225, 25}}S;19;{{0, 0}, {225, 25}}S;6;buttonS;27;bordered+controlSizeRegularD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;233E;K;5;stateD;K;6;CP$UIDd;3;234E;K;5;valueD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;31;Add segment with flexible widthS;0;d;2;14T;S;23;{{131, 229}, {218, 25}}S;19;{{0, 0}, {218, 25}}D;K;6;$classD;K;6;CP$UIDd;3;126E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;233E;K;5;stateD;K;6;CP$UIDd;3;234E;K;5;valueD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;28;Add segment with fixed widthS;23;{{131, 262}, {218, 25}}D;K;6;$classD;K;6;CP$UIDd;3;126E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;233E;K;5;stateD;K;6;CP$UIDd;3;234E;K;5;valueD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;SetSegmentCount:S;23;{{131, 302}, {218, 25}}D;K;6;$classD;K;6;CP$UIDd;3;126E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;233E;K;5;stateD;K;6;CP$UIDd;3;234E;K;5;valueD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;Change label At Index:S;23;{{131, 335}, {218, 25}}D;K;6;$classD;K;6;CP$UIDd;3;126E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;233E;K;5;stateD;K;6;CP$UIDd;3;234E;K;5;valueD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;Change image At Index:S;20;{{404, 227}, {0, 0}}S;16;{{0, 0}, {0, 0}}S;7;stepperD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;50d;5;65540d;2;10d;3;200S;22;{{353, 225}, {47, 22}}S;18;{{0, 0}, {47, 22}}S;9;textfieldS;35;bezeled+controlSizeRegular+editableD;K;6;$classD;K;6;CP$UIDd;3;108E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;224E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;114E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;101E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;101E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;237E;E;E;S;2;50D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;E;S;20;{{404, 301}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;3;100S;22;{{353, 299}, {47, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;240E;E;E;S;1;0S;20;{{404, 333}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;3S;22;{{353, 331}, {47, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;241E;E;E;S;20;{{404, 260}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{353, 258}, {47, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;242E;E;E;S;1;3S;20;{{27, 72}, {78, 17}}S;18;{{0, 0}, {78, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;13;Regular (cib)D;K;6;$classD;K;6;CP$UIDd;3;165E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;243E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;239E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;E;S;21;{{27, 122}, {65, 17}}S;18;{{0, 0}, {65, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;11;Small (cib)S;22;{{138, 20}, {139, 25}}S;19;{{0, 0}, {139, 25}}S;12;popup-buttonD;K;6;$classD;K;6;CP$UIDd;3;126E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;233E;K;5;stateD;K;6;CP$UIDd;3;234E;K;5;valueD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;12S;10;Select OneS;17;_popUpItemAction:d;7;1048576S;11;Select ManyS;9;MomentaryS;20;{{27, 22}, {95, 17}}S;18;{{0, 0}, {95, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;14;Tracking Mode:S;23;{{131, 375}, {276, 25}}S;19;{{0, 0}, {276, 25}}D;K;6;$classD;K;6;CP$UIDd;3;126E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;233E;K;5;stateD;K;6;CP$UIDd;3;234E;K;5;valueD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;39;Test width not affected by frame changeS;22;{{429, 377}, {98, 17}}S;18;{{0, 0}, {98, 17}}S;30;controlSizeRegular+placeholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{304, 20}, {93, 21}}S;18;{{0, 0}, {93, 21}}S;9;check-boxS;27;controlSizeRegular+selectedD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;7;EnabledS;13;AppControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;E;E;S;28;_CPFontSystemFacePlaceholderd;2;11D;K;10;$classnameS;14;_CPSegmentItemK;8;$classesA;S;14;_CPSegmentItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;226E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;244E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;101E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;132E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;2;96E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;3;226E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;245E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;132E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;132E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;113E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;3;226E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;244E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;101E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;132E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;2;96E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;3;226E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;245E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;132E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;132E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;113E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;169E;E;S;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;232E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;108E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;246E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;247E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;101E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;101E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;249E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;250E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;50E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;50E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;113E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;3;236E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;252E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;250E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;52E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;52E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;253E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;254E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;250E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;54E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;54E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;256E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;250E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;56E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;56E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;113E;E;E;S;5;helloS;5;worldS;18;.AppleSystemUIFontd;2;13D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;259E;E;d;2;42D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;260E;E;D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;259E;E;D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;259E;E;D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;259E;E;D;K;6;$classD;K;6;CP$UIDd;3;248E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;263E;E;f;18;0.6862745098039216S;56;{"origin":{"x":0,"y":1},"size":{"width":47,"height":21}}S;60;{"origin":{"x":353,"y":226},"size":{"width":47,"height":21}}S;60;{"origin":{"x":353,"y":300},"size":{"width":47,"height":21}}S;60;{"origin":{"x":353,"y":332},"size":{"width":47,"height":21}}S;60;{"origin":{"x":353,"y":259},"size":{"width":47,"height":21}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.xib b/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.xib index 680506c6b..7b500023a 100644 --- a/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.xib +++ b/Tests/Manual/CPSegmentedControlTest/Resources/MainMenu.xib @@ -1,1345 +1,258 @@ - - - - 1050 - 14C109 - 6751 - 1344.72 - 757.30 - - com.apple.InterfaceBuilder.CocoaPlugin - 6751 - - - NSButton - NSButtonCell - NSCustomObject - NSMenu - NSMenuItem - NSPopUpButton - NSPopUpButtonCell - NSSegmentedCell - NSSegmentedControl - NSStepper - NSStepperCell - NSTextField - NSTextFieldCell - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - 15 - 2 - {{487, 354}, {745, 482}} - 1948778496 - Window - NSWindow - - - - - 256 - - - - 268 - {{136, 341}, {94, 20}} - - - - _NS:9 - YES - - 75497472 - 131072 - - YES - 11 - 3100 - - _NS:9 - - - - hello - 0 - - - world - 1 - YES - 0 - - - 1 - 1 - - NO - - - - 268 - {{136, 389}, {208, 24}} - - - - _NS:9 - YES - - 75497472 - 0 - - YES - 13 - 1044 - - _NS:9 - - - - 100 - hello - 0 - - - 100 - world - 1 - YES - 0 - - - 1 - 1 - - NO - - - - 268 - {{125, 258}, {237, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Add segment with flexible width - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{125, 225}, {230, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Add segment with fixed width - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{125, 192}, {230, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - SetSegmentCount: - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{125, 152}, {230, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Change label At Index: - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{125, 119}, {230, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Change image At Index: - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{401, 230}, {19, 27}} - - - - _NS:1592 - YES - - 786464 - 0 - _NS:1592 - - 50 - 1 - 200 - 10 - YES - - NO - - - - 268 - {{357, 232}, {39, 22}} - - - - _NS:9 - 1 - YES - - -1804599231 - 272630784 - 50 - - _NS:9 - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - 3 - MAA - - - - NO - 1 - - - - 268 - {{401, 156}, {19, 27}} - - - - _NS:1592 - YES - - 786464 - 0 - _NS:1592 - - 100 - 1 - YES - - NO - - - - 268 - {{357, 158}, {39, 22}} - - - - _NS:9 - 2 - YES - - -1804599231 - -1874852864 - 0 - - _NS:9 - - YES - - - - NO - 1 - - - - 268 - {{401, 124}, {19, 27}} - - - - _NS:1592 - YES - - 786464 - 0 - _NS:1592 - - 100 - 1 - YES - - NO - - - - 268 - {{357, 126}, {39, 22}} - - - - _NS:9 - 3 - YES - - -1804599231 - -1874852864 - 0 - - _NS:9 - - YES - - - - NO - 1 - - - - 268 - {{401, 197}, {19, 27}} - - - - _NS:1592 - YES - - 786464 - 0 - _NS:1592 - - 3 - 10 - 1 - YES - - NO - - - - 268 - {{357, 199}, {39, 22}} - - - - _NS:9 - 4 - YES - - -1804599231 - 272630784 - 3 - - _NS:9 - - YES - - - - NO - 1 - - - - 268 - {{25, 393}, {82, 17}} - - - - _NS:526 - {251, 750} - YES - - 68157504 - 272630784 - Regular (cib) - - _NS:526 - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - labelColor - - - - NO - 1 - - - - 268 - {{25, 343}, {69, 17}} - - - - _NS:526 - {251, 750} - YES - - 68157504 - 272630784 - Small (cib) - - _NS:526 - - - - - NO - 1 - - - - 268 - {{136, 438}, {144, 26}} - - - - _NS:9 - YES - - 71303232 - 2048 - - YES - 13 - 1301 - - _NS:9 - - 109199360 - 129 - - .HelveticaNeueDeskInterface-Regular - 13 - 16 - - - - 400 - 75 - - - Select One - - 1048576 - 2147483647 - 1 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - _popUpItemAction: - - - YES - - - - - - - Select Many - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Momentary - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 1 - YES - YES - 2 - - NO - - - - 268 - {{25, 443}, {99, 17}} - - - - _NS:526 - {251, 750} - YES - - 68157504 - 272630784 - Tracking Mode: - - _NS:526 - - - - - NO - 1 - - - - 268 - {{125, 79}, {288, 32}} - - - _NS:9 - YES - - 67108864 - 134217728 - Test width not affected by frame change - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{427, 88}, {102, 17}} - - - _NS:526 - {251, 750} - YES - - 68157504 - 272630784 - - - _NS:526 - - - - - NO - 1 - - - {745, 482} - - - - - {{0, 0}, {1680, 1027}} - {10000000000000, 10000000000000} - YES - - - AppController - - - - - - - delegate - - - - 451 - - - - addSegment: - - - - 467 - - - - segmentedControl1 - - - - 471 - - - - segmentedControl2 - - - - 472 - - - - addSegmentWithFixedSize: - - - - 476 - - - - removeSegment: - - - - 480 - - - - theWindow - - - - 482 - - - - changeLabel: - - - - 493 - - - - changeImage: - - - - 494 - - - - setTrackingMode: - - - - 532 - - - - passedLabel - - - - 537 - - - - testWidthAndFrame: - - - - 538 - - - - takeIntegerValueFrom: - - - - 512 - - - - takeIntegerValueFrom: - - - - 513 - - - - takeIntegerValueFrom: - - - - 514 - - - - takeIntegerValueFrom: - - - - 519 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 371 - - - - - - - - 372 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 450 - - - - - 460 - - - - - - - - 461 - - - - - 462 - - - - - - - - 463 - - - - - 464 - - - - - - - - 465 - - - - - 469 - - - - - - - - 470 - - - - - 473 - - - - - - - - 474 - - - - - 487 - - - - - - - - 488 - - - - - 490 - - - - - - - - 491 - - - - - 497 - - - - - - - - 498 - - - - - 499 - - - - - - - - 500 - - - - - - 502 - - - - - - - - 503 - - - - - - - - 504 - - - - - - 506 - - - - - 507 - - - - - - - - 508 - - - - - - - - 509 - - - - - - 511 - - - - - 515 - - - - - - - - 516 - - - - - - - - 517 - - - - - 518 - - - - - 520 - - - - - - - - 521 - - - - - 522 - - - - - - - - 523 - - - - - 524 - - - - - - - - 525 - - - - - - - - 526 - - - - - - - - - - 527 - - - - - 528 - - - - - 529 - - - - - 530 - - - - - - - - 531 - - - - - 533 - - - - - - - - 534 - - - - - 535 - - - - - - - - 536 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - {400.5, 397} - com.apple.InterfaceBuilder.CocoaPlugin - {{303, 221}, {480, 360}} - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 538 - - - - - AppController - NSObject - - id - id - id - id - id - id - id - - - - addSegment: - id - - - addSegmentWithFixedSize: - id - - - changeImage: - id - - - changeLabel: - id - - - removeSegment: - id - - - setTrackingMode: - id - - - testWidthAndFrame: - id - - - - NSTextField - NSSegmentedControl - NSSegmentedControl - NSWindow - - - - passedLabel - NSTextField - - - segmentedControl1 - NSSegmentedControl - - - segmentedControl2 - NSSegmentedControl - - - theWindow - NSWindow - - - - IBProjectSource - ../.XcodeSupport/AppController.h - - - - - 0 - IBCocoaFramework - NO - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - {12, 12} - {10, 2} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/CPTabViewBindings/index-debug.html b/Tests/Manual/CPTabViewBindings/index-debug.html index d167acc92..029e77822 100644 --- a/Tests/Manual/CPTabViewBindings/index-debug.html +++ b/Tests/Manual/CPTabViewBindings/index-debug.html @@ -59,7 +59,6 @@ + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPTextView/index.html b/Tests/Manual/CPTextView/index.html new file mode 100644 index 000000000..5069921db --- /dev/null +++ b/Tests/Manual/CPTextView/index.html @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + CPTextView + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPTextView/main.j b/Tests/Manual/CPTextView/main.j new file mode 100644 index 000000000..7a956f1f5 --- /dev/null +++ b/Tests/Manual/CPTextView/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPLevelIndicator + * + * Created by Alexander Ljungberg on May 28, 2011. + * Copyright 2011, WireLoad All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/CPTextViewCibTest/AppController.j b/Tests/Manual/CPTextViewCibTest/AppController.j new file mode 100644 index 000000000..82b6d6ec8 --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/AppController.j @@ -0,0 +1,34 @@ +/* + * AppController.j + * CPTextViewCibTest + * + * Created by You on June 4, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPTextView textView; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; +} + +@end diff --git a/Tests/Manual/CPTextViewCibTest/Info.plist b/Tests/Manual/CPTextViewCibTest/Info.plist new file mode 100644 index 000000000..f24e33a9a --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPTextViewCibTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2014, Your Company All rights reserved. + + diff --git a/Tests/Manual/CPTextViewCibTest/Jakefile b/Tests/Manual/CPTextViewCibTest/Jakefile new file mode 100644 index 000000000..eb85f3135 --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/Jakefile @@ -0,0 +1,184 @@ +/* + * Jakefile + * CPTextViewCibTest + * + * Created by You on June 4, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "CPTextViewCibTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPTextViewCibTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPTextViewCibTest"); + task.setIdentifier("com.yourcompany.CPTextViewCibTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPTextViewCibTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPTextViewCibTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPTextViewCibTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (ENV["CONFIGURATION"] === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", ENV["CONFIGURATION"], projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/CPTextViewCibTest/Resources/MainMenu.cib b/Tests/Manual/CPTextViewCibTest/Resources/MainMenu.cib new file mode 100644 index 000000000..7aded24f7 --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;34E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;35E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;36E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;37E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;21E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;38E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;36E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;34E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;39E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;40E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;41E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;42E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;43E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;44E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;45E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;23E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;46E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;47E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;47E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;48E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;50E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;52E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;46E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;55E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;56E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;57E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;50E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;58E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;27E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;32E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;31E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;59E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;59E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;59E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;59E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;60E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;51E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;51E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;2;61E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;2;62E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;46E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;63E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;64E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;65E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;66E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;50E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;69E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;29E;E;D;K;10;$classnameS;10;CPTextViewK;8;$classesA;S;10;CPTextViewS;6;CPTextS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;46E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;64E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;64E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;66E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;2;70E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;50E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;71E;K;23;CPTextViewIsEditableKeyD;K;6;CP$UIDd;2;60E;K;25;CPTextViewIsSelectableKeyD;K;6;CP$UIDd;2;60E;K;23;CPTextViewIsRichTextKeyD;K;6;CP$UIDd;2;60E;K;21;CPTextViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;22;CPTextViewContainerKeyD;K;6;CP$UIDd;2;73E;K;32;CPTextViewInsertionPointColorKeyD;K;6;CP$UIDd;2;74E;K;35;CPTextViewSelectedTextAttributesKeyD;K;6;CP$UIDd;2;76E;K;23;CPTextViewAllowsUndoKeyD;K;6;CP$UIDd;2;60E;K;26;CPTextViewUsesFontPanelKeyD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;46E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;77E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;79E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;81E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;50E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;83E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;46E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;25E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;84E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;85E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;51E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;86E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;46E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;87E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;81E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;50E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;89E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;46E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;25E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;90E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;85E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;60E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;86E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;91E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;E;E;S;8;delegateS;8;textViewS;9;theWindowS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879048192S;24;{{335, 128}, {480, 360}}S;21;{{0, 0}, {1440, 878}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;E;E;S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{20, 20}, {448, 320}}S;20;{{0, 0}, {448, 320}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;61E;E;E;d;2;36S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;10T;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;92E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;92E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;50E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;50E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;51E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;93E;E;d;1;2S;20;{{1, 1}, {446, 318}}S;20;{{0, 0}, {446, 318}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;d;2;18D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;94E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;vfokrtD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;15;CPTextContainerK;8;$classesA;S;15;CPTextContainerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;22;CPTextContainerSizeKeyD;K;6;CP$UIDd;2;96E;K;31;CPTextContainerLayoutManagerKeyD;K;6;CP$UIDd;2;98E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;10;CP.objectsD;K;7;NSColorD;K;6;CP$UIDd;2;74E;K;17;NSBackgroundColorD;K;6;CP$UIDd;3;100E;E;E;S;23;{{-100, 405}, {87, 15}}S;18;{{0, 0}, {87, 15}}d;1;8d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:d;1;4d;1;1S;21;{{432, 1}, {15, 318}}S;19;{{0, 0}, {15, 318}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:S;13;AppControllerS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;E;E;S;5;colorS;15;{446, 10000000}D;K;10;$classnameS;15;CPLayoutManagerK;8;$classesA;S;15;CPLayoutManagerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;29;CPLayoutManagerTextStorageKeyD;K;6;CP$UIDd;3;102E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;86E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;E;D;K;10;$classnameS;13;CPTextStorageK;8;$classesA;S;13;CPTextStorageS;25;CPMutableAttributedStringS;18;CPAttributedStringS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;101E;K;24;CPAttributedStringStringD;K;6;CP$UIDd;3;104E;K;24;CPAttributedStringRangesD;K;6;CP$UIDd;3;105E;K;28;CPAttributedStringAttributesD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;2;86E;E;E;S;21;Je suis un CPTextViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;110E;E;E;f;12;0.6666666667D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;111E;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;10;CP.objectsD;K;30;CPForegroundColorAttributeNameD;K;6;CP$UIDd;3;112E;K;19;CPFontAttributeNameD;K;6;CP$UIDd;3;114E;K;29;CPParagraphStyleAttributeNameD;K;6;CP$UIDd;3;116E;E;E;S;26;{"location":0,"length":21}D;K;6;$classD;K;6;CP$UIDd;2;67E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;117E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;49E;E;D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;118E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;119E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;60E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;51E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;51E;E;D;K;10;$classnameS;16;CPParagraphStyleK;8;$classesA;S;16;CPParagraphStyleS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;115E;K;28;CPParagraphStyleAlignmentKeyD;K;6;CP$UIDd;2;85E;K;27;CPParagraphStyleTabStopsKeyD;K;6;CP$UIDd;1;0E;K;38;CPParagraphStyleFirstLineHeadIndentKeyD;K;6;CP$UIDd;2;46E;K;29;CPParagraphStyleHeadIndentKeyD;K;6;CP$UIDd;2;46E;K;29;CPParagraphStyleTailIndentKeyD;K;6;CP$UIDd;2;46E;K;35;CPParagraphStyleParagraphSpacingKeyD;K;6;CP$UIDd;2;46E;K;36;CPParagraphStyleMinimumLineHeightKeyD;K;6;CP$UIDd;2;46E;K;36;CPParagraphStyleMaximumLineHeightKeyD;K;6;CP$UIDd;2;46E;K;30;CPParagraphStyleLineSpacingKeyD;K;6;CP$UIDd;2;46E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;2;86E;E;E;S;11;Arial Blackd;2;16f;12;0.3049308391f;12;0.3742420204E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTextViewCibTest/Resources/MainMenu.xib b/Tests/Manual/CPTextViewCibTest/Resources/MainMenu.xib new file mode 100644 index 000000000..3b53186d8 --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/Resources/MainMenu.xib @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/CPTextViewCibTest/index-debug.html b/Tests/Manual/CPTextViewCibTest/index-debug.html new file mode 100644 index 000000000..ed8c41c09 --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/index-debug.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + CPTextViewCibTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTextViewCibTest/index.html b/Tests/Manual/CPTextViewCibTest/index.html new file mode 100644 index 000000000..9dd3013c4 --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + CPTextViewCibTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTextViewCibTest/main.j b/Tests/Manual/CPTextViewCibTest/main.j new file mode 100644 index 000000000..a9d2a4c48 --- /dev/null +++ b/Tests/Manual/CPTextViewCibTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPTextViewCibTest + * + * Created by You on June 4, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.cib b/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.cib index 076ebfc48..72c10e78c 100644 --- a/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.cib +++ b/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;3;213E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;217E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;223E;D;K;6;CP$UIDd;3;224E;D;K;6;CP$UIDd;3;225E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;229E;D;K;6;CP$UIDd;3;230E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;232E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;236E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;238E;D;K;6;CP$UIDd;3;239E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;246E;D;K;6;CP$UIDd;3;247E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;D;K;6;CP$UIDd;3;250E;D;K;6;CP$UIDd;3;251E;D;K;6;CP$UIDd;3;253E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;257E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;261E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;266E;D;K;6;CP$UIDd;3;267E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;249E;D;K;6;CP$UIDd;3;250E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;253E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;257E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;261E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;267E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;268E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;269E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;264E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;270E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;264E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;266E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;264E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;258E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;264E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;259E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;273E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;264E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;253E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;274E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;111E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;276E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;116E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;178E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;278E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;184E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;279E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;175E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;280E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;183E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;281E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;177E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;282E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;176E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;283E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;179E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;284E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;186E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;285E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;182E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;286E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;117E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;287E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;104E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;288E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;127E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;289E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;156E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;157E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;292E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;136E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;293E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;294E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;134E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;295E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;149E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;296E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;297E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;135E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;150E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;299E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;132E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;300E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;144E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;301E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;145E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;301E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;142E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;302E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;301E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;138E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;148E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;304E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;143E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;301E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;305E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;190E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;191E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;307E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;308E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;160E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;161E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;310E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;162E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;199E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;312E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;223E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;225E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;314E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;226E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;315E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;217E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;316E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;218E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;317E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;219E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;318E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;220E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;319E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;221E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;320E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;212E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;321E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;213E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;322E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;214E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;323E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;206E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;324E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;207E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;325E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;208E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;209E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;327E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;169E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;328E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;153E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;329E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;330E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;165E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;331E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;166E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;332E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;170E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;171E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;172E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;335E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;251E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;336E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;229E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;337E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;230E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;338E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;231E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;339E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;232E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;246E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;341E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;247E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;342E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;248E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;343E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;237E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;344E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;238E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;345E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;239E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;346E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;242E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;347E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;243E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;348E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;244E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;349E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;262E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;266E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;350E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;351E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;352E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;354E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;261E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;266E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;350E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;351E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;352E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;259E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;266E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;350E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;351E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;352E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;356E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;258E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;266E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;350E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;351E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;352E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;357E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;268E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;358E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;359E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;360E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;361E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;109E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;361E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;364E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;365E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;109E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;369E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;109E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;370E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;109E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;371E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;109E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;372E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;373E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;115E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;373E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;374E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;376E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;377E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;378E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;379E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;380E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;381E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;383E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;384E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;125E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;384E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;385E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;386E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;387E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;115E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;378E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;388E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;389E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;129E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;389E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;391E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;392E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;393E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;395E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;396E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;397E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;398E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;399E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;400E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;401E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;402E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;403E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;405E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;140E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;405E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;406E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;407E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;408E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;140E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;409E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;410E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;140E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;411E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;412E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;413E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;140E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;414E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;415E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;416E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;140E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;417E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;418E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;419E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;140E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;420E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;421E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;147E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;421E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;422E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;423E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;424E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;425E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;426E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;427E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;428E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;429E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;430E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;155E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;430E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;431E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;432E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;155E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;433E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;155E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;434E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;159E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;434E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;436E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;419E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;159E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;420E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;437E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;416E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;159E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;417E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;438E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;408E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;159E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;409E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;439E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;440E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;441E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;442E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;168E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;442E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;443E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;444E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;445E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;446E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;447E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;448E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;388E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;449E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;449E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;451E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;452E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;453E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;454E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;455E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;456E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;457E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;458E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;459E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;460E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;461E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;181E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;461E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;462E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;463E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;464E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;181E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;465E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;466E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;467E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;468E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;469E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;174E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;470E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;189E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;470E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;471E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;472E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;189E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;473E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;388E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;474E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;189E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;475E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;475E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;476E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;477E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;195E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;477E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;478E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;479E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;480E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;473E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;481E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;416E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;482E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;483E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;419E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;484E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;485E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;486E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;487E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;408E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;488E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;489E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;490E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;491E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;492E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;205E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;492E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;493E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;494E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;205E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;495E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;205E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;496E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;205E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;497E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;205E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;498E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;211E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;498E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;499E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;494E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;211E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;495E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;211E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;500E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;211E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;501E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;216E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;501E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;502E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;494E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;503E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;504E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;505E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;506E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;507E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;508E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;509E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;401E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;388E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;510E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;195E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;399E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;388E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;511E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;228E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;511E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;512E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;513E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;514E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;515E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;516E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;517E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;518E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;519E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;520E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;235E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;520E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;521E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;522E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;523E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;524E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;525E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;526E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;523E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;524E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;525E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;366E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;368E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;527E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;528E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;401E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;529E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;530E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;228E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;399E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;529E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;531E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;362E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;250E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;3;105E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;531E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;532E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;533E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;534E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;250E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;535E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;363E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;252E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;536E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;537E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;538E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;539E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;540E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;541E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;373E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;255E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;254E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;543E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;544E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;545E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;546E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;256E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;255E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;547E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;548E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;255E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;549E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;550E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;546E;K;6;$afontD;K;6;CP$UIDd;3;552E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;542E;K;11;$aalignmentD;K;6;CP$UIDd;3;490E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;366E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;553E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;554E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;368E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;368E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;368E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;556E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;542E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;490E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;256E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;255E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;557E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;558E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;255E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;549E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;550E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;K;6;$afontD;K;6;CP$UIDd;3;552E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;416E;K;11;$aalignmentD;K;6;CP$UIDd;3;490E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;366E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;367E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;554E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;366E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;366E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;366E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;560E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;416E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;490E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;561E;E;D;K;6;$classD;K;6;CP$UIDd;3;256E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;255E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;562E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;558E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;255E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;549E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;550E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;K;6;$afontD;K;6;CP$UIDd;3;552E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;416E;K;11;$aalignmentD;K;6;CP$UIDd;3;490E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;366E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;367E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;554E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;366E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;366E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;366E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;560E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;416E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;490E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;563E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;260E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;255E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;564E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;565E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;255E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;549E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;546E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;542E;K;11;$aalignmentD;K;6;CP$UIDd;3;542E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;567E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;568E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;542E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;569E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;542E;E;D;K;6;$classD;K;6;CP$UIDd;3;260E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;255E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;570E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;565E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;255E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;549E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;546E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;542E;K;11;$aalignmentD;K;6;CP$UIDd;3;542E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;567E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;490E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;542E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;569E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;542E;E;D;K;6;$classD;K;6;CP$UIDd;3;256E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;255E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;571E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;572E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;255E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;549E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;550E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;546E;K;6;$afontD;K;6;CP$UIDd;3;552E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;542E;K;11;$aalignmentD;K;6;CP$UIDd;3;490E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;366E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;573E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;554E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;368E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;368E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;368E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;556E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;542E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;490E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;574E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;265E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;575E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;366E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;542E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;576E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;577E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;578E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;550E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;546E;K;6;$afontD;K;6;CP$UIDd;3;552E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;416E;K;11;$aalignmentD;K;6;CP$UIDd;3;490E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;366E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;579E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;554E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;368E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;368E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;368E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;556E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;416E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;490E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;253E;E;E;S;8;delegateS;10;controllerS;10;textFieldAS;10;textFieldBS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;14;runPageLayout:S;6;print:S;15;saveDocumentAs:S;12;newDocument:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;5;hide:S;10;terminate:S;22;hideOtherApplications:S;22;unhideAllApplications:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;10;underline:S;21;orderFrontColorPanel:S;9;copyFont:S;10;pasteFont:S;9;unscript:S;12;superscript:S;10;subscript:S;14;raiseBaseline:S;14;lowerBaseline:S;21;useStandardLigatures:S;17;turnOffLigatures:S;16;useAllLigatures:S;19;useStandardKerning:S;15;turnOffKerning:S;15;tightenKerning:S;14;loosenKerning:S;14;uppercaseWord:S;34;toggleAutomaticSpellingCorrection:S;29;orderFrontSubstitutionsPanel:S;32;toggleAutomaticDashSubstitution:S;31;toggleAutomaticTextReplacement:S;14;lowercaseWord:S;15;capitalizeWord:S;17;pasteAsPlainText:S;9;showHelp:S;10;alignLeft:S;12;alignCenter:S;15;alignJustified:S;11;alignRight:S;12;toggleRuler:S;10;copyRuler:S;11;pasteRuler:S;32;makeBaseWritingDirectionNatural:S;36;makeBaseWritingDirectionLeftToRight:S;36;makeBaseWritingDirectionRightToLeft:S;32;makeTextWritingDirectionNatural:S;36;makeTextWritingDirectionLeftToRight:S;36;makeTextWritingDirectionRightToLeft:S;23;value: selection.volumeS;5;valueS;16;selection.volumeD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;3;366E;K;27;CPMultipleValuesPlaceholderD;K;6;CP$UIDd;3;580E;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;581E;K;26;CPNotApplicablePlaceholderD;K;6;CP$UIDd;3;582E;K;17;CPNullPlaceholderD;K;6;CP$UIDd;3;583E;E;E;S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;249E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;33;CPContinuouslyUpdatesValueBindingS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;119E;E;E;S;39;About CPContinuouslyUpdatesValueBindingS;38;Hide CPContinuouslyUpdatesValueBindingS;1;hS;8;Show AllS;38;Quit CPContinuouslyUpdatesValueBindingS;1;qS;12;Preferences…S;1;,S;8;ServicesS;15;_CPServicesMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;11;Hide Othersd;7;1572864S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;154E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;142E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;153E;E;E;S;27;Check Spelling While TypingS;18;Check Document NowS;1;;S;25;Show Spelling and GrammarS;1;:S;27;Check Grammar With SpellingS;30;Correct Spelling AutomaticallyS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;156E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;166E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;18;Show SubstitutionsS;12;Smart DashesS;16;Text ReplacementS;15;TransformationsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;E;E;S;15;Make Upper CaseS;15;Make Lower CaseS;10;CapitalizeS;21;Paste and Match StyleS;1;VS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;177E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;6;Print…S;1;pS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;182E;E;E;S;10;Clear MenuS;13;Page Setup...S;1;PS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;E;E;S;12;Show ToolbarS;1;tS;18;Customize Toolbar…S;6;FormatD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;227E;E;E;S;4;FontS;11;_CPFontMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;223E;D;K;6;CP$UIDd;3;224E;D;K;6;CP$UIDd;3;225E;D;K;6;CP$UIDd;3;226E;E;E;S;10;Show FontsS;4;BoldS;1;bS;6;ItalicS;1;iS;9;UnderlineS;1;uS;6;BiggerS;1;+S;7;Smallerd;1;4S;1;-S;4;KernD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;E;E;S;11;Use DefaultS;8;Use NoneS;7;TightenS;6;LoosenS;8;LigatureD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;3;213E;D;K;6;CP$UIDd;3;214E;E;E;S;7;Use AllS;8;BaselineD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;217E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;221E;E;E;S;11;SuperscriptS;9;SubscriptS;5;RaiseS;5;LowerS;11;Show ColorsS;1;CS;10;Copy StyleS;11;Paste StyleS;4;TextD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;229E;D;K;6;CP$UIDd;3;230E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;232E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;246E;D;K;6;CP$UIDd;3;247E;D;K;6;CP$UIDd;3;248E;E;E;S;10;Align LeftS;1;{S;6;CenterS;1;|S;7;JustifyS;11;Align RightS;1;}S;17;Writing DirectionD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;236E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;238E;D;K;6;CP$UIDd;3;239E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;D;K;6;CP$UIDd;3;244E;E;E;S;9;ParagraphS;8; DefaultS;14; Left to RightS;14; Right to LeftS;9;SelectionS;10;Show RulerS;10;Copy Rulerd;7;1310720S;11;Paste RulerS;4;HelpS;11;_NSHelpMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;251E;E;E;S;38;CPContinuouslyUpdatesValueBinding HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1954021376S;24;{{335, 585}, {460, 203}}S;22;{{0, 0}, {1920, 1178}}d;2;15d;1;0S;21;{{7, 11}, {460, 203}}S;20;{{0, 0}, {460, 203}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;257E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;3;261E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;263E;E;E;S;6;normalS;21;{{20, 20}, {420, 68}}S;19;{{0, 0}, {420, 68}}d;2;36S;9;textfieldD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;551E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;584E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;585E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;368E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;368E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;366E;E;S;200;The controls on the left should update the ones on the right immediately when interacted with, while the fields on the right should not update the other field until first responder status is resigned.d;4;3072D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;555E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;586E;E;S;21;{{16, 92}, {214, 29}}S;19;{{0, 0}, {214, 29}}S;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;555E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;587E;E;S;21;I update immediately!S;22;{{230, 92}, {214, 29}}S;21;I am more pondersome.S;21;{{77, 124}, {92, 21}}S;18;{{0, 0}, {92, 21}}S;6;sliderd;2;50d;2;68d;3;100S;22;{{291, 124}, {92, 21}}S;22;{{20, 149}, {417, 34}}S;19;{{0, 0}, {417, 34}}S;123;(These sliders don't technically test the Continuously updates binding option, but the functionality is related in spirit.)S;44;CPContinuouslyUpdatesValueBindingAppDelegateS;19;CPMutableDictionaryS;18;{{3, 0}, {32, 17}}S;18;{{0, 0}, {32, 17}}d;2;12S;5;LabelS;8;multipleS;12;no selectionS;14;not applicableS;16;null placeholderS;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;588E;D;K;6;CP$UIDd;3;588E;D;K;6;CP$UIDd;3;588E;D;K;6;CP$UIDd;3;419E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;419E;D;K;6;CP$UIDd;3;419E;D;K;6;CP$UIDd;3;419E;D;K;6;CP$UIDd;3;419E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;3;213E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;217E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;223E;D;K;6;CP$UIDd;3;224E;D;K;6;CP$UIDd;3;225E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;229E;D;K;6;CP$UIDd;3;230E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;232E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;236E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;238E;D;K;6;CP$UIDd;3;239E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;246E;D;K;6;CP$UIDd;3;247E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;D;K;6;CP$UIDd;3;250E;D;K;6;CP$UIDd;3;251E;D;K;6;CP$UIDd;3;252E;D;K;6;CP$UIDd;3;254E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;260E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;266E;D;K;6;CP$UIDd;3;268E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;272E;D;K;6;CP$UIDd;3;273E;D;K;6;CP$UIDd;3;274E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;275E;D;K;6;CP$UIDd;3;277E;D;K;6;CP$UIDd;3;278E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;225E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;241E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;250E;D;K;6;CP$UIDd;3;251E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;254E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;260E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;266E;D;K;6;CP$UIDd;3;268E;D;K;6;CP$UIDd;3;266E;D;K;6;CP$UIDd;3;266E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;274E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;278E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;279E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;280E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;275E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;281E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;275E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;277E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;282E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;275E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;259E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;283E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;275E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;260E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;284E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;275E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;254E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;285E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;249E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;286E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;246E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;287E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;111E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;288E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;289E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;132E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;136E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;292E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;137E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;293E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;294E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;125E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;295E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;134E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;296E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;297E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;122E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;105E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;299E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;300E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;120E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;301E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;182E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;302E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;181E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;144E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;304E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;148E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;305E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;143E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;160E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;307E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;147E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;308E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;145E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;159E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;310E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;153E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;312E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;152E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;312E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;156E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;154E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;312E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;314E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;162E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;315E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;155E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;312E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;247E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;316E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;242E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;317E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;243E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;318E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;319E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;169E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;320E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;170E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;321E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;172E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;322E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;190E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;323E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;214E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;324E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;216E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;325E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;217E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;208E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;327E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;209E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;328E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;210E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;329E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;211E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;330E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;212E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;331E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;203E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;332E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;204E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;205E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;197E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;335E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;336E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;199E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;337E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;200E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;338E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;176E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;339E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;164E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;167E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;341E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;171E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;342E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;173E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;343E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;177E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;344E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;178E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;345E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;146E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;346E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;252E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;347E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;220E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;348E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;221E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;349E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;222E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;350E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;223E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;351E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;237E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;352E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;238E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;353E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;239E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;354E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;228E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;229E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;356E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;230E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;357E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;233E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;358E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;234E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;359E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;235E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;360E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;270E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;277E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;361E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;362E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;363E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;365E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;263E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;277E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;366E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;367E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;363E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;368E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;262E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;277E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;366E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;367E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;363E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;369E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;260E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;277E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;366E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;367E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;363E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;370E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;259E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;277E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;366E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;367E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;363E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;371E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;279E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;372E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;373E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;374E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;375E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;110E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;110E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;375E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;378E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;379E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;380E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;384E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;385E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;386E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;116E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;116E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;386E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;387E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;388E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;389E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;390E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;391E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;390E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;393E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;395E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;396E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;124E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;124E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;396E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;397E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;398E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;399E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;400E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;401E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;402E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;128E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;128E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;402E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;403E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;405E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;128E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;406E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;407E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;408E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;409E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;410E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;411E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;412E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;413E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;414E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;415E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;412E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;416E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;417E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;418E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;139E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;139E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;418E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;419E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;420E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;421E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;422E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;423E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;412E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;424E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;425E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;426E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;427E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;428E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;429E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;430E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;431E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;432E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;433E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;434E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;435E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;151E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;151E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;435E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;436E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;437E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;438E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;151E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;439E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;440E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;441E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;151E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;442E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;443E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;444E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;151E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;445E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;412E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;446E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;447E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;151E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;448E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;449E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;151E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;450E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;451E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;158E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;158E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;451E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;452E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;453E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;158E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;454E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;455E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;158E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;456E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;457E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;158E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;458E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;158E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;459E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;460E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;166E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;166E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;460E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;461E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;462E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;463E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;438E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;166E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;439E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;464E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;441E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;166E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;442E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;465E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;466E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;444E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;166E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;445E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;412E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;467E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;468E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;175E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;468E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;469E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;470E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;175E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;471E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;175E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;472E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;175E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;473E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;180E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;180E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;139E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;473E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;474E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;475E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;180E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;476E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;180E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;477E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;184E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;184E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;477E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;478E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;479E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;186E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;186E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;479E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;480E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;481E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;482E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;483E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;484E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;441E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;485E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;486E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;438E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;487E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;488E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;489E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;490E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;444E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;491E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;492E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;493E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;494E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;495E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;196E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;495E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;496E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;497E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;196E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;498E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;196E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;499E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;196E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;500E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;196E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;501E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;202E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;501E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;502E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;497E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;498E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;503E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;504E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;207E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;504E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;505E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;497E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;506E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;507E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;508E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;509E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;510E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;511E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;512E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;427E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;513E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;429E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;514E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;219E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;219E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;514E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;515E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;516E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;517E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;518E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;519E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;520E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;521E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;522E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;523E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;226E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;523E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;524E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;525E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;526E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;527E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;528E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;529E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;526E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;527E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;528E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;530E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;531E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;427E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;532E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;533E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;219E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;429E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;532E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;534E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;241E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;534E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;535E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;536E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;241E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;483E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;537E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;241E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;538E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;245E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;245E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;538E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;539E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;540E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;541E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;245E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;542E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;543E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;381E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;383E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;544E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;545E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;251E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;376E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;251E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;545E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;546E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;547E;E;D;K;6;$classD;K;6;CP$UIDd;3;108E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;548E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;251E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;549E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;377E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;253E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;550E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;551E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;552E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;553E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;554E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;555E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;375E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;256E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;255E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;557E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;557E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;558E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;561E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;257E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;562E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;563E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;564E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;565E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;566E;K;6;$afontD;K;6;CP$UIDd;3;568E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;556E;K;11;$aalignmentD;K;6;CP$UIDd;3;493E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;569E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;381E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;570E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;383E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;573E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;556E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;493E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;383E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;381E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;383E;E;D;K;6;$classD;K;6;CP$UIDd;3;257E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;574E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;575E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;564E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;565E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;576E;K;6;$afontD;K;6;CP$UIDd;3;568E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;441E;K;11;$aalignmentD;K;6;CP$UIDd;3;493E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;577E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;381E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;382E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;381E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;381E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;381E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;578E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;441E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;493E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;579E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;383E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;383E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;381E;E;D;K;6;$classD;K;6;CP$UIDd;3;257E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;580E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;575E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;564E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;565E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;576E;K;6;$afontD;K;6;CP$UIDd;3;568E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;441E;K;11;$aalignmentD;K;6;CP$UIDd;3;493E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;581E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;381E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;382E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;381E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;381E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;381E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;578E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;441E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;493E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;582E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;383E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;383E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;381E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;583E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;584E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;564E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;585E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;566E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;556E;K;11;$aalignmentD;K;6;CP$UIDd;3;556E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;586E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;587E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;588E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;556E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;589E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;556E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;590E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;584E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;564E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;585E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;566E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;556E;K;11;$aalignmentD;K;6;CP$UIDd;3;556E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;591E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;587E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;556E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;589E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;556E;E;D;K;6;$classD;K;6;CP$UIDd;3;257E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;592E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;593E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;564E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;565E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;566E;K;6;$afontD;K;6;CP$UIDd;3;568E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;556E;K;11;$aalignmentD;K;6;CP$UIDd;3;493E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;594E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;381E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;595E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;383E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;573E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;556E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;493E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;383E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;381E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;383E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;265E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;596E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;597E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;598E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;599E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;600E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;601E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;268E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;273E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;272E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;602E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;602E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;602E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;602E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;381E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;383E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;383E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;603E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;441E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;556E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;267E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;266E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;604E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;605E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;606E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;266E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;607E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;578E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;608E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;270E;E;D;K;10;$classnameS;10;CPTextViewK;8;$classesA;S;10;CPTextViewS;6;CPTextS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;269E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;268E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;605E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;605E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;268E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;609E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;578E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;610E;K;23;CPTextViewIsEditableKeyD;K;6;CP$UIDd;3;381E;K;25;CPTextViewIsSelectableKeyD;K;6;CP$UIDd;3;381E;K;23;CPTextViewIsRichTextKeyD;K;6;CP$UIDd;3;383E;K;21;CPTextViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;22;CPTextViewContainerKeyD;K;6;CP$UIDd;3;612E;K;32;CPTextViewInsertionPointColorKeyD;K;6;CP$UIDd;3;613E;K;35;CPTextViewSelectedTextAttributesKeyD;K;6;CP$UIDd;3;614E;K;23;CPTextViewAllowsUndoKeyD;K;6;CP$UIDd;3;381E;K;26;CPTextViewUsesFontPanelKeyD;K;6;CP$UIDd;3;381E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;271E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;266E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;615E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;616E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;266E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;607E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;617E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;618E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;619E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;620E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;556E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;266E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;621E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;383E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;438E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;271E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;266E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;622E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;623E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;266E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;607E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;618E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;619E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;624E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;556E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;266E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;625E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;381E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;438E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;257E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;256E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;626E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;627E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;256E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;599E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;565E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;566E;K;6;$afontD;K;6;CP$UIDd;3;568E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;556E;K;11;$aalignmentD;K;6;CP$UIDd;3;493E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;628E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;381E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;629E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;383E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;573E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;556E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;493E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;383E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;381E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;383E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;630E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;276E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;631E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;381E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;381E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;3;383E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;3;383E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;633E;E;D;K;6;$classD;K;6;CP$UIDd;3;257E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;556E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;634E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;635E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;599E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;565E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;566E;K;6;$afontD;K;6;CP$UIDd;3;568E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;441E;K;11;$aalignmentD;K;6;CP$UIDd;3;493E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;636E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;381E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;637E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;493E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;556E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;571E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;383E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;383E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;573E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;441E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;493E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;383E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;383E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;381E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;254E;E;E;S;8;delegateS;10;controllerS;10;textFieldAS;10;textFieldBS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;14;runPageLayout:S;6;print:S;15;saveDocumentAs:S;12;newDocument:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;5;hide:S;10;terminate:S;22;hideOtherApplications:S;22;unhideAllApplications:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;10;underline:S;21;orderFrontColorPanel:S;9;copyFont:S;10;pasteFont:S;9;unscript:S;12;superscript:S;10;subscript:S;14;raiseBaseline:S;14;lowerBaseline:S;21;useStandardLigatures:S;17;turnOffLigatures:S;16;useAllLigatures:S;19;useStandardKerning:S;15;turnOffKerning:S;15;tightenKerning:S;14;loosenKerning:S;14;uppercaseWord:S;34;toggleAutomaticSpellingCorrection:S;29;orderFrontSubstitutionsPanel:S;32;toggleAutomaticDashSubstitution:S;31;toggleAutomaticTextReplacement:S;14;lowercaseWord:S;15;capitalizeWord:S;17;pasteAsPlainText:S;9;showHelp:S;10;alignLeft:S;12;alignCenter:S;15;alignJustified:S;11;alignRight:S;12;toggleRuler:S;10;copyRuler:S;11;pasteRuler:S;32;makeBaseWritingDirectionNatural:S;36;makeBaseWritingDirectionLeftToRight:S;36;makeBaseWritingDirectionRightToLeft:S;32;makeTextWritingDirectionNatural:S;36;makeTextWritingDirectionLeftToRight:S;36;makeTextWritingDirectionRightToLeft:S;34;attributedString: selection.volumeS;16;attributedStringS;16;selection.volumeD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;364E;K;10;CP.objectsD;K;17;CPNullPlaceholderD;K;6;CP$UIDd;3;638E;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;3;381E;E;E;S;23;value: selection.volumeS;5;valueD;K;6;$classD;K;6;CP$UIDd;3;364E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;364E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;364E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;364E;K;10;CP.objectsD;K;27;CPMultipleValuesPlaceholderD;K;6;CP$UIDd;3;639E;K;17;CPNullPlaceholderD;K;6;CP$UIDd;3;638E;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;640E;K;26;CPNotApplicablePlaceholderD;K;6;CP$UIDd;3;641E;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;3;381E;E;E;S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;250E;E;E;S;33;CPContinuouslyUpdatesValueBindingS;14;submenuAction:d;7;1048576S;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;E;E;S;39;About CPContinuouslyUpdatesValueBindingT;S;0;F;S;12;Preferences…S;1;,S;8;ServicesS;15;_CPServicesMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;38;Hide CPContinuouslyUpdatesValueBindingS;1;hS;11;Hide Othersd;7;1572864S;8;Show AllS;38;Quit CPContinuouslyUpdatesValueBindingS;1;qS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;E;E;S;3;NewS;1;nS;5;Open…S;1;oS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;129E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;4;SaveS;1;sS;8;Save As…S;1;Sd;7;1179648S;15;Revert to SavedS;13;Page Setup...S;1;PS;6;Print…S;1;pS;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;179E;E;E;S;4;UndoS;1;zS;4;RedoS;1;ZS;3;CutS;1;xS;4;CopyS;1;cS;5;PasteS;1;vS;21;Paste and Match StyleS;1;VS;6;DeleteS;10;Select AllS;1;aS;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;156E;E;E;S;5;Find…d;1;1S;1;fS;9;Find Nextd;1;2S;1;gS;13;Find Previousd;1;3S;1;GS;22;Use Selection for Findd;1;7S;1;eS;17;Jump to SelectionS;1;jS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;E;E;S;25;Show Spelling and GrammarS;1;:S;18;Check Document NowS;1;;S;27;Check Spelling While TypingS;27;Check Grammar With SpellingS;30;Correct Spelling AutomaticallyS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;173E;E;E;S;18;Show SubstitutionsS;16;Smart Copy/PasteS;12;Smart QuotesS;12;Smart DashesS;11;Smart LinksS;16;Text ReplacementS;15;TransformationsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;E;E;S;15;Make Upper CaseS;15;Make Lower CaseS;10;CapitalizeS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;E;E;S;14;Start SpeakingS;13;Stop SpeakingS;6;FormatD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;218E;E;E;S;4;FontS;11;_CPFontMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;213E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;217E;E;E;S;10;Show FontsS;1;tS;4;BoldS;1;bS;6;ItalicS;1;iS;9;UnderlineS;1;uS;6;BiggerS;1;+S;7;Smallerd;1;4S;1;-S;4;KernD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;200E;E;E;S;11;Use DefaultS;8;Use NoneS;7;TightenS;6;LoosenS;8;LigatureD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;E;E;S;7;Use AllS;8;BaselineD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;212E;E;E;S;11;SuperscriptS;9;SubscriptS;5;RaiseS;5;LowerS;11;Show ColorsS;1;CS;10;Copy StyleS;11;Paste StyleS;4;TextD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;223E;D;K;6;CP$UIDd;3;224E;D;K;6;CP$UIDd;3;225E;D;K;6;CP$UIDd;3;236E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;238E;D;K;6;CP$UIDd;3;239E;E;E;S;10;Align LeftS;1;{S;6;CenterS;1;|S;7;JustifyS;11;Align RightS;1;}S;17;Writing DirectionD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;229E;D;K;6;CP$UIDd;3;230E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;232E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;235E;E;E;S;9;ParagraphS;8; DefaultS;14; Left to RightS;14; Right to LeftS;9;SelectionS;10;Show RulerS;10;Copy Rulerd;7;1310720S;11;Paste RulerS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;E;E;S;12;Show ToolbarS;18;Customize Toolbar…S;6;WindowS;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;246E;D;K;6;CP$UIDd;3;247E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;E;E;S;8;MinimizeS;1;mS;4;ZoomS;18;Bring All to FrontS;4;HelpS;11;_NSHelpMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;252E;E;E;S;38;CPContinuouslyUpdatesValueBinding HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1886912512S;24;{{335, 453}, {460, 335}}S;22;{{0, 0}, {1920, 1178}}d;2;15d;1;0S;20;{{0, 0}, {460, 335}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;3;260E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;263E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;266E;D;K;6;CP$UIDd;3;274E;E;E;S;6;normalS;6;{1, 1}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{19, 20}, {422, 68}}S;19;{{0, 0}, {422, 68}}d;2;36S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;567E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;642E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;571E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;383E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;383E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;381E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;200;The controls on the left should update the ones on the right immediately when interacted with, while the fields on the right should not update the other field until first responder status is resigned.d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;572E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;643E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;644E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;E;S;21;{{16, 93}, {214, 22}}S;19;{{0, 0}, {214, 22}}S;47;bezeled+controlSizeRegular+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;646E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;572E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;647E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;644E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;E;S;21;I update immediately!S;22;{{230, 93}, {214, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;648E;E;E;S;21;I am more pondersome.S;21;{{77, 124}, {92, 21}}S;18;{{0, 0}, {92, 21}}S;6;sliderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;50d;2;68d;3;100S;22;{{291, 124}, {92, 21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{19, 149}, {419, 34}}S;19;{{0, 0}, {419, 34}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;123;(These sliders don't technically test the Continuously updates binding option, but the functionality is related in spirit.)S;22;{{19, 211}, {222, 70}}S;19;{{0, 0}, {222, 70}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;268E;D;K;6;CP$UIDd;3;272E;D;K;6;CP$UIDd;3;273E;D;K;6;CP$UIDd;3;603E;E;E;d;2;12S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;10D;K;6;$classD;K;6;CP$UIDd;3;255E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;266E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;649E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;649E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;266E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;560E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;560E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;383E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;650E;E;S;19;{{1, 1}, {205, 68}}S;19;{{0, 0}, {205, 68}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;270E;E;E;d;1;8D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;18D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;15;CPTextContainerK;8;$classesA;S;15;CPTextContainerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;611E;K;22;CPTextContainerSizeKeyD;K;6;CP$UIDd;3;651E;K;31;CPTextContainerLayoutManagerKeyD;K;6;CP$UIDd;3;653E;E;D;K;6;$classD;K;6;CP$UIDd;3;572E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;654E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;644E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;E;D;K;6;$classD;K;6;CP$UIDd;3;364E;K;10;CP.objectsD;K;7;NSColorD;K;6;CP$UIDd;3;613E;K;17;NSBackgroundColorD;K;6;CP$UIDd;3;655E;E;E;S;23;{{-100, 155}, {87, 15}}S;18;{{0, 0}, {87, 15}}d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:S;20;{{206, 1}, {15, 68}}S;18;{{0, 0}, {15, 68}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:S;22;{{19, 289}, {328, 34}}S;19;{{0, 0}, {328, 34}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;57;This is to check whether bindings to CPTextView also workS;44;CPContinuouslyUpdatesValueBindingAppDelegateS;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;632E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;18;{{2, 0}, {34, 17}}S;18;{{0, 0}, {34, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;5;LabelS;16;null placeholderS;8;multipleS;12;no selectionS;14;not applicableS;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;656E;D;K;6;CP$UIDd;3;656E;D;K;6;CP$UIDd;3;656E;D;K;6;CP$UIDd;3;438E;E;E;S;5;colorD;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;645E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;658E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;659E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;259E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;259E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;660E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;438E;D;K;6;CP$UIDd;3;438E;D;K;6;CP$UIDd;3;438E;D;K;6;CP$UIDd;3;438E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;645E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;661E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;659E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;260E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;260E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;662E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;15;{205, 10000000}D;K;10;$classnameS;15;CPLayoutManagerK;8;$classesA;S;15;CPLayoutManagerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;652E;K;29;CPLayoutManagerTextStorageKeyD;K;6;CP$UIDd;3;664E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;556E;D;K;6;CP$UIDd;3;556E;D;K;6;CP$UIDd;3;556E;D;K;6;CP$UIDd;3;438E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;572E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;665E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;644E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;559E;E;f;18;0.6862745098039216D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;657E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;666E;E;d;2;42D;K;6;$classD;K;6;CP$UIDd;3;657E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;667E;E;D;K;6;$classD;K;6;CP$UIDd;3;657E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;666E;E;D;K;6;$classD;K;6;CP$UIDd;3;657E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;668E;E;D;K;10;$classnameS;13;CPTextStorageK;8;$classesA;S;13;CPTextStorageS;25;CPMutableAttributedStringS;18;CPAttributedStringS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;663E;K;24;CPAttributedStringStringD;K;6;CP$UIDd;3;382E;K;24;CPAttributedStringRangesD;K;6;CP$UIDd;3;669E;K;28;CPAttributedStringAttributesD;K;6;CP$UIDd;3;670E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;671E;D;K;6;CP$UIDd;3;671E;D;K;6;CP$UIDd;3;671E;D;K;6;CP$UIDd;3;438E;E;E;S;57;{"origin":{"x":0,"y":1},"size":{"width":214,"height":21}}S;59;{"origin":{"x":16,"y":94},"size":{"width":214,"height":21}}S;60;{"origin":{"x":230,"y":94},"size":{"width":214,"height":21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;672E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;673E;E;E;f;12;0.6666666667D;K;6;$classD;K;6;CP$UIDd;3;657E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;674E;E;D;K;6;$classD;K;6;CP$UIDd;3;364E;K;10;CP.objectsD;E;E;S;25;{"location":0,"length":0}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.xib b/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.xib index 1170088f5..a50b01703 100644 --- a/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.xib +++ b/Tests/Manual/ContinuouslyUpdatesValueBinding/Resources/MainMenu.xib @@ -1,4132 +1,777 @@ - - - 1060 - 10J3210 - 1306 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 1306 - - - YES - NSTextField - NSView - NSWindowTemplate - NSMenu - NSMenuItem - NSTextFieldCell - NSObjectController - NSSlider - NSSliderCell - NSCustomObject - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - YES - - - CPContinuouslyUpdatesValueBinding - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - CPContinuouslyUpdatesValueBinding - - YES - - - About CPContinuouslyUpdatesValueBinding - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide CPContinuouslyUpdatesValueBinding - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit CPContinuouslyUpdatesValueBinding - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Paste and Match Style - V - 1572864 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling and Grammar - : - 1048576 - 2147483647 - - - - - - Check Document Now - ; - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - Correct Spelling Automatically - - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Show Substitutions - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Dashes - - 2147483647 - - - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - Text Replacement - - 2147483647 - - - - - - - - - Transformations - - 2147483647 - - - submenuAction: - - Transformations - - YES - - - Make Upper Case - - 2147483647 - - - - - - Make Lower Case - - 2147483647 - - - - - - Capitalize - - 2147483647 - - - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - YES - - - Font - - 2147483647 - - - submenuAction: - - Font - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - YES - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - YES - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Writing Direction - - 2147483647 - - - submenuAction: - - Writing Direction - - YES - - - YES - Paragraph - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - YES - Selection - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - YES - - - CPContinuouslyUpdatesValueBinding Help - ? - 1048576 - 2147483647 - - - - - _NSHelpMenu - - - - _NSMainMenu - - - 15 - 2 - {{335, 390}, {460, 203}} - 1954021376 - CPContinuouslyUpdatesValueBinding - NSWindow - - - - 256 - - YES - - - 268 - {{17, 115}, {426, 68}} - - - - YES - - 67239424 - 272629760 - The controls on the left should update the ones on the right immediately when interacted with, while the fields on the right should not update the other field until first responder status is resigned. - - LucidaGrande - 13 - 1044 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - - - - 268 - {{20, 85}, {206, 22}} - - - - YES - - -1804468671 - 272630784 - - - I update immediately! - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - - - - - - 268 - {{234, 85}, {206, 22}} - - - - YES - - -1804468671 - 272630784 - - - I am more pondersome. - - YES - - - - - - - 268 - {{75, 58}, {96, 21}} - - - - YES - - -2079981824 - 0 - - - 100 - 0.0 - 50 - 0.0 - 0 - 1 - NO - NO - - - - - 268 - {{289, 58}, {96, 21}} - - - - YES - - -2080244224 - 0 - - - 100 - 0.0 - 50 - 0.0 - 0 - 1 - NO - NO - - - - - 268 - {{17, 20}, {423, 34}} - - - - YES - - 67239424 - 272629760 - (These sliders don't technically test the Continuously updates binding option, but the functionality is related in spirit.) - - - - - - - - {{7, 11}, {460, 203}} - - - - - {{0, 0}, {1920, 1178}} - {1e+13, 1e+13} - - - CPContinuouslyUpdatesValueBindingAppDelegate - - - - YES - volume - - YES - YES - - - - - 268 - {38, 17} - - YES - - 68288064 - 272630784 - Label - - - - - - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - raiseBaseline: - - - - 426 - - - - lowerBaseline: - - - - 427 - - - - copyFont: - - - - 428 - - - - subscript: - - - - 429 - - - - superscript: - - - - 430 - - - - tightenKerning: - - - - 431 - - - - underline: - - - - 432 - - - - orderFrontColorPanel: - - - - 433 - - - - useAllLigatures: - - - - 434 - - - - loosenKerning: - - - - 435 - - - - pasteFont: - - - - 436 - - - - unscript: - - - - 437 - - - - useStandardKerning: - - - - 438 - - - - useStandardLigatures: - - - - 439 - - - - turnOffLigatures: - - - - 440 - - - - turnOffKerning: - - - - 441 - - - - terminate: - - - - 449 - - - - toggleAutomaticSpellingCorrection: - - - - 456 - - - - orderFrontSubstitutionsPanel: - - - - 458 - - - - toggleAutomaticDashSubstitution: - - - - 461 - - - - toggleAutomaticTextReplacement: - - - - 463 - - - - uppercaseWord: - - - - 464 - - - - capitalizeWord: - - - - 467 - - - - lowercaseWord: - - - - 468 - - - - pasteAsPlainText: - - - - 486 - - - - performFindPanelAction: - - - - 487 - - - - performFindPanelAction: - - - - 488 - - - - performFindPanelAction: - - - - 489 - - - - showHelp: - - - - 493 - - - - delegate - - - - 495 - - - - alignCenter: - - - - 518 - - - - pasteRuler: - - - - 519 - - - - toggleRuler: - - - - 520 - - - - alignRight: - - - - 521 - - - - copyRuler: - - - - 522 - - - - alignJustified: - - - - 523 - - - - alignLeft: - - - - 524 - - - - makeBaseWritingDirectionNatural: - - - - 525 - - - - makeBaseWritingDirectionLeftToRight: - - - - 526 - - - - makeBaseWritingDirectionRightToLeft: - - - - 527 - - - - makeTextWritingDirectionNatural: - - - - 528 - - - - makeTextWritingDirectionLeftToRight: - - - - 529 - - - - makeTextWritingDirectionRightToLeft: - - - - 530 - - - - textFieldB - - - - 550 - - - - textFieldA - - - - 551 - - - - value: selection.volume - - - - - - value: selection.volume - value - selection.volume - 2 - - - 576 - - - - theWindow - - - - 579 - - - - controller - - - - 580 - - - - value: selection.volume - - - - - - value: selection.volume - value - selection.volume - - YES - - YES - NSContinuouslyUpdatesValue - NSMultipleValuesPlaceholder - NSNoSelectionPlaceholder - NSNotApplicablePlaceholder - NSNullPlaceholder - - - YES - - multiple - no selection - not applicable - null placeholder - - - 2 - - - 584 - - - - value: selection.volume - - - - - - value: selection.volume - value - selection.volume - 2 - - - 590 - - - - value: selection.volume - - - - - - value: selection.volume - value - selection.volume - 2 - - - 591 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - - - 80 - - - - - 78 - - - - - 72 - - - - - 82 - - - - - 124 - - - YES - - - - - - 77 - - - - - 73 - - - - - 79 - - - - - 112 - - - - - 74 - - - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - YES - - - - - - 372 - - - YES - - - - - - - - - - - 375 - - - YES - - - - - - 376 - - - YES - - - - - - - 377 - - - YES - - - - - - 388 - - - YES - - - - - - - - - - - - - - - - - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - 396 - - - - - 397 - - - YES - - - - - - 398 - - - YES - - - - - - 399 - - - YES - - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 404 - - - - - 405 - - - YES - - - - - - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - 410 - - - - - 411 - - - YES - - - - - - - - 412 - - - - - 413 - - - - - 414 - - - - - 415 - - - YES - - - - - - - - - 416 - - - - - 417 - - - - - 418 - - - - - 419 - - - - - 450 - - - YES - - - - - - 451 - - - YES - - - - - - - - 452 - - - - - 453 - - - - - 454 - - - - - 457 - - - - - 459 - - - - - 460 - - - - - 462 - - - - - 465 - - - - - 466 - - - - - 485 - - - - - 490 - - - YES - - - - - - 491 - - - YES - - - - - - 492 - - - - - 494 - - - - - 496 - - - YES - - - - - - 497 - - - YES - - - - - - - - - - - - - - - 498 - - - - - 499 - - - - - 500 - - - - - 501 - - - - - 502 - - - - - 503 - - - YES - - - - - - 504 - - - - - 505 - - - - - 506 - - - - - 507 - - - - - 508 - - - YES - - - - - - - - - - - - - - 509 - - - - - 510 - - - - - 511 - - - - - 512 - - - - - 513 - - - - - 514 - - - - - 515 - - - - - 516 - - - - - 517 - - - - - 533 - - - YES - - - - - - 534 - - - YES - - - - - - 535 - - - YES - - - - - - 536 - - - - - 537 - - - - - 538 - - - - - 562 - - - - - 585 - - - YES - - - - - - 586 - - - - - 587 - - - YES - - - - - - 588 - - - - - 592 - - - YES - - - - - - 593 - - - - - 594 - - - YES - - - - - - 595 - - - - - - - YES - - YES - -3.IBPluginDependency - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBEditorWindowLastContentRect - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBEditorWindowLastContentRect - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBEditorWindowLastContentRect - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBEditorWindowLastContentRect - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBEditorWindowLastContentRect - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBEditorWindowLastContentRect - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 371.IBEditorWindowLastContentRect - 371.IBPluginDependency - 371.IBWindowTemplateEditedContentRect - 371.NSWindowTemplate.visibleAtLaunch - 371.editorWindowContentRectSynchronizationRect - 372.IBPluginDependency - 375.IBPluginDependency - 376.IBEditorWindowLastContentRect - 376.IBPluginDependency - 377.IBPluginDependency - 388.IBEditorWindowLastContentRect - 388.IBPluginDependency - 389.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 392.IBPluginDependency - 393.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBPluginDependency - 399.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 404.IBPluginDependency - 405.IBPluginDependency - 406.IBPluginDependency - 407.IBPluginDependency - 408.IBPluginDependency - 409.IBPluginDependency - 410.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency - 413.IBPluginDependency - 414.IBPluginDependency - 415.IBPluginDependency - 416.IBPluginDependency - 417.IBPluginDependency - 418.IBPluginDependency - 419.IBPluginDependency - 450.IBPluginDependency - 451.IBEditorWindowLastContentRect - 451.IBPluginDependency - 452.IBPluginDependency - 453.IBPluginDependency - 454.IBPluginDependency - 457.IBPluginDependency - 459.IBPluginDependency - 460.IBPluginDependency - 462.IBPluginDependency - 465.IBPluginDependency - 466.IBPluginDependency - 485.IBPluginDependency - 490.IBPluginDependency - 491.IBEditorWindowLastContentRect - 491.IBPluginDependency - 492.IBPluginDependency - 496.IBPluginDependency - 497.IBEditorWindowLastContentRect - 497.IBPluginDependency - 498.IBPluginDependency - 499.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 - 500.IBPluginDependency - 501.IBPluginDependency - 502.IBPluginDependency - 503.IBPluginDependency - 504.IBPluginDependency - 505.IBPluginDependency - 506.IBPluginDependency - 507.IBPluginDependency - 508.IBEditorWindowLastContentRect - 508.IBPluginDependency - 509.IBPluginDependency - 510.IBPluginDependency - 511.IBPluginDependency - 512.IBPluginDependency - 513.IBPluginDependency - 514.IBPluginDependency - 515.IBPluginDependency - 516.IBPluginDependency - 517.IBPluginDependency - 533.IBPluginDependency - 534.IBPluginDependency - 535.IBPluginDependency - 536.IBPluginDependency - 537.IBPluginDependency - 538.IBPluginDependency - 56.IBPluginDependency - 56.ImportedFromIB2 - 562.IBPluginDependency - 57.IBEditorWindowLastContentRect - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 585.IBPluginDependency - 586.IBPluginDependency - 587.IBPluginDependency - 588.IBPluginDependency - 592.IBPluginDependency - 593.IBPluginDependency - 594.IBPluginDependency - 595.IBPluginDependency - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBEditorWindowLastContentRect - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{753, 187}, {275, 113}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{547, 180}, {254, 283}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{187, 434}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {167, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{753, 217}, {238, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{654, 239}, {194, 73}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{525, 802}, {197, 73}} - {{380, 836}, {512, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{6, 978}, {478, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - {{604, 269}, {231, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{475, 832}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{746, 287}, {220, 133}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{380, 496}, {480, 360}} - com.apple.InterfaceBuilder.CocoaPlugin - {{380, 496}, {480, 360}} - - {{33, 99}, {480, 360}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{591, 420}, {83, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{523, 2}, {178, 283}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{753, 197}, {170, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{725, 289}, {246, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{674, 260}, {204, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{878, 180}, {164, 173}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - {{286, 129}, {275, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{23, 794}, {245, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{452, 109}, {196, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{145, 474}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - - - - - YES - - - - - 595 - - - - YES - - CPContinuouslyUpdatesValueBindingAppDelegate - NSObject - - YES - - YES - controller - textFieldA - textFieldB - theWindow - - - YES - NSObjectController - NSTextField - NSTextField - NSWindow - - - - YES - - YES - controller - textFieldA - textFieldB - theWindow - - - YES - - controller - NSObjectController - - - textFieldA - NSTextField - - - textFieldB - NSTextField - - - theWindow - NSWindow - - - - - IBProjectSource - ./Classes/CPContinuouslyUpdatesValueBindingAppDelegate.h - - - - NSDocument - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - - - IBProjectSource - ./Classes/NSDocument.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The controls on the left should update the ones on the right immediately when interacted with, while the fields on the right should not update the other field until first responder status is resigned. + + + + + + + + + + + + + + + + + multiple + no selection + not applicable + null placeholder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + null placeholder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volume + + + + + + + + + + + + + diff --git a/Tests/Manual/MobileTest/AppController.j b/Tests/Manual/MobileTest/AppController.j new file mode 100644 index 000000000..81bedcdf5 --- /dev/null +++ b/Tests/Manual/MobileTest/AppController.j @@ -0,0 +1,61 @@ +/* + * AppController.j + * MobileTest + * + * Created by You on August 18, 2016. + * Copyright 2016, Your Company All rights reserved. + */ + +@import +@import +@import "Test1Controller.j" +@import "Test2Controller.j" + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPButton nextButton; + @outlet CPView testView; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (@action)next:(id)sender +{ + [self activateTest:[Test2Controller new]]; + [sender setEnabled:NO]; +} + +- (void)activateTest:aController +{ + var viewFrame = [testView frame], + resizingMask = [testView autoresizingMask]; + + [aController loadViewWithCompletionHandler:function(aView, error) + { + [aView setFrame:viewFrame]; + [aView setAutoresizingMask:resizingMask]; + [[theWindow contentView] replaceSubview:testView with:aView]; + testView = aView; + [theWindow makeFirstResponder:[aView nextValidKeyView]]; + }]; + +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; + + [self activateTest:[Test1Controller new]]; +} + +@end diff --git a/Tests/Manual/MobileTest/Info.plist b/Tests/Manual/MobileTest/Info.plist new file mode 100644 index 000000000..12bb51220 --- /dev/null +++ b/Tests/Manual/MobileTest/Info.plist @@ -0,0 +1,16 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + MobileTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2016, Your Company All rights reserved. + CPTheme + Aristo2 + + diff --git a/Tests/Manual/MobileTest/Jakefile b/Tests/Manual/MobileTest/Jakefile new file mode 100644 index 000000000..b40d57510 --- /dev/null +++ b/Tests/Manual/MobileTest/Jakefile @@ -0,0 +1,172 @@ +/* + * Jakefile + * MobileTest + * + * Created by You on August 18, 2016. + * Copyright 2016, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "MobileTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "MobileTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("MobileTest"); + task.setIdentifier("com.yourcompany.MobileTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("MobileTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O2"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/MobileTest/Resources/MainMenu.cib b/Tests/Manual/MobileTest/Resources/MainMenu.cib new file mode 100644 index 000000000..6e8a49351 --- /dev/null +++ b/Tests/Manual/MobileTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;20E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;31E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;32E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;33E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;31E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;34E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;31E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;35E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;31E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;26E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;36E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;31E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;23E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;37E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;31E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;38E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;32E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;39E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;40E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;41E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;42E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;43E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;44E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;45E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;25E;K;53;_CPCibWindowTemplateWindowAutorecalculatesKeyViewLoopD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;47E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;48E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;48E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;49E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;50E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;51E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;51E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;52E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;53E;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;47E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;54E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;55E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;56E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;50E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;51E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;51E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;52E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;57E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;47E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;58E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;59E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;60E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;61E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;62E;K;6;$afontD;K;6;CP$UIDd;2;64E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;65E;K;11;$aalignmentD;K;6;CP$UIDd;2;65E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;51E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;51E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;52E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;66E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;46E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;67E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;68E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;47E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;69E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;52E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;52E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;52E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;71E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;65E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;65E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;52E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;52E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;47E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;72E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;75E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;76E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;47E;K;6;$afontD;K;6;CP$UIDd;2;77E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;47E;K;11;$aalignmentD;K;6;CP$UIDd;2;65E;K;7;$aimageD;K;6;CP$UIDd;2;79E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;51E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;51E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;52E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;80E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;47E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;68E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;47E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;69E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;81E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;82E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;52E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;83E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;47E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;46E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;65E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;47E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;84E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;S;8;delegateS;10;nextButtonS;8;testViewS;9;theWindowS;5;next:S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879050240S;24;{{335, -71}, {375, 559}}S;21;{{0, 0}, {1440, 878}}d;1;7S;6;WindowT;d;1;0S;20;{{0, 0}, {375, 559}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;30E;E;E;S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{0, 0}, {375, 525}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;E;E;d;2;53D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;23;{{133, 254}, {108, 17}}S;19;{{0, 0}, {108, 17}}d;2;36S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;63E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;85E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;69E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;52E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;52E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;46E;E;d;1;2D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;10;Loading...d;1;4d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;70E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;86E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;87E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;50E;E;S;22;{{159, 524}, {57, 25}}S;18;{{0, 0}, {57, 25}}d;2;13S;6;buttonS;27;bordered+controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;2;63E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;85E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;69E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;46E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;52E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;4;nameD;K;6;CP$UIDd;2;88E;K;12;defaultValueD;K;6;CP$UIDd;2;90E;K;5;stateD;K;6;CP$UIDd;2;91E;K;5;valueD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;NextS;0;d;2;14S;13;AppControllerS;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;E;E;S;5;colorS;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;89E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;2;63E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;95E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;74E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;52E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;52E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;52E;E;f;18;0.6862745098039216d;1;1S;18;.AppleSystemUIFontE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/MobileTest/Resources/MainMenu.xib b/Tests/Manual/MobileTest/Resources/MainMenu.xib new file mode 100644 index 000000000..17403d716 --- /dev/null +++ b/Tests/Manual/MobileTest/Resources/MainMenu.xib @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/MobileTest/Resources/Test1View.cib b/Tests/Manual/MobileTest/Resources/Test1View.cib new file mode 100644 index 000000000..2032bdfb6 --- /dev/null +++ b/Tests/Manual/MobileTest/Resources/Test1View.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;30E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;31E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;32E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;22E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;33E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;22E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;26E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;34E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;26E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;35E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;36E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;37E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;39E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;25E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;40E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;41E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;37E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;43E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;44E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;45E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;45E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;46E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;47E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;48E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;49E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;49E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;50E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;51E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;44E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;52E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;54E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;55E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;56E;K;6;$afontD;K;6;CP$UIDd;2;58E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;44E;K;11;$aalignmentD;K;6;CP$UIDd;2;59E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;49E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;49E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;50E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;60E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;61E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;62E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;59E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;44E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;63E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;50E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;65E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;44E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;59E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;50E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;61E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;50E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;44E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;66E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;55E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;56E;K;6;$afontD;K;6;CP$UIDd;2;58E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;59E;K;11;$aalignmentD;K;6;CP$UIDd;2;59E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;49E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;49E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;50E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;68E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;61E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;69E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;59E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;44E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;63E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;50E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;65E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;59E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;59E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;50E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;50E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;50E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;44E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;70E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;71E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;54E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;55E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;K;6;$afontD;K;6;CP$UIDd;2;58E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;11;$aalignmentD;K;6;CP$UIDd;2;59E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;49E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;49E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;50E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;74E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;61E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;75E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;59E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;44E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;63E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;61E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;61E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;61E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;76E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;73E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;59E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;50E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;50E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;61E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;44E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;77E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;54E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;55E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;56E;K;6;$afontD;K;6;CP$UIDd;2;58E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;44E;K;11;$aalignmentD;K;6;CP$UIDd;2;59E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;49E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;49E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;50E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;79E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;61E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;80E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;59E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;44E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;63E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;50E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;65E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;44E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;59E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;50E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;61E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;50E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;44E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;81E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;55E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;56E;K;6;$afontD;K;6;CP$UIDd;2;58E;K;12;$atext-colorD;K;6;CP$UIDd;2;83E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;44E;K;11;$aalignmentD;K;6;CP$UIDd;2;59E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;49E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;49E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;50E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;84E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;61E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;85E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;59E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;44E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;63E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;50E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;50E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;65E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;44E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;59E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;50E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;61E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;50E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;2;86E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;2;61E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;2;61E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;2;50E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;2;50E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;2;88E;E;S;16;CPViewControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;viewS;11;nextKeyViewS;23;value: selection.field1S;5;valueS;16;selection.field1D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;61E;E;E;S;38;displayPatternValue1: selection.field1S;20;displayPatternValue1D;K;6;$classD;K;6;CP$UIDd;2;38E;K;10;CP.objectsD;K;16;CPDisplayPatternD;K;6;CP$UIDd;2;89E;E;E;S;13;CPApplicationd;1;0S;20;{{0, 0}, {375, 525}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;E;E;d;2;18S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{20, 20}, {335, 17}}S;19;{{0, 0}, {335, 17}}d;2;36S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;90E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;63E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;50E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;50E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;61E;E;d;1;4D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;T;S;54;1. The text field below should be the first responder.d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;91E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;48E;E;S;22;{{20, 151}, {335, 17}}d;2;34D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;10;You typed:S;21;{{16, 42}, {343, 22}}S;19;{{0, 0}, {343, 22}}S;47;bezeled+controlSizeRegular+editable+placeholderd;1;2D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;94E;E;E;S;0;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;48E;E;S;21;{{20, 75}, {335, 68}}S;19;{{0, 0}, {335, 68}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;160;2. Using the iOS virtual keyboard, type something and then tap "Done". The text field should resign first responder status. The virtual keyboard should dismiss.S;22;{{20, 176}, {335, 68}}D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;82E;K;4;nameD;K;6;CP$UIDd;2;96E;K;12;defaultValueD;K;6;CP$UIDd;2;97E;K;6;valuesD;K;6;CP$UIDd;2;98E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;179;It should not be possible to unfocus the field by tapping outside of it. Neither should tab on a hardware keyboard or return on the virtual keyboard cause the field to lose focus.S;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;21;You typed: %{value1}@S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;E;E;S;5;colorD;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;93E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;102E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;103E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;26E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;26E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;104E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;E;E;S;10;text-colorD;K;6;$classD;K;6;CP$UIDd;2;64E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;48E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;2;97E;K;6;normalD;K;6;CP$UIDd;3;106E;E;E;f;18;0.6862745098039216d;1;1D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;101E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;107E;E;d;2;42D;K;6;$classD;K;6;CP$UIDd;3;101E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;108E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;3;100E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;48E;E;S;57;{"origin":{"x":0,"y":1},"size":{"width":343,"height":21}}S;59;{"origin":{"x":16,"y":43},"size":{"width":343,"height":21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;E;E;f;4;0.25f;4;0.85E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/MobileTest/Resources/Test1View.xib b/Tests/Manual/MobileTest/Resources/Test1View.xib new file mode 100644 index 000000000..972eefa9b --- /dev/null +++ b/Tests/Manual/MobileTest/Resources/Test1View.xib @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + You typed: %{value1}@ + + + + + + + + + + + + + + + + + + + + + + + + + + 2. Using the iOS virtual keyboard, type something and then tap "Done". The text field should resign first responder status. The virtual keyboard should dismiss. + + + + + + + + + + It should not be possible to unfocus the field by tapping outside of it. Neither should tab on a hardware keyboard or return on the virtual keyboard cause the field to lose focus. + + + + + + + + + + + + + field1 + + + + diff --git a/Tests/Manual/MobileTest/Resources/Test2View.cib b/Tests/Manual/MobileTest/Resources/Test2View.cib new file mode 100644 index 000000000..5bda08604 --- /dev/null +++ b/Tests/Manual/MobileTest/Resources/Test2View.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;51E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;52E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;53E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;31E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;31E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;55E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;60E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;40E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;61E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;36E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;38E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;63E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;39E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;35E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;34E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;66E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;49E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;67E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;68E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;69E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;42E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;37E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;73E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;75E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;75E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;77E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;78E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;81E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;82E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;83E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;74E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;90E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;80E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;95E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;74E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;91E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;96E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;101E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;104E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;105E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;106E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;107E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;108E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;109E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;110E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;111E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;112E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;113E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;114E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;115E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;116E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;117E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;118E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;119E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;120E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;121E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;74E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;122E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;80E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;95E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;74E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;91E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;121E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;74E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;126E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;127E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;80E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;95E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;74E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;91E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;121E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;12;$atext-colorD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;74E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;131E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;132E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;80E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;95E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;74E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;91E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;133E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;134E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;135E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;100E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;136E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;100E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;137E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;91E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;47E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;139E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;141E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;142E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;74E;K;6;$afontD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;74E;K;11;$aalignmentD;K;6;CP$UIDd;3;100E;K;7;$aimageD;K;6;CP$UIDd;3;144E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;145E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;74E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;146E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;102E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;80E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;147E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;74E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;91E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;100E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;74E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;148E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;83E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;6;$afontD;K;6;CP$UIDd;2;88E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;79E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;79E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;149E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;150E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;74E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;93E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;80E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;95E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;89E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;89E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;80E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;80E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;80E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;151E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;2;91E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;2;91E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;2;80E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;2;80E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;153E;E;S;16;CPViewControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;viewS;11;nextKeyViewS;23;value: selection.field1S;5;valueS;16;selection.field1D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;S;38;displayPatternValue1: selection.field1S;20;displayPatternValue1D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;16;CPDisplayPatternD;K;6;CP$UIDd;3;154E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;26;CPContinuouslyUpdatesValueD;K;6;CP$UIDd;2;91E;E;E;S;13;CPApplicationd;1;0S;20;{{0, 0}, {375, 525}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;E;E;d;2;18S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{20, 20}, {335, 17}}S;19;{{0, 0}, {335, 17}}d;2;36S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;155E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;93E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;91E;E;d;1;4D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;157E;E;E;T;S;43;1. Using iOS, select the bottom text field.d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;158E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;78E;E;S;22;{{16, 480}, {176, 22}}S;19;{{0, 0}, {176, 22}}d;2;10S;47;bezeled+controlSizeRegular+editable+placeholderd;1;2D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;160E;E;E;S;0;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;78E;E;S;22;{{16, 448}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;162E;E;E;S;22;{{16, 416}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;163E;E;E;S;22;{{16, 384}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;164E;E;E;S;22;{{16, 352}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;165E;E;E;S;22;{{16, 320}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;166E;E;E;S;22;{{16, 288}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;E;E;S;22;{{16, 256}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;168E;E;E;S;22;{{16, 224}, {176, 22}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;E;E;S;21;{{20, 45}, {335, 34}}S;19;{{0, 0}, {335, 34}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;106;2. Try to tap other fields while the virtual keyboard is selected. The right field should become selected.S;21;{{20, 87}, {335, 34}}d;2;34D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;78;3. Tapping the "Do Nothing" button should not cause keyboard focus to be lost.S;22;{{20, 129}, {335, 34}}D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;170E;K;12;defaultValueD;K;6;CP$UIDd;3;171E;K;6;valuesD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;85;Cappuccino's hit test should not be confused by the presence of the virtual keyboard.S;23;{{121, 194}, {238, 22}}S;19;{{0, 0}, {238, 22}}S;56;bezeled+controlSizeRegular+disabled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;8;DisabledS;21;{{20, 197}, {97, 25}}S;18;{{0, 0}, {97, 25}}d;2;12S;6;buttonS;27;bordered+controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;2;87E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;155E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;93E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;91E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;173E;K;12;defaultValueD;K;6;CP$UIDd;3;175E;K;5;stateD;K;6;CP$UIDd;3;176E;K;5;valueD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;10;Do Nothingd;2;14S;22;{{20, 171}, {335, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;10;You typed:S;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;21;You typed: %{value1}@S;28;_CPFontSystemFacePlaceholderD;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;179E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;33E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;33E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;184E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;34E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;34E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;186E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;35E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;35E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;188E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;36E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;36E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;189E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;190E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;37E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;37E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;191E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;192E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;38E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;38E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;194E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;39E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;39E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;196E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;40E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;40E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;197E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;198E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;41E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;41E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;199E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;200E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;180E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;42E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;42E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;201E;E;S;10;text-colorD;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;202E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;171E;K;6;normalD;K;6;CP$UIDd;3;203E;E;E;S;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;174E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;2;87E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;204E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;205E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;206E;E;d;2;42D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;207E;E;f;18;0.6862745098039216d;1;1D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;209E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;210E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;211E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;212E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;213E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;217E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;3;183E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;78E;E;S;18;.AppleSystemUIFontd;2;13S;57;{"origin":{"x":0,"y":1},"size":{"width":335,"height":16}}S;59;{"origin":{"x":20,"y":21},"size":{"width":335,"height":16}}S;57;{"origin":{"x":0,"y":1},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":481},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":449},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":417},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":385},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":353},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":321},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":289},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":257},"size":{"width":176,"height":21}}S;60;{"origin":{"x":16,"y":225},"size":{"width":176,"height":21}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;220E;E;E;f;4;0.25f;4;0.85E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/MobileTest/Resources/Test2View.xib b/Tests/Manual/MobileTest/Resources/Test2View.xib new file mode 100644 index 000000000..94c06e49e --- /dev/null +++ b/Tests/Manual/MobileTest/Resources/Test2View.xib @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + You typed: %{value1}@ + + + + + + + + + + + + + field1 + + + + diff --git a/Tests/Manual/MobileTest/Test1Controller.j b/Tests/Manual/MobileTest/Test1Controller.j new file mode 100644 index 000000000..020197e39 --- /dev/null +++ b/Tests/Manual/MobileTest/Test1Controller.j @@ -0,0 +1,19 @@ +@import +@import "Test1Controller.j" + + +@implementation Test1Controller : CPViewController +{ +} + +- (id)init +{ + return [super initWithCibName:@"Test1View" bundle:nil]; +} + +- (void)viewDidLoad +{ + CPLog("Loaded %@ view %@", self, [self view]); +} + +@end diff --git a/Tests/Manual/MobileTest/Test2Controller.j b/Tests/Manual/MobileTest/Test2Controller.j new file mode 100644 index 000000000..644eed773 --- /dev/null +++ b/Tests/Manual/MobileTest/Test2Controller.j @@ -0,0 +1,19 @@ +@import +@import "Test1Controller.j" + + +@implementation Test2Controller : CPViewController +{ +} + +- (id)init +{ + return [super initWithCibName:@"Test2View" bundle:nil]; +} + +- (void)viewDidLoad +{ + CPLog("Loaded %@ view %@", self, [self view]); +} + +@end diff --git a/Tests/Manual/MobileTest/index-debug.html b/Tests/Manual/MobileTest/index-debug.html new file mode 100644 index 000000000..dd81cdff7 --- /dev/null +++ b/Tests/Manual/MobileTest/index-debug.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + MobileTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/MobileTest/index.html b/Tests/Manual/MobileTest/index.html new file mode 100644 index 000000000..56bfc77c6 --- /dev/null +++ b/Tests/Manual/MobileTest/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + MobileTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/MobileTest/main.j b/Tests/Manual/MobileTest/main.j new file mode 100644 index 000000000..66b702a49 --- /dev/null +++ b/Tests/Manual/MobileTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPTextField + * + * Created by Alexander Ljungberg on August 2, 2010. + * Copyright 2010, WireLoad, LLC All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/SmartFoldersDemo/AppController.j b/Tests/Manual/SmartFoldersDemo/AppController.j index 45dcf399d..810e6a8e0 100644 --- a/Tests/Manual/SmartFoldersDemo/AppController.j +++ b/Tests/Manual/SmartFoldersDemo/AppController.j @@ -224,6 +224,7 @@ var rootItems = [CPArray arrayWithObject:[CPDictionary dictionaryWithObjectsAndK [smartOutlineView reloadData]; [self saveSmartFolders]; + [aSheet orderOut:nil]; } } // convenience method diff --git a/Tests/Manual/TableTest/DragAndDrop/AppController.j b/Tests/Manual/TableTest/DragAndDrop/AppController.j index 56464a735..d9ae3d92d 100644 --- a/Tests/Manual/TableTest/DragAndDrop/AppController.j +++ b/Tests/Manual/TableTest/DragAndDrop/AppController.j @@ -152,6 +152,11 @@ TableTestDragAndDropTableViewDataType = @"TableTestDragAndDropTableViewDataType" return YES; } +- (void)tableView:(CPTableView)aTableView didDragTableColumn:(CPTableColumn)aTableColumn +{ + CPLog.debug(_cmd + aTableColumn); +} + @end diff --git a/Tests/Manual/TableTest/ViewBasedCib/AppController.j b/Tests/Manual/TableTest/ViewBasedCib/AppController.j index 53e6fabe2..2461331c1 100644 --- a/Tests/Manual/TableTest/ViewBasedCib/AppController.j +++ b/Tests/Manual/TableTest/ViewBasedCib/AppController.j @@ -203,6 +203,11 @@ CPLogRegister(CPLogConsole) return [height intValue]; } +- (void)tableView:(CPTableView)aTableView didDragTableColumn:(CPTableColumn)aTableColumn +{ + CPLog.debug(_cmd + aTableColumn); +} + // CELL VIEWS ACTIONS - (IBAction)_sliderAction:(id)sender { diff --git a/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.cib b/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.cib index 9c18c04a7..33dd45471 100644 --- a/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.cib +++ b/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;92E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;94E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;89E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;97E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;51E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;98E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;51E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;92E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;99E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;100E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;102E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;103E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;104E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;89E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;105E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;62E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;106E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;107E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;108E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;111E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;108E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;77E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;114E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;115E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;116E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;69E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;117E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;118E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;68E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;120E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;121E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;124E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;125E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;1;0E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;74E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;126E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;127E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;74E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;114E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;115E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;89E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;131E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;132E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;135E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;136E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;107E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;121E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;141E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;144E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;51E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;92E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;132E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;147E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;149E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;150E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;151E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;152E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;153E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;154E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;155E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;47E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;157E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;157E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;158E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;160E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;161E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;162E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;166E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;167E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;85E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;82E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;168E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;168E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;168E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;168E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;169E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;169E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;169E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;170E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;171E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;156E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;166E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;172E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;166E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;174E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;175E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;12;$agrid-colorD;K;6;CP$UIDd;3;176E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;178E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;179E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;156E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;177E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;169E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;169E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;169E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;169E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;169E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;180E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;176E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;181E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;169E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;183E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;84E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;K;35;CPTableViewArchivedReusableViewsKeyD;K;6;CP$UIDd;3;184E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;185E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;186E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;187E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;188E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;190E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;191E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;181E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;192E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;169E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;15;CPTableCellViewK;8;$classesA;S;15;CPTableCellViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;193E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;194E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;195E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;197E;E;D;K;10;$classnameS;5;CPBoxK;8;$classesA;S;5;CPBoxS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;55E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;198E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;199E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;200E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;55E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;156E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;201E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;18;$abackground-colorD;K;6;CP$UIDd;3;202E;K;14;$aborder-colorD;K;6;CP$UIDd;3;203E;K;14;$aborder-widthD;K;6;CP$UIDd;3;171E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;204E;K;16;$acontent-marginD;K;6;CP$UIDd;3;206E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;177E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;207E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;208E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;156E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;209E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;210E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;211E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;209E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;11;$aalignmentD;K;6;CP$UIDd;3;177E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;215E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;169E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;216E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;192E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;217E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;177E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;209E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;218E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;219E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;209E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;220E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;221E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;222E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;223E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;224E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;209E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;225E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;226E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;209E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;227E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;11;$aalignmentD;K;6;CP$UIDd;3;177E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;171E;K;6;$afontD;K;6;CP$UIDd;3;228E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;169E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;229E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;192E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;230E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;171E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;177E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;231E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;232E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;233E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;63E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;235E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;236E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;63E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;237E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;11;$aalignmentD;K;6;CP$UIDd;3;177E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;215E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;169E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;238E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;192E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;217E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;177E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPImageViewK;8;$classesA;S;11;CPImageViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;63E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;239E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;240E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;63E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;241E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;181E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;156E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;63E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;242E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;243E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;63E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;244E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;245E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;6;$afontD;K;6;CP$UIDd;3;215E;K;16;$aimage-positionD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;207E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;247E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;248E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;192E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;207E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;207E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;169E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;171E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;156E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;249E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;250E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;251E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;185E;E;D;K;10;$classnameS;18;CPSegmentedControlK;8;$classesA;S;18;CPSegmentedControlS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;70E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;252E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;253E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;254E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;255E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;11;$aalignmentD;K;6;CP$UIDd;3;171E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;6;$afontD;K;6;CP$UIDd;3;256E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;257E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;207E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;207E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;258E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;259E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;260E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;11;$aalignmentD;K;6;CP$UIDd;3;171E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;215E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;169E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;261E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;192E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;230E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;171E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;262E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;263E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;187E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;188E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;264E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;265E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;181E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;192E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;169E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;266E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;267E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;268E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;270E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;220E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;271E;K;11;$aalignmentD;K;6;CP$UIDd;3;177E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;6;$afontD;K;6;CP$UIDd;3;272E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;169E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;273E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;169E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;274E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;156E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;177E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;275E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;276E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;168E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;277E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;278E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;279E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;181E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;192E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;169E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;280E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;281E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;282E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;283E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;284E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;285E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;286E;K;11;$aalignmentD;K;6;CP$UIDd;3;177E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;215E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;169E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;273E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;169E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;230E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;177E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;287E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;288E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;168E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;277E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;289E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;290E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;181E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;192E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;169E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;291E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;292E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;168E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;277E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;293E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;294E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;181E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;192E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;169E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;295E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;296E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;297E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;298E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;299E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;300E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;49E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;301E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;156E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;192E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;302E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;167E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;303E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;303E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;167E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;304E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;51E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;305E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;306E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;297E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;298E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;299E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;300E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;49E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;307E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;156E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;169E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;308E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;309E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;310E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;311E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;245E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;246E;K;11;$aalignmentD;K;6;CP$UIDd;3;177E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;6;$afontD;K;6;CP$UIDd;3;215E;K;16;$aimage-positionD;K;6;CP$UIDd;3;181E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;207E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;312E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;248E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;192E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;207E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;207E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;169E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;181E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;156E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;313E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;314E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;311E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;315E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;316E;K;11;$aalignmentD;K;6;CP$UIDd;3;171E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;6;$afontD;K;6;CP$UIDd;3;256E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;177E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;317E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;248E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;192E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;318E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;156E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;169E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;171E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;156E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;319E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;320E;E;D;K;10;$classnameS;17;CPArrayControllerK;8;$classesA;S;17;CPArrayControllerS;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;321E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;169E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;192E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;169E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;169E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;169E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;169E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;169E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;192E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;192E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;45E;E;E;S;8;delegateS;9;tableViewS;9;theWindowS;10;dataSourceS;17;contentControllerS;10;personViewS;9;placeViewS;14;_sliderAction:S;24;_textFieldBezeledAction:S;27;_textFieldNotBezeledAction:S;7;reload:S;25;hidden: variableRowHeightS;6;hiddenS;17;variableRowHeightD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;322E;E;E;S;24;value: variableRowHeightS;5;valueD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;24;value: objectValue.valueS;17;objectValue.valueD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;29;value: objectValue.identifierS;22;objectValue.identifierD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;23;value: objectValue.showS;16;objectValue.showD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;23;value: objectValue.nameS;16;objectValue.nameD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;18;value: objectValueS;11;objectValueD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;21;contentArray: contentS;12;contentArrayS;7;contentD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;32;valueURL: objectValue.image.pathS;8;valueURLS;22;objectValue.image.pathD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;28;CPRaisesForNotApplicableKeysD;K;6;CP$UIDd;3;192E;K;26;CPConditionallySetsEnabledD;K;6;CP$UIDd;3;192E;K;38;CPAllowsEditingMultipleValuesSelectionD;K;6;CP$UIDd;3;192E;E;E;S;24;hidden: objectValue.showD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;322E;E;E;S;25;value: objectValue.sliderS;18;objectValue.sliderD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;22;CPValidatesImmediatelyD;K;6;CP$UIDd;3;169E;E;E;S;29;value: objectValue.image.nameS;22;objectValue.image.nameD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;28;CPRaisesForNotApplicableKeysD;K;6;CP$UIDd;3;192E;K;38;CPAllowsEditingMultipleValuesSelectionD;K;6;CP$UIDd;3;192E;E;E;S;24;content: arrangedObjectsS;15;arrangedObjectsD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 282}, {994, 356}}S;22;{{0, 0}, {1680, 1028}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {994, 356}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;88E;E;E;S;6;normalS;21;{{0, 45}, {995, 312}}S;20;{{0, 0}, {995, 312}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;170E;E;E;d;2;18S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;323E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;324E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;297E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;326E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;51E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;327E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;328E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;329E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;297E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;325E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;330E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;84E;E;d;2;10T;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;d;1;2S;20;{{0, 0}, {993, 294}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;332E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;333E;E;d;1;4d;2;87S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;E;E;d;1;3D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;182E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;334E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;335E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;297E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;336E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;337E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;6;personD;K;6;CP$UIDd;3;339E;K;32;AutomaticTableColumnIdentifier.1D;K;6;CP$UIDd;3;340E;K;32;AutomaticTableColumnIdentifier.2D;K;6;CP$UIDd;3;341E;K;8;multipleD;K;6;CP$UIDd;3;342E;K;5;placeD;K;6;CP$UIDd;3;343E;E;E;S;8;multipled;3;234d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;344E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;12;$atext-colorD;K;6;CP$UIDd;3;346E;K;6;$afontD;K;6;CP$UIDd;3;347E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;348E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;347E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;346E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;156E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;286E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;353E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;354E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;169E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;325E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;F;S;20;{{1, 94}, {234, 82}}S;19;{{0, 0}, {234, 82}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;57E;E;E;d;2;45S;5;placeS;19;{{3, 3}, {228, 76}}S;19;{{0, 0}, {228, 76}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;209E;E;E;S;3;boxD;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;356E;E;d;1;5D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;205E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;357E;E;d;1;1S;3;BoxD;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;57E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;393E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;394E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;395E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;57E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;326E;E;S;20;{{12, 10}, {99, 22}}S;18;{{0, 0}, {99, 22}}d;2;34S;9;textfieldD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;214E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;358E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;359E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;169E;E;S;4;CityD;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;360E;E;S;21;{{12, 26}, {200, 21}}S;19;{{0, 0}, {200, 21}}d;2;42S;6;sliderd;3;100d;2;50d;3;200S;21;{{130, 41}, {82, 17}}S;18;{{0, 0}, {82, 17}}d;2;41D;K;6;$classD;K;6;CP$UIDd;3;214E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;358E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;318E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;169E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;169E;E;S;10;Row HeightD;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;361E;E;S;19;{{1, 1}, {234, 91}}S;19;{{0, 0}, {234, 91}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;68E;E;E;S;6;personS;18;{{3, 3}, {76, 22}}S;18;{{0, 0}, {76, 22}}d;2;38S;4;NameS;20;{{146, 0}, {88, 85}}S;18;{{0, 0}, {88, 85}}d;2;57S;19;{{1, 27}, {60, 21}}S;18;{{0, 0}, {60, 21}}d;2;36S;9;check-boxS;8;selectedS;4;showS;0;S;21;{{1, 178}, {234, 87}}S;19;{{0, 0}, {234, 87}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;71E;E;E;S;21;{{37, 32}, {164, 25}}S;19;{{0, 0}, {164, 25}}d;2;13S;17;segmented-controlD;K;6;$classD;K;6;CP$UIDd;3;214E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;358E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;359E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;169E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;363E;D;K;6;CP$UIDd;3;364E;D;K;6;CP$UIDd;3;365E;E;E;S;19;{{3, 3}, {228, 22}}S;19;{{0, 0}, {228, 22}}d;2;39S;4;TextS;32;AutomaticTableColumnIdentifier.2d;3;284D;K;6;$classD;K;6;CP$UIDd;3;189E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;366E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;12;$atext-colorD;K;6;CP$UIDd;3;346E;K;6;$afontD;K;6;CP$UIDd;3;347E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;367E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;347E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;346E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;156E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;286E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;368E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;353E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;354E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;169E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;325E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;21;{{388, 1}, {284, 86}}S;19;{{0, 0}, {284, 86}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;E;E;S;20;{{8, 21}, {267, 43}}S;19;{{0, 0}, {267, 43}}S;16;bezeled+editableD;K;6;$classD;K;6;CP$UIDd;3;214E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;358E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;369E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;169E;E;S;13;Editable TextD;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;370E;E;S;32;AutomaticTableColumnIdentifier.1d;3;147f;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;3;189E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;371E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;12;$atext-colorD;K;6;CP$UIDd;3;346E;K;6;$afontD;K;6;CP$UIDd;3;347E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;372E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;347E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;346E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;156E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;286E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;373E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;353E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;354E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;169E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;325E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;21;{{238, 1}, {147, 87}}S;19;{{0, 0}, {147, 87}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;78E;E;E;d;3;666S;19;{{3, 8}, {141, 22}}S;19;{{0, 0}, {141, 22}}S;8;editableS;6;Oranged;3;149D;K;6;$classD;K;6;CP$UIDd;3;189E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;374E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;12;$atext-colorD;K;6;CP$UIDd;3;346E;K;6;$afontD;K;6;CP$UIDd;3;347E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;375E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;347E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;346E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;156E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;286E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;376E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;353E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;354E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;169E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;325E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;13;TableCellViewd;3;164D;K;6;$classD;K;6;CP$UIDd;3;189E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;377E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;12;$atext-colorD;K;6;CP$UIDd;3;346E;K;6;$afontD;K;6;CP$UIDd;3;347E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;378E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;347E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;346E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;156E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;286E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;177E;K;6;$afontD;K;6;CP$UIDd;3;379E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;353E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;354E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;169E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;169E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;192E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;325E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;177E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;21;{{1, -76}, {755, 15}}S;19;{{0, 0}, {755, 15}}d;1;8d;11;-2147483648S;8;scrollerS;8;disabledS;29;_horizontalScrollerDidScroll:f;18;0.9968944099378882S;19;{{0, 0}, {993, 25}}S;14;tableHeaderRowS;23;{{224, 193}, {15, 102}}S;19;{{0, 0}, {15, 102}}S;27;_verticalScrollerDidScroll:f;18;0.9595687331536388S;22;{{828, 15}, {150, 21}}S;19;{{0, 0}, {150, 21}}d;2;33S;19;Variable Row HeightS;22;{{718, 11}, {104, 25}}S;19;{{0, 0}, {104, 25}}S;6;buttonS;8;borderedS;11;Reload Datad;2;14S;13;AppControllerS;17;TableViewDelegateS;19;CPMutableDictionaryS;15;CPNegateBooleanS;20;{{1, 1}, {993, 294}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;380E;E;S;6;_NS:11S;21;{{1, 295}, {993, 17}}S;19;{{0, 0}, {993, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;84E;E;E;S;6;_NS:15S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;381E;D;K;6;CP$UIDd;3;381E;D;K;6;CP$UIDd;3;381E;D;K;6;CP$UIDd;3;207E;E;E;S;22;{{224, 289}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;10;cornerviewS;6;_NS:19D;K;10;$classnameS;5;CPCibK;8;$classesA;S;5;CPCibS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;338E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;382E;E;D;K;6;$classD;K;6;CP$UIDd;3;338E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;383E;E;D;K;6;$classD;K;6;CP$UIDd;3;338E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;384E;E;D;K;6;$classD;K;6;CP$UIDd;3;338E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;385E;E;D;K;6;$classD;K;6;CP$UIDd;3;338E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;386E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;388E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;173E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;389E;E;D;K;6;$classD;K;6;CP$UIDd;3;214E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;358E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;390E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;169E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;169E;E;S;14;Multiple CellsS;17;{{3, 0}, {-6, 0}}S;17;{{0, 0}, {-6, 0}}D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;4;nameD;K;6;CP$UIDd;3;391E;K;12;defaultValueD;K;6;CP$UIDd;3;215E;K;6;valuesD;K;6;CP$UIDd;3;392E;E;S;9;Text Celld;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;396E;D;K;6;CP$UIDd;3;397E;D;K;6;CP$UIDd;3;398E;D;K;6;CP$UIDd;3;399E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;400E;D;K;6;CP$UIDd;3;401E;D;K;6;CP$UIDd;3;402E;D;K;6;CP$UIDd;3;207E;E;E;S;22;{"width":0,"height":0}S;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;403E;D;K;6;CP$UIDd;3;403E;D;K;6;CP$UIDd;3;403E;D;K;6;CP$UIDd;3;207E;E;E;D;K;10;$classnameS;14;_CPSegmentItemK;8;$classesA;S;14;_CPSegmentItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;362E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;248E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;192E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;169E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;156E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;362E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;248E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;169E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;169E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;207E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;362E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;1;0E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;192E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;169E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;156E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;405E;E;E;S;16;Editable BezeledD;K;6;$classD;K;6;CP$UIDd;3;351E;K;4;nameD;K;6;CP$UIDd;3;391E;K;12;defaultValueD;K;6;CP$UIDd;3;215E;K;6;valuesD;K;6;CP$UIDd;3;406E;E;d;2;26D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;407E;D;K;6;CP$UIDd;3;407E;D;K;6;CP$UIDd;3;407E;D;K;6;CP$UIDd;3;207E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;408E;E;E;S;20;Editable Non BezeledD;K;6;$classD;K;6;CP$UIDd;3;351E;K;4;nameD;K;6;CP$UIDd;3;391E;K;12;defaultValueD;K;6;CP$UIDd;3;215E;K;6;valuesD;K;6;CP$UIDd;3;409E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;410E;E;E;S;15;Created In CodeD;K;6;$classD;K;6;CP$UIDd;3;351E;K;4;nameD;K;6;CP$UIDd;3;391E;K;12;defaultValueD;K;6;CP$UIDd;3;215E;K;6;valuesD;K;6;CP$UIDd;3;411E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;412E;E;E;S;12;External CibD;K;6;$classD;K;6;CP$UIDd;3;351E;K;4;nameD;K;6;CP$UIDd;3;391E;K;12;defaultValueD;K;6;CP$UIDd;3;215E;K;6;valuesD;K;6;CP$UIDd;3;413E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;207E;E;E;f;12;0.7997416835S;12600;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE2RTtEO0s7NjtDUCRVSURkOzI7MTdFO0Q7Szs2O0NQJFVJRGQ7MjsxOEU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MjBFO0Q7Szs2O0NQJFVJRGQ7MjsyMkU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyNEU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyNkU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyN0U7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxMUU7RDtLOzY7Q1AkVUlEZDsyOzIwRTtEO0s7NjtDUCRVSURkOzI7MjJFO0Q7Szs2O0NQJFVJRGQ7MjsyMEU7RDtLOzY7Q1AkVUlEZDsyOzI0RTtEO0s7NjtDUCRVSURkOzI7MjBFO0Q7Szs2O0NQJFVJRGQ7MjsyNkU7RDtLOzY7Q1AkVUlEZDsyOzExRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Szs4OyRjbGFzc2VzQTtTOzE4O19DUENpYkN1c3RvbU9iamVjdFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTBFO0s7Mjc7X0NQQ2liQ3VzdG9tT2JqZWN0Q2xhc3NOYW1lRDtLOzY7Q1AkVUlEZDsyOzI4RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs1O0NQU2V0Szs4OyRjbGFzc2VzQTtTOzU7Q1BTZXRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEyRTtLOzE1O0NQU2V0T2JqZWN0c0tleUQ7Szs2O0NQJFVJRGQ7MjsyOUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQmluZGluZ0Nvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE0RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyNkU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjszMEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzMxRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MzJFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7MjszNEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTRFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzI0RTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzM1RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvckJpbmRpbmdLZXlEO0s7NjtDUCRVSURkOzI7MzZFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yS2V5UGF0aEtleUQ7Szs2O0NQJFVJRGQ7MjszN0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JPcHRpb25zS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxNEU7SzsyNDtfQ1BDaWJDb25uZWN0b3JTb3VyY2VLZXlEO0s7NjtDUCRVSURkOzI7MjRFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yQmluZGluZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0MEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLZXlQYXRoS2V5RDtLOzY7Q1AkVUlEZDsyOzQxRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvck9wdGlvbnNLZXlEO0s7NjtDUCRVSURkOzI7NDJFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE0RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyMkU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7Mjs0M0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzMxRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7NDFFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTU7Q1BUYWJsZUNlbGxWaWV3Szs4OyRjbGFzc2VzQTtTOzE1O0NQVGFibGVDZWxsVmlld1M7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxOUU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NDZFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzE3O0NQVmlld1N1YnZpZXdzS2V5RDtLOzY7Q1AkVUlEZDsyOzQ3RTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7NDhFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MjA7Q1BSZXVzZUlkZW50aWZpZXJLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzEwO0NQQ2hlY2tCb3hLOzg7JGNsYXNzZXNBO1M7MTA7Q1BDaGVja0JveFM7ODtDUEJ1dHRvblM7OTtDUENvbnRyb2xTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjFFO0s7Mjc7Q1BSZXNwb25kZXJOZXh0UmVzcG9uZGVyS2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MTg7Q1BWaWV3U3VwZXJ2aWV3S2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7NTNFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzU1RTtLOzExOyRhYWxpZ25tZW50RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE3OyRhbGluZS1icmVhay1tb2RlRDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzY7JGFmb250RDtLOzY7Q1AkVUlEZDsyOzU3RTtLOzE2OyRhaW1hZ2UtcG9zaXRpb25EO0s7NjtDUCRVSURkOzI7NThFO0s7MTc7Q1BDb250cm9sVmFsdWVLZXlEO0s7NjtDUCRVSURkOzI7NTlFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzYwRTtLOzE2O0NQQnV0dG9uVGl0bGVLZXlEO0s7NjtDUCRVSURkOzI7NjFFO0s7MjU7Q1BCdXR0b25BbHRlcm5hdGVUaXRsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs2MkU7SzsyNztDUEJ1dHRvbkFsbG93c01peGVkU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NjNFO0s7MjM7Q1BCdXR0b25IaWdobGlnaHRzQnlLZXlEO0s7NjtDUCRVSURkOzI7NTlFO0s7MjM7Q1BCdXR0b25TaG93c1N0YXRlQnlLZXlEO0s7NjtDUCRVSURkOzI7NTlFO0s7MzI7Q1BCdXR0b25JbWFnZURpbXNXaGVuRGlzYWJsZWRLZXlEO0s7NjtDUCRVSURkOzI7NjRFO0s7MjQ7Q1BCdXR0b25JbWFnZVBvc2l0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzU4RTtLOzI4O0NQQnV0dG9uS2V5RXF1aXZhbGVudE1hc2tLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MjQ7Q1BCdXR0b25QZXJpb2RpY0RlbGF5S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjc7Q1BCdXR0b25QZXJpb2RpY0ludGVydmFsS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzExO0NQSW1hZ2VWaWV3Szs4OyRjbGFzc2VzQTtTOzExO0NQSW1hZ2VWaWV3Uzs5O0NQQ29udHJvbFM7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyM0U7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzY1RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs2NkU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs2N0U7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0OUU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNTskYWltYWdlLXNjYWxpbmdEO0s7NjtDUCRVSURkOzI7NjhFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzYwRTtLOzIzO0NQSW1hZ2VWaWV3SGFzU2hhZG93S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjg7Q1BJbWFnZVZpZXdJbWFnZUFsaWdubWVudEtleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTE7Q1BUZXh0RmllbGRLOzg7JGNsYXNzZXNBO1M7MTE7Q1BUZXh0RmllbGRTOzk7Q1BDb250cm9sUzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzI1RTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NjlFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzcwRTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzcxRTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzI7NzJFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0OUU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7Mjs2MEU7Szs2OyRhZm9udEQ7Szs2O0NQJFVJRGQ7Mjs1N0U7SzszNTtDUENvbnRyb2xTZW5kc0FjdGlvbk9uRW5kRWRpdGluZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs2NEU7SzsxNztDUENvbnRyb2xWYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3M0U7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NjBFO0s7MjQ7Q1BUZXh0RmllbGRJc0VkaXRhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzYzRTtLOzI2O0NQVGV4dEZpZWxkSXNTZWxlY3RhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzYzRTtLOzI5O0NQVGV4dEZpZWxkRHJhd3NCYWNrZ3JvdW5kS2V5RDtLOzY7Q1AkVUlEZDsyOzYzRTtLOzI5O0NQVGV4dEZpZWxkQmFja2dyb3VuZENvbG9yS2V5RDtLOzY7Q1AkVUlEZDsyOzc1RTtLOzI3O0NQVGV4dEZpZWxkTGluZUJyZWFrTW9kZUtleUQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsyMztDUFRleHRGaWVsZEFsaWdubWVudEtleUQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzszMTtDUFRleHRGaWVsZFBsYWNlaG9sZGVyU3RyaW5nS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEwRTtLOzI3O19DUENpYkN1c3RvbU9iamVjdENsYXNzTmFtZUQ7Szs2O0NQJFVJRGQ7Mjs3NkU7RTtTOzg7Q1BPYmplY3REO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7UzsyOTt2YWx1ZTogb2JqZWN0VmFsdWUuaW1hZ2UubmFtZVM7NTt2YWx1ZVM7MjI7b2JqZWN0VmFsdWUuaW1hZ2UubmFtZUQ7SzsxMDskY2xhc3NuYW1lUzsxMjtDUERpY3Rpb25hcnlLOzg7JGNsYXNzZXNBO1M7MTI7Q1BEaWN0aW9uYXJ5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjszM0U7SzsxMDtDUC5vYmplY3RzRDtLOzI4O0NQUmFpc2VzRm9yTm90QXBwbGljYWJsZUtleXNEO0s7NjtDUCRVSURkOzI7NjNFO0s7Mzg7Q1BBbGxvd3NFZGl0aW5nTXVsdGlwbGVWYWx1ZXNTZWxlY3Rpb25EO0s7NjtDUCRVSURkOzI7NjNFO0U7RTtTOzMyO3ZhbHVlVVJMOiBvYmplY3RWYWx1ZS5pbWFnZS5wYXRoUzs4O3ZhbHVlVVJMUzsyMjtvYmplY3RWYWx1ZS5pbWFnZS5wYXRoRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzMzRTtLOzEwO0NQLm9iamVjdHNEO0s7Mjg7Q1BSYWlzZXNGb3JOb3RBcHBsaWNhYmxlS2V5c0Q7Szs2O0NQJFVJRGQ7Mjs2M0U7SzsyNjtDUENvbmRpdGlvbmFsbHlTZXRzRW5hYmxlZEQ7Szs2O0NQJFVJRGQ7Mjs2M0U7SzszODtDUEFsbG93c0VkaXRpbmdNdWx0aXBsZVZhbHVlc1NlbGVjdGlvbkQ7Szs2O0NQJFVJRGQ7Mjs2M0U7RTtFO1M7MjQ7aGlkZGVuOiBvYmplY3RWYWx1ZS5zaG93Uzs2O2hpZGRlblM7MTY7b2JqZWN0VmFsdWUuc2hvd0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjszM0U7SzsxMDtDUC5vYmplY3RzRDtLOzIyO0NQVmFsdWVUcmFuc2Zvcm1lck5hbWVEO0s7NjtDUCRVSURkOzI7NzdFO0U7RTtTOzIzO3ZhbHVlOiBvYmplY3RWYWx1ZS5zaG93RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzMzRTtLOzEwO0NQLm9iamVjdHNEO0U7RTtkOzE7MFM7MTk7e3swLCAwfSwgezIzNCwgOTF9fUQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsyNkU7RDtLOzY7Q1AkVUlEZDsyOzI0RTtEO0s7NjtDUCRVSURkOzI7MjJFO0U7RTtkOzI7NDVTOzY7bm9ybWFsUzs2O3BlcnNvblM7MTk7e3sxLCAyN30sIHs2MCwgMjF9fVM7MTg7e3swLCAwfSwgezYwLCAyMX19ZDsyOzM2Uzs5O2NoZWNrLWJveFM7ODtzZWxlY3RlZEQ7SzsxMDskY2xhc3NuYW1lUzs2O0NQRm9udEs7ODskY2xhc3Nlc0E7Uzs2O0NQRm9udFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NTZFO0s7MTM7Q1BGb250TmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3OEU7SzsxMztDUEZvbnRTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzc5RTtLOzE1O0NQRm9udElzQm9sZEtleUQ7Szs2O0NQJFVJRGQ7Mjs2M0U7SzsxNztDUEZvbnRJc0l0YWxpY0tleUQ7Szs2O0NQJFVJRGQ7Mjs2M0U7SzsxNztDUEZvbnRJc1N5c3RlbUtleUQ7Szs2O0NQJFVJRGQ7Mjs2NEU7RTtkOzE7MmQ7MTsxZDsxOzRTOzQ7c2hvd1M7MDtGO1Q7UzsyMDt7ezE0NiwgMH0sIHs4OCwgODV9fVM7MTg7e3swLCAwfSwgezg4LCA4NX19ZDsyOzU3ZDsxOzNTOzE4O3t7MywgM30sIHs3NiwgMjJ9fVM7MTg7e3swLCAwfSwgezc2LCAyMn19ZDsyOzM4Uzs5O3RleHRmaWVsZFM7NDtOYW1lRDtLOzEwOyRjbGFzc25hbWVTOzc7Q1BDb2xvcks7ODskY2xhc3Nlc0E7Uzs3O0NQQ29sb3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzc0RTtLOzIwO0NQQ29sb3JDb21wb25lbnRzS2V5RDtLOzY7Q1AkVUlEZDsyOzgwRTtFO1M7MTM7Q1BBcHBsaWNhdGlvblM7MTU7Q1BOZWdhdGVCb29sZWFuUzsyODtfQ1BGb250U3lzdGVtRmFjZVBsYWNlaG9sZGVyZDsyOy0xRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzU5RTtEO0s7NjtDUCRVSURkOzI7NTlFO0Q7Szs2O0NQJFVJRGQ7Mjs1OUU7RDtLOzY7Q1AkVUlEZDsyOzU5RTtFO0U7RTtLOzk7JGFyY2hpdmVyUzsxNTtDUEtleWVkQXJjaGl2ZXJLOzg7JHZlcnNpb25TOzY7MTAwMDAwRTs=S;7408;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RDtLOzY7Q1AkVUlEZDsyOzIxRTtEO0s7NjtDUCRVSURkOzE7MEU7RDtLOzY7Q1AkVUlEZDsyOzIyRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzExRTtEO0s7NjtDUCRVSURkOzI7MTlFO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RDtLOzY7Q1AkVUlEZDsyOzExRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Szs4OyRjbGFzc2VzQTtTOzE4O19DUENpYkN1c3RvbU9iamVjdFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTBFO0s7Mjc7X0NQQ2liQ3VzdG9tT2JqZWN0Q2xhc3NOYW1lRDtLOzY7Q1AkVUlEZDsyOzIzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs1O0NQU2V0Szs4OyRjbGFzc2VzQTtTOzU7Q1BTZXRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEyRTtLOzE1O0NQU2V0T2JqZWN0c0tleUQ7Szs2O0NQJFVJRGQ7MjsyNEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJDb250cm9sQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQ29udHJvbENvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE0RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsxMUU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjsyNUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQmluZGluZ0Nvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsxOUU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjsyNkU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzI3RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MjhFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7MjszMEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTU7Q1BUYWJsZUNlbGxWaWV3Szs4OyRjbGFzc2VzQTtTOzE1O0NQVGFibGVDZWxsVmlld1M7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxOEU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7MzJFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzMyRTtLOzE3O0NQVmlld1N1YnZpZXdzS2V5RDtLOzY7Q1AkVUlEZDsyOzMzRTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7MzRFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7MzVFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzExO0NQVGV4dEZpZWxkSzs4OyRjbGFzc2VzQTtTOzExO0NQVGV4dEZpZWxkUzs5O0NQQ29udHJvbFM7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7MTlFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzM2RTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzM3RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7MjszOEU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7MTlFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7MjszOUU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzQwRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NDFFO0s7MTE7JGFhbGlnbm1lbnREO0s7NjtDUCRVSURkOzI7NDJFO0s7MTc7JGFsaW5lLWJyZWFrLW1vZGVEO0s7NjtDUCRVSURkOzI7NDJFO0s7NjskYWZvbnREO0s7NjtDUCRVSURkOzI7NDRFO0s7MzU7Q1BDb250cm9sU2VuZHNBY3Rpb25PbkVuZEVkaXRpbmdLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTc7Q1BDb250cm9sVmFsdWVLZXlEO0s7NjtDUCRVSURkOzI7NDZFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzQyRTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0N0U7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs0OUU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7NDJFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NDJFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7NTBFO0U7Uzs4O0NQT2JqZWN0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7Mjc7X3RleHRGaWVsZE5vdEJlemVsZWRBY3Rpb246UzsyNDt2YWx1ZTogb2JqZWN0VmFsdWUudmFsdWVTOzU7dmFsdWVTOzE3O29iamVjdFZhbHVlLnZhbHVlRDtLOzEwOyRjbGFzc25hbWVTOzEyO0NQRGljdGlvbmFyeUs7ODskY2xhc3Nlc0E7UzsxMjtDUERpY3Rpb25hcnlTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzI5RTtLOzEwO0NQLm9iamVjdHNEO0U7RTtkOzE7MFM7MTk7e3swLCAwfSwgezE0NywgODd9fUQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RTtFO2Q7Mjs0NVM7Njtub3JtYWxkOzM7NjY2UzsxOTt7ezMsIDh9LCB7MTQxLCAyMn19UzsxOTt7ezAsIDB9LCB7MTQxLCAyMn19ZDsyOzM0Uzs5O3RleHRmaWVsZFM7ODtlZGl0YWJsZWQ7MTs0RDtLOzEwOyRjbGFzc25hbWVTOzY7Q1BGb250Szs4OyRjbGFzc2VzQTtTOzY7Q1BGb250Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs0M0U7SzsxMztDUEZvbnROYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzEzO0NQRm9udFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MTU7Q1BGb250SXNCb2xkS2V5RDtLOzY7Q1AkVUlEZDsyOzQ3RTtLOzE3O0NQRm9udElzSXRhbGljS2V5RDtLOzY7Q1AkVUlEZDsyOzQ3RTtLOzE3O0NQRm9udElzU3lzdGVtS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtFO1Q7UzsxMztFZGl0YWJsZSBUZXh0RjtEO0s7MTA7JGNsYXNzbmFtZVM7NztDUENvbG9ySzs4OyRjbGFzc2VzQTtTOzc7Q1BDb2xvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NDhFO0s7MjA7Q1BDb2xvckNvbXBvbmVudHNLZXlEO0s7NjtDUCRVSURkOzI7NTNFO0U7UzsxMztDUEFwcGxpY2F0aW9uUzsyODtfQ1BGb250U3lzdGVtRmFjZVBsYWNlaG9sZGVyZDsyOy0xRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzU0RTtEO0s7NjtDUCRVSURkOzI7NTRFO0Q7Szs2O0NQJFVJRGQ7Mjs1NEU7RDtLOzY7Q1AkVUlEZDsyOzU1RTtFO0U7ZjsxODswLjY4NjI3NDUwOTgwMzkyMTZkOzE7MUU7Szs5OyRhcmNoaXZlclM7MTU7Q1BLZXllZEFyY2hpdmVySzs4OyR2ZXJzaW9uUzs2OzEwMDAwMEU7S;8020;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtEO0s7NjtDUCRVSURkOzI7MThFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzIwRTtEO0s7NjtDUCRVSURkOzI7MjJFO0Q7Szs2O0NQJFVJRGQ7MTswRTtEO0s7NjtDUCRVSURkOzI7MjNFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MTFFO0Q7Szs2O0NQJFVJRGQ7MjsyMEU7RDtLOzY7Q1AkVUlEZDsyOzIyRTtEO0s7NjtDUCRVSURkOzI7MTFFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxODtfQ1BDaWJDdXN0b21PYmplY3RLOzg7JGNsYXNzZXNBO1M7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7MjRFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzU7Q1BTZXRLOzg7JGNsYXNzZXNBO1M7NTtDUFNldFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTJFO0s7MTU7Q1BTZXRPYmplY3RzS2V5RDtLOzY7Q1AkVUlEZDsyOzI1RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsyMTtDUENpYkNvbnRyb2xDb25uZWN0b3JLOzg7JGNsYXNzZXNBO1M7MjE7Q1BDaWJDb250cm9sQ29ubmVjdG9yUzsxNDtDUENpYkNvbm5lY3RvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTRFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzIyRTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzExRTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzI2RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsyMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLOzg7JGNsYXNzZXNBO1M7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yUzsxNDtDUENpYkNvbm5lY3RvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTZFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MjdFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yQmluZGluZ0tleUQ7Szs2O0NQJFVJRGQ7MjsyOEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLZXlQYXRoS2V5RDtLOzY7Q1AkVUlEZDsyOzI5RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvck9wdGlvbnNLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyMkU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjszMkU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzI4RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MzNFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7MjszNEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTU7Q1BUYWJsZUNlbGxWaWV3Szs4OyRjbGFzc2VzQTtTOzE1O0NQVGFibGVDZWxsVmlld1M7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxOUU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7MzZFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzM2RTtLOzE3O0NQVmlld1N1YnZpZXdzS2V5RDtLOzY7Q1AkVUlEZDsyOzM3RTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7MzhFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzExO0NQVGV4dEZpZWxkSzs4OyRjbGFzc2VzQTtTOzExO0NQVGV4dEZpZWxkUzs5O0NQQ29udHJvbFM7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzM1RTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzQwRTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0MUU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs0MkU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NDRFO0s7MTE7JGFhbGlnbm1lbnREO0s7NjtDUCRVSURkOzI7NDVFO0s7MTc7JGFsaW5lLWJyZWFrLW1vZGVEO0s7NjtDUCRVSURkOzI7MzVFO0s7NjskYWZvbnREO0s7NjtDUCRVSURkOzI7NDdFO0s7MzU7Q1BDb250cm9sU2VuZHNBY3Rpb25PbkVuZEVkaXRpbmdLZXlEO0s7NjtDUCRVSURkOzI7NDhFO0s7MTc7Q1BDb250cm9sVmFsdWVLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0OEU7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0OEU7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0OEU7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7MzVFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7NTJFO0U7Uzs4O0NQT2JqZWN0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7MjQ7X3RleHRGaWVsZEJlemVsZWRBY3Rpb246UzsxODt2YWx1ZTogb2JqZWN0VmFsdWVTOzU7dmFsdWVTOzExO29iamVjdFZhbHVlRDtLOzEwOyRjbGFzc25hbWVTOzEyO0NQRGljdGlvbmFyeUs7ODskY2xhc3Nlc0E7UzsxMjtDUERpY3Rpb25hcnlTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzMwRTtLOzEwO0NQLm9iamVjdHNEO0U7RTtTOzI0O3ZhbHVlOiBvYmplY3RWYWx1ZS52YWx1ZVM7MTc7b2JqZWN0VmFsdWUudmFsdWVEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MzBFO0s7MTA7Q1Aub2JqZWN0c0Q7RTtFO2Q7MTswUzsxOTt7ezAsIDB9LCB7Mjg0LCA4Nn19RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzIyRTtFO0U7ZDsyOzQ1Uzs2O25vcm1hbFM7MjA7e3s4LCAyMX0sIHsyNjcsIDQzfX1TOzE5O3t7MCwgMH0sIHsyNjcsIDQzfX1kOzI7NDJTOzk7dGV4dGZpZWxkUzsxNjtiZXplbGVkK2VkaXRhYmxlZDsxOzREO0s7MTA7JGNsYXNzbmFtZVM7NjtDUEZvbnRLOzg7JGNsYXNzZXNBO1M7NjtDUEZvbnRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzEzO0NQRm9udE5hbWVLZXlEO0s7NjtDUCRVSURkOzI7NTNFO0s7MTM7Q1BGb250U2l6ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsxNTtDUEZvbnRJc0JvbGRLZXlEO0s7NjtDUCRVSURkOzI7NTVFO0s7MTc7Q1BGb250SXNJdGFsaWNLZXlEO0s7NjtDUCRVSURkOzI7NTVFO0s7MTc7Q1BGb250SXNTeXN0ZW1LZXlEO0s7NjtDUCRVSURkOzI7NDhFO0U7VDtTOzEzO0VkaXRhYmxlIFRleHREO0s7MTA7JGNsYXNzbmFtZVM7NztDUENvbG9ySzs4OyRjbGFzc2VzQTtTOzc7Q1BDb2xvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NTBFO0s7MjA7Q1BDb2xvckNvbXBvbmVudHNLZXlEO0s7NjtDUCRVSURkOzI7NTZFO0U7UzsxMztDUEFwcGxpY2F0aW9uUzsyODtfQ1BGb250U3lzdGVtRmFjZVBsYWNlaG9sZGVyZDsyOzI2RjtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7NTdFO0Q7Szs2O0NQJFVJRGQ7Mjs1N0U7RDtLOzY7Q1AkVUlEZDsyOzU3RTtEO0s7NjtDUCRVSURkOzI7NThFO0U7RTtmOzEyOzAuOTU0NzAwMTAwOGQ7MTsxRTtLOzk7JGFyY2hpdmVyUzsxNTtDUEtleWVkQXJjaGl2ZXJLOzg7JHZlcnNpb25TOzY7MTAwMDAwRTs=S;10488;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MTdFO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyMkU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxMUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtEO0s7NjtDUCRVSURkOzI7MTlFO0Q7Szs2O0NQJFVJRGQ7MjsxN0U7RDtLOzY7Q1AkVUlEZDsyOzIxRTtEO0s7NjtDUCRVSURkOzI7MTFFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxODtfQ1BDaWJDdXN0b21PYmplY3RLOzg7JGNsYXNzZXNBO1M7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7MjNFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzU7Q1BTZXRLOzg7JGNsYXNzZXNBO1M7NTtDUFNldFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTJFO0s7MTU7Q1BTZXRPYmplY3RzS2V5RDtLOzY7Q1AkVUlEZDsyOzI0RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsyMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLOzg7JGNsYXNzZXNBO1M7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yUzsxNDtDUENpYkNvbm5lY3RvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTRFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzE5RTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzE3RTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzI1RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvckJpbmRpbmdLZXlEO0s7NjtDUCRVSURkOzI7MjZFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yS2V5UGF0aEtleUQ7Szs2O0NQJFVJRGQ7MjsyN0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JPcHRpb25zS2V5RDtLOzY7Q1AkVUlEZDsyOzI5RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxNTtDUFRhYmxlQ2VsbFZpZXdLOzg7JGNsYXNzZXNBO1M7MTU7Q1BUYWJsZUNlbGxWaWV3Uzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7MjszMEU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7MjszMUU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0s7MTc7Q1BWaWV3U3Vidmlld3NLZXlEO0s7NjtDUCRVSURkOzI7MzJFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7MjszM0U7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7MjszNEU7SzsyMDtDUFJldXNlSWRlbnRpZmllcktleUQ7Szs2O0NQJFVJRGQ7MjszNUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTE7Q1BUZXh0RmllbGRLOzg7JGNsYXNzZXNBO1M7MTE7Q1BUZXh0RmllbGRTOzk7Q1BDb250cm9sUzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE4RTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsxN0U7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzBFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7MzZFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzM3RTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsxN0U7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7MjszNEU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs0MEU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7Mjs0MUU7Szs2OyRhZm9udEQ7Szs2O0NQJFVJRGQ7Mjs0M0U7SzszNTtDUENvbnRyb2xTZW5kc0FjdGlvbk9uRW5kRWRpdGluZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7SzsxNztDUENvbnRyb2xWYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NDFFO0s7MjQ7Q1BUZXh0RmllbGRJc0VkaXRhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzI2O0NQVGV4dEZpZWxkSXNTZWxlY3RhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzI5O0NQVGV4dEZpZWxkRHJhd3NCYWNrZ3JvdW5kS2V5RDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzI5O0NQVGV4dEZpZWxkQmFja2dyb3VuZENvbG9yS2V5RDtLOzY7Q1AkVUlEZDsyOzQ4RTtLOzI3O0NQVGV4dEZpZWxkTGluZUJyZWFrTW9kZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0MUU7SzsyMztDUFRleHRGaWVsZEFsaWdubWVudEtleUQ7Szs2O0NQJFVJRGQ7Mjs0MEU7SzszMTtDUFRleHRGaWVsZFBsYWNlaG9sZGVyU3RyaW5nS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzE4O0NQU2VnbWVudGVkQ29udHJvbEs7ODskY2xhc3Nlc0E7UzsxODtDUFNlZ21lbnRlZENvbnRyb2xTOzk7Q1BDb250cm9sUzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsxN0U7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzBFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsxN0U7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7MjszNEU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs0MEU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7MjszMEU7Szs2OyRhZm9udEQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NDFFO0s7Mjk7Q1BTZWdtZW50ZWRDb250cm9sU2VnbWVudHNLZXlEO0s7NjtDUCRVSURkOzI7NTRFO0s7Mjk7Q1BTZWdtZW50ZWRDb250cm9sU2VsZWN0ZWRLZXlEO0s7NjtDUCRVSURkOzI7NTVFO0s7MzM7Q1BTZWdtZW50ZWRDb250cm9sU2VnbWVudFN0eWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzU1RTtLOzMzO0NQU2VnbWVudGVkQ29udHJvbFRyYWNraW5nTW9kZUtleUQ7Szs2O0NQJFVJRGQ7MjszMEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTBFO0s7Mjc7X0NQQ2liQ3VzdG9tT2JqZWN0Q2xhc3NOYW1lRDtLOzY7Q1AkVUlEZDsyOzU2RTtFO1M7ODtDUE9iamVjdEQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtTOzI5O3ZhbHVlOiBvYmplY3RWYWx1ZS5pZGVudGlmaWVyUzs1O3ZhbHVlUzsyMjtvYmplY3RWYWx1ZS5pZGVudGlmaWVyRDtLOzEwOyRjbGFzc25hbWVTOzEyO0NQRGljdGlvbmFyeUs7ODskY2xhc3Nlc0E7UzsxMjtDUERpY3Rpb25hcnlTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzI4RTtLOzEwO0NQLm9iamVjdHNEO0U7RTtkOzE7MFM7MTk7e3swLCAwfSwgezIzNCwgODd9fUQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RDtLOzY7Q1AkVUlEZDsyOzIxRTtFO0U7ZDsyOzQ1Uzs2O25vcm1hbFM7ODttdWx0aXBsZVM7MTk7e3szLCAzfSwgezIyOCwgMjJ9fVM7MTk7e3swLCAwfSwgezIyOCwgMjJ9fWQ7MjszOVM7OTt0ZXh0ZmllbGRkOzE7MmQ7MTs0RDtLOzEwOyRjbGFzc25hbWVTOzY7Q1BGb250Szs4OyRjbGFzc2VzQTtTOzY7Q1BGb250Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs0MkU7SzsxMztDUEZvbnROYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzU3RTtLOzEzO0NQRm9udFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NThFO0s7MTU7Q1BGb250SXNCb2xkS2V5RDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzE3O0NQRm9udElzSXRhbGljS2V5RDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzE3O0NQRm9udElzU3lzdGVtS2V5RDtLOzY7Q1AkVUlEZDsyOzQ0RTtFO1Q7Uzs0O1RleHRGO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQ29sb3JLOzg7JGNsYXNzZXNBO1M7NztDUENvbG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs0N0U7SzsyMDtDUENvbG9yQ29tcG9uZW50c0tleUQ7Szs2O0NQJFVJRGQ7Mjs1OUU7RTtTOzIxO3t7MzcsIDMyfSwgezE2NCwgMjV9fVM7MTk7e3swLCAwfSwgezE2NCwgMjV9fWQ7MjsxM1M7MTc7c2VnbWVudGVkLWNvbnRyb2xEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NDJFO0s7MTM7Q1BGb250TmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1N0U7SzsxMztDUEZvbnRTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzU4RTtLOzE1O0NQRm9udElzQm9sZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7SzsxNztDUEZvbnRJc0l0YWxpY0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NkU7SzsxNztDUEZvbnRJc1N5c3RlbUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7NjFFO0Q7Szs2O0NQJFVJRGQ7Mjs2MkU7RDtLOzY7Q1AkVUlEZDsyOzYzRTtFO0U7ZDsxOzFTOzEzO0NQQXBwbGljYXRpb25TOzI4O19DUEZvbnRTeXN0ZW1GYWNlUGxhY2Vob2xkZXJkOzI7LTFEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7NjRFO0Q7Szs2O0NQJFVJRGQ7Mjs2NEU7RDtLOzY7Q1AkVUlEZDsyOzY0RTtEO0s7NjtDUCRVSURkOzI7NTVFO0U7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTQ7X0NQU2VnbWVudEl0ZW1LOzg7JGNsYXNzZXNBO1M7MTQ7X0NQU2VnbWVudEl0ZW1TOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzYwRTtLOzIxO0NQU2VnbWVudEl0ZW1JbWFnZUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzIxO0NQU2VnbWVudEl0ZW1MYWJlbEtleUQ7Szs2O0NQJFVJRGQ7Mjs2NUU7SzsyMDtDUFNlZ21lbnRJdGVtTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzI0O0NQU2VnbWVudEl0ZW1TZWxlY3RlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0NkU7SzsyMztDUFNlZ21lbnRJdGVtRW5hYmxlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7SzsxOTtDUFNlZ21lbnRJdGVtVGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzMwRTtLOzIxO0NQU2VnbWVudEl0ZW1XaWR0aEtleUQ7Szs2O0NQJFVJRGQ7Mjs2NkU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NjBFO0s7MjE7Q1BTZWdtZW50SXRlbUltYWdlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjE7Q1BTZWdtZW50SXRlbUxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzY1RTtLOzIwO0NQU2VnbWVudEl0ZW1NZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjQ7Q1BTZWdtZW50SXRlbVNlbGVjdGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzQ0RTtLOzIzO0NQU2VnbWVudEl0ZW1FbmFibGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzQ0RTtLOzE5O0NQU2VnbWVudEl0ZW1UYWdLZXlEO0s7NjtDUCRVSURkOzI7NTVFO0s7MjE7Q1BTZWdtZW50SXRlbVdpZHRoS2V5RDtLOzY7Q1AkVUlEZDsyOzY2RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsyMTtDUFNlZ21lbnRJdGVtSW1hZ2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMTtDUFNlZ21lbnRJdGVtTGFiZWxLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMDtDUFNlZ21lbnRJdGVtTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzI0O0NQU2VnbWVudEl0ZW1TZWxlY3RlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0NkU7SzsyMztDUFNlZ21lbnRJdGVtRW5hYmxlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7SzsxOTtDUFNlZ21lbnRJdGVtVGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzMwRTtLOzIxO0NQU2VnbWVudEl0ZW1XaWR0aEtleUQ7Szs2O0NQJFVJRGQ7Mjs2NkU7RTtmOzE4OzAuNjg2Mjc0NTA5ODAzOTIxNlM7MDtkOzI7NTJFO0s7OTskYXJjaGl2ZXJTOzE1O0NQS2V5ZWRBcmNoaXZlcks7ODskdmVyc2lvblM7NjsxMDAwMDBFOw==S;16008;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtEO0s7NjtDUCRVSURkOzI7MThFO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MjFFO0Q7Szs2O0NQJFVJRGQ7MjsyM0U7RDtLOzY7Q1AkVUlEZDsyOzI1RTtEO0s7NjtDUCRVSURkOzE7MEU7RDtLOzY7Q1AkVUlEZDsyOzI3RTtEO0s7NjtDUCRVSURkOzE7MEU7RDtLOzY7Q1AkVUlEZDsyOzI4RTtEO0s7NjtDUCRVSURkOzE7MEU7RDtLOzY7Q1AkVUlEZDsyOzI5RTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzExRTtEO0s7NjtDUCRVSURkOzI7MjFFO0Q7Szs2O0NQJFVJRGQ7MjsyM0U7RDtLOzY7Q1AkVUlEZDsyOzI1RTtEO0s7NjtDUCRVSURkOzI7MjNFO0Q7Szs2O0NQJFVJRGQ7MjsyN0U7RDtLOzY7Q1AkVUlEZDsyOzIzRTtEO0s7NjtDUCRVSURkOzI7MjhFO0Q7Szs2O0NQJFVJRGQ7MjsxMUU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzE4O19DUENpYkN1c3RvbU9iamVjdEs7ODskY2xhc3Nlc0E7UzsxODtfQ1BDaWJDdXN0b21PYmplY3RTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEwRTtLOzI3O19DUENpYkN1c3RvbU9iamVjdENsYXNzTmFtZUQ7Szs2O0NQJFVJRGQ7MjszMEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7NTtDUFNldEs7ODskY2xhc3Nlc0E7Uzs1O0NQU2V0Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMkU7SzsxNTtDUFNldE9iamVjdHNLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzIxO0NQQ2liQ29udHJvbENvbm5lY3Rvcks7ODskY2xhc3Nlc0E7UzsyMTtDUENpYkNvbnRyb2xDb25uZWN0b3JTOzE0O0NQQ2liQ29ubmVjdG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxNEU7SzsyNDtfQ1BDaWJDb25uZWN0b3JTb3VyY2VLZXlEO0s7NjtDUCRVSURkOzI7MjdFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MzJFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzIxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvcks7ODskY2xhc3Nlc0E7UzsyMTtDUENpYkJpbmRpbmdDb25uZWN0b3JTOzE0O0NQQ2liQ29ubmVjdG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxNkU7SzsyNDtfQ1BDaWJDb25uZWN0b3JTb3VyY2VLZXlEO0s7NjtDUCRVSURkOzI7MjhFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MzNFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yQmluZGluZ0tleUQ7Szs2O0NQJFVJRGQ7MjszNEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLZXlQYXRoS2V5RDtLOzY7Q1AkVUlEZDsyOzM1RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvck9wdGlvbnNLZXlEO0s7NjtDUCRVSURkOzI7MzdFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyN0U7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjszOEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzM0RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0MEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTZFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzI1RTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzExRTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzQxRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvckJpbmRpbmdLZXlEO0s7NjtDUCRVSURkOzI7NDJFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yS2V5UGF0aEtleUQ7Szs2O0NQJFVJRGQ7Mjs0M0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JPcHRpb25zS2V5RDtLOzY7Q1AkVUlEZDsyOzQ0RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxNTtDUFRhYmxlQ2VsbFZpZXdLOzg7JGNsYXNzZXNBO1M7MTU7Q1BUYWJsZUNlbGxWaWV3Uzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NkU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7NDZFO0s7MTc7Q1BWaWV3U3Vidmlld3NLZXlEO0s7NjtDUCRVSURkOzI7NDdFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs0OEU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0OUU7SzsyMDtDUFJldXNlSWRlbnRpZmllcktleUQ7Szs2O0NQJFVJRGQ7Mjs1MEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7NTtDUEJveEs7ODskY2xhc3Nlc0E7Uzs1O0NQQm94Uzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzIyRTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NTFFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzUyRTtLOzE3O0NQVmlld1N1YnZpZXdzS2V5RDtLOzY7Q1AkVUlEZDsyOzUzRTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzU0RTtLOzI1O0NQVmlld0F1dG9yZXNpemVzU3Vidmlld3NEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs1NUU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ5RTtLOzE4OyRhYmFja2dyb3VuZC1jb2xvckQ7Szs2O0NQJFVJRGQ7Mjs1N0U7SzsxNDskYWJvcmRlci1jb2xvckQ7Szs2O0NQJFVJRGQ7Mjs1OEU7SzsxNDskYWJvcmRlci13aWR0aEQ7Szs2O0NQJFVJRGQ7Mjs1OUU7SzsxNTskYWNvcm5lci1yYWRpdXNEO0s7NjtDUCRVSURkOzI7NjBFO0s7MTY7JGFjb250ZW50LW1hcmdpbkQ7Szs2O0NQJFVJRGQ7Mjs2MkU7SzsxMjtDUEJveFR5cGVLZXlEO0s7NjtDUCRVSURkOzI7NjNFO0s7MTg7Q1BCb3hCb3JkZXJUeXBlS2V5RDtLOzY7Q1AkVUlEZDsyOzY0RTtLOzEwO0NQQm94VGl0bGVEO0s7NjtDUCRVSURkOzI7NjVFO0s7MTg7Q1BCb3hUaXRsZVBvc2l0aW9uRDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE0O0NQQm94VGl0bGVWaWV3RDtLOzY7Q1AkVUlEZDsxOzBFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzExO0NQVGV4dEZpZWxkSzs4OyRjbGFzc2VzQTtTOzExO0NQVGV4dEZpZWxkUzs5O0NQQ29udHJvbFM7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyNEU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7NjZFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzY3RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs2OEU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7NjZFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs2OUU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzcwRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MTE7JGFhbGlnbm1lbnREO0s7NjtDUCRVSURkOzI7NjNFO0s7MTc7JGFsaW5lLWJyZWFrLW1vZGVEO0s7NjtDUCRVSURkOzI7NTlFO0s7NjskYWZvbnREO0s7NjtDUCRVSURkOzI7NzJFO0s7MzU7Q1BDb250cm9sU2VuZHNBY3Rpb25PbkVuZEVkaXRpbmdLZXlEO0s7NjtDUCRVSURkOzI7NzNFO0s7MTc7Q1BDb250cm9sVmFsdWVLZXlEO0s7NjtDUCRVSURkOzI7NzRFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzYzRTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs3NkU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7NTlFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NjNFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs4O0NQU2xpZGVySzs4OyRjbGFzc2VzQTtTOzg7Q1BTbGlkZXJTOzk7Q1BDb250cm9sUzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzI2RTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7Mjs2NkU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NzdFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzc4RTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7Mjs2NkU7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzc5RTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzI7ODBFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0OUU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNztDUENvbnRyb2xWYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs4MUU7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NjNFO0s7MTk7Q1BTbGlkZXJNaW5WYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs4MkU7SzsxOTtDUFNsaWRlck1heFZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzgzRTtLOzIzO0NQU2xpZGVyQWx0SW5jclZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyNEU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7NjZFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzg0RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs4NUU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7NjZFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs4NkU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzcwRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MTE7JGFhbGlnbm1lbnREO0s7NjtDUCRVSURkOzI7NjNFO0s7MTc7JGFsaW5lLWJyZWFrLW1vZGVEO0s7NjtDUCRVSURkOzI7NjNFO0s7NjskYWZvbnREO0s7NjtDUCRVSURkOzI7ODdFO0s7MzU7Q1BDb250cm9sU2VuZHNBY3Rpb25PbkVuZEVkaXRpbmdLZXlEO0s7NjtDUCRVSURkOzI7NzNFO0s7MTc7Q1BDb250cm9sVmFsdWVLZXlEO0s7NjtDUCRVSURkOzI7ODhFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzYzRTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs4OUU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7NjNFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NjNFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7OTBFO0U7Uzs4O0NQT2JqZWN0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7MTQ7X3NsaWRlckFjdGlvbjpTOzIzO3ZhbHVlOiBvYmplY3RWYWx1ZS5uYW1lUzs1O3ZhbHVlUzsxNjtvYmplY3RWYWx1ZS5uYW1lRDtLOzEwOyRjbGFzc25hbWVTOzEyO0NQRGljdGlvbmFyeUs7ODskY2xhc3Nlc0E7UzsxMjtDUERpY3Rpb25hcnlTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzM2RTtLOzEwO0NQLm9iamVjdHNEO0U7RTtTOzI1O3ZhbHVlOiBvYmplY3RWYWx1ZS5zbGlkZXJTOzE4O29iamVjdFZhbHVlLnNsaWRlckQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjszNkU7SzsxMDtDUC5vYmplY3RzRDtLOzIyO0NQVmFsaWRhdGVzSW1tZWRpYXRlbHlEO0s7NjtDUCRVSURkOzI7NzNFO0U7RTtTOzI1O2hpZGRlbjogdmFyaWFibGVSb3dIZWlnaHRTOzY7aGlkZGVuUzsxNzt2YXJpYWJsZVJvd0hlaWdodEQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjszNkU7SzsxMDtDUC5vYmplY3RzRDtLOzIyO0NQVmFsdWVUcmFuc2Zvcm1lck5hbWVEO0s7NjtDUCRVSURkOzI7OTFFO0U7RTtkOzE7MFM7MTk7e3swLCAwfSwgezIzNCwgODJ9fUQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsyM0U7RTtFO2Q7Mjs0NVM7Njtub3JtYWxTOzU7cGxhY2VTOzE5O3t7MywgM30sIHsyMjgsIDc2fX1TOzE5O3t7MCwgMH0sIHsyMjgsIDc2fX1EO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7NjZFO0U7RTtkOzI7MThTOzM7Ym94RDtLOzEwOyRjbGFzc25hbWVTOzc7Q1BDb2xvcks7ODskY2xhc3Nlc0E7Uzs3O0NQQ29sb3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzU2RTtLOzIwO0NQQ29sb3JDb21wb25lbnRzS2V5RDtLOzY7Q1AkVUlEZDsyOzkzRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs1NkU7SzsyMDtDUENvbG9yQ29tcG9uZW50c0tleUQ7Szs2O0NQJFVJRGQ7Mjs5NEU7RTtkOzE7MmQ7MTs1RDtLOzEwOyRjbGFzc25hbWVTOzIxO19DUEtleWVkQXJjaGl2ZXJWYWx1ZUs7ODskY2xhc3Nlc0E7UzsyMTtfQ1BLZXllZEFyY2hpdmVyVmFsdWVTOzc7Q1BWYWx1ZVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NjFFO0s7MTU7Q1BWYWx1ZVZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzk1RTtFO2Q7MTs0ZDsxOzFTOzM7Qm94RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzkyRTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsyM0U7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzM7MTAxRTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7MzsxMDJFO0s7MTc7Q1BWaWV3U3Vidmlld3NLZXlEO0s7NjtDUCRVSURkOzM7MTAzRTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsyM0U7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzU0RTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ5RTtLOzIwO0NQUmV1c2VJZGVudGlmaWVyS2V5RDtLOzY7Q1AkVUlEZDszOzEwNEU7RTtTOzIxO3t7MTMwLCA0MX0sIHs4MiwgMTd9fVM7MTg7e3swLCAwfSwgezgyLCAxN319ZDsyOzQxUzs5O3RleHRmaWVsZEQ7SzsxMDskY2xhc3NuYW1lUzs2O0NQRm9udEs7ODskY2xhc3Nlc0E7Uzs2O0NQRm9udFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NzFFO0s7MTM7Q1BGb250TmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs5NkU7SzsxMztDUEZvbnRTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzk3RTtLOzE1O0NQRm9udElzQm9sZEtleUQ7Szs2O0NQJFVJRGQ7Mjs3M0U7SzsxNztDUEZvbnRJc0l0YWxpY0tleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsxNztDUEZvbnRJc1N5c3RlbUtleUQ7Szs2O0NQJFVJRGQ7Mjs3M0U7RTtUO1M7MTA7Um93IEhlaWdodEY7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzU2RTtLOzIwO0NQQ29sb3JDb21wb25lbnRzS2V5RDtLOzY7Q1AkVUlEZDsyOzk4RTtFO1M7MjE7e3sxMiwgMjZ9LCB7MjAwLCAyMX19UzsxOTt7ezAsIDB9LCB7MjAwLCAyMX19ZDsyOzQyUzs2O3NsaWRlcmQ7MzsxMDBkOzI7NTBkOzM7MjAwUzsyMDt7ezEyLCAxMH0sIHs5OSwgMjJ9fVM7MTg7e3swLCAwfSwgezk5LCAyMn19ZDsyOzM0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzcxRTtLOzEzO0NQRm9udE5hbWVLZXlEO0s7NjtDUCRVSURkOzI7OTZFO0s7MTM7Q1BGb250U2l6ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs5OUU7SzsxNTtDUEZvbnRJc0JvbGRLZXlEO0s7NjtDUCRVSURkOzI7NzVFO0s7MTc7Q1BGb250SXNJdGFsaWNLZXlEO0s7NjtDUCRVSURkOzI7NzVFO0s7MTc7Q1BGb250SXNTeXN0ZW1LZXlEO0s7NjtDUCRVSURkOzI7NzNFO0U7Uzs0O0NpdHlEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NTZFO0s7MjA7Q1BDb2xvckNvbXBvbmVudHNLZXlEO0s7NjtDUCRVSURkOzM7MTAwRTtFO1M7MTM7Q1BBcHBsaWNhdGlvblM7MTU7Q1BOZWdhdGVCb29sZWFuRDtLOzEwOyRjbGFzc25hbWVTOzY7Q1BWaWV3Szs4OyRjbGFzc2VzQTtTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzM7MTA1RTtEO0s7NjtDUCRVSURkOzM7MTA2RTtEO0s7NjtDUCRVSURkOzM7MTA3RTtEO0s7NjtDUCRVSURkOzM7MTA4RTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDszOzEwOUU7RDtLOzY7Q1AkVUlEZDszOzExMEU7RDtLOzY7Q1AkVUlEZDszOzExMUU7RDtLOzY7Q1AkVUlEZDsyOzY0RTtFO0U7UzsyMjt7IndpZHRoIjowLCJoZWlnaHQiOjB9UzsyODtfQ1BGb250U3lzdGVtRmFjZVBsYWNlaG9sZGVyZDsyOzE0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDszOzExMkU7RDtLOzY7Q1AkVUlEZDszOzExMkU7RDtLOzY7Q1AkVUlEZDszOzExMkU7RDtLOzY7Q1AkVUlEZDsyOzY0RTtFO0U7ZDsyOy0xRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzY0RTtEO0s7NjtDUCRVSURkOzI7NjRFO0Q7Szs2O0NQJFVJRGQ7Mjs2NEU7RDtLOzY7Q1AkVUlEZDsyOzY0RTtFO0U7UzsxOTt7ezIsIDJ9LCB7MjI0LCA3Mn19UzsxOTt7ezAsIDB9LCB7MjI0LCA3Mn19RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzI4RTtEO0s7NjtDUCRVSURkOzI7MjdFO0Q7Szs2O0NQJFVJRGQ7MjsyNUU7RTtFO1M7NjtfTlM6MTFmOzEyOzAuMjk0MTE3NjQ3MWY7MTE7MC41MzcyNTQ5MDJmOzEyOzAuODE1Njg2Mjc0NWY7NDswLjEyZjsxMjswLjI4NDQzMTcwMzZmOzEyOzAuNDM1NzY3Mzg5MWY7MTI7MC42OTg4NDA3MjU4ZjsxODswLjY4NjI3NDUwOTgwMzkyMTZFO0s7OTskYXJjaGl2ZXJTOzE1O0NQS2V5ZWRBcmNoaXZlcks7ODskdmVyc2lvblM7NjsxMDAwMDBFOw==D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;387E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;192E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;414E;D;K;6;CP$UIDd;3;414E;D;K;6;CP$UIDd;3;414E;D;K;6;CP$UIDd;3;207E;E;E;d;2;11S;4;fontD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;415E;K;6;normalD;K;6;CP$UIDd;3;416E;E;E;S;19;{{2, 2}, {224, 72}}S;19;{{0, 0}, {224, 72}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;E;E;f;12;0.2941176471f;11;0.537254902f;12;0.8156862745f;4;0.12f;12;0.2844317036f;12;0.4357673891f;12;0.6988407258f;18;0.6862745098039216d;2;52D;K;6;$classD;K;6;CP$UIDd;3;387E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;264E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;264E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;192E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;415E;K;6;normalD;K;6;CP$UIDd;3;416E;E;E;f;12;0.9547001008D;K;6;$classD;K;6;CP$UIDd;3;387E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;278E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;278E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;192E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;415E;K;6;normalD;K;6;CP$UIDd;3;416E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;387E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;289E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;289E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;192E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;415E;K;6;normalD;K;6;CP$UIDd;3;416E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;387E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;293E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;331E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;293E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;192E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;415E;K;6;normalD;K;6;CP$UIDd;3;416E;E;E;f;18;0.5019607843137255D;K;6;$classD;K;6;CP$UIDd;3;214E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;417E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;418E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;169E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;3;214E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;358E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;418E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;192E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;169E;E;S;17;Arial, sans-serifd;2;12E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;92E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;94E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;89E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;53E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;97E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;53E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;98E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;53E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;92E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;99E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;100E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;64E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;102E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;103E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;104E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;89E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;105E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;68E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;106E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;107E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;108E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;90E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;111E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;108E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;74E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;114E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;115E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;116E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;69E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;117E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;118E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;120E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;121E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;64E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;124E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;125E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;1;0E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;77E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;126E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;127E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;77E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;114E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;115E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;89E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;131E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;132E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;135E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;136E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;107E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;121E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;64E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;141E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;112E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;144E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;53E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;92E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;132E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;147E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;149E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;150E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;151E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;152E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;153E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;154E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;155E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;47E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;157E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;157E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;158E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;162E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;163E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;164E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;165E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;166E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;167E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;168E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;51E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;169E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;83E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;82E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;170E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;170E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;170E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;170E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;171E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;171E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;171E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;173E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;174E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;175E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;156E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;176E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;177E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;178E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;166E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;180E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;181E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;53E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;182E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;182E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;183E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;12;$agrid-colorD;K;6;CP$UIDd;3;185E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;186E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;188E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;189E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;156E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;187E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;171E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;171E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;171E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;171E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;171E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;190E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;185E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;191E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;171E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;173E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;85E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;K;35;CPTableViewArchivedReusableViewsKeyD;K;6;CP$UIDd;3;192E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;193E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;194E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;195E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;196E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;198E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;199E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;191E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;161E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;171E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;15;CPTableCellViewK;8;$classesA;S;15;CPTableCellViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;200E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;201E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;202E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;203E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;204E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;205E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;57E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;206E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;57E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;208E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;210E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;187E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;213E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;161E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;216E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;187E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;D;K;10;$classnameS;11;CPImageViewK;8;$classesA;S;11;CPImageViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;57E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;217E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;218E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;57E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;219E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;210E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;191E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;220E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;156E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;57E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;221E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;222E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;57E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;223E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;224E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;225E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;226E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;227E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;228E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;229E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;161E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;227E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;227E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;171E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;156E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;230E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;231E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;232E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;203E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;233E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;235E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;236E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;237E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;210E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;187E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;238E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;239E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;161E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;216E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;187E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;240E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;241E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;242E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;243E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;210E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;244E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;245E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;246E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;247E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;64E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;248E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;249E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;64E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;250E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;210E;K;6;$afontD;K;6;CP$UIDd;3;251E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;187E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;252E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;253E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;161E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;254E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;187E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;255E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;257E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;203E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;193E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;259E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;260E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;261E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;210E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;262E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;263E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;161E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;254E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;175E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;D;K;10;$classnameS;18;CPSegmentedControlK;8;$classesA;S;18;CPSegmentedControlS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;264E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;265E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;266E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;210E;K;6;$afontD;K;6;CP$UIDd;3;268E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;269E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;270E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;227E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;227E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;271E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;272E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;170E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;273E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;274E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;275E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;191E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;161E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;171E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;276E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;277E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;278E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;203E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;279E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;280E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;281E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;237E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;283E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;187E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;284E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;285E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;171E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;254E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;187E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;286E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;287E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;195E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;196E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;288E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;289E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;191E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;161E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;171E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;290E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;292E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;203E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;293E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;294E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;295E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;242E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;296E;K;6;$afontD;K;6;CP$UIDd;3;297E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;11;$aalignmentD;K;6;CP$UIDd;3;187E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;298E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;285E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;171E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;299E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;156E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;187E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;171E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;300E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;301E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;170E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;273E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;302E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;303E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;191E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;161E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;171E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;304E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;305E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;170E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;273E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;306E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;307E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;191E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;161E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;171E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;308E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;309E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;310E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;311E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;312E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;313E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;314E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;49E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;315E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;161E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;227E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;316E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;310E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;311E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;312E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;313E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;318E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;49E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;319E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;171E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;320E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;169E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;321E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;321E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;322E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;323E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;53E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;324E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;325E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;326E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;224E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;225E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;11;$aalignmentD;K;6;CP$UIDd;3;187E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;327E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;227E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;328E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;229E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;161E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;227E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;227E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;171E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;156E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;87E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;329E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;330E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;326E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;331E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;332E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;156E;K;6;$afontD;K;6;CP$UIDd;3;268E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;156E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;7;$aimageD;K;6;CP$UIDd;3;334E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;335E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;187E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;336E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;229E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;161E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;337E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;156E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;171E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;156E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;338E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;339E;E;D;K;10;$classnameS;17;CPArrayControllerK;8;$classesA;S;17;CPArrayControllerS;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;340E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;171E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;161E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;3;161E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;3;161E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;342E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;171E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;171E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;171E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;171E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;171E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;161E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;161E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;45E;E;E;S;8;delegateS;9;tableViewS;9;theWindowS;10;dataSourceS;17;contentControllerS;10;personViewS;9;placeViewS;14;_sliderAction:S;24;_textFieldBezeledAction:S;27;_textFieldNotBezeledAction:S;7;reload:S;25;hidden: variableRowHeightS;6;hiddenS;17;variableRowHeightD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;343E;E;E;S;24;value: variableRowHeightS;5;valueD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;24;value: objectValue.valueS;17;objectValue.valueD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;29;value: objectValue.identifierS;22;objectValue.identifierD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;23;value: objectValue.showS;16;objectValue.showD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;23;value: objectValue.nameS;16;objectValue.nameD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;18;value: objectValueS;11;objectValueD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;21;contentArray: contentS;12;contentArrayS;7;contentD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;32;valueURL: objectValue.image.pathS;8;valueURLS;22;objectValue.image.pathD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;28;CPRaisesForNotApplicableKeysD;K;6;CP$UIDd;3;161E;K;26;CPConditionallySetsEnabledD;K;6;CP$UIDd;3;161E;K;38;CPAllowsEditingMultipleValuesSelectionD;K;6;CP$UIDd;3;161E;E;E;S;24;hidden: objectValue.showD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;343E;E;E;S;25;value: objectValue.sliderS;18;objectValue.sliderD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;22;CPValidatesImmediatelyD;K;6;CP$UIDd;3;171E;E;E;S;29;value: objectValue.image.nameS;22;objectValue.image.nameD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;28;CPRaisesForNotApplicableKeysD;K;6;CP$UIDd;3;161E;K;38;CPAllowsEditingMultipleValuesSelectionD;K;6;CP$UIDd;3;161E;E;E;S;24;content: arrangedObjectsS;15;arrangedObjectsD;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;E;E;S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879048192S;24;{{335, 282}, {994, 356}}S;22;{{0, 0}, {1680, 1028}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {994, 356}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;88E;E;E;S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{0, 45}, {995, 312}}S;20;{{0, 0}, {995, 312}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;3;174E;E;E;d;2;18S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;344E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;345E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;346E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;310E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;347E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;85E;E;d;2;10T;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;172E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;156E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;348E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;349E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;310E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;350E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;351E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;353E;E;d;1;2S;20;{{1, 1}, {993, 311}}S;20;{{0, 0}, {993, 311}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;53E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;179E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;354E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{0, 0}, {993, 288}}D;K;6;$classD;K;6;CP$UIDd;3;179E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;356E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;179E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;357E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;4d;2;87S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;3;109E;K;10;CP.objectsD;K;6;personD;K;6;CP$UIDd;3;359E;K;32;AutomaticTableColumnIdentifier.1D;K;6;CP$UIDd;3;360E;K;32;AutomaticTableColumnIdentifier.2D;K;6;CP$UIDd;3;361E;K;8;multipleD;K;6;CP$UIDd;3;362E;K;5;placeD;K;6;CP$UIDd;3;363E;E;E;S;8;multipled;3;234d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;197E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;364E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;365E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;6;$afontD;K;6;CP$UIDd;3;366E;K;12;$atext-colorD;K;6;CP$UIDd;3;367E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;368E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;369E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;370E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;371E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;372E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;373E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;171E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;180E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;S;19;{{1, 1}, {234, 91}}S;19;{{0, 0}, {234, 91}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;63E;E;E;d;2;45S;6;personD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;18;{{2, 3}, {78, 22}}S;18;{{0, 0}, {78, 22}}d;2;38S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;211E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;374E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;215E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;Named;2;-1D;K;6;$classD;K;6;CP$UIDd;3;179E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;375E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;S;20;{{146, 0}, {88, 85}}S;18;{{0, 0}, {88, 85}}d;2;57D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;{{0, 29}, {70, 21}}S;18;{{0, 0}, {70, 21}}d;2;36S;9;check-boxS;27;controlSizeRegular+selectedD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;1S;4;showS;0;S;20;{{1, 94}, {234, 82}}S;19;{{0, 0}, {234, 82}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;E;E;S;5;placeD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{16, 15}, {101, 22}}S;19;{{0, 0}, {101, 22}}d;2;34D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;CityS;21;{{17, 31}, {200, 21}}S;19;{{0, 0}, {200, 21}}d;2;42S;6;sliderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;3;100d;2;50d;3;200S;21;{{134, 46}, {84, 17}}S;18;{{0, 0}, {84, 17}}d;2;41D;K;6;$classD;K;6;CP$UIDd;3;211E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;374E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;337E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;171E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;10;Row HeightD;K;6;$classD;K;6;CP$UIDd;3;179E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;376E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;S;21;{{1, 178}, {234, 87}}S;19;{{0, 0}, {234, 87}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;72E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;{{2, 3}, {230, 22}}S;19;{{0, 0}, {230, 22}}d;2;39D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;TextS;21;{{37, 34}, {158, 25}}S;19;{{0, 0}, {158, 25}}d;2;13S;17;segmented-controlD;K;6;$classD;K;6;CP$UIDd;3;211E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;374E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;215E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;171E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;378E;D;K;6;CP$UIDd;3;379E;D;K;6;CP$UIDd;3;380E;E;E;S;32;AutomaticTableColumnIdentifier.1d;3;147f;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;3;197E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;381E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;365E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;6;$afontD;K;6;CP$UIDd;3;366E;K;12;$atext-colorD;K;6;CP$UIDd;3;367E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;382E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;383E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;370E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;384E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;372E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;373E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;171E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;180E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;S;21;{{238, 1}, {147, 87}}S;19;{{0, 0}, {147, 87}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;3;666S;19;{{2, 8}, {143, 22}}S;19;{{0, 0}, {143, 22}}S;27;controlSizeRegular+editableD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;13;Editable TextS;32;AutomaticTableColumnIdentifier.2d;3;284D;K;6;$classD;K;6;CP$UIDd;3;197E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;385E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;365E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;6;$afontD;K;6;CP$UIDd;3;366E;K;12;$atext-colorD;K;6;CP$UIDd;3;367E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;386E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;387E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;370E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;388E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;372E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;373E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;171E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;180E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;S;21;{{388, 1}, {284, 86}}S;19;{{0, 0}, {284, 86}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;78E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{8, 22}, {267, 36}}S;19;{{0, 0}, {267, 36}}S;35;bezeled+controlSizeRegular+editableD;K;6;$classD;K;6;CP$UIDd;3;211E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;389E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;390E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;3;179E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;391E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;S;6;Oranged;3;149D;K;6;$classD;K;6;CP$UIDd;3;197E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;392E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;365E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;6;$afontD;K;6;CP$UIDd;3;366E;K;12;$atext-colorD;K;6;CP$UIDd;3;367E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;393E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;394E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;370E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;395E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;372E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;373E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;171E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;180E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;S;13;TableCellViewd;3;164D;K;6;$classD;K;6;CP$UIDd;3;197E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;396E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;365E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;6;$afontD;K;6;CP$UIDd;3;366E;K;12;$atext-colorD;K;6;CP$UIDd;3;367E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;397E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;398E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;370E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;187E;K;11;$aalignmentD;K;6;CP$UIDd;3;156E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;399E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;372E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;373E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;156E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;215E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;171E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;171E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;161E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;180E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;187E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;156E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;161E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;161E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;161E;E;S;21;{{1, -76}, {755, 15}}S;19;{{0, 0}, {755, 15}}d;1;8d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:S;23;{{224, 193}, {15, 102}}S;19;{{0, 0}, {15, 102}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:f;18;0.9311377245508982S;19;{{0, 0}, {993, 25}}S;14;tableHeaderRowD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{827, 17}, {160, 21}}S;19;{{0, 0}, {160, 21}}d;2;33D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;Variable Row HeightS;22;{{718, 14}, {104, 25}}S;19;{{0, 0}, {104, 25}}S;6;buttonS;27;bordered+controlSizeRegularD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;333E;K;4;nameD;K;6;CP$UIDd;3;400E;K;12;defaultValueD;K;6;CP$UIDd;3;402E;K;5;stateD;K;6;CP$UIDd;3;403E;K;5;valueD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;11;Reload Datad;2;14S;13;AppControllerS;17;TableViewDelegateS;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;341E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;15;CPNegateBooleanS;21;{{1, 289}, {993, 23}}S;19;{{0, 0}, {993, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;85E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{0, 287}, {14, 25}}S;18;{{0, 0}, {14, 25}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;227E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;227E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;405E;D;K;6;CP$UIDd;3;405E;D;K;6;CP$UIDd;3;405E;D;K;6;CP$UIDd;3;227E;E;E;D;K;10;$classnameS;5;CPCibK;8;$classesA;S;5;CPCibS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;358E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;406E;E;D;K;6;$classD;K;6;CP$UIDd;3;358E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;407E;E;D;K;6;$classD;K;6;CP$UIDd;3;358E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;408E;E;D;K;6;$classD;K;6;CP$UIDd;3;358E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;409E;E;D;K;6;$classD;K;6;CP$UIDd;3;358E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;410E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;412E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;211E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;374E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;413E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;171E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;3;179E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;355E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;14;Multiple CellsS;41;controlSizeRegular+editable+tableDataViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;9;Text Celld;4;3072S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;227E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;415E;D;K;6;CP$UIDd;3;415E;D;K;6;CP$UIDd;3;415E;D;K;6;CP$UIDd;3;227E;E;E;D;K;10;$classnameS;14;_CPSegmentItemK;8;$classesA;S;14;_CPSegmentItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;377E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;229E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;161E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;171E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;156E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;416E;E;D;K;6;$classD;K;6;CP$UIDd;3;377E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;229E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;171E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;171E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;227E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;416E;E;D;K;6;$classD;K;6;CP$UIDd;3;377E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;1;0E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;161E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;171E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;156E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;416E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;417E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;Editable Non BezeledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;418E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;Editable BezeledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;14;.SF NS Displayd;2;26D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;419E;D;K;6;CP$UIDd;3;419E;D;K;6;CP$UIDd;3;419E;D;K;6;CP$UIDd;3;227E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;420E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;15;Created In CodeD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;421E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;12;External CibD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;401E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;211E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;422E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;266E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;161E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;161E;E;f;12;0.7997416835S;14856;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE2RTtEO0s7NjtDUCRVSURkOzI7MTdFO0Q7Szs2O0NQJFVJRGQ7MjsxOEU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MjBFO0Q7Szs2O0NQJFVJRGQ7MjsyMkU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyNEU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyNkU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyN0U7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxMUU7RDtLOzY7Q1AkVUlEZDsyOzIwRTtEO0s7NjtDUCRVSURkOzI7MjJFO0Q7Szs2O0NQJFVJRGQ7MjsyMEU7RDtLOzY7Q1AkVUlEZDsyOzI0RTtEO0s7NjtDUCRVSURkOzI7MjBFO0Q7Szs2O0NQJFVJRGQ7MjsyNkU7RDtLOzY7Q1AkVUlEZDsyOzExRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Szs4OyRjbGFzc2VzQTtTOzE4O19DUENpYkN1c3RvbU9iamVjdFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTBFO0s7Mjc7X0NQQ2liQ3VzdG9tT2JqZWN0Q2xhc3NOYW1lRDtLOzY7Q1AkVUlEZDsyOzI4RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs1O0NQU2V0Szs4OyRjbGFzc2VzQTtTOzU7Q1BTZXRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEyRTtLOzE1O0NQU2V0T2JqZWN0c0tleUQ7Szs2O0NQJFVJRGQ7MjsyOUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQmluZGluZ0Nvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE0RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyNEU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjszMEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzMxRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MzJFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7MjszNEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTRFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzI0RTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzM1RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvckJpbmRpbmdLZXlEO0s7NjtDUCRVSURkOzI7MzZFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yS2V5UGF0aEtleUQ7Szs2O0NQJFVJRGQ7MjszN0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JPcHRpb25zS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxNEU7SzsyNDtfQ1BDaWJDb25uZWN0b3JTb3VyY2VLZXlEO0s7NjtDUCRVSURkOzI7MjJFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yQmluZGluZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0MEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLZXlQYXRoS2V5RDtLOzY7Q1AkVUlEZDsyOzQxRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvck9wdGlvbnNLZXlEO0s7NjtDUCRVSURkOzI7NDJFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE0RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyNkU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7Mjs0M0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzQwRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MzdFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTU7Q1BUYWJsZUNlbGxWaWV3Szs4OyRjbGFzc2VzQTtTOzE1O0NQVGFibGVDZWxsVmlld1M7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxOUU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NDZFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzQ3RTtLOzE3O0NQVmlld1N1YnZpZXdzS2V5RDtLOzY7Q1AkVUlEZDsyOzQ4RTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7NDlFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0s7MjA7Q1BSZXVzZUlkZW50aWZpZXJLZXlEO0s7NjtDUCRVSURkOzI7NTFFO0s7MTQ7Q1BWaWV3U2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MTg7Q1BWaWV3U2l6ZVNjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUyRTtLOzE3O0NQVmlld0lzU2NhbGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzUzRTtLOzE5O0NQVmlld0FwcGVhcmFuY2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMjtDUFZpZXdUcmFja2luZ0FyZWFzS2V5RDtLOzY7Q1AkVUlEZDsyOzU0RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxMTtDUFRleHRGaWVsZEs7ODskY2xhc3Nlc0E7UzsxMTtDUFRleHRGaWVsZFM7OTtDUENvbnRyb2xTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjFFO0s7Mjc7Q1BSZXNwb25kZXJOZXh0UmVzcG9uZGVyS2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1NUU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7NTZFO0s7MTg7Q1BWaWV3U3VwZXJ2aWV3S2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7NTdFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs1OEU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzU5RTtLOzY7JGFmb250RDtLOzY7Q1AkVUlEZDsyOzYxRTtLOzE3OyRhbGluZS1icmVhay1tb2RlRDtLOzY7Q1AkVUlEZDsyOzYyRTtLOzExOyRhYWxpZ25tZW50RDtLOzY7Q1AkVUlEZDsyOzYyRTtLOzE0O0NQVmlld1NjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUyRTtLOzE4O0NQVmlld1NpemVTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MkU7SzsxNztDUFZpZXdJc1NjYWxlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsxOTtDUFZpZXdBcHBlYXJhbmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjI7Q1BWaWV3VHJhY2tpbmdBcmVhc0tleUQ7Szs2O0NQJFVJRGQ7Mjs2M0U7SzszNTtDUENvbnRyb2xTZW5kc0FjdGlvbk9uRW5kRWRpdGluZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs2NEU7SzsxNztDUENvbnRyb2xWYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs2NUU7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MjM7Q1BDb250cm9sQ29udHJvbFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MzM7Q1BDb250cm9sQmFzZVdyaXR0aW5nRGlyZWN0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzY2RTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs2OEU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzI5O0NQVGV4dEZpZWxkVXNlc1NpbmdsZUxpbmVNb2RlRDtLOzY7Q1AkVUlEZDsyOzUzRTtLOzE2O0NQVGV4dEZpZWxkV3JhcHNEO0s7NjtDUCRVSURkOzI7NTNFO0s7MTg7Q1BUZXh0RmllbGRTY3JvbGxzRDtLOzY7Q1AkVUlEZDsyOzUzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxMTtDUEltYWdlVmlld0s7ODskY2xhc3Nlc0E7UzsxMTtDUEltYWdlVmlld1M7OTtDUENvbnRyb2xTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjNFO0s7Mjc7Q1BSZXNwb25kZXJOZXh0UmVzcG9uZGVyS2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs2OUU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7NzBFO0s7MTg7Q1BWaWV3U3VwZXJ2aWV3S2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7NzFFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NTlFO0s7MTU7JGFpbWFnZS1zY2FsaW5nRDtLOzY7Q1AkVUlEZDsyOzcyRTtLOzE3OyRhbGluZS1icmVhay1tb2RlRDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzExOyRhYWxpZ25tZW50RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE0O0NQVmlld1NjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUyRTtLOzE4O0NQVmlld1NpemVTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MkU7SzsxNztDUFZpZXdJc1NjYWxlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsxOTtDUFZpZXdBcHBlYXJhbmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjI7Q1BWaWV3VHJhY2tpbmdBcmVhc0tleUQ7Szs2O0NQJFVJRGQ7Mjs3M0U7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MjM7Q1BDb250cm9sQ29udHJvbFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MzM7Q1BDb250cm9sQmFzZVdyaXR0aW5nRGlyZWN0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzY2RTtLOzIzO0NQSW1hZ2VWaWV3SGFzU2hhZG93S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjg7Q1BJbWFnZVZpZXdJbWFnZUFsaWdubWVudEtleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTA7Q1BDaGVja0JveEs7ODskY2xhc3Nlc0E7UzsxMDtDUENoZWNrQm94Uzs4O0NQQnV0dG9uUzs5O0NQQ29udHJvbFM7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyNUU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzc0RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs3NUU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs3NkU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzc3RTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NzhFO0s7MTU7JGFpbWFnZS1zY2FsaW5nRDtLOzY7Q1AkVUlEZDsyOzc5RTtLOzY7JGFmb250RDtLOzY7Q1AkVUlEZDsyOzYxRTtLOzE3OyRhbGluZS1icmVhay1tb2RlRDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzExOyRhYWxpZ25tZW50RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzE0O0NQVmlld1NjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUyRTtLOzE4O0NQVmlld1NpemVTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MkU7SzsxNztDUFZpZXdJc1NjYWxlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsxOTtDUFZpZXdBcHBlYXJhbmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjI7Q1BWaWV3VHJhY2tpbmdBcmVhc0tleUQ7Szs2O0NQJFVJRGQ7Mjs4MEU7SzsxNztDUENvbnRyb2xWYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs4MUU7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MjM7Q1BDb250cm9sQ29udHJvbFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MzM7Q1BDb250cm9sQmFzZVdyaXR0aW5nRGlyZWN0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzY2RTtLOzE2O0NQQnV0dG9uVGl0bGVLZXlEO0s7NjtDUCRVSURkOzI7ODJFO0s7MjU7Q1BCdXR0b25BbHRlcm5hdGVUaXRsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs4M0U7SzsyNztDUEJ1dHRvbkFsbG93c01peGVkU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NTNFO0s7MjM7Q1BCdXR0b25IaWdobGlnaHRzQnlLZXlEO0s7NjtDUCRVSURkOzI7ODFFO0s7MjM7Q1BCdXR0b25TaG93c1N0YXRlQnlLZXlEO0s7NjtDUCRVSURkOzI7ODFFO0s7MzI7Q1BCdXR0b25JbWFnZURpbXNXaGVuRGlzYWJsZWRLZXlEO0s7NjtDUCRVSURkOzI7NjRFO0s7MjQ7Q1BCdXR0b25JbWFnZVBvc2l0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzc5RTtLOzI4O0NQQnV0dG9uS2V5RXF1aXZhbGVudE1hc2tLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MjQ7Q1BCdXR0b25QZXJpb2RpY0RlbGF5S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjc7Q1BCdXR0b25QZXJpb2RpY0ludGVydmFsS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEwRTtLOzI3O19DUENpYkN1c3RvbU9iamVjdENsYXNzTmFtZUQ7Szs2O0NQJFVJRGQ7Mjs4NEU7RTtTOzg7Q1BPYmplY3REO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7UzszMjt2YWx1ZVVSTDogb2JqZWN0VmFsdWUuaW1hZ2UucGF0aFM7ODt2YWx1ZVVSTFM7MjI7b2JqZWN0VmFsdWUuaW1hZ2UucGF0aEQ7SzsxMDskY2xhc3NuYW1lUzsxMjtDUERpY3Rpb25hcnlLOzg7JGNsYXNzZXNBO1M7MTI7Q1BEaWN0aW9uYXJ5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjszM0U7SzsxMDtDUC5vYmplY3RzRDtLOzI4O0NQUmFpc2VzRm9yTm90QXBwbGljYWJsZUtleXNEO0s7NjtDUCRVSURkOzI7NTNFO0s7MjY7Q1BDb25kaXRpb25hbGx5U2V0c0VuYWJsZWREO0s7NjtDUCRVSURkOzI7NTNFO0s7Mzg7Q1BBbGxvd3NFZGl0aW5nTXVsdGlwbGVWYWx1ZXNTZWxlY3Rpb25EO0s7NjtDUCRVSURkOzI7NTNFO0U7RTtTOzI0O2hpZGRlbjogb2JqZWN0VmFsdWUuc2hvd1M7NjtoaWRkZW5TOzE2O29iamVjdFZhbHVlLnNob3dEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MzNFO0s7MTA7Q1Aub2JqZWN0c0Q7SzsyMjtDUFZhbHVlVHJhbnNmb3JtZXJOYW1lRDtLOzY7Q1AkVUlEZDsyOzg1RTtFO0U7UzsyOTt2YWx1ZTogb2JqZWN0VmFsdWUuaW1hZ2UubmFtZVM7NTt2YWx1ZVM7MjI7b2JqZWN0VmFsdWUuaW1hZ2UubmFtZUQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjszM0U7SzsxMDtDUC5vYmplY3RzRDtLOzI4O0NQUmFpc2VzRm9yTm90QXBwbGljYWJsZUtleXNEO0s7NjtDUCRVSURkOzI7NTNFO0s7Mzg7Q1BBbGxvd3NFZGl0aW5nTXVsdGlwbGVWYWx1ZXNTZWxlY3Rpb25EO0s7NjtDUCRVSURkOzI7NTNFO0U7RTtTOzIzO3ZhbHVlOiBvYmplY3RWYWx1ZS5zaG93RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzMzRTtLOzEwO0NQLm9iamVjdHNEO0U7RTtkOzE7MFM7MTk7e3sxLCAxfSwgezIzNCwgOTF9fVM7MTk7e3swLCAwfSwgezIzNCwgOTF9fUQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsyMkU7RDtLOzY7Q1AkVUlEZDsyOzI0RTtEO0s7NjtDUCRVSURkOzI7MjZFO0U7RTtkOzI7NDVTOzY7bm9ybWFsUzs2O3BlcnNvblM7Njt7MSwgMX1GO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtTOzE4O3t7MiwgM30sIHs3OCwgMjJ9fVM7MTg7e3swLCAwfSwgezc4LCAyMn19ZDsyOzM4Uzs5O3RleHRmaWVsZFM7MTg7Y29udHJvbFNpemVSZWd1bGFyRDtLOzEwOyRjbGFzc25hbWVTOzY7Q1BGb250Szs4OyRjbGFzc2VzQTtTOzY7Q1BGb250Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsxMztDUEZvbnROYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzg2RTtLOzEzO0NQRm9udFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NjZFO0s7MTU7Q1BGb250SXNCb2xkS2V5RDtLOzY7Q1AkVUlEZDsyOzUzRTtLOzE3O0NQRm9udElzSXRhbGljS2V5RDtLOzY7Q1AkVUlEZDsyOzUzRTtLOzE3O0NQRm9udElzU3lzdGVtS2V5RDtLOzY7Q1AkVUlEZDsyOzY0RTtFO2Q7MTs0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1Q7Uzs0O05hbWVkOzI7LTFEO0s7MTA7JGNsYXNzbmFtZVM7NztDUENvbG9ySzs4OyRjbGFzc2VzQTtTOzc7Q1BDb2xvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NjdFO0s7MjA7Q1BDb2xvckNvbXBvbmVudHNLZXlEO0s7NjtDUCRVSURkOzI7ODdFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs4OEU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtFO1M7MjA7e3sxNDYsIDB9LCB7ODgsIDg1fX1TOzE4O3t7MCwgMH0sIHs4OCwgODV9fWQ7Mjs1N2Q7MTszRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7MTk7e3swLCAyOX0sIHs3MCwgMjF9fVM7MTg7e3swLCAwfSwgezcwLCAyMX19ZDsyOzM2Uzs5O2NoZWNrLWJveFM7Mjc7Y29udHJvbFNpemVSZWd1bGFyK3NlbGVjdGVkZDsxOzJEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7ZDsxOzFTOzQ7c2hvd1M7MDtTOzEzO0NQQXBwbGljYXRpb25TOzE1O0NQTmVnYXRlQm9vbGVhblM7Mjg7X0NQRm9udFN5c3RlbUZhY2VQbGFjZWhvbGRlckQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7Mjs4MUU7RDtLOzY7Q1AkVUlEZDsyOzgxRTtEO0s7NjtDUCRVSURkOzI7ODFFO0Q7Szs2O0NQJFVJRGQ7Mjs4MUU7RTtFO1M7NTtjb2xvckU7Szs5OyRhcmNoaXZlclM7MTU7Q1BLZXllZEFyY2hpdmVySzs4OyR2ZXJzaW9uUzs2OzEwMDAwMEU7S;8756;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RDtLOzY7Q1AkVUlEZDsyOzIxRTtEO0s7NjtDUCRVSURkOzE7MEU7RDtLOzY7Q1AkVUlEZDsyOzIyRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzExRTtEO0s7NjtDUCRVSURkOzI7MTlFO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RDtLOzY7Q1AkVUlEZDsyOzExRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Szs4OyRjbGFzc2VzQTtTOzE4O19DUENpYkN1c3RvbU9iamVjdFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTBFO0s7Mjc7X0NQQ2liQ3VzdG9tT2JqZWN0Q2xhc3NOYW1lRDtLOzY7Q1AkVUlEZDsyOzIzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs1O0NQU2V0Szs4OyRjbGFzc2VzQTtTOzU7Q1BTZXRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEyRTtLOzE1O0NQU2V0T2JqZWN0c0tleUQ7Szs2O0NQJFVJRGQ7MjsyNEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJDb250cm9sQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQ29udHJvbENvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE0RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsxMUU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjsyNUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQmluZGluZ0Nvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsxOUU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjsyNkU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzI3RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MjhFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7MjszMEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTU7Q1BUYWJsZUNlbGxWaWV3Szs4OyRjbGFzc2VzQTtTOzE1O0NQVGFibGVDZWxsVmlld1M7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxOEU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7MzJFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzMzRTtLOzE3O0NQVmlld1N1YnZpZXdzS2V5RDtLOzY7Q1AkVUlEZDsyOzM0RTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7MzVFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7MzZFO0s7MjA7Q1BSZXVzZUlkZW50aWZpZXJLZXlEO0s7NjtDUCRVSURkOzI7MzdFO0s7MTQ7Q1BWaWV3U2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7MzhFO0s7MTg7Q1BWaWV3U2l6ZVNjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzE3O0NQVmlld0lzU2NhbGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzM5RTtLOzE5O0NQVmlld0FwcGVhcmFuY2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMjtDUFZpZXdUcmFja2luZ0FyZWFzS2V5RDtLOzY7Q1AkVUlEZDsyOzQwRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxMTtDUFRleHRGaWVsZEs7ODskY2xhc3Nlc0E7UzsxMTtDUFRleHRGaWVsZFM7OTtDUENvbnRyb2xTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjBFO0s7Mjc7Q1BSZXNwb25kZXJOZXh0UmVzcG9uZGVyS2V5RDtLOzY7Q1AkVUlEZDsyOzE5RTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs0MUU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0MkU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7NDNFO0s7MTg7Q1BWaWV3U3VwZXJ2aWV3S2V5RDtLOzY7Q1AkVUlEZDsyOzE5RTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7NDRFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzY7JGFmb250RDtLOzY7Q1AkVUlEZDsyOzQ4RTtLOzE3OyRhbGluZS1icmVhay1tb2RlRDtLOzY7Q1AkVUlEZDsyOzQ5RTtLOzExOyRhYWxpZ25tZW50RDtLOzY7Q1AkVUlEZDsyOzQ5RTtLOzE0O0NQVmlld1NjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzE4O0NQVmlld1NpemVTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7MjszOEU7SzsxNztDUFZpZXdJc1NjYWxlZEtleUQ7Szs2O0NQJFVJRGQ7MjszOUU7SzsxOTtDUFZpZXdBcHBlYXJhbmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjI7Q1BWaWV3VHJhY2tpbmdBcmVhc0tleUQ7Szs2O0NQJFVJRGQ7Mjs1MEU7SzszNTtDUENvbnRyb2xTZW5kc0FjdGlvbk9uRW5kRWRpdGluZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsxNztDUENvbnRyb2xWYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MkU7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MjM7Q1BDb250cm9sQ29udHJvbFNpemVLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0s7MzM7Q1BDb250cm9sQmFzZVdyaXR0aW5nRGlyZWN0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzUzRTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7MjszOUU7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs1NUU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzI5O0NQVGV4dEZpZWxkVXNlc1NpbmdsZUxpbmVNb2RlRDtLOzY7Q1AkVUlEZDsyOzM5RTtLOzE2O0NQVGV4dEZpZWxkV3JhcHNEO0s7NjtDUCRVSURkOzI7MzlFO0s7MTg7Q1BUZXh0RmllbGRTY3JvbGxzRDtLOzY7Q1AkVUlEZDsyOzM5RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7NTZFO0U7Uzs4O0NQT2JqZWN0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7Mjc7X3RleHRGaWVsZE5vdEJlemVsZWRBY3Rpb246UzsyNDt2YWx1ZTogb2JqZWN0VmFsdWUudmFsdWVTOzU7dmFsdWVTOzE3O29iamVjdFZhbHVlLnZhbHVlRDtLOzEwOyRjbGFzc25hbWVTOzEyO0NQRGljdGlvbmFyeUs7ODskY2xhc3Nlc0E7UzsxMjtDUERpY3Rpb25hcnlTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzI5RTtLOzEwO0NQLm9iamVjdHNEO0U7RTtkOzE7MFM7MjE7e3syMzgsIDF9LCB7MTQ3LCA4N319UzsxOTt7ezAsIDB9LCB7MTQ3LCA4N319RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzIxRTtFO0U7ZDsyOzQ1Uzs2O25vcm1hbFM7MzI7QXV0b21hdGljVGFibGVDb2x1bW5JZGVudGlmaWVyLjFTOzY7ezEsIDF9RjtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7ZDszOzY2NlM7MTk7e3syLCA4fSwgezE0MywgMjJ9fVM7MTk7e3swLCAwfSwgezE0MywgMjJ9fWQ7MjszNFM7OTt0ZXh0ZmllbGRTOzI3O2NvbnRyb2xTaXplUmVndWxhcitlZGl0YWJsZUQ7SzsxMDskY2xhc3NuYW1lUzs2O0NQRm9udEs7ODskY2xhc3Nlc0E7Uzs2O0NQRm9udFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NDdFO0s7MTM7Q1BGb250TmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1N0U7SzsxMztDUEZvbnRTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzUzRTtLOzE1O0NQRm9udElzQm9sZEtleUQ7Szs2O0NQJFVJRGQ7MjszOUU7SzsxNztDUEZvbnRJc0l0YWxpY0tleUQ7Szs2O0NQJFVJRGQ7MjszOUU7SzsxNztDUEZvbnRJc1N5c3RlbUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7RTtkOzE7NEQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtUO1M7MTM7RWRpdGFibGUgVGV4dGQ7MjstMUQ7SzsxMDskY2xhc3NuYW1lUzs3O0NQQ29sb3JLOzg7JGNsYXNzZXNBO1M7NztDUENvbG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsyMDtDUENvbG9yQ29tcG9uZW50c0tleUQ7Szs2O0NQJFVJRGQ7Mjs1OEU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzU5RTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7MzZFO0U7UzsxMztDUEFwcGxpY2F0aW9uUzsyODtfQ1BGb250U3lzdGVtRmFjZVBsYWNlaG9sZGVyRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzYwRTtEO0s7NjtDUCRVSURkOzI7NjBFO0Q7Szs2O0NQJFVJRGQ7Mjs2MEU7RDtLOzY7Q1AkVUlEZDsyOzYxRTtFO0U7Uzs1O2NvbG9yZjsxODswLjY4NjI3NDUwOTgwMzkyMTZkOzE7MUU7Szs5OyRhcmNoaXZlclM7MTU7Q1BLZXllZEFyY2hpdmVySzs4OyR2ZXJzaW9uUzs2OzEwMDAwMEU7S;9356;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtEO0s7NjtDUCRVSURkOzI7MThFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzIwRTtEO0s7NjtDUCRVSURkOzI7MjJFO0Q7Szs2O0NQJFVJRGQ7MTswRTtEO0s7NjtDUCRVSURkOzI7MjNFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MTFFO0Q7Szs2O0NQJFVJRGQ7MjsyMEU7RDtLOzY7Q1AkVUlEZDsyOzIyRTtEO0s7NjtDUCRVSURkOzI7MTFFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxODtfQ1BDaWJDdXN0b21PYmplY3RLOzg7JGNsYXNzZXNBO1M7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7MjRFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzU7Q1BTZXRLOzg7JGNsYXNzZXNBO1M7NTtDUFNldFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTJFO0s7MTU7Q1BTZXRPYmplY3RzS2V5RDtLOzY7Q1AkVUlEZDsyOzI1RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsyMTtDUENpYkNvbnRyb2xDb25uZWN0b3JLOzg7JGNsYXNzZXNBO1M7MjE7Q1BDaWJDb250cm9sQ29ubmVjdG9yUzsxNDtDUENpYkNvbm5lY3RvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTRFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzIyRTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzExRTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzI2RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsyMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLOzg7JGNsYXNzZXNBO1M7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yUzsxNDtDUENpYkNvbm5lY3RvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTZFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MjBFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MjdFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yQmluZGluZ0tleUQ7Szs2O0NQJFVJRGQ7MjsyOEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLZXlQYXRoS2V5RDtLOzY7Q1AkVUlEZDsyOzI5RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvck9wdGlvbnNLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyMkU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsyMEU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjszMkU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzI4RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MzNFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7MjszNEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTU7Q1BUYWJsZUNlbGxWaWV3Szs4OyRjbGFzc2VzQTtTOzE1O0NQVGFibGVDZWxsVmlld1M7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxOUU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzVFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7MzZFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzM3RTtLOzE3O0NQVmlld1N1YnZpZXdzS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7MzlFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NDBFO0s7MjA7Q1BSZXVzZUlkZW50aWZpZXJLZXlEO0s7NjtDUCRVSURkOzI7NDFFO0s7MTQ7Q1BWaWV3U2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7NDJFO0s7MTg7Q1BWaWV3U2l6ZVNjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzQyRTtLOzE3O0NQVmlld0lzU2NhbGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzE5O0NQVmlld0FwcGVhcmFuY2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMjtDUFZpZXdUcmFja2luZ0FyZWFzS2V5RDtLOzY7Q1AkVUlEZDsyOzQ0RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxMTtDUFRleHRGaWVsZEs7ODskY2xhc3Nlc0E7UzsxMTtDUFRleHRGaWVsZFM7OTtDUENvbnRyb2xTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjFFO0s7Mjc7Q1BSZXNwb25kZXJOZXh0UmVzcG9uZGVyS2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7MjszNUU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7NDZFO0s7MTg7Q1BWaWV3U3VwZXJ2aWV3S2V5RDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzIyO0NQVmlld0F1dG9yZXNpemluZ01hc2tEO0s7NjtDUCRVSURkOzI7NDdFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0OEU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ5RTtLOzY7JGFmb250RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzE3OyRhbGluZS1icmVhay1tb2RlRDtLOzY7Q1AkVUlEZDsyOzM1RTtLOzExOyRhYWxpZ25tZW50RDtLOzY7Q1AkVUlEZDsyOzUyRTtLOzE0O0NQVmlld1NjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzQyRTtLOzE4O0NQVmlld1NpemVTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0MkU7SzsxNztDUFZpZXdJc1NjYWxlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs0M0U7SzsxOTtDUFZpZXdBcHBlYXJhbmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjI7Q1BWaWV3VHJhY2tpbmdBcmVhc0tleUQ7Szs2O0NQJFVJRGQ7Mjs1M0U7SzszNTtDUENvbnRyb2xTZW5kc0FjdGlvbk9uRW5kRWRpdGluZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsxNztDUENvbnRyb2xWYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1NUU7SzsyNDtDUENvbnRyb2xTZW5kQWN0aW9uT25LZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MjM7Q1BDb250cm9sQ29udHJvbFNpemVLZXlEO0s7NjtDUCRVSURkOzI7MzVFO0s7MzM7Q1BDb250cm9sQmFzZVdyaXR0aW5nRGlyZWN0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzU2RTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs1OEU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7MzVFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzI5O0NQVGV4dEZpZWxkVXNlc1NpbmdsZUxpbmVNb2RlRDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzE2O0NQVGV4dEZpZWxkV3JhcHNEO0s7NjtDUCRVSURkOzI7NTRFO0s7MTg7Q1BUZXh0RmllbGRTY3JvbGxzRDtLOzY7Q1AkVUlEZDsyOzQzRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7NTlFO0U7Uzs4O0NQT2JqZWN0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7MjQ7X3RleHRGaWVsZEJlemVsZWRBY3Rpb246UzsxODt2YWx1ZTogb2JqZWN0VmFsdWVTOzU7dmFsdWVTOzExO29iamVjdFZhbHVlRDtLOzEwOyRjbGFzc25hbWVTOzEyO0NQRGljdGlvbmFyeUs7ODskY2xhc3Nlc0E7UzsxMjtDUERpY3Rpb25hcnlTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzMwRTtLOzEwO0NQLm9iamVjdHNEO0U7RTtTOzI0O3ZhbHVlOiBvYmplY3RWYWx1ZS52YWx1ZVM7MTc7b2JqZWN0VmFsdWUudmFsdWVEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MzBFO0s7MTA7Q1Aub2JqZWN0c0Q7RTtFO2Q7MTswUzsyMTt7ezM4OCwgMX0sIHsyODQsIDg2fX1TOzE5O3t7MCwgMH0sIHsyODQsIDg2fX1EO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MjJFO0U7RTtkOzI7NDVTOzY7bm9ybWFsUzszMjtBdXRvbWF0aWNUYWJsZUNvbHVtbklkZW50aWZpZXIuMlM7Njt7MSwgMX1GO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtTOzIwO3t7OCwgMjJ9LCB7MjY3LCAzNn19UzsxOTt7ezAsIDB9LCB7MjY3LCAzNn19ZDsyOzQyUzs5O3RleHRmaWVsZFM7MzU7YmV6ZWxlZCtjb250cm9sU2l6ZVJlZ3VsYXIrZWRpdGFibGVEO0s7MTA7JGNsYXNzbmFtZVM7NjtDUEZvbnRLOzg7JGNsYXNzZXNBO1M7NjtDUEZvbnRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzEzO0NQRm9udE5hbWVLZXlEO0s7NjtDUCRVSURkOzI7NjBFO0s7MTM7Q1BGb250U2l6ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs2MUU7SzsxNTtDUEZvbnRJc0JvbGRLZXlEO0s7NjtDUCRVSURkOzI7NDNFO0s7MTc7Q1BGb250SXNJdGFsaWNLZXlEO0s7NjtDUCRVSURkOzI7NDNFO0s7MTc7Q1BGb250SXNTeXN0ZW1LZXlEO0s7NjtDUCRVSURkOzI7NDNFO0U7ZDsxOzREO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7VDtTOzEzO0VkaXRhYmxlIFRleHRkOzI7LTFEO0s7MTA7JGNsYXNzbmFtZVM7NztDUENvbG9ySzs4OyRjbGFzc2VzQTtTOzc7Q1BDb2xvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NTdFO0s7MjA7Q1BDb2xvckNvbXBvbmVudHNLZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs2M0U7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQwRTtFO1M7MTM7Q1BBcHBsaWNhdGlvblM7MTQ7LlNGIE5TIERpc3BsYXlkOzI7MjZEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7NjRFO0Q7Szs2O0NQJFVJRGQ7Mjs2NEU7RDtLOzY7Q1AkVUlEZDsyOzY0RTtEO0s7NjtDUCRVSURkOzI7NjVFO0U7RTtTOzU7Y29sb3JmOzEyOzAuOTU0NzAwMTAwOGQ7MTsxRTtLOzk7JGFyY2hpdmVyUzsxNTtDUEtleWVkQXJjaGl2ZXJLOzg7JHZlcnNpb25TOzY7MTAwMDAwRTs=S;12224;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MTdFO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyMkU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxMUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtEO0s7NjtDUCRVSURkOzI7MTlFO0Q7Szs2O0NQJFVJRGQ7MjsxN0U7RDtLOzY7Q1AkVUlEZDsyOzIxRTtEO0s7NjtDUCRVSURkOzI7MTFFO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxODtfQ1BDaWJDdXN0b21PYmplY3RLOzg7JGNsYXNzZXNBO1M7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7MjNFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzU7Q1BTZXRLOzg7JGNsYXNzZXNBO1M7NTtDUFNldFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTJFO0s7MTU7Q1BTZXRPYmplY3RzS2V5RDtLOzY7Q1AkVUlEZDsyOzI0RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsyMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLOzg7JGNsYXNzZXNBO1M7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yUzsxNDtDUENpYkNvbm5lY3RvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTRFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzE5RTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzE3RTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzI1RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvckJpbmRpbmdLZXlEO0s7NjtDUCRVSURkOzI7MjZFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yS2V5UGF0aEtleUQ7Szs2O0NQJFVJRGQ7MjsyN0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JPcHRpb25zS2V5RDtLOzY7Q1AkVUlEZDsyOzI5RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzsxNTtDUFRhYmxlQ2VsbFZpZXdLOzg7JGNsYXNzZXNBO1M7MTU7Q1BUYWJsZUNlbGxWaWV3Uzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzE4O0NQUmVzcG9uZGVyTWVudUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzEyO0NQVmlld1RhZ0tleUQ7Szs2O0NQJFVJRGQ7MjszMEU7SzsxNDtDUFZpZXdGcmFtZUtleUQ7Szs2O0NQJFVJRGQ7MjszMUU7SzsxNTtDUFZpZXdCb3VuZHNLZXlEO0s7NjtDUCRVSURkOzI7MzJFO0s7MTc7Q1BWaWV3U3Vidmlld3NLZXlEO0s7NjtDUCRVSURkOzI7MzNFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7MjszNEU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7MjszNUU7SzsyMDtDUFJldXNlSWRlbnRpZmllcktleUQ7Szs2O0NQJFVJRGQ7MjszNkU7SzsxNDtDUFZpZXdTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7MjszN0U7SzsxODtDUFZpZXdTaXplU2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7MzdFO0s7MTc7Q1BWaWV3SXNTY2FsZWRLZXlEO0s7NjtDUCRVSURkOzI7MzhFO0s7MTk7Q1BWaWV3QXBwZWFyYW5jZUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzIyO0NQVmlld1RyYWNraW5nQXJlYXNLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzExO0NQVGV4dEZpZWxkSzs4OyRjbGFzc2VzQTtTOzExO0NQVGV4dEZpZWxkUzs5O0NQQ29udHJvbFM7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxOEU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7MTdFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzMwRTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzQwRTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0MUU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7MTdFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs0MkU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NDRFO0s7NjskYWZvbnREO0s7NjtDUCRVSURkOzI7NDZFO0s7MTc7JGFsaW5lLWJyZWFrLW1vZGVEO0s7NjtDUCRVSURkOzI7NDdFO0s7MTE7JGFhbGlnbm1lbnREO0s7NjtDUCRVSURkOzI7NDhFO0s7MTQ7Q1BWaWV3U2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7MzdFO0s7MTg7Q1BWaWV3U2l6ZVNjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzM3RTtLOzE3O0NQVmlld0lzU2NhbGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzE5O0NQVmlld0FwcGVhcmFuY2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMjtDUFZpZXdUcmFja2luZ0FyZWFzS2V5RDtLOzY7Q1AkVUlEZDsyOzQ5RTtLOzM1O0NQQ29udHJvbFNlbmRzQWN0aW9uT25FbmRFZGl0aW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzE3O0NQQ29udHJvbFZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzI0O0NQQ29udHJvbFNlbmRBY3Rpb25PbktleUQ7Szs2O0NQJFVJRGQ7Mjs0N0U7SzsyMztDUENvbnRyb2xDb250cm9sU2l6ZUtleUQ7Szs2O0NQJFVJRGQ7MjszMEU7SzszMztDUENvbnRyb2xCYXNlV3JpdHRpbmdEaXJlY3Rpb25LZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MjQ7Q1BUZXh0RmllbGRJc0VkaXRhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzI2O0NQVGV4dEZpZWxkSXNTZWxlY3RhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzI5O0NQVGV4dEZpZWxkRHJhd3NCYWNrZ3JvdW5kS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzI5O0NQVGV4dEZpZWxkQmFja2dyb3VuZENvbG9yS2V5RDtLOzY7Q1AkVUlEZDsyOzU0RTtLOzI3O0NQVGV4dEZpZWxkTGluZUJyZWFrTW9kZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0N0U7SzsyMztDUFRleHRGaWVsZEFsaWdubWVudEtleUQ7Szs2O0NQJFVJRGQ7Mjs0OEU7SzszMTtDUFRleHRGaWVsZFBsYWNlaG9sZGVyU3RyaW5nS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjk7Q1BUZXh0RmllbGRVc2VzU2luZ2xlTGluZU1vZGVEO0s7NjtDUCRVSURkOzI7MzhFO0s7MTY7Q1BUZXh0RmllbGRXcmFwc0Q7Szs2O0NQJFVJRGQ7MjszOEU7SzsxODtDUFRleHRGaWVsZFNjcm9sbHNEO0s7NjtDUCRVSURkOzI7MzhFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzE4O0NQU2VnbWVudGVkQ29udHJvbEs7ODskY2xhc3Nlc0E7UzsxODtDUFNlZ21lbnRlZENvbnRyb2xTOzk7Q1BDb250cm9sUzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsxN0U7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzBFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NTVFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzU2RTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsxN0U7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzU3RTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzI7NThFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7Szs2OyRhZm9udEQ7Szs2O0NQJFVJRGQ7Mjs1OUU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7MjszMEU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs0OEU7SzsxNDtDUFZpZXdTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7MjszN0U7SzsxODtDUFZpZXdTaXplU2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7MzdFO0s7MTc7Q1BWaWV3SXNTY2FsZWRLZXlEO0s7NjtDUCRVSURkOzI7MzhFO0s7MTk7Q1BWaWV3QXBwZWFyYW5jZUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzIyO0NQVmlld1RyYWNraW5nQXJlYXNLZXlEO0s7NjtDUCRVSURkOzI7NjBFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzQ3RTtLOzIzO0NQQ29udHJvbENvbnRyb2xTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzMwRTtLOzMzO0NQQ29udHJvbEJhc2VXcml0dGluZ0RpcmVjdGlvbktleUQ7Szs2O0NQJFVJRGQ7Mjs1MkU7SzsyOTtDUFNlZ21lbnRlZENvbnRyb2xTZWdtZW50c0tleUQ7Szs2O0NQJFVJRGQ7Mjs2MUU7SzsyOTtDUFNlZ21lbnRlZENvbnRyb2xTZWxlY3RlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs2MkU7SzszMztDUFNlZ21lbnRlZENvbnRyb2xTZWdtZW50U3R5bGVLZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MzM7Q1BTZWdtZW50ZWRDb250cm9sVHJhY2tpbmdNb2RlS2V5RDtLOzY7Q1AkVUlEZDsyOzMwRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7NjNFO0U7Uzs4O0NQT2JqZWN0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7Mjk7dmFsdWU6IG9iamVjdFZhbHVlLmlkZW50aWZpZXJTOzU7dmFsdWVTOzIyO29iamVjdFZhbHVlLmlkZW50aWZpZXJEO0s7MTA7JGNsYXNzbmFtZVM7MTI7Q1BEaWN0aW9uYXJ5Szs4OyRjbGFzc2VzQTtTOzEyO0NQRGljdGlvbmFyeVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjhFO0s7MTA7Q1Aub2JqZWN0c0Q7RTtFO2Q7MTswUzsyMTt7ezEsIDE3OH0sIHsyMzQsIDg3fX1TOzE5O3t7MCwgMH0sIHsyMzQsIDg3fX1EO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MTlFO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RTtFO2Q7Mjs0NVM7Njtub3JtYWxTOzg7bXVsdGlwbGVTOzY7ezEsIDF9RjtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7UzsxOTt7ezIsIDN9LCB7MjMwLCAyMn19UzsxOTt7ezAsIDB9LCB7MjMwLCAyMn19ZDsyOzM5Uzs5O3RleHRmaWVsZFM7MTg7Y29udHJvbFNpemVSZWd1bGFyRDtLOzEwOyRjbGFzc25hbWVTOzY7Q1BGb250Szs4OyRjbGFzc2VzQTtTOzY7Q1BGb250Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxMztDUEZvbnROYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzY0RTtLOzEzO0NQRm9udFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NTJFO0s7MTU7Q1BGb250SXNCb2xkS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzE3O0NQRm9udElzSXRhbGljS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzE3O0NQRm9udElzU3lzdGVtS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtFO2Q7MTs0ZDsxOzJEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7VDtTOzQ7VGV4dGQ7MjstMUQ7SzsxMDskY2xhc3NuYW1lUzs3O0NQQ29sb3JLOzg7JGNsYXNzZXNBO1M7NztDUENvbG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs1M0U7SzsyMDtDUENvbG9yQ29tcG9uZW50c0tleUQ7Szs2O0NQJFVJRGQ7Mjs2NUU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzY2RTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7MzVFO0U7UzsyMTt7ezM3LCAzNH0sIHsxNTgsIDI1fX1TOzE5O3t7MCwgMH0sIHsxNTgsIDI1fX1kOzI7MTNTOzE3O3NlZ21lbnRlZC1jb250cm9sRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzEzO0NQRm9udE5hbWVLZXlEO0s7NjtDUCRVSURkOzI7NjRFO0s7MTM7Q1BGb250U2l6ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MkU7SzsxNTtDUEZvbnRJc0JvbGRLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0s7MTc7Q1BGb250SXNJdGFsaWNLZXlEO0s7NjtDUCRVSURkOzI7MzhFO0s7MTc7Q1BGb250SXNTeXN0ZW1LZXlEO0s7NjtDUCRVSURkOzI7NTBFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7Mjs2OEU7RDtLOzY7Q1AkVUlEZDsyOzY5RTtEO0s7NjtDUCRVSURkOzI7NzBFO0U7RTtkOzE7MVM7MTM7Q1BBcHBsaWNhdGlvblM7Mjg7X0NQRm9udFN5c3RlbUZhY2VQbGFjZWhvbGRlckQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7Mjs3MUU7RDtLOzY7Q1AkVUlEZDsyOzcxRTtEO0s7NjtDUCRVSURkOzI7NzFFO0Q7Szs2O0NQJFVJRGQ7Mjs2MkU7RTtFO1M7NTtjb2xvckQ7SzsxMDskY2xhc3NuYW1lUzsxNDtfQ1BTZWdtZW50SXRlbUs7ODskY2xhc3Nlc0E7UzsxNDtfQ1BTZWdtZW50SXRlbVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NjdFO0s7MjE7Q1BTZWdtZW50SXRlbUltYWdlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjE7Q1BTZWdtZW50SXRlbUxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzcyRTtLOzIwO0NQU2VnbWVudEl0ZW1NZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjQ7Q1BTZWdtZW50SXRlbVNlbGVjdGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzIzO0NQU2VnbWVudEl0ZW1FbmFibGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzE5O0NQU2VnbWVudEl0ZW1UYWdLZXlEO0s7NjtDUCRVSURkOzI7MzBFO0s7MjE7Q1BTZWdtZW50SXRlbVdpZHRoS2V5RDtLOzY7Q1AkVUlEZDsyOzczRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs2N0U7SzsyMTtDUFNlZ21lbnRJdGVtSW1hZ2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMTtDUFNlZ21lbnRJdGVtTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7NzJFO0s7MjA7Q1BTZWdtZW50SXRlbU1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyNDtDUFNlZ21lbnRJdGVtU2VsZWN0ZWRLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0s7MjM7Q1BTZWdtZW50SXRlbUVuYWJsZWRLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0s7MTk7Q1BTZWdtZW50SXRlbVRhZ0tleUQ7Szs2O0NQJFVJRGQ7Mjs2MkU7SzsyMTtDUFNlZ21lbnRJdGVtV2lkdGhLZXlEO0s7NjtDUCRVSURkOzI7NzNFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzY3RTtLOzIxO0NQU2VnbWVudEl0ZW1JbWFnZUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzIxO0NQU2VnbWVudEl0ZW1MYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzIwO0NQU2VnbWVudEl0ZW1NZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjQ7Q1BTZWdtZW50SXRlbVNlbGVjdGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzIzO0NQU2VnbWVudEl0ZW1FbmFibGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzE5O0NQU2VnbWVudEl0ZW1UYWdLZXlEO0s7NjtDUCRVSURkOzI7MzBFO0s7MjE7Q1BTZWdtZW50SXRlbVdpZHRoS2V5RDtLOzY7Q1AkVUlEZDsyOzczRTtFO2Y7MTg7MC42ODYyNzQ1MDk4MDM5MjE2UzswO2Q7Mjs1MkU7Szs5OyRhcmNoaXZlclM7MTU7Q1BLZXllZEFyY2hpdmVySzs4OyR2ZXJzaW9uUzs2OzEwMDAwMEU7S;14988;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtEO0s7NjtDUCRVSURkOzI7MThFO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtEO0s7NjtDUCRVSURkOzI7MjFFO0Q7Szs2O0NQJFVJRGQ7MjsyM0U7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyNUU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyNkU7RDtLOzY7Q1AkVUlEZDsxOzBFO0Q7Szs2O0NQJFVJRGQ7MjsyN0U7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxMUU7RDtLOzY7Q1AkVUlEZDsyOzIxRTtEO0s7NjtDUCRVSURkOzI7MjNFO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RDtLOzY7Q1AkVUlEZDsyOzI1RTtEO0s7NjtDUCRVSURkOzI7MjFFO0Q7Szs2O0NQJFVJRGQ7MjsyNkU7RDtLOzY7Q1AkVUlEZDsyOzExRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Szs4OyRjbGFzc2VzQTtTOzE4O19DUENpYkN1c3RvbU9iamVjdFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTBFO0s7Mjc7X0NQQ2liQ3VzdG9tT2JqZWN0Q2xhc3NOYW1lRDtLOzY7Q1AkVUlEZDsyOzI4RTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs1O0NQU2V0Szs4OyRjbGFzc2VzQTtTOzU7Q1BTZXRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEyRTtLOzE1O0NQU2V0T2JqZWN0c0tleUQ7Szs2O0NQJFVJRGQ7MjsyOUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJDb250cm9sQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQ29udHJvbENvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE0RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyNUU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsxMUU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjszMEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9ySzs4OyRjbGFzc2VzQTtTOzIxO0NQQ2liQmluZGluZ0Nvbm5lY3RvclM7MTQ7Q1BDaWJDb25uZWN0b3JTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzE2RTtLOzI0O19DUENpYkNvbm5lY3RvclNvdXJjZUtleUQ7Szs2O0NQJFVJRGQ7MjsyNkU7SzsyOTtfQ1BDaWJDb25uZWN0b3JEZXN0aW5hdGlvbktleUQ7Szs2O0NQJFVJRGQ7MjsxMUU7SzsyMztfQ1BDaWJDb25uZWN0b3JMYWJlbEtleUQ7Szs2O0NQJFVJRGQ7MjszMUU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JCaW5kaW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzMyRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvcktleVBhdGhLZXlEO0s7NjtDUCRVSURkOzI7MzNFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yT3B0aW9uc0tleUQ7Szs2O0NQJFVJRGQ7MjszNUU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTZFO0s7MjQ7X0NQQ2liQ29ubmVjdG9yU291cmNlS2V5RDtLOzY7Q1AkVUlEZDsyOzIzRTtLOzI5O19DUENpYkNvbm5lY3RvckRlc3RpbmF0aW9uS2V5RDtLOzY7Q1AkVUlEZDsyOzIxRTtLOzIzO19DUENpYkNvbm5lY3RvckxhYmVsS2V5RDtLOzY7Q1AkVUlEZDsyOzM2RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3RvckJpbmRpbmdLZXlEO0s7NjtDUCRVSURkOzI7MzdFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yS2V5UGF0aEtleUQ7Szs2O0NQJFVJRGQ7MjszOEU7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JPcHRpb25zS2V5RDtLOzY7Q1AkVUlEZDsyOzM5RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxNkU7SzsyNDtfQ1BDaWJDb25uZWN0b3JTb3VyY2VLZXlEO0s7NjtDUCRVSURkOzI7MjVFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7NDBFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yQmluZGluZ0tleUQ7Szs2O0NQJFVJRGQ7MjszN0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLZXlQYXRoS2V5RDtLOzY7Q1AkVUlEZDsyOzQxRTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvck9wdGlvbnNLZXlEO0s7NjtDUCRVSURkOzI7NDJFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzE1O0NQVGFibGVDZWxsVmlld0s7ODskY2xhc3Nlc0E7UzsxNTtDUFRhYmxlQ2VsbFZpZXdTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjBFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzQ0RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNztDUFZpZXdTdWJ2aWV3c0tleUQ7Szs2O0NQJFVJRGQ7Mjs0NkU7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzQ3RTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ4RTtLOzIwO0NQUmV1c2VJZGVudGlmaWVyS2V5RDtLOzY7Q1AkVUlEZDsyOzQ5RTtLOzE0O0NQVmlld1NjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzE4O0NQVmlld1NpemVTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MEU7SzsxNztDUFZpZXdJc1NjYWxlZEtleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsxOTtDUFZpZXdBcHBlYXJhbmNlS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjI7Q1BWaWV3VHJhY2tpbmdBcmVhc0tleUQ7Szs2O0NQJFVJRGQ7Mjs1MkU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTE7Q1BUZXh0RmllbGRLOzg7JGNsYXNzZXNBO1M7MTE7Q1BUZXh0RmllbGRTOzk7Q1BDb250cm9sUzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzIyRTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7NDNFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NTNFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzU0RTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsyMUU7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzU1RTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzI7NTZFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1N0U7Szs2OyRhZm9udEQ7Szs2O0NQJFVJRGQ7Mjs1OUU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsxNDtDUFZpZXdTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1MEU7SzsxODtDUFZpZXdTaXplU2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0s7MTc7Q1BWaWV3SXNTY2FsZWRLZXlEO0s7NjtDUCRVSURkOzI7NTFFO0s7MTk7Q1BWaWV3QXBwZWFyYW5jZUtleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzIyO0NQVmlld1RyYWNraW5nQXJlYXNLZXlEO0s7NjtDUCRVSURkOzI7NjFFO0s7MzU7Q1BDb250cm9sU2VuZHNBY3Rpb25PbkVuZEVkaXRpbmdLZXlEO0s7NjtDUCRVSURkOzI7NjJFO0s7MTc7Q1BDb250cm9sVmFsdWVLZXlEO0s7NjtDUCRVSURkOzI7NjNFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzYwRTtLOzIzO0NQQ29udHJvbENvbnRyb2xTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzMzO0NQQ29udHJvbEJhc2VXcml0dGluZ0RpcmVjdGlvbktleUQ7Szs2O0NQJFVJRGQ7Mjs2NEU7SzsyNDtDUFRleHRGaWVsZElzRWRpdGFibGVLZXlEO0s7NjtDUCRVSURkOzI7NTFFO0s7MjY7Q1BUZXh0RmllbGRJc1NlbGVjdGFibGVLZXlEO0s7NjtDUCRVSURkOzI7NTFFO0s7Mjk7Q1BUZXh0RmllbGREcmF3c0JhY2tncm91bmRLZXlEO0s7NjtDUCRVSURkOzI7NTFFO0s7Mjk7Q1BUZXh0RmllbGRCYWNrZ3JvdW5kQ29sb3JLZXlEO0s7NjtDUCRVSURkOzI7NjZFO0s7Mjc7Q1BUZXh0RmllbGRMaW5lQnJlYWtNb2RlS2V5RDtLOzY7Q1AkVUlEZDsyOzYwRTtLOzIzO0NQVGV4dEZpZWxkQWxpZ25tZW50S2V5RDtLOzY7Q1AkVUlEZDsyOzYwRTtLOzMxO0NQVGV4dEZpZWxkUGxhY2Vob2xkZXJTdHJpbmdLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyOTtDUFRleHRGaWVsZFVzZXNTaW5nbGVMaW5lTW9kZUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsxNjtDUFRleHRGaWVsZFdyYXBzRDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzE4O0NQVGV4dEZpZWxkU2Nyb2xsc0Q7Szs2O0NQJFVJRGQ7Mjs1MUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7ODtDUFNsaWRlcks7ODskY2xhc3Nlc0E7Uzs4O0NQU2xpZGVyUzs5O0NQQ29udHJvbFM7NjtDUFZpZXdTOzExO0NQUmVzcG9uZGVyUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyNEU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzY3RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs2OEU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs2OUU7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzcwRTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NTdFO0s7MTc7JGFsaW5lLWJyZWFrLW1vZGVEO0s7NjtDUCRVSURkOzI7NDNFO0s7MTE7JGFhbGlnbm1lbnREO0s7NjtDUCRVSURkOzI7NDNFO0s7MTQ7Q1BWaWV3U2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0s7MTg7Q1BWaWV3U2l6ZVNjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzE3O0NQVmlld0lzU2NhbGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzE5O0NQVmlld0FwcGVhcmFuY2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMjtDUFZpZXdUcmFja2luZ0FyZWFzS2V5RDtLOzY7Q1AkVUlEZDsyOzcxRTtLOzE3O0NQQ29udHJvbFZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzcyRTtLOzI0O0NQQ29udHJvbFNlbmRBY3Rpb25PbktleUQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsyMztDUENvbnRyb2xDb250cm9sU2l6ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0M0U7SzszMztDUENvbnRyb2xCYXNlV3JpdHRpbmdEaXJlY3Rpb25LZXlEO0s7NjtDUCRVSURkOzI7NjRFO0s7MTk7Q1BTbGlkZXJNaW5WYWx1ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3M0U7SzsxOTtDUFNsaWRlck1heFZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzc0RTtLOzIzO0NQU2xpZGVyQWx0SW5jclZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsyMkU7SzsyNztDUFJlc3BvbmRlck5leHRSZXNwb25kZXJLZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzQzRTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzc1RTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7Mjs3NkU7SzsxODtDUFZpZXdTdXBlcnZpZXdLZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7MjI7Q1BWaWV3QXV0b3Jlc2l6aW5nTWFza0Q7Szs2O0NQJFVJRGQ7Mjs3N0U7SzsxOTtDUFZpZXdUaGVtZUNsYXNzS2V5RDtLOzY7Q1AkVUlEZDsyOzU2RTtLOzE5O0NQVmlld1RoZW1lU3RhdGVLZXlEO0s7NjtDUCRVSURkOzI7NTdFO0s7NjskYWZvbnREO0s7NjtDUCRVSURkOzI7NzhFO0s7MTc7JGFsaW5lLWJyZWFrLW1vZGVEO0s7NjtDUCRVSURkOzI7NzlFO0s7MTE7JGFhbGlnbm1lbnREO0s7NjtDUCRVSURkOzI7NjBFO0s7MTQ7Q1BWaWV3U2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7NTBFO0s7MTg7Q1BWaWV3U2l6ZVNjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUwRTtLOzE3O0NQVmlld0lzU2NhbGVkS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzE5O0NQVmlld0FwcGVhcmFuY2VLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsyMjtDUFZpZXdUcmFja2luZ0FyZWFzS2V5RDtLOzY7Q1AkVUlEZDsyOzgwRTtLOzM1O0NQQ29udHJvbFNlbmRzQWN0aW9uT25FbmRFZGl0aW5nS2V5RDtLOzY7Q1AkVUlEZDsyOzYyRTtLOzE3O0NQQ29udHJvbFZhbHVlS2V5RDtLOzY7Q1AkVUlEZDsyOzgxRTtLOzI0O0NQQ29udHJvbFNlbmRBY3Rpb25PbktleUQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzsyMztDUENvbnRyb2xDb250cm9sU2l6ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0M0U7SzszMztDUENvbnRyb2xCYXNlV3JpdHRpbmdEaXJlY3Rpb25LZXlEO0s7NjtDUCRVSURkOzI7NjRFO0s7MjQ7Q1BUZXh0RmllbGRJc0VkaXRhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzI2O0NQVGV4dEZpZWxkSXNTZWxlY3RhYmxlS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzI5O0NQVGV4dEZpZWxkRHJhd3NCYWNrZ3JvdW5kS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzI5O0NQVGV4dEZpZWxkQmFja2dyb3VuZENvbG9yS2V5RDtLOzY7Q1AkVUlEZDsyOzgyRTtLOzI3O0NQVGV4dEZpZWxkTGluZUJyZWFrTW9kZUtleUQ7Szs2O0NQJFVJRGQ7Mjs3OUU7SzsyMztDUFRleHRGaWVsZEFsaWdubWVudEtleUQ7Szs2O0NQJFVJRGQ7Mjs2MEU7SzszMTtDUFRleHRGaWVsZFBsYWNlaG9sZGVyU3RyaW5nS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7Mjk7Q1BUZXh0RmllbGRVc2VzU2luZ2xlTGluZU1vZGVEO0s7NjtDUCRVSURkOzI7NTFFO0s7MTY7Q1BUZXh0RmllbGRXcmFwc0Q7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsxODtDUFRleHRGaWVsZFNjcm9sbHNEO0s7NjtDUCRVSURkOzI7NjJFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEwRTtLOzI3O19DUENpYkN1c3RvbU9iamVjdENsYXNzTmFtZUQ7Szs2O0NQJFVJRGQ7Mjs4M0U7RTtTOzg7Q1BPYmplY3REO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7M0U7SzsxMDtDUC5vYmplY3RzQTtFO0U7UzsxNDtfc2xpZGVyQWN0aW9uOlM7MjU7aGlkZGVuOiB2YXJpYWJsZVJvd0hlaWdodFM7NjtoaWRkZW5TOzE3O3ZhcmlhYmxlUm93SGVpZ2h0RDtLOzEwOyRjbGFzc25hbWVTOzEyO0NQRGljdGlvbmFyeUs7ODskY2xhc3Nlc0E7UzsxMjtDUERpY3Rpb25hcnlTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzM0RTtLOzEwO0NQLm9iamVjdHNEO0s7MjI7Q1BWYWx1ZVRyYW5zZm9ybWVyTmFtZUQ7Szs2O0NQJFVJRGQ7Mjs4NEU7RTtFO1M7MjM7dmFsdWU6IG9iamVjdFZhbHVlLm5hbWVTOzU7dmFsdWVTOzE2O29iamVjdFZhbHVlLm5hbWVEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MzRFO0s7MTA7Q1Aub2JqZWN0c0Q7RTtFO1M7MjU7dmFsdWU6IG9iamVjdFZhbHVlLnNsaWRlclM7MTg7b2JqZWN0VmFsdWUuc2xpZGVyRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzM0RTtLOzEwO0NQLm9iamVjdHNEO0s7MjI7Q1BWYWxpZGF0ZXNJbW1lZGlhdGVseUQ7Szs2O0NQJFVJRGQ7Mjs2MkU7RTtFO2Q7MTswUzsyMDt7ezEsIDk0fSwgezIzNCwgODJ9fVM7MTk7e3swLCAwfSwgezIzNCwgODJ9fUQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsyM0U7RDtLOzY7Q1AkVUlEZDsyOzI1RTtEO0s7NjtDUCRVSURkOzI7MjZFO0U7RTtkOzI7NDVTOzY7bm9ybWFsUzs1O3BsYWNlUzs2O3sxLCAxfUY7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7MjE7e3sxNiwgMTV9LCB7MTAxLCAyMn19UzsxOTt7ezAsIDB9LCB7MTAxLCAyMn19ZDsyOzM0Uzs5O3RleHRmaWVsZFM7MTg7Y29udHJvbFNpemVSZWd1bGFyRDtLOzEwOyRjbGFzc25hbWVTOzY7Q1BGb250Szs4OyRjbGFzc2VzQTtTOzY7Q1BGb250Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs1OEU7SzsxMztDUEZvbnROYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzg1RTtLOzEzO0NQRm9udFNpemVLZXlEO0s7NjtDUCRVSURkOzI7NjRFO0s7MTU7Q1BGb250SXNCb2xkS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzE3O0NQRm9udElzSXRhbGljS2V5RDtLOzY7Q1AkVUlEZDsyOzUxRTtLOzE3O0NQRm9udElzU3lzdGVtS2V5RDtLOzY7Q1AkVUlEZDsyOzYyRTtFO2Q7MTs0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1Q7Uzs0O0NpdHlkOzI7LTFEO0s7MTA7JGNsYXNzbmFtZVM7NztDUENvbG9ySzs4OyRjbGFzc2VzQTtTOzc7Q1BDb2xvclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NjVFO0s7MjA7Q1BDb2xvckNvbXBvbmVudHNLZXlEO0s7NjtDUCRVSURkOzI7ODZFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs4N0U7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ4RTtFO1M7MjE7e3sxNywgMzF9LCB7MjAwLCAyMX19UzsxOTt7ezAsIDB9LCB7MjAwLCAyMX19ZDsyOzQyUzs2O3NsaWRlckQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtkOzM7MTAwZDsyOzUwZDszOzIwMFM7MjE7e3sxMzQsIDQ2fSwgezg0LCAxN319UzsxODt7ezAsIDB9LCB7ODQsIDE3fX1kOzI7NDFEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NThFO0s7MTM7Q1BGb250TmFtZUtleUQ7Szs2O0NQJFVJRGQ7Mjs4NUU7SzsxMztDUEZvbnRTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzg4RTtLOzE1O0NQRm9udElzQm9sZEtleUQ7Szs2O0NQJFVJRGQ7Mjs2MkU7SzsxNztDUEZvbnRJc0l0YWxpY0tleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsxNztDUEZvbnRJc1N5c3RlbUtleUQ7Szs2O0NQJFVJRGQ7Mjs2MkU7RTtkOzE7MkQ7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtTOzEwO1JvdyBIZWlnaHREO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7NjVFO0s7MjA7Q1BDb2xvckNvbXBvbmVudHNLZXlEO0s7NjtDUCRVSURkOzI7ODlFO0s7MTk7Q1BWaWV3VGhlbWVDbGFzc0tleUQ7Szs2O0NQJFVJRGQ7Mjs4N0U7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzQ4RTtFO1M7MTM7Q1BBcHBsaWNhdGlvblM7MTU7Q1BOZWdhdGVCb29sZWFuUzsyODtfQ1BGb250U3lzdGVtRmFjZVBsYWNlaG9sZGVyRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzkwRTtEO0s7NjtDUCRVSURkOzI7OTBFO0Q7Szs2O0NQJFVJRGQ7Mjs5MEU7RDtLOzY7Q1AkVUlEZDsyOzkwRTtFO0U7Uzs1O2NvbG9yZDsyOzE0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzkxRTtEO0s7NjtDUCRVSURkOzI7OTFFO0Q7Szs2O0NQJFVJRGQ7Mjs5MUU7RDtLOzY7Q1AkVUlEZDsyOzkwRTtFO0U7ZDsxOzFmOzE4OzAuNjg2Mjc0NTA5ODAzOTIxNkU7Szs5OyRhcmNoaXZlclM7MTU7Q1BLZXllZEFyY2hpdmVySzs4OyR2ZXJzaW9uUzs2OzEwMDAwMEU7D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;411E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;198E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;424E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;198E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;166E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;425E;E;d;2;12D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;426E;D;K;6;CP$UIDd;3;426E;D;K;6;CP$UIDd;3;426E;D;K;6;CP$UIDd;3;227E;E;E;f;18;0.6862745098039216d;2;52D;K;6;$classD;K;6;CP$UIDd;3;411E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;274E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;424E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;274E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;166E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;427E;E;D;K;6;$classD;K;6;CP$UIDd;3;411E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;288E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;424E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;288E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;166E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;428E;E;f;12;0.9547001008D;K;6;$classD;K;6;CP$UIDd;3;411E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;302E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;424E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;302E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;166E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;429E;E;D;K;6;$classD;K;6;CP$UIDd;3;411E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;306E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;424E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;306E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;166E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;159E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;160E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;430E;E;S;18;.AppleSystemUIFontS;18;{{5, 0}, {-10, 0}}S;18;{{0, 0}, {-10, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;f;18;0.5019607843137255D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.xib b/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.xib index 5af8d2f52..ab3eed9da 100644 --- a/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.xib +++ b/Tests/Manual/TableTest/ViewBasedCib/Resources/MainMenu.xib @@ -1,1919 +1,349 @@ - - - - 1070 - 11G63 - 3084 - 1138.51 - 569.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 3084 - - - YES - NSArrayController - NSBox - NSButton - NSButtonCell - NSCustomObject - NSImageCell - NSImageView - NSScrollView - NSScroller - NSSegmentedCell - NSSegmentedControl - NSSlider - NSSliderCell - NSTableCellView - NSTableColumn - NSTableHeaderView - NSTableView - NSTextField - NSTextFieldCell - NSView - NSWindowTemplate - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - 7 - 2 - {{335, 390}, {994, 356}} - 1946157056 - Window - NSWindow - - - - - 256 - - YES - - - 274 - - YES - - - 2304 - - YES - - - 256 - {993, 294} - - - - _NS:13 - YES - - - 256 - {993, 17} - - - - _NS:16 - - - - - -2147483392 - {{224, 0}, {16, 17}} - - - - _NS:19 - - - YES - - multiple - 234 - 40 - 1000 - - 75497536 - 2048 - Multiple Cells - - LucidaGrande - 11 - 3100 - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 337696320 - 2048 - Text Cell - - LucidaGrande - 13 - 1044 - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - - - 3 - YES - YES - - - - 147 - 10 - 3.4028234663852886e+38 - - 75628096 - 2048 - Editable Non Bezeled - - - 6 - System - headerColor - - 3 - MQA - - - - - - 337772096 - 2048 - Text Cell - - - - - - 3 - YES - YES - - - - 284 - 40 - 1000 - - 75584576 - 2048 - Editable Bezeled - - - - - - 337728576 - 2048 - Text Cell - - - - - - 3 - YES - YES - - - - Orange - 149 - 10 - 3.4028234663852886e+38 - - 75628096 - 2048 - Created In Code - - - - - - 337772096 - 2048 - Text Cell - - - - - - 3 - YES - YES - - - - TableCellView - 164 - 10 - 3.4028234663852886e+38 - - 75628096 - 2048 - External Cib - - - - - - 337772096 - 2048 - Text Cell - - - - - - 3 - YES - YES - - - - 3 - 2 - - 6 - System - alternateSelectedControlColor - - 1 - MCAwIDEAA - - - - 3 - MC43OTk3NDE2ODM1AA - - 87 - -20971520 - - - 3 - 4 - 15 - 0 - YES - 0 - 1 - - - {{1, 17}, {993, 294}} - - - - _NS:11 - - - 4 - - - - -2147483392 - {{224, 17}, {15, 102}} - - - - _NS:58 - - _doScroller: - 0.95956873315363878 - - - - -2147483392 - {{1, 373}, {755, 15}} - - - - _NS:60 - 1 - - _doScroller: - 0.99689440993788825 - - - - 2304 - - YES - - - {{1, 0}, {993, 17}} - - - - _NS:15 - - - 4 - - - - {{0, -1}, {995, 312}} - - - - _NS:9 - 133682 - - - - - - QSAAAEEgAABCsgAAQrIAAA - - - - 265 - {{828, 320}, {150, 18}} - - - - _NS:9 - YES - - -2080374784 - 268435456 - Variable Row Height - - _NS:9 - - 1210863872 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - - - - 265 - {{712, 314}, {116, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Reload Data - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - - - {994, 356} - - - - - {{0, 0}, {1680, 1028}} - {10000000000000, 10000000000000} - YES - - - AppController - - - TableViewDelegate - - - YES - - YES - YES - YES - YES - YES - - - - - YES - - - delegate - - - - 451 - - - - tableView - - - - 488 - - - - theWindow - - - - 596 - - - - reload: - - - - 723 - - - - content: arrangedObjects - - - - - - content: arrangedObjects - content - arrangedObjects - 2 - - - 572 - - - - delegate - - - - 661 - - - - dataSource - - - - 698 - - - - value: objectValue.image.name - - - 270 - {{0, 66}, {82, 22}} - - - {250, 750} - YES - - 67239488 - 272631808 - Name - - - - 6 - System - textBackgroundColor - - - - 6 - System - textColor - - - - - - - 301 - - YES - - - - 313 - - YES - - YES - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple PNG pasteboard type - NSFilenamesPboardType - NeXT Encapsulated PostScript v1.2 pasteboard type - NeXT TIFF v4.0 pasteboard type - - - {{146, 6}, {88, 85}} - - - _NS:9 - YES - - 134217728 - 33554432 - _NS:9 - 0 - 3 - 2 - NO - - YES - - - - 268 - {{1, 43}, {60, 18}} - - - _NS:9 - YES - - -2080374784 - 0 - show - - _NS:9 - - 1211912448 - 2 - - - - - 200 - 25 - - - - {{1, 1}, {234, 91}} - - - - - - value: objectValue.image.name - value - objectValue.image.name - - YES - - YES - NSAllowsEditingMultipleValuesSelection - NSRaisesForNotApplicableKeys - - - YES - - - - - 2 - - - 701 - - - - value: objectValue.slider - - - 298 - {{10, 25}, {204, 21}} - - - _NS:9 - YES - - -2080374784 - 0 - - _NS:9 - - 200 - 50 - 100 - 0.0 - 0 - 1 - NO - NO - - - - - 301 - - YES - - - 18 - - YES - - - 274 - - YES - - - 266 - {{9, 40}, {105, 22}} - - - _NS:20 - {250, 750} - YES - - 67108928 - 272631808 - City - - _NS:20 - - - - - - - - - 297 - {{127, 14}, {88, 17}} - - - _NS:1535 - YES - - 68157504 - 272630784 - Row Height - - LucidaGrande-Bold - 14 - 16 - - _NS:1535 - - - 6 - System - controlColor - - - - - - - {{2, 2}, {224, 72}} - - - _NS:11 - - - {{3, 3}, {228, 76}} - - - _NS:9 - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 4 - 0 - NO - - 5 - - 1 - MC4yODQ0MzE3MDM2IDAuNDM1NzY3Mzg5MSAwLjY5ODg0MDcyNTgAA - - - 1 - MC4yOTQxMTc2NDcxIDAuNTM3MjU0OTAyIDAuODE1Njg2Mjc0NSAwLjEyAA - - 1 - - - - - {{1, 94}, {234, 82}} - - _NS:9 - - - - - value: objectValue.slider - value - objectValue.slider - - NSValidatesImmediately - - - 2 - - - 715 - - - - hidden: objectValue.show - - - - - - hidden: objectValue.show - hidden - objectValue.show - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 594 - - - - valueURL: objectValue.image.path - - - - - - valueURL: objectValue.image.path - valueURL - objectValue.image.path - - YES - - YES - NSAllowsEditingMultipleValuesSelection - NSConditionallySetsEnabled - NSRaisesForNotApplicableKeys - - - YES - - - - - - 2 - - - 697 - - - - contentArray: content - - - - - - contentArray: content - contentArray - content - 2 - - - 505 - - - - value: objectValue.value - - - 298 - {{12, 25}, {259, 36}} - - - _NS:20 - {250, 750} - YES - - 341835777 - 272629760 - Editable Text - - LucidaGrande - 26 - 16 - - _NS:20 - - YES - - 3 - MC45NTQ3MDAxMDA4AA - - - - - - - 301 - - YES - - - {{388, 1}, {284, 86}} - - _NS:9 - - - - - value: objectValue.value - value - objectValue.value - 2 - - - 588 - - - - value: objectValue - - - - - - value: objectValue - value - objectValue - 2 - - - 574 - - - - value: objectValue.name - - - - - - value: objectValue.name - value - objectValue.name - 2 - - - 591 - - - - value: objectValue.show - - - - - - value: objectValue.show - value - objectValue.show - 2 - - - 590 - - - - value: objectValue.identifier - - - 271 - {{0, 62}, {234, 22}} - - - _NS:20 - {250, 750} - YES - - 67108928 - 138414080 - Text - - _NS:20 - - - - - - - - 301 - - YES - - - - 261 - {{35, 30}, {164, 24}} - - - _NS:9 - YES - - 67108864 - 0 - - LucidaGrande - 13 - 16 - - _NS:9 - - - YES - - 52 - - 0 - - - 52 - - 1 - YES - 0 - - - 52 - 0 - - - 1 - 1 - - - - {{1, 178}, {234, 87}} - - _NS:9 - - - - - value: objectValue.identifier - value - objectValue.identifier - 2 - - - 593 - - - - value: objectValue.value - - - 266 - {{0, 57}, {147, 22}} - - - {250, 750} - 666 - YES - - 337772097 - 272631808 - Editable Text - - - - - - - - - 301 - - YES - - - {{238, 1}, {147, 87}} - - - - - - value: objectValue.value - value - objectValue.value - 2 - - - 629 - - - - _sliderAction: - - - - 655 - - - - _textFieldBezeledAction: - - - - 656 - - - - _textFieldNotBezeledAction: - - - - 657 - - - - personView - - - - 658 - - - - placeView - - - - 659 - - - - contentController - - - - 694 - - - - value: variableRowHeight - - - - - - value: variableRowHeight - value - variableRowHeight - 2 - - - 714 - - - - hidden: variableRowHeight - - - - - - hidden: variableRowHeight - hidden - variableRowHeight - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 719 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 371 - - - YES - - - - - - 372 - - - YES - - - - - - - - 450 - - - - - 460 - - - YES - - - - - - - - - 461 - - - YES - - - - - - - - - - 462 - - - - - 463 - - - - - 464 - - - - - 465 - - - YES - - - - - - - - - 466 - - - YES - - - - - - - 467 - - - - - 468 - - - - - 469 - - - YES - - - - - - - - 470 - - - YES - - - - - - 471 - - - - - 494 - - - YES - - - - - - 495 - - - - - 503 - - - - - 521 - - - YES - - - - - - 523 - - - YES - - - - - - 524 - - - - - 535 - - - YES - - - - - - 546 - - - YES - - - - - - - - 537 - - - YES - - - - - - 538 - - - - - 547 - - - YES - - - - - - - 549 - - - YES - - - - - - 550 - - - - - 492 - - - YES - - - - - - 493 - - - - - 542 - - - YES - - - - - - 543 - - - - - 599 - - - YES - - - - - - 600 - - - - - 622 - - - YES - - - - - - - 623 - - - - - 624 - - - YES - - - - - - 625 - - - YES - - - - - - 626 - - - - - 633 - - - YES - - - - - - 634 - - - - - 639 - - - YES - - - - - - 640 - - - - - 652 - - - - - 710 - - - YES - - - - - - 711 - - - - - 716 - - - YES - - - - - - 717 - - - - - 720 - - - YES - - - - - - 721 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 371.IBPluginDependency - 371.IBWindowTemplateEditedContentRect - 371.NSWindowTemplate.visibleAtLaunch - 372.IBPluginDependency - 450.IBPluginDependency - 460.IBPluginDependency - 461.IBPluginDependency - 461.ibExternalAutomaticallyCalculatesRowSizeFromViewHeight - 462.IBPluginDependency - 463.IBPluginDependency - 464.IBPluginDependency - 465.IBPluginDependency - 465.isInViewBasedMode - 465.prototypeCellViews - 466.IBPluginDependency - 466.isInViewBasedMode - 466.prototypeCellViews - 467.IBPluginDependency - 468.IBPluginDependency - 469.IBPluginDependency - 469.userInterfaceItemIdentifier - 470.IBPluginDependency - 471.IBPluginDependency - 492.IBPluginDependency - 493.IBPluginDependency - 494.IBPluginDependency - 495.IBPluginDependency - 503.IBPluginDependency - 521.IBPluginDependency - 523.IBPluginDependency - 524.IBPluginDependency - 535.IBPluginDependency - 535.userInterfaceItemIdentifier - 537.IBPluginDependency - 538.IBPluginDependency - 542.IBPluginDependency - 543.IBPluginDependency - 546.IBPluginDependency - 547.IBPluginDependency - 547.userInterfaceItemIdentifier - 549.IBPluginDependency - 550.IBPluginDependency - 599.IBPluginDependency - 600.IBPluginDependency - 622.IBPluginDependency - 622.isInViewBasedMode - 622.prototypeCellViews - 623.IBPluginDependency - 624.IBPluginDependency - 625.IBPluginDependency - 626.IBPluginDependency - 633.IBPluginDependency - 633.isInViewBasedMode - 634.IBPluginDependency - 639.IBPluginDependency - 639.isInViewBasedMode - 640.IBPluginDependency - 652.IBPluginDependency - 710.IBPluginDependency - 711.IBPluginDependency - 716.IBPluginDependency - 717.IBPluginDependency - 720.IBPluginDependency - 721.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{303, 221}, {480, 360}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - - - - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - person - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - place - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - multiple - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 723 - - - - YES - - AppController - NSObject - - reload: - id - - - reload: - - reload: - id - - - - tableView - NSTableView - - - tableView - - tableView - NSTableView - - - - IBProjectSource - ./Classes/AppController.h - - - - TableViewDelegate - NSObject - - YES - - YES - _sliderAction: - _textFieldBezeledAction: - _textFieldNotBezeledAction: - - - YES - id - id - id - - - - YES - - YES - _sliderAction: - _textFieldBezeledAction: - _textFieldNotBezeledAction: - - - YES - - _sliderAction: - id - - - _textFieldBezeledAction: - id - - - _textFieldNotBezeledAction: - id - - - - - YES - - YES - contentController - externalView - imageView - personView - placeView - textField - view - - - YES - NSArrayController - NSView - NSImageView - NSView - NSView - NSTextField - CPTableCellView - - - - YES - - YES - contentController - externalView - imageView - personView - placeView - textField - view - - - YES - - contentController - NSArrayController - - - externalView - NSView - - - imageView - NSImageView - - - personView - NSView - - - placeView - NSView - - - textField - NSTextField - - - view - CPTableCellView - - - - - IBProjectSource - ./Classes/TableViewDelegate.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - NSSwitch - {15, 15} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j b/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j index 8eb717751..a7df34795 100644 --- a/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j +++ b/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j @@ -142,7 +142,7 @@ [_menuItemView setDirty]; } -// Performs autoenable processing, returns isEnabled to propagate state to NativeHost +// Performs autoenable processing, returns isEnabled to propagate state - (BOOL)_performAutoenable { if ([_menu autoenablesItems]) @@ -162,7 +162,7 @@ } else { - // XXX: will toggle state as part of _target check, required to sync stane with NativeHost + // XXX: will toggle state as part of _target check _isEnabled = isEnabled; [_menuItemView setDirty]; diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector-inlined.js b/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector-inlined.js new file mode 100644 index 000000000..502214f75 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector-inlined.js @@ -0,0 +1,7 @@ +var the_class=objj_allocateClassPair(Nil,"TheSuperClass"),meta_class=the_class.isa; +objj_registerClassPair(the_class); +var the_class=objj_allocateClassPair(Nil,"TheClass"),meta_class=the_class.isa; +objj_registerClassPair(the_class); +class_addMethods(the_class,[new objj_method(sel_getUid("xxxx:"),function $TheClass__xxxx_(_1,_2,_3){ +(objj_getClass("TheClass").super_class.method_dtable["xxxx:"]||_objj_forward)(_1,"xxxx:",_3); +},["void","id"])]); \ No newline at end of file diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector.j b/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector.j new file mode 100644 index 000000000..3e7035be5 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector.j @@ -0,0 +1,11 @@ +@implementation TheSuperClass +@end + +@implementation TheClass + +- (void)xxxx:(id)argument +{ + [super xxxx:argument]; +} + +@end \ No newline at end of file diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector.js b/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector.js new file mode 100644 index 000000000..e2c2376b6 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/super-selector.js @@ -0,0 +1,7 @@ +var the_class=objj_allocateClassPair(Nil,"TheSuperClass"),meta_class=the_class.isa; +objj_registerClassPair(the_class); +var the_class=objj_allocateClassPair(Nil,"TheClass"),meta_class=the_class.isa; +objj_registerClassPair(the_class); +class_addMethods(the_class,[new objj_method(sel_getUid("xxxx:"),function $TheClass__xxxx_(_1,_2,_3){ +objj_msgSendSuper1({receiver:_1,super_class:objj_getClass("TheClass").super_class},"xxxx:",_3); +},["void","id"])]); diff --git a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j index 34150d7f2..f622dd8d8 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j @@ -16,6 +16,7 @@ var FILENAMES = [ "Messages/colon-selector", "Messages/self-as-receiver", "Messages/complex-receiver", + "Messages/super-selector", "Misc/parenthesis-return", "Misc/preprocess-if-directives", @@ -53,12 +54,12 @@ var FILENAMES = [ correctInlined = FILE.exists(p) ? FILE.read(p) : correct; // Get inlined version if it exists. Otherwise use the regular one. [self assertNoThrow:function() { - preprocessed = ObjectiveJ.ObjJAcornCompiler.compileToExecutable(unpreprocessed, nil, ObjectiveJ.ObjJAcornCompiler.Flags.IncludeDebugSymbols | ObjectiveJ.ObjJAcornCompiler.Flags.IncludeTypeSignatures).code(); + preprocessed = ObjectiveJ.ObjJCompiler.compileToExecutable(unpreprocessed, nil, {includeMethodFunctionNames: true, includeMethodArgumentTypeSignatures: true, includeIvarTypeSignatures: true, inlineMsgSendFunctions: false, transformNamedFunctionDeclarationToAssignment: true}).code(); preprocessed = compressor.compress(preprocessed, { charset : "UTF-8", useServer : true }); correct = compressor.compress(correct, { charset : "UTF-8", useServer : true }); // Get an Inlined version - preprocessedInlined = ObjectiveJ.ObjJAcornCompiler.compileToExecutable(unpreprocessed, nil, ObjectiveJ.ObjJAcornCompiler.Flags.IncludeDebugSymbols | ObjectiveJ.ObjJAcornCompiler.Flags.InlineMsgSend | ObjectiveJ.ObjJAcornCompiler.Flags.IncludeTypeSignatures).code(); + preprocessedInlined = ObjectiveJ.ObjJCompiler.compileToExecutable(unpreprocessed, nil, {includeMethodFunctionNames: true, includeMethodArgumentTypeSignatures: true, includeIvarTypeSignatures: true, inlineMsgSendFunctions: true, transformNamedFunctionDeclarationToAssignment:true}).code(); preprocessedInlined = compressor.compress(preprocessedInlined, { charset : "UTF-8", useServer : true }); correctInlined = compressor.compress(correctInlined, { charset : "UTF-8", useServer : true }); }]; diff --git a/Tests/Tools/ToolsTest.j b/Tests/Tools/ToolsTest.j index 67bb7e06c..ab0df8e1f 100644 --- a/Tests/Tools/ToolsTest.j +++ b/Tests/Tools/ToolsTest.j @@ -58,10 +58,11 @@ function cleanup() { \nERROR line 1 in file:" + rootDirectory + "/objjErrorTestFile.j: Can't find superclass CPObject\n" equals:p.stdout.read() message:"objj failed"]; var p = OS.popen(["objj", "-x", "objjWarningTestFile.j"]); + var pp = p.stdout.read(); [self assert:0 equals:p.wait() message:"objj failed"]; [self assert:"\nline1sourcePath" + rootDirectory + "/objjWarningTestFile.jmessage\n@import <Foundation/Foundation.j>@implementation AppController : CPObject{CPWindow theWindow;}@end\ -\n ^\ -\nWARNING line 1 in file:" + rootDirectory + "/objjWarningTestFile.j: Unknown type 'CPWindow' for ivar 'theWindow'\n" equals:p.stdout.read() message:"objj failed"]; +\n ^\ +\nWARNING line 1 in file:" + rootDirectory + "/objjWarningTestFile.j: Unknown type 'CPWindow' for ivar 'theWindow'\n" equals:pp message:"objj failed"]; status = OS.system(["objj", "-m", "ToolsTestApp/AppController.j", "ToolsTestApp/AppController.j"]); [self assert:0 equals:status message:"objj failed with several files"]; diff --git a/Tools/NativeHost/.gitignore b/Tools/NativeHost/.gitignore deleted file mode 100644 index f921bd442..000000000 --- a/Tools/NativeHost/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -*.mode1v3 -*.pbxuser -*.perspectivev3 -build diff --git a/Tools/NativeHost/AppController+MainMenu.m b/Tools/NativeHost/AppController+MainMenu.m deleted file mode 100644 index dbc98e63e..000000000 --- a/Tools/NativeHost/AppController+MainMenu.m +++ /dev/null @@ -1,33 +0,0 @@ -// -// AppController+MainMenu.m -// NativeHost -// -// Created by Francisco Tolmasky on 9/2/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - -#import "MenuBridge.h" -#import "AppController.h" - - -@interface NSApplication (MenuMethods) - -- (void)setAppleMenu:(NSMenu *)aMenu; - -@end - -@implementation AppController (MainMenu) - -- (void)setMainMenuObject:(WebScriptObject *)aMenuObject -{ - NSMenu * mainMenu = [[MenuBridge alloc] initWithMenuObject:aMenuObject]; - - [NSApp setAppleMenu:[[mainMenu itemArray] objectAtIndex:0]]; - [NSApp setMainMenu:mainMenu]; - - [mainMenu release]; -} - -@end diff --git a/Tools/NativeHost/AppController+WebFrameLoadDelegate.m b/Tools/NativeHost/AppController+WebFrameLoadDelegate.m deleted file mode 100644 index fdce4d601..000000000 --- a/Tools/NativeHost/AppController+WebFrameLoadDelegate.m +++ /dev/null @@ -1,26 +0,0 @@ - - -// -// AppController+WebFrameLoadDelegate.m -// NativeHost -// -// Created by Francisco Tolmasky on 7/28/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "AppController.h" - -#import "BridgedMethods.h" - - -@implementation AppController (WebFrameLoadDelegate) - -- (void)webView:(WebView *)aWebView didClearWindowObject:(WebScriptObject *)aWindowObject forFrame:(WebFrame *)aFrame -{ - if (aWebView == webView) - [GlobalMethods enhanceWindowObject:aWindowObject ofWebView:aWebView]; - else - [WindowMethods enhanceWindowObject:aWindowObject ofWebView:aWebView]; -} - -@end diff --git a/Tools/NativeHost/AppController+WebPolicyDelegate.m b/Tools/NativeHost/AppController+WebPolicyDelegate.m deleted file mode 100644 index 2c098dcd0..000000000 --- a/Tools/NativeHost/AppController+WebPolicyDelegate.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// AppController+WebPolicyDelegate.m -// NativeHost -// -// Created by Francisco Tolmasky on 5/11/10. -// Copyright 2010 280 North, Inc. All rights reserved. -// - -#import "NSURL+Additions.h" -#import "AppController.h" - - -@implementation AppController (WebPolicyDelegate) - -- (void)webView:(WebView *)aWebView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)aRequest newFrameName:(NSString *)aFrameName decisionListener:(id /*< WebPolicyDecisionListener >*/)aListener -{ - [[NSWorkspace sharedWorkspace] openURL:[actionInformation objectForKey:WebActionOriginalURLKey]]; - [aListener ignore]; -} - -- (void)webView:(WebView *)aWebView decidePolicyForNavigationAction:(NSDictionary *)aDictionary request:(NSURLRequest *)aRequest frame:(WebFrame *)aWebFrame decisionListener:(id /**/)aDecisionListener -{ - NSURL * requestURL = [aRequest URL]; - - if([aWebView mainFrame] != aWebFrame || - [[baseURL scheme] isEqualTo:[requestURL scheme]] && - ![baseURL host] || [[baseURL host] isEqualTo:[requestURL host]] && - ![baseURL port] || [[baseURL port] isEqualTo:[requestURL port]]) - return [aDecisionListener use]; - - [[NSWorkspace sharedWorkspace] openURL:[aDictionary objectForKey:WebActionOriginalURLKey]]; - [aDecisionListener ignore]; -} - -@end diff --git a/Tools/NativeHost/AppController+WebResourceLoadDelegate.m b/Tools/NativeHost/AppController+WebResourceLoadDelegate.m deleted file mode 100644 index a60540b75..000000000 --- a/Tools/NativeHost/AppController+WebResourceLoadDelegate.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// AppController+WebResourceLoadDelegate.m -// NativeHost -// -// Created by Francisco Tolmasky on 7/28/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "AppController.h" -#import "SSCrypto.h" - -NSString *authHeader = nil; - -@implementation AppController (WebResourceLoadDelegate) - -- (NSURLRequest *)webView:(WebView *)aSender resource:(id)anIdentifier willSendRequest:(NSURLRequest *)aRequest redirectResponse:(NSURLResponse *)aRedirectResponse fromDataSource:(WebDataSource *)aDataSource -{ - aRequest = [[aRequest mutableCopy] autorelease]; - - if (!authHeader) - { - NSString *plaintext = [NSString stringWithFormat:@"%@:%@", SERVER_USER, SERVER_PASSWORD]; - NSData *data = [plaintext dataUsingEncoding:NSASCIIStringEncoding]; - authHeader = [[NSString alloc] initWithFormat:@"Basic %@", [data encodeBase64WithNewlines:NO]]; - } - - [(NSMutableURLRequest *)aRequest setValue:authHeader forHTTPHeaderField:@"Authorization"]; - - return aRequest; -} - -@end diff --git a/Tools/NativeHost/AppController+WebUIDelegate.m b/Tools/NativeHost/AppController+WebUIDelegate.m deleted file mode 100644 index a75f9d6a9..000000000 --- a/Tools/NativeHost/AppController+WebUIDelegate.m +++ /dev/null @@ -1,71 +0,0 @@ -// -// AppController+WebUIDelegate.m -// NativeHost -// -// Created by Francisco Tolmasky on 7/28/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "AppController.h" -#import "WebWindow.h" - - -@implementation AppController (WebUIDelegate) - -- (void)webView:(WebView *)aWebView setFrame:(NSRect)aFrame -{ - [[aWebView window] setFrame:aFrame display:YES]; -} - -- (NSRect)webViewFrame:(WebView *)aWebView -{ - return [[aWebView window] frame]; -} - -- (WebView *)webView:(WebView *)aWebView createWebViewWithRequest:(NSURLRequest *)aRequest -{ - return [[WebWindow webWindow] webView]; -} - -- (void)webViewClose:(WebView *)aWebView -{ - // Important to call close and not: - // -performClose:, which beeps without the presence of a close button. - // -orderOut:, which doesn't release the window. - [[aWebView window] close]; - //[[aWebView window] orderOut:self]; -} - -- (void)webViewShow:(WebView *)aWebView -{ - [[aWebView window] makeKeyAndOrderFront:self]; -} - -- (NSAttributedString *)loggedOutput; -{ - return loggedOutput; -} - -- (void)webView:(WebView *)aWebView addMessageToConsole:(NSDictionary *)aDictionary -{ - NSString * message = [aDictionary objectForKey:@"message"]; - NSAttributedString * attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n", message, nil]]; - - [loggedOutput appendAttributedString:attributedString]; - - [attributedString release]; - NHLog(@"CONSOLE", message); -} - -- (void)webView:(WebView *)aSender runJavaScriptAlertPanelWithMessage:(NSString *)aMessage initiatedByFrame:(WebFrame *)aFrame -{ - WebDataSource * dataSource = [aFrame dataSource]; - NSString * title = [dataSource pageTitle]; - - if (![title length]) - title = [[[dataSource request] URL] absoluteString]; - - [[NSAlert alertWithMessageText:title defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@", aMessage, nil] runModal]; -} - -@end diff --git a/Tools/NativeHost/AppController.h b/Tools/NativeHost/AppController.h deleted file mode 100644 index 69e1d2358..000000000 --- a/Tools/NativeHost/AppController.h +++ /dev/null @@ -1,54 +0,0 @@ -// -// AppController.h -// NativeHost -// -// Created by Francisco Tolmasky on 6/4/09. -// Copyright 2009 280 North, Inc. All rights reserved. -// - -#import - -extern int SERVER_PORT; -extern NSString *SERVER_PASSWORD; -extern NSString *SERVER_USER; - -@class Server; -@class WebScriptObject; - -@interface AppController : NSObject -{ - NSWindow * webViewWindow; - WebView * webView; - - NSMutableArray * openingFilenames; - NSMutableArray * openingURLStrings; - - Server * server; - NSFileHandle * stdinFileHandle; - - NSMutableAttributedString * loggedOutput; - - NSURL * baseURL; -} - -- (void)configureLocalStorage; -- (NSURL *)baseURL; - -- (void)startServer; -- (void)startCappuccinoApplication; - -- (NSArray *)openingURLStrings; - -- (NSView *)keyView; -- (WebView *)webView; -- (WebScriptObject *)windowScriptObject; - -@end - -@interface AppController (MainMenu) - -- (void)setMainMenuObject:(WebScriptObject *)aMenuObject; - -@end - -void NHLog(NSString *type, NSString *message); \ No newline at end of file diff --git a/Tools/NativeHost/AppController.m b/Tools/NativeHost/AppController.m deleted file mode 100644 index fa64a749d..000000000 --- a/Tools/NativeHost/AppController.m +++ /dev/null @@ -1,221 +0,0 @@ -// -// AppController.m -// NativeHost -// -// Created by Francisco Tolmasky on 6/4/09. -// Copyright 2009 280 North, Inc. All rights reserved. -// - -#import "Console.h" -#import "Server.h" -#import "AppController.h" -#import "NSURL+Additions.h" -#import "BridgedMethods.h" -#import "WebWindow.h" -#import "WebScripObject+Objective-J.h" - -extern int interactive; - -int SERVER_PORT = 9191; -NSString *SERVER_PASSWORD = nil; -NSString *SERVER_USER = nil; - - -@implementation AppController - -- (id)init -{ - self = [super init]; - - if (self) - openingURLStrings = [NSMutableArray new]; - - return self; -} - -- (void)dealloc -{ - [webView release]; - [webViewWindow release]; - - [openingURLStrings release]; - - [super dealloc]; -} - -- (BOOL)application:(NSApplication *)anApplication openFile:(NSString *)aFilename -{ - id canOpenFilesImmediately = [[webView windowScriptObject] evaluateWebScript:@"CPApp && CPApp._finishedLaunching"]; - - NSString *path = [[[NSURL fileURLWithPath:aFilename] HTTPFileSystemURL] absoluteString]; - if ([canOpenFilesImmediately isKindOfClass:[NSNumber class]] && [canOpenFilesImmediately boolValue]) - [[webView windowScriptObject] evaluateObjectiveJ:[NSString stringWithFormat:@"[CPApp _openURL:[CPURL URLWithString:\"%@\"]]", path]]; - else - [openingURLStrings addObject:path]; - - return NO; -} - -- (void)applicationWillFinishLaunching:(NSNotification *)aNotification -{ - NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; - - [defaults registerDefaults:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"WebKitDeveloperExtras"]]; - - [self startServer]; -} - -- (void)applicationDidFinishLaunching:(NSNotification *)notification -{ - [self startCappuccinoApplication]; -} - -- (void)applicationDidResignActive:(NSNotification *)aNotification -{ - // FIXME: handle this better. - [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _willResignActive];"]; - [[self windowScriptObject] evaluateObjectiveJ:@"CPApp._isActive = NO;"]; - [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _didResignActive];"]; -} - -- (void)applicationDidBecomeActive:(NSNotification *)aNotification -{ - // FIXME: handle this better. - [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _willBecomeActive];"]; - [[self windowScriptObject] evaluateObjectiveJ:@"CPApp._isActive = YES;"]; - [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _didBecomeActive];"]; -} - -- (NSArray *)openingURLStrings -{ - return openingURLStrings; -} - -- (NSView *)keyView -{ - return [[[webView mainFrame] frameView] documentView]; -} - -- (WebView *)webView -{ - return webView; -} - -- (WebScriptObject *)windowScriptObject -{ - return [webView windowScriptObject]; -} - -- (void)startServer -{ - server = [[Server alloc] init]; - - if (![server start]) - exit(0); - - if (interactive) - { - stdinFileHandle = [[NSFileHandle fileHandleWithStandardInput] retain]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(didReadStdin:) - name:NSFileHandleReadCompletionNotification - object:stdinFileHandle]; - - fprintf(stdout, "objj> "); - fflush(stdout); - [stdinFileHandle readInBackgroundAndNotify]; - } -} - -- (void)didReadStdin:(NSNotification *)aNotification -{ - NSString *string = [[NSString alloc] initWithData:[[aNotification userInfo] objectForKey:NSFileHandleNotificationDataItem] encoding:NSASCIIStringEncoding]; - NSString *result = [[self windowScriptObject] evaluateObjectiveJReturningString:string]; - [string release]; - if ([result respondsToSelector:@selector(UTF8String)]) - fprintf(stdout, "%s\n", [result UTF8String]); - fprintf(stdout, "objj> "); - fflush(stdout); - [stdinFileHandle readInBackgroundAndNotify]; -} - -- (NSURL *)baseURL -{ - return baseURL; -} - -- (void)startCappuccinoApplication -{ - NSString *initialURL = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NHInitialURL"]; - BOOL prependServer = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"NHInitialURLPrependServer"] boolValue]; - - if (!initialURL) - { - NSString *initialResource = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NHInitialResource"]; - - if (!initialResource) - initialResource = @"Application/index.html"; - - initialURL = [[NSString stringWithFormat:@"file://%@/%@", [[NSBundle mainBundle] resourcePath], initialResource] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - baseURL = [[NSURL alloc] initWithString:@"file:///"]; - } - else if (prependServer) - { - initialURL = [NSString stringWithFormat:@"http://127.0.0.1:%d/%@", SERVER_PORT, initialURL]; - baseURL = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"http://127.0.0.1:%d/", SERVER_PORT]]; - } - - NHLog(@"STARTUP", [initialURL description]); - - [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:initialURL]]]; -} - -- (void)applicationWillTerminate:(NSNotification *)aNotification -{ - [server stop]; -} - -- (void)configureLocalStorage -{ - WebPreferences *webConfiguration = [WebPreferences standardPreferences]; - NSBundle *mainBundle = [NSBundle mainBundle]; - NSString *cappBundleName = [mainBundle objectForInfoDictionaryKey:@"CPBundleName"]; - NSString *applicationSupportFile = [@"~/Library/Application Support/" stringByExpandingTildeInPath]; - NSString *savePath = [NSString pathWithComponents:[NSArray arrayWithObjects:applicationSupportFile, cappBundleName, @"LocalStorage", nil]]; - - if ([webConfiguration respondsToSelector:@selector(setLocalStorageDatabasePath:)]) - [webConfiguration setLocalStorageDatabasePath:savePath]; - else - [webConfiguration _setLocalStorageDatabasePath:savePath]; - - [webView setPreferences:webConfiguration]; -} - -- (void)awakeFromNib -{ - webView = [[WebView alloc] init]; - - [webView setUIDelegate:self]; - [webView setFrameLoadDelegate:self]; - [webView setResourceLoadDelegate:self]; - [webView setPolicyDelegate:self]; - - [self configureLocalStorage]; - - webViewWindow = [[NSWindow alloc] init]; - - [webViewWindow setContentView:webView]; -} - -@end - -void NHLog(NSString *type, NSString *message) -{ - NSArray *lines = [message componentsSeparatedByString:@"\n"]; - for (NSString *line in lines) - { - if ([line length] > 0) - NSLog(@"%10@: %@", type, line); - } -} diff --git a/Tools/NativeHost/Application.h b/Tools/NativeHost/Application.h deleted file mode 100644 index d09086a9f..000000000 --- a/Tools/NativeHost/Application.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// Application.h -// NativeHost -// -// Created by Francisco Tolmasky on 10/8/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - - -@interface Application : NSApplication -{ -} - -- (void)_reallyTerminate:(id)sender; - -@end diff --git a/Tools/NativeHost/Application.m b/Tools/NativeHost/Application.m deleted file mode 100644 index 2234f307d..000000000 --- a/Tools/NativeHost/Application.m +++ /dev/null @@ -1,49 +0,0 @@ -// -// Application.m -// NativeHost -// -// Created by Francisco Tolmasky on 10/8/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "Application.h" -#import "AppController.h" -#import "WebScripObject+Objective-J.h" -#import "WebWindow.h" - -@implementation Application - -- (void)sendEvent:(NSEvent *)anEvent -{ - [WebWindow enableAllWindows]; - - NSWindow * window = [anEvent window]; - - if (!window || [window isKindOfClass:[WebWindow class]]) - { - NSResponder * firstResponder = window ? [window firstResponder] : [(AppController *)[self delegate] keyView]; - - switch ([anEvent type]) - { - case NSKeyDown: return [firstResponder keyDown:anEvent]; - case NSKeyUp: return [firstResponder keyUp:anEvent]; - } - } - - [super sendEvent:anEvent]; -} - -- (void)terminate:(id)sender -{ - if ([[[self delegate] windowScriptObject] evaluateObjectiveJ:@"(CPApp)"] == [WebUndefined undefined]) - [self _reallyTerminate:sender]; - else - [[(AppController *)[self delegate] windowScriptObject] evaluateObjectiveJ:@"[CPApp terminate:nil]"]; -} - -- (void)_reallyTerminate:(id)sender -{ - [super terminate:sender]; -} - -@end diff --git a/Tools/NativeHost/BridgedMethods.h b/Tools/NativeHost/BridgedMethods.h deleted file mode 100644 index a9af18f1f..000000000 --- a/Tools/NativeHost/BridgedMethods.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// BridgedMethods.h -// NativeHost -// -// Created by Francisco Tolmasky on 10/16/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - - -@interface BridgedMethods : NSObject -{ - WebView * webView; -} -+ (NSMutableArray *)arrayFromWebScriptObject:(WebScriptObject *)incomingObject; -+ (void)enhanceWindowObject:(WebScriptObject *)aWindowObject ofWebView:(WebView *)aWebView; -@end - -@interface GlobalMethods : BridgedMethods -{ -} -- (id)isDesktop; - -- (id)openingURLStrings; - -- (id)setMainMenu:(id)arguments; - -- (id)terminate; -- (id)activateIgnoringOtherApps:(NSArray *)arguments; -- (id)deactivate; -- (id)hide; -- (id)hideOtherApplications; - -- (id)savePanel:(NSArray *)arguments; // FIXME: This should be implemented in Cappuccino. -- (id)openPanel; // FIXME: This should be implemented in Cappuccino. - -- (id)clearRecentDocuments; -- (id)noteNewRecentDocumentPath:(NSArray *)aURL; -- (id)recentDocumentURLs; - -- (id)pasteboardWithName:(NSArray *)arguments; - -@end - -@interface WindowMethods : BridgedMethods -{ -} -- (id)miniaturize; -- (id)deminiaturize; - -- (id)level; -- (id)setLevel:(NSArray *)arguments; - -- (id)hasShadow; -- (id)setHasShadow:(NSArray *)arguments; - -- (id)shadowStyle; -- (id)setShadowStyle:(NSArray *)arguments; - -- (id)frame; -- (id)setFrame:(NSArray *)arguments; - -@end - diff --git a/Tools/NativeHost/BridgedMethods.m b/Tools/NativeHost/BridgedMethods.m deleted file mode 100644 index 7e637692a..000000000 --- a/Tools/NativeHost/BridgedMethods.m +++ /dev/null @@ -1,345 +0,0 @@ -// -// BridgedMethods.m -// NativeHost -// -// Created by Francisco Tolmasky on 10/16/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - - -#import -#import "Application.h" -#import "AppController.h" -#import "BridgedMethods.h" -#import "NSObject+WebAdditions.h" -#import "NSURL+Additions.h" -#import "WebWindow.h" -#import "WebPasteboardProxy.h" - -static NSMutableDictionary * MethodClasses; - -@implementation GlobalMethods - -- (id)isDesktop -{ - return [NSNumber numberWithBool:YES]; -} - -- (id)openingURLStrings -{ - return [(AppController *)[NSApp delegate] openingURLStrings]; -} - -- (id)setMainMenu:(id)arguments -{ - [[NSApp delegate] setMainMenuObject:[arguments objectAtIndex:0]]; - - return [WebUndefined undefined]; -} - -- (id)terminate -{ - [(Application *)NSApp _reallyTerminate:self]; - - return [WebUndefined undefined]; -} - -- (id)activateIgnoringOtherApps:(NSArray *)arguments -{ - id argument = [arguments objectAtIndex:0]; - - [(NSApplication *)NSApp activateIgnoringOtherApps:[argument isKindOfClass:[NSNumber class]] && [(NSNumber *)argument boolValue]]; - - return [WebUndefined undefined]; -} - -- (id)deactivate -{ - [(NSApplication *)NSApp deactivate]; - return [WebUndefined undefined]; -} - -- (id)hide -{ - [NSApp hide:self]; - return [WebUndefined undefined]; -} - -- (id)hideOtherApplications -{ - [NSApp hideOtherApplications:self]; - return [WebUndefined undefined]; -} - -- (id)openPanel -{ - NSOpenPanel * openPanel = [NSOpenPanel openPanel]; - - NSInteger result = [openPanel runModal]; - - NSMutableString * resultObject = [NSMutableString stringWithFormat:@"({ button:%d, URLs:", result]; - - NSMutableArray * fileSystemURLs = [NSMutableArray array]; - - for (NSURL * URL in [openPanel URLs]) - [fileSystemURLs addObject:[URL HTTPFileSystemURL]]; - - if (result == NSFileHandlingPanelOKButton) - [resultObject appendString:[NSString stringWithFormat:@"[\"%@\"] })", [fileSystemURLs componentsJoinedByString:@"\", \""]]]; - - else - [resultObject appendString:@"[] })"]; - - return [[webView windowScriptObject] evaluateWebScript:resultObject]; -} - -- (id)savePanel:(NSArray *)arguments -{ - NSSavePanel * savePanel = [NSSavePanel savePanel]; - WebScriptObject *args = [arguments objectAtIndex:0]; - - [savePanel setAllowedFileTypes:[BridgedMethods arrayFromWebScriptObject:[args valueForKey:@"allowedFileTypes"]]]; - - id allowsOtherFileTypes = [args valueForKey:@"allowsOtherFileTypes"]; - - [savePanel setAllowsOtherFileTypes:allowsOtherFileTypes && [allowsOtherFileTypes webBoolValue]]; - - id isExtensionHidden = [args valueForKey:@"isExtensionHidden"]; - - [savePanel setExtensionHidden:isExtensionHidden && [isExtensionHidden webBoolValue]]; - - id canSelectHiddenExtension = [args valueForKey:@"canSelectHiddenExtension"]; - - [savePanel setCanSelectHiddenExtension:canSelectHiddenExtension && canSelectHiddenExtension]; - - id canCreateDirectories = [args valueForKey:@"canCreateDirectories"]; - - [savePanel setCanCreateDirectories:canCreateDirectories && [canCreateDirectories webBoolValue]]; - - NSInteger result = [savePanel runModal]; - - return [[webView windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"({ button:%d, URL:\"%@\" })", result, [[[savePanel URL] HTTPFileSystemURL] absoluteString]]]; -} - -- (id)clearRecentDocuments -{ - [[NSDocumentController sharedDocumentController] clearRecentDocuments:self]; - return [WebUndefined undefined]; -} - -- (id)noteNewRecentDocumentPath:(NSArray *)arguments -{ - if (![arguments count]) - return [WebUndefined undefined]; - - NSString *aURL = [arguments objectAtIndex:0]; - NSURL *fileURL = [NSURL fileSystemURLFromHTTPFileSystemString:aURL]; - - [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:fileURL]; - - return [WebUndefined undefined]; -} - -- (id)recentDocumentURLs -{ - NSArray *existingURLs = [[NSDocumentController sharedDocumentController] recentDocumentURLs]; - NSMutableArray *urlsAsStrings = [NSMutableArray array]; - - for (int i=0, count = [existingURLs count]; i < count; i++) - [urlsAsStrings addObject:[[existingURLs objectAtIndex:i] absoluteString]]; - - return urlsAsStrings; -} - -- (id)pasteboardWithName:(NSArray *)arguments -{ - if (![arguments count]) - return [WebUndefined undefined]; - - return [WebPasteboardProxy pasteboardWithName:[arguments objectAtIndex:0]]; -} - -@end - -@implementation WindowMethods - -- (id)miniaturize -{ - [[webView window] miniaturize:nil]; - return [WebUndefined undefined]; -} - -- (id)deminiaturize -{ - [[webView window] deminiaturize:nil]; - return [WebUndefined undefined]; -} - -- (id)level -{ - return [NSNumber numberWithInt:[[webView window] level]]; -} - -- (id)setLevel:(NSArray *)arguments -{ - [[webView window] setLevel:[[arguments objectAtIndex:0] intValue]]; - - return [WebUndefined undefined]; -} - -- (id)hasShadow -{ - return [NSNumber numberWithBool:[[webView window] hasShadow]]; -} - -- (id)setHasShadow:(NSArray *)arguments -{ - [[webView window] setHasShadow:[[arguments objectAtIndex:0] boolValue]]; - - return [WebUndefined undefined]; -} - -- (id)frame -{ - NSRect frame = [[webView window] frame]; - - return [[webView windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"({ origin:{%f, %f}, size:{%f, %f}})", NSMinX(frame), NSMinY(frame), NSWidth(frame), NSHeight(frame)]]; -} - -- (id)setFrame:(NSArray *)arguments -{ - id origin = [[arguments objectAtIndex:0] valueForKey:@"origin"], - size = [[arguments objectAtIndex:0] valueForKey:@"size"]; - - NSWindow * window = [webView window]; - NSScreen * screen = [window screen]; - - if (!screen) - screen = [NSScreen mainScreen]; // Is this correct? - - float height = [[size valueForKey:@"height"] floatValue]; - - [[webView window] setFrame:NSMakeRect([[origin valueForKey:@"x"] floatValue], NSMaxY([screen frame]) - [[origin valueForKey:@"y"] floatValue] - height, [[size valueForKey:@"width"] floatValue], height) display:YES]; - /* - NSLog([webView description]); - NSLog(@"%@ %@", [window screen], NSStringFromRect([window frame])); - NSLog(@"%f - %f - %f = %f", NSMaxY([[window screen] frame]), [[origin valueForKey:@"y"] floatValue], height, NSMaxY([[window screen] frame]) - [[origin valueForKey:@"y"] floatValue] - height); - NSLog(@"FROM: %@", NSStringFromRect(NSMakeRect([[origin valueForKey:@"x"] floatValue], [[origin valueForKey:@"y"] floatValue], [[size valueForKey:@"width"] floatValue], height))); - NSLog(@" TO: %@", NSStringFromRect([[webView window] frame])); - */ - - return [WebUndefined undefined]; -} - -- (id)shadowStyle -{ - WebWindow * window = (WebWindow *)[webView window]; - - return [NSNumber numberWithInt:[window shadowStyle]]; -} - -- (id)setShadowStyle:(id)arguments -{ - int type = [[arguments objectAtIndex:0] intValue]; - - WebWindow * window = (WebWindow *)[webView window]; - - [window setShadowStyle:type]; - - return [WebUndefined undefined]; -} - -@end - - -@interface WindowScriptObjectMethod : NSObject -{ - WebView * webView; -} - -- (id)initWithWebView:(WebView *)aWebView; - -@end - -@implementation WindowScriptObjectMethod - -- (id)initWithWebView:(WebView *)aWebView -{ - self = [super init]; - - if (self) - webView = aWebView; - - return self; -} - -@end - -@implementation BridgedMethods - -+ (NSMutableArray *)arrayFromWebScriptObject:(WebScriptObject *)incomingObject -{ - if (!incomingObject) - return nil; - - NSMutableArray * newItems = [[NSMutableArray alloc] init]; - - for (int i=0; [incomingObject webScriptValueAtIndex:i]!=[WebUndefined undefined]; i++) - { - id oneItem =[incomingObject webScriptValueAtIndex:i]; - [newItems addObject:oneItem]; - } - - return [newItems autorelease]; -} - -+ (void)enhanceWindowObject:(WebScriptObject *)aWindowObject ofWebView:(WebView *)aWebView -{ - NSDictionary * classMethods = [MethodClasses objectForKey:[self className]]; - NSString * key = nil; - NSEnumerator * keyEnumerator = [classMethods keyEnumerator]; - - while (key = [keyEnumerator nextObject]) - [aWindowObject setValue:[(WindowScriptObjectMethod *)[[[classMethods objectForKey:key] alloc] initWithWebView:aWebView] autorelease] forKey:key]; -} - -+ (void)bridgeMethod:(Method)aMethod dictionary:(NSMutableDictionary *)aDictionary -{ - NSString * methodName = NSStringFromSelector(method_getName(aMethod)), - * publicMethodName = [NSString stringWithFormat:@"cp%@", [[NSString stringWithFormat:@"%@%@", [[methodName substringToIndex:1] uppercaseString], [methodName substringFromIndex:1]] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@":"]]]; - - Class methodClass = objc_allocateClassPair([WindowScriptObjectMethod class], [[NSString stringWithFormat:@"WebScriptObjectMethod_%@", publicMethodName] cString], 0); - - class_addMethod(methodClass, @selector(invokeDefaultMethodWithArguments:), method_getImplementation(aMethod), "@@:@"); - - objc_registerClassPair(methodClass); - - [aDictionary setObject:methodClass forKey:publicMethodName]; -} - -+ (void)initialize -{ - if (!MethodClasses) - MethodClasses = [[NSMutableDictionary alloc] init]; - - NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init]; - - [MethodClasses setObject:dictionary forKey:[self className]]; - [dictionary release]; - - unsigned int methodCount = 0; - Method * methods = class_copyMethodList(self, &methodCount); - - if (!methods) - return; - - int index = 0; - - for (; index < methodCount; ++index) - [self bridgeMethod:methods[index] dictionary:dictionary]; - - free(methods); - methods = NULL; -} - -@end diff --git a/Tools/NativeHost/Console.h b/Tools/NativeHost/Console.h deleted file mode 100644 index a4d9b6c42..000000000 --- a/Tools/NativeHost/Console.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// Console.h -// NativeHost -// -// Created by Francisco Tolmasky on 6/16/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - - -@interface Console : NSObject -{ - NSMutableAttributedString * contents; -} - -+ (id)sharedConsole; - -- (NSAttributedString *)contents; - -@end diff --git a/Tools/NativeHost/Console.m b/Tools/NativeHost/Console.m deleted file mode 100644 index 2118f999b..000000000 --- a/Tools/NativeHost/Console.m +++ /dev/null @@ -1,69 +0,0 @@ -// -// Console.m -// NativeHost -// -// Created by Francisco Tolmasky on 6/16/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "Console.h" - -#import "AppController.h" - - -@implementation Console - -+ (id)sharedConsole -{ - static Console * console = nil; - - if (!console) - console = [[Console alloc] init]; - - return console; -} - -- (id)init -{ - self = [super init]; - - if (self) - contents = [[NSMutableAttributedString alloc] init]; - - return self; -} - -- (void)dealloc -{ - [contents release]; - [super dealloc]; -} - -- (NSAttributedString *)contents -{ - return contents; -} - -- (void)webView:(WebView *)aWebView addMessageToConsole:(NSDictionary *)aDictionary -{ - NSString * message = [aDictionary objectForKey:@"message"]; - - NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n", message, nil]]; - [contents appendAttributedString:attrString]; - [attrString release]; - - NHLog(@"CONSOLE", message); -} - -- (void)webView:(WebView *)aSender runJavaScriptAlertPanelWithMessage:(NSString *)aMessage initiatedByFrame:(WebFrame *)aFrame -{ - WebDataSource * dataSource = [aFrame dataSource]; - NSString * title = [dataSource pageTitle]; - - if (![title length]) - title = [[[dataSource request] URL] absoluteString]; - - [[NSAlert alertWithMessageText:title defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:aMessage, nil] runModal]; -} - -@end diff --git a/Tools/NativeHost/English.lproj/InfoPlist.strings b/Tools/NativeHost/English.lproj/InfoPlist.strings deleted file mode 100644 index 5e45963c3..000000000 Binary files a/Tools/NativeHost/English.lproj/InfoPlist.strings and /dev/null differ diff --git a/Tools/NativeHost/English.lproj/MainMenu.cib b/Tools/NativeHost/English.lproj/MainMenu.cib deleted file mode 100644 index 36815f025..000000000 --- a/Tools/NativeHost/English.lproj/MainMenu.cib +++ /dev/null @@ -1 +0,0 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;19E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;20E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;18E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;21E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;19E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;22E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;23E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;8;delegateS;13;NSFontManagerS;13;AppControllerE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tools/NativeHost/English.lproj/MainMenu.xib b/Tools/NativeHost/English.lproj/MainMenu.xib deleted file mode 100644 index 2bce8a810..000000000 --- a/Tools/NativeHost/English.lproj/MainMenu.xib +++ /dev/null @@ -1,548 +0,0 @@ - - - - 1050 - 10C540 - 732 - 1038.25 - 458.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 732 - - - YES - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - YES - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - NSFontManager - - - AppController - - - - - YES - - - delegate - - - - 519 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 420 - - - - - 487 - - - - - - - -3.IBPluginDependency - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - - YES - - - - - YES - - - YES - - - - 677 - - - - YES - - AppController - NSObject - - IBProjectSource - AppController.h - - - - NSObject - - IBProjectSource - NSObject+WebAdditions.h - - - - - YES - - NSApplication - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSApplication.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSApplicationScripting.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSColorPanel.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSHelpManager.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSPageLayout.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSUserInterfaceItemSearching.h - - - - NSFontManager - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontManager.h - - - - NSMenu - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenu.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAccessibility.h - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDictionaryController.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDragging.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontPanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSKeyValueBinding.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSNibLoading.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSOutlineView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSPasteboard.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSavePanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbarItem.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSView.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebDownload.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebEditingDelegate.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebFrameLoadDelegate.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebJavaPlugIn.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebPlugin.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebPluginContainer.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebPolicyDelegate.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebResourceLoadDelegate.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebScriptObject.h - - - - NSObject - - IBFrameworkSource - WebKit.framework/Headers/WebUIDelegate.h - - - - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSInterfaceStyle.h - - - - NSResponder - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSResponder.h - - - - - 0 - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - ../NativeHost.xcodeproj - 3 - - diff --git a/Tools/NativeHost/Info.plist b/Tools/NativeHost/Info.plist deleted file mode 100644 index 2f8dbca99..000000000 --- a/Tools/NativeHost/Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - icon - CFBundleShortVersionString - 0.9 - CFBundleIdentifier - com.280north.${PRODUCT_NAME:identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - NativeHost - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/Tools/NativeHost/Jakefile b/Tools/NativeHost/Jakefile deleted file mode 100644 index 8df9bce4b..000000000 --- a/Tools/NativeHost/Jakefile +++ /dev/null @@ -1,45 +0,0 @@ - -require("../../common.jake"); - -var OS = require("os"); -var task = require("jake").task -var stream = require("narwhal/term").stream; - -task ("build", function() -{ - if (executableExists("xcodebuild")) - { - var args = "-alltargets -configuration Release"; - - if (xcodebuildHasTenPointFiveSDK()) - args = "-sdk macosx10.5 " + args; - - else - args = "-sdk macosx " + args; - - if (OS.system("xcodebuild " + args)) - OS.exit(1); - - rm_rf(FILE.join($BUILD_CJS_CAPPUCCINO, "support", "NativeHost.app")); - FILE.mkdirs(FILE.join($BUILD_CJS_CAPPUCCINO, "support")) - cp_r(FILE.join("build", "Release", "NativeHost.app"), FILE.join($BUILD_CJS_CAPPUCCINO, "support", "NativeHost.app")); - } - else - { - print("Building NativeHost requires Xcode."); - } -}); - -task ("clean", function() -{ - if (OS.system("xcodebuild clean")) - OS.exit(1); -}); - -task ("clobber", function() -{ - if (OS.system("xcodebuild clean")) - OS.exit(1); -}); - -task ("default", ["build"]); diff --git a/Tools/NativeHost/MenuBridge.h b/Tools/NativeHost/MenuBridge.h deleted file mode 100644 index 847237409..000000000 --- a/Tools/NativeHost/MenuBridge.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// MenuBridge.h -// NativeHost -// -// Created by Francisco Tolmasky on 9/2/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - - -@class WebScriptObject; - -@interface MenuBridge : NSMenu -{ - WebScriptObject * menuObject; -} - -+ (id)menuBridgeWithMenuObject:(WebScriptObject *)aMenuObject; -- (id)initWithMenuObject:(WebScriptObject *)aMenuObject; - -@end diff --git a/Tools/NativeHost/MenuBridge.m b/Tools/NativeHost/MenuBridge.m deleted file mode 100644 index ad14a7191..000000000 --- a/Tools/NativeHost/MenuBridge.m +++ /dev/null @@ -1,63 +0,0 @@ -// -// MenuBridge.m -// NativeHost -// -// Created by Francisco Tolmasky on 9/2/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "WebScripObject+Objective-J.h" -#import "MenuItemBridge.h" -#import "MenuBridge.h" - - -@implementation MenuBridge - -+ (id)menuBridgeWithMenuObject:(WebScriptObject *)aMenuObject -{ - if (!aMenuObject) - return nil; - - static NSMapTable * cache = nil; - - if (!cache) - cache = [[NSMapTable mapTableWithStrongToStrongObjects] retain]; - - MenuBridge * menuBridge = [cache objectForKey:aMenuObject]; - - if (!menuBridge) - { - menuBridge = [MenuBridge alloc]; - - [cache setObject:menuBridge forKey:aMenuObject]; - - [[menuBridge initWithMenuObject:aMenuObject] autorelease]; - } - - return menuBridge; -} - -- (id)initWithMenuObject:(WebScriptObject *)aMenuObject -{ - self = [super initWithTitle:[aMenuObject bridgeSelector:@selector(title)]]; - - if (self) - { - menuObject = aMenuObject; - - NSInteger index = 0, - count = [[aMenuObject bridgeSelector:@selector(numberOfItems)] intValue]; - - for (; index < count; ++index) - [self addItem:[[[MenuItemBridge alloc] initWithMenuItemObject:[aMenuObject bridgeSelector:@selector(itemAtIndex:) withObject:[NSNumber numberWithInt:index]]] autorelease]]; - } - - return self; -} - -- (void)performActionForItemAtIndex:(NSInteger)anIndex -{ - [menuObject bridgeSelector:@selector(performActionForItemAtIndex:) withObject:[NSNumber numberWithInt:anIndex]]; -} - -@end diff --git a/Tools/NativeHost/MenuItemBridge.h b/Tools/NativeHost/MenuItemBridge.h deleted file mode 100644 index 86e70d6f2..000000000 --- a/Tools/NativeHost/MenuItemBridge.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// ReflectMenuItem.h -// NativeHost -// -// Created by Francisco Tolmasky on 9/2/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - - -@class WebScriptObject; - -@interface MenuItemBridge : NSMenuItem -{ - WebScriptObject * menuItemObject; -} - -+ (id)menuItemBridgeWithMenuItemObject:(WebScriptObject *)aMenuItemObject; -- (id)initWithMenuItemObject:(WebScriptObject *)aMenuItemObject; - -- (void)updateFromMenuItemObject; - -@end diff --git a/Tools/NativeHost/MenuItemBridge.m b/Tools/NativeHost/MenuItemBridge.m deleted file mode 100644 index b661f35e8..000000000 --- a/Tools/NativeHost/MenuItemBridge.m +++ /dev/null @@ -1,77 +0,0 @@ -// -// ReflectMenuItem.m -// NativeHost -// -// Created by Francisco Tolmasky on 9/2/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "WebScripObject+Objective-J.h" -#import "MenuBridge.h" -#import "MenuItemBridge.h" - - -@implementation MenuItemBridge - -+ (id)menuItemBridgeWithMenuItemObject:(WebScriptObject *)aMenuItemObject -{ - if (!aMenuItemObject) - return nil; - - static NSMapTable * cache = nil; - - if (!cache) - cache = [[NSMapTable mapTableWithStrongToStrongObjects] retain]; - - MenuItemBridge * menuItemBridge = [cache objectForKey:aMenuItemObject]; - - if (!menuItemBridge) - { - menuItemBridge = [MenuBridge alloc]; - - [cache setObject:menuItemBridge forKey:aMenuItemObject]; - - [[menuItemBridge initWithMenuItemObject:aMenuItemObject] autorelease]; - } - - return menuItemBridge; -} - -- (id)initWithMenuItemObject:(WebScriptObject *)aMenuItemObject -{ - if ([[aMenuItemObject bridgeSelector:@selector(isSeparatorItem)] boolValue]) - return [[NSMenuItem separatorItem] retain]; - - self = [super init]; - - if (self) - { - menuItemObject = aMenuItemObject; - - [self updateFromMenuItemObject]; - } - - return self; -} -/* -- (BOOL)isSeparatorItem -{ - return [[menuItemObject bridgeSelector:@selector(isSeparatorItem)] boolValue]; -} -*/ -- (void)updateFromMenuItemObject -{ - [self setTitle:[menuItemObject bridgeSelector:@selector(title)]]; - [self setSubmenu:[MenuBridge menuBridgeWithMenuObject:[menuItemObject bridgeSelector:@selector(submenu)]]]; - [self setKeyEquivalent:[menuItemObject bridgeSelector:@selector(keyEquivalent)]]; - [self setKeyEquivalentModifierMask:[[menuItemObject evaluateObjectiveJ:[NSString stringWithFormat:@"(function() { var mask = %u; return (((mask & CPAlphaShiftKeyMask) ? %u : 0) | ((mask & CPShiftKeyMask) ? %u : 0) | ((mask & CPControlKeyMask) ? %u : 0) | ((mask & CPAlternateKeyMask) ? %u : 0) | ((mask & CPCommandKeyMask) ? %u : 0) | ((mask & CPNumericPadKeyMask) ? %u : 0) | ((mask & CPHelpKeyMask) ? %u : 0) | ((mask & CPFunctionKeyMask) ? %u : 0)) }())", [[menuItemObject bridgeSelector:@selector(keyEquivalentModifierMask)] unsignedIntegerValue], NSAlphaShiftKeyMask, NSShiftKeyMask, NSControlKeyMask, NSAlternateKeyMask, NSCommandKeyMask, NSNumericPadKeyMask, NSHelpKeyMask, NSFunctionKeyMask, NSDeviceIndependentModifierFlagsMask]] unsignedIntegerValue]];[self setAction:@selector(bridgeAction:)]; - [self setTarget:self]; - [self setAction:@selector(bridgeAction:)]; -} - -// This exists so that the menu items are enabled. -- (void)bridgeAction:(id)aSender -{ -} - -@end diff --git a/Tools/NativeHost/NSObject+WebAdditions.h b/Tools/NativeHost/NSObject+WebAdditions.h deleted file mode 100644 index b4ab41035..000000000 --- a/Tools/NativeHost/NSObject+WebAdditions.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// NSObject+WebAdditions.h -// NativeHost -// -// Created by Francisco Tolmasky on 11/16/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - - -@interface NSObject (WebAdditions) - -- (BOOL)webBoolValue; - -@end diff --git a/Tools/NativeHost/NSObject+WebAdditions.m b/Tools/NativeHost/NSObject+WebAdditions.m deleted file mode 100644 index 1ffd942a1..000000000 --- a/Tools/NativeHost/NSObject+WebAdditions.m +++ /dev/null @@ -1,19 +0,0 @@ -// -// NSObject+WebAdditions.m -// NativeHost -// -// Created by Francisco Tolmasky on 11/16/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "NSObject+WebAdditions.h" - - -@implementation NSObject (WebAdditions) - -- (BOOL)webBoolValue -{ - return [self isKindOfClass:[NSNumber class]] && [(NSNumber *)self boolValue]; -} - -@end diff --git a/Tools/NativeHost/NSURL+Additions.h b/Tools/NativeHost/NSURL+Additions.h deleted file mode 100644 index 32cee28f6..000000000 --- a/Tools/NativeHost/NSURL+Additions.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// NSURL+Additions.h -// NativeHost -// -// Created by Francisco Tolmasky on 6/3/09. -// Copyright 2009 280 North, Inc. All rights reserved. -// - -#import - - -@interface NSURL (Additions) - -- (NSURL *)HTTPFileSystemURL; -+ (NSURL *)fileSystemURLFromHTTPFileSystemString:(NSString *)aString; - -@end diff --git a/Tools/NativeHost/NSURL+Additions.m b/Tools/NativeHost/NSURL+Additions.m deleted file mode 100644 index 39cabb1a3..000000000 --- a/Tools/NativeHost/NSURL+Additions.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// NSURL+Additions.m -// NativeHost -// -// Created by Francisco Tolmasky on 6/3/09. -// Copyright 2009 280 North, Inc. All rights reserved. -// - -#import "NSURL+Additions.h" -#import "AppController.h" - -@implementation NSURL (Additions) - -- (NSURL *)HTTPFileSystemURL -{ - if ([[self scheme] caseInsensitiveCompare:@"file"] == NSOrderedSame) - return [[[NSURL alloc] initWithScheme:@"http" - host:[NSString stringWithFormat:@"127.0.0.1:%d", SERVER_PORT] - path:[@"/filesystem/" stringByAppendingString:[self path]]] autorelease]; - - return [[self copy] autorelease]; -} - -+ (NSURL *)fileSystemURLFromHTTPFileSystemString:(NSString *)aString -{ - NSURL *httpURL = [NSURL URLWithString:aString]; - NSString *path = [httpURL path]; - NSRange range = [path rangeOfString:@"/filesystem"]; - - if (range.location == 0 && NSMaxRange(range) < [path length]) - path = [path substringFromIndex:[@"/filesystem" length]]; - - return [[[NSURL alloc] initFileURLWithPath:path] autorelease]; -} - -@end diff --git a/Tools/NativeHost/NativeHost.xcodeproj/TemplateIcon.icns b/Tools/NativeHost/NativeHost.xcodeproj/TemplateIcon.icns deleted file mode 100644 index 62cb7015e..000000000 Binary files a/Tools/NativeHost/NativeHost.xcodeproj/TemplateIcon.icns and /dev/null differ diff --git a/Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj b/Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj deleted file mode 100644 index b40dc518a..000000000 --- a/Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj +++ /dev/null @@ -1,424 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; - 4D55A7941180F1E000B5187D /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D55A7931180F1BE00B5187D /* icon.icns */; }; - 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; - 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; - 9E2E533A103B33CB00DF2D13 /* Server.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E2E5339103B33CB00DF2D13 /* Server.m */; }; - 9E43AC84104DB51400263989 /* WebScripObject+Objective-J.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E43AC83104DB51400263989 /* WebScripObject+Objective-J.m */; }; - 9E44CA9D0FD798FE00860A54 /* NSURL+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E44CA9C0FD798FE00860A54 /* NSURL+Additions.m */; }; - 9E4EBB4210892BDE0091C8E9 /* BridgedMethods.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E4EBB4110892BDE0091C8E9 /* BridgedMethods.m */; }; - 9E52D2F9119B05EF00B831FC /* AppController+WebPolicyDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E52D2F8119B05EF00B831FC /* AppController+WebPolicyDelegate.m */; }; - 9E535D05104F6F4900C119FA /* AppController+MainMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E535D04104F6F4900C119FA /* AppController+MainMenu.m */; }; - 9E535D32104F73FB00C119FA /* MenuBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E535D31104F73FB00C119FA /* MenuBridge.m */; }; - 9E535D37104F761F00C119FA /* MenuItemBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E535D36104F761F00C119FA /* MenuItemBridge.m */; }; - 9E55CFE50FE8750C007D1D64 /* Console.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E55CFE40FE8750C007D1D64 /* Console.m */; }; - 9E5D4F0D1090FB6E00E76B38 /* WebWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E5D4F0C1090FB6E00E76B38 /* WebWindow.m */; }; - 9E9DD6C00FC93C7A0001EF2E /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E9DD6BF0FC93C7A0001EF2E /* WebKit.framework */; }; - 9EA1BEF7107E7EE500CDE684 /* Application.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EA1BEF6107E7EE500CDE684 /* Application.m */; }; - 9EB99C960FD8968100AA94A2 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EB99C950FD8968100AA94A2 /* AppController.m */; }; - 9EBC421E10B1D07100C2AE33 /* NSObject+WebAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EBC421D10B1D07100C2AE33 /* NSObject+WebAdditions.m */; }; - 9ED96C8A1020072300D24B9C /* AppController+WebUIDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED96C871020072300D24B9C /* AppController+WebUIDelegate.m */; }; - 9ED96C8B1020072300D24B9C /* AppController+WebFrameLoadDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED96C881020072300D24B9C /* AppController+WebFrameLoadDelegate.m */; }; - 9ED96C8C1020072300D24B9C /* AppController+WebResourceLoadDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED96C891020072300D24B9C /* AppController+WebResourceLoadDelegate.m */; }; - AD8D31C6108F98B00008F7C4 /* SSCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = AD8D31C5108F98B00008F7C4 /* SSCrypto.m */; }; - AD8D31C9108F98E40008F7C4 /* libssl.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AD8D31C8108F98E40008F7C4 /* libssl.dylib */; }; - AD8D31CB108F98EF0008F7C4 /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AD8D31CA108F98EF0008F7C4 /* libcrypto.dylib */; }; - AD8D350F109040300008F7C4 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD8D350E109040300008F7C4 /* IOKit.framework */; }; - ADCCEF6810D43C970055BDFD /* WebPasteboardProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = ADCCEF3310D4370F0055BDFD /* WebPasteboardProxy.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; - 1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; - 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* NativeHost_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeHost_Prefix.pch; sourceTree = ""; }; - 4D55A7931180F1BE00B5187D /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = icon.icns; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8D1107320486CEB800E47090 /* NativeHost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NativeHost.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 9E2E5338103B33CB00DF2D13 /* Server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Server.h; sourceTree = ""; }; - 9E2E5339103B33CB00DF2D13 /* Server.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Server.m; sourceTree = ""; }; - 9E43AC82104DB51400263989 /* WebScripObject+Objective-J.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WebScripObject+Objective-J.h"; sourceTree = ""; }; - 9E43AC83104DB51400263989 /* WebScripObject+Objective-J.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WebScripObject+Objective-J.m"; sourceTree = ""; }; - 9E44CA9B0FD798FE00860A54 /* NSURL+Additions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURL+Additions.h"; sourceTree = ""; }; - 9E44CA9C0FD798FE00860A54 /* NSURL+Additions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+Additions.m"; sourceTree = ""; }; - 9E4EBB4010892BDE0091C8E9 /* BridgedMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BridgedMethods.h; sourceTree = ""; }; - 9E4EBB4110892BDE0091C8E9 /* BridgedMethods.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BridgedMethods.m; sourceTree = ""; }; - 9E52D2F8119B05EF00B831FC /* AppController+WebPolicyDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppController+WebPolicyDelegate.m"; sourceTree = ""; }; - 9E535D04104F6F4900C119FA /* AppController+MainMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppController+MainMenu.m"; sourceTree = ""; }; - 9E535D30104F73FB00C119FA /* MenuBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuBridge.h; sourceTree = ""; }; - 9E535D31104F73FB00C119FA /* MenuBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuBridge.m; sourceTree = ""; }; - 9E535D35104F761F00C119FA /* MenuItemBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuItemBridge.h; sourceTree = ""; }; - 9E535D36104F761F00C119FA /* MenuItemBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuItemBridge.m; sourceTree = ""; }; - 9E55CFE30FE8750C007D1D64 /* Console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Console.h; sourceTree = ""; }; - 9E55CFE40FE8750C007D1D64 /* Console.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Console.m; sourceTree = ""; }; - 9E5D4F0B1090FB6E00E76B38 /* WebWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebWindow.h; sourceTree = ""; }; - 9E5D4F0C1090FB6E00E76B38 /* WebWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebWindow.m; sourceTree = ""; }; - 9E9DD6BF0FC93C7A0001EF2E /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - 9EA1BEF5107E7EE500CDE684 /* Application.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Application.h; sourceTree = ""; }; - 9EA1BEF6107E7EE500CDE684 /* Application.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Application.m; sourceTree = ""; }; - 9EB99C940FD8968100AA94A2 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = ""; }; - 9EB99C950FD8968100AA94A2 /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = ""; }; - 9EBC421C10B1D07100C2AE33 /* NSObject+WebAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+WebAdditions.h"; sourceTree = ""; }; - 9EBC421D10B1D07100C2AE33 /* NSObject+WebAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+WebAdditions.m"; sourceTree = ""; }; - 9ED96C871020072300D24B9C /* AppController+WebUIDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppController+WebUIDelegate.m"; sourceTree = ""; }; - 9ED96C881020072300D24B9C /* AppController+WebFrameLoadDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppController+WebFrameLoadDelegate.m"; sourceTree = ""; }; - 9ED96C891020072300D24B9C /* AppController+WebResourceLoadDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppController+WebResourceLoadDelegate.m"; sourceTree = ""; }; - AD8D31C4108F98B00008F7C4 /* SSCrypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSCrypto.h; sourceTree = ""; }; - AD8D31C5108F98B00008F7C4 /* SSCrypto.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSCrypto.m; sourceTree = ""; }; - AD8D31C8108F98E40008F7C4 /* libssl.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libssl.dylib; path = /usr/lib/libssl.dylib; sourceTree = ""; }; - AD8D31CA108F98EF0008F7C4 /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcrypto.dylib; path = /usr/lib/libcrypto.dylib; sourceTree = ""; }; - AD8D350E109040300008F7C4 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; - ADCCEF3210D4370F0055BDFD /* WebPasteboardProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebPasteboardProxy.h; sourceTree = ""; }; - ADCCEF3310D4370F0055BDFD /* WebPasteboardProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebPasteboardProxy.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8D11072E0486CEB800E47090 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, - 9E9DD6C00FC93C7A0001EF2E /* WebKit.framework in Frameworks */, - AD8D31C9108F98E40008F7C4 /* libssl.dylib in Frameworks */, - AD8D31CB108F98EF0008F7C4 /* libcrypto.dylib in Frameworks */, - AD8D350F109040300008F7C4 /* IOKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 9E535D04104F6F4900C119FA /* AppController+MainMenu.m */, - 9ED96C881020072300D24B9C /* AppController+WebFrameLoadDelegate.m */, - 9ED96C891020072300D24B9C /* AppController+WebResourceLoadDelegate.m */, - 9ED96C871020072300D24B9C /* AppController+WebUIDelegate.m */, - 9E52D2F8119B05EF00B831FC /* AppController+WebPolicyDelegate.m */, - 9EB99C940FD8968100AA94A2 /* AppController.h */, - 9EB99C950FD8968100AA94A2 /* AppController.m */, - 9EA1BEF5107E7EE500CDE684 /* Application.h */, - 9EA1BEF6107E7EE500CDE684 /* Application.m */, - 9E55CFE30FE8750C007D1D64 /* Console.h */, - 9E55CFE40FE8750C007D1D64 /* Console.m */, - 9E2E5338103B33CB00DF2D13 /* Server.h */, - 9E2E5339103B33CB00DF2D13 /* Server.m */, - AD8D31C4108F98B00008F7C4 /* SSCrypto.h */, - AD8D31C5108F98B00008F7C4 /* SSCrypto.m */, - 9E5D4F0B1090FB6E00E76B38 /* WebWindow.h */, - 9E5D4F0C1090FB6E00E76B38 /* WebWindow.m */, - 9E1E34190FCC82A5007F8CA0 /* Bridge */, - ); - name = Classes; - sourceTree = ""; - }; - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { - isa = PBXGroup; - children = ( - AD8D31CA108F98EF0008F7C4 /* libcrypto.dylib */, - AD8D31C8108F98E40008F7C4 /* libssl.dylib */, - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, - AD8D350E109040300008F7C4 /* IOKit.framework */, - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 29B97324FDCFA39411CA2CEA /* AppKit.framework */, - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, - 29B97325FDCFA39411CA2CEA /* Foundation.framework */, - 9E9DD6BF0FC93C7A0001EF2E /* WebKit.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 8D1107320486CEB800E47090 /* NativeHost.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* NativeHost */ = { - isa = PBXGroup; - children = ( - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = NativeHost; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 29B97316FDCFA39411CA2CEA /* main.m */, - 32CA4F630368D1EE00C91783 /* NativeHost_Prefix.pch */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 4D55A7931180F1BE00B5187D /* icon.icns */, - 8D1107310486CEB800E47090 /* Info.plist */, - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, - 1DDD58140DA1D0A300B32029 /* MainMenu.xib */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9E1E34190FCC82A5007F8CA0 /* Bridge */ = { - isa = PBXGroup; - children = ( - 9E535DB7104F923E00C119FA /* Menus */, - 9E4EBB4010892BDE0091C8E9 /* BridgedMethods.h */, - 9E4EBB4110892BDE0091C8E9 /* BridgedMethods.m */, - 9EBC421C10B1D07100C2AE33 /* NSObject+WebAdditions.h */, - 9EBC421D10B1D07100C2AE33 /* NSObject+WebAdditions.m */, - 9E44CA9B0FD798FE00860A54 /* NSURL+Additions.h */, - 9E44CA9C0FD798FE00860A54 /* NSURL+Additions.m */, - ADCCEF3210D4370F0055BDFD /* WebPasteboardProxy.h */, - ADCCEF3310D4370F0055BDFD /* WebPasteboardProxy.m */, - 9E43AC82104DB51400263989 /* WebScripObject+Objective-J.h */, - 9E43AC83104DB51400263989 /* WebScripObject+Objective-J.m */, - ); - name = Bridge; - sourceTree = ""; - }; - 9E535DB7104F923E00C119FA /* Menus */ = { - isa = PBXGroup; - children = ( - 9E535D30104F73FB00C119FA /* MenuBridge.h */, - 9E535D31104F73FB00C119FA /* MenuBridge.m */, - 9E535D35104F761F00C119FA /* MenuItemBridge.h */, - 9E535D36104F761F00C119FA /* MenuItemBridge.m */, - ); - name = Menus; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8D1107260486CEB800E47090 /* NativeHost */ = { - isa = PBXNativeTarget; - buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "NativeHost" */; - buildPhases = ( - 8D1107290486CEB800E47090 /* Resources */, - 8D11072C0486CEB800E47090 /* Sources */, - 8D11072E0486CEB800E47090 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = NativeHost; - productInstallPath = "$(HOME)/Applications"; - productName = NativeHost; - productReference = 8D1107320486CEB800E47090 /* NativeHost.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0440; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "NativeHost" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* NativeHost */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8D1107260486CEB800E47090 /* NativeHost */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D1107290486CEB800E47090 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, - 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */, - 4D55A7941180F1E000B5187D /* icon.icns in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8D11072C0486CEB800E47090 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9E535D05104F6F4900C119FA /* AppController+MainMenu.m in Sources */, - 9ED96C8B1020072300D24B9C /* AppController+WebFrameLoadDelegate.m in Sources */, - 9ED96C8C1020072300D24B9C /* AppController+WebResourceLoadDelegate.m in Sources */, - 9ED96C8A1020072300D24B9C /* AppController+WebUIDelegate.m in Sources */, - 9EB99C960FD8968100AA94A2 /* AppController.m in Sources */, - 9EA1BEF7107E7EE500CDE684 /* Application.m in Sources */, - 9E4EBB4210892BDE0091C8E9 /* BridgedMethods.m in Sources */, - 9E55CFE50FE8750C007D1D64 /* Console.m in Sources */, - 8D11072D0486CEB800E47090 /* main.m in Sources */, - 9E535D32104F73FB00C119FA /* MenuBridge.m in Sources */, - 9E535D37104F761F00C119FA /* MenuItemBridge.m in Sources */, - 9EBC421E10B1D07100C2AE33 /* NSObject+WebAdditions.m in Sources */, - 9E44CA9D0FD798FE00860A54 /* NSURL+Additions.m in Sources */, - 9E2E533A103B33CB00DF2D13 /* Server.m in Sources */, - AD8D31C6108F98B00008F7C4 /* SSCrypto.m in Sources */, - ADCCEF6810D43C970055BDFD /* WebPasteboardProxy.m in Sources */, - 9E43AC84104DB51400263989 /* WebScripObject+Objective-J.m in Sources */, - 9E5D4F0D1090FB6E00E76B38 /* WebWindow.m in Sources */, - 9E52D2F9119B05EF00B831FC /* AppController+WebPolicyDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 089C165DFE840E0CC02AAC07 /* English */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 1DDD58150DA1D0A300B32029 /* English */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - C01FCF4B08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = NativeHost_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = "ACTIVATION=0"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INFOPLIST_FILE = Info.plist; - INFOPLIST_PREPROCESS = YES; - INFOPLIST_PREPROCESSOR_DEFINITIONS = "ACTIVATION=0"; - INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_NAME = NativeHost; - }; - name = Debug; - }; - C01FCF4C08A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = NativeHost_Prefix.pch; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INFOPLIST_FILE = Info.plist; - INFOPLIST_PREPROCESS = YES; - INFOPLIST_PREPROCESSOR_DEFINITIONS = "ACTIVATION=0"; - INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_NAME = NativeHost; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_VERSION = 4.2; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "NativeHost" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4B08A954540054247B /* Debug */, - C01FCF4C08A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "NativeHost" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/Tools/NativeHost/NativeHost_Prefix.pch b/Tools/NativeHost/NativeHost_Prefix.pch deleted file mode 100644 index 17e44cd86..000000000 --- a/Tools/NativeHost/NativeHost_Prefix.pch +++ /dev/null @@ -1,8 +0,0 @@ -// -// Prefix header for all source files of the 'NativeHost' target in the 'NativeHost' project -// - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Tools/NativeHost/SSCrypto.h b/Tools/NativeHost/SSCrypto.h deleted file mode 100644 index 89ff70a9e..000000000 --- a/Tools/NativeHost/SSCrypto.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - Copyright (c) 2003-2006, Septicus Software All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Septicus Software nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -// -// SSCrypto.h -// -// Created by Ed Silva on Sat May 31 2003. -// Copyright (c) 2003-2006 Septicus Software. All rights reserved. -// - - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -@interface NSData (HexDump) -- (NSString *)encodeBase64; -- (NSString *)encodeBase64WithNewlines:(BOOL)encodeWithNewlines; -- (NSData *)decodeBase64; -- (NSData *)decodeBase64WithNewLines:(BOOL)decodeWithNewLines; -- (NSString *)hexval; -- (NSString *)hexdump; -@end - -@interface SSCrypto : NSObject -{ - NSData *symmetricKey; - NSData *cipherText; - NSData *clearText; - NSData *publicKey; - NSData *privateKey; - - BOOL isSymmetric; -} - -- (id)init; -- (id)initWithSymmetricKey:(NSData *)k; -- (id)initWithPublicKey:(NSData *)pub; -- (id)initWithPrivateKey:(NSData *)priv; -- (id)initWithPublicKey:(NSData *)pub privateKey:(NSData *)priv; - -- (BOOL)isSymmetric; -- (void)setIsSymmetric:(BOOL)flag; - -- (NSData *)symmetricKey; -- (void)setSymmetricKey:(NSData *)k; - -- (NSData *)publicKey; -- (void)setPublicKey:(NSData *)k; - -- (NSData *)privateKey; -- (void)setPrivateKey:(NSData *)k; - -- (NSData *)clearTextAsData; -- (NSString *)clearTextAsString; -- (void)setClearTextWithData:(NSData *)c; -- (void)setClearTextWithString:(NSString *)c; - -- (NSData *)cipherTextAsData; -- (NSString *)cipherTextAsString; -- (void)setCipherText:(NSData *)c; - -- (NSData *)decrypt; -- (NSData *)decrypt:(NSString *)cipherName; - -- (NSData *)verify; - -- (NSData *)encrypt; -- (NSData *)encrypt:(NSString *)cipherName; - -- (NSData *)sign; - -- (NSData *)digest:(NSString *)digestName; - -+ (NSData *)generateRSAPrivateKeyWithLength:(int)length; -+ (NSData *)generateRSAPublicKeyFromPrivateKey:(NSData *)privateKey; -+ (NSData *)getKeyDataWithLength:(int)length; -+ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt; -+ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt withIterations:(int)count; -+ (NSData *)getSHA1ForData:(NSData *)d; -+ (NSData *)getMD5ForData:(NSData *)d; - -@end diff --git a/Tools/NativeHost/SSCrypto.m b/Tools/NativeHost/SSCrypto.m deleted file mode 100644 index 09c557531..000000000 --- a/Tools/NativeHost/SSCrypto.m +++ /dev/null @@ -1,1214 +0,0 @@ -/* - Copyright (c) 2003-2006, Septicus Software All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Septicus Software nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -// -// SSCrypto.m -// SimpleWebCam -// -// Created by Ed Silva on Sat May 31 2003. -// Copyright (c) 2003-2006 Septicus Software. All rights reserved. -// - -#import "SSCrypto.h" - -@implementation NSData (HexDump) - -/** - * Encodes the current data in base64, and creates and returns an NSString from the result. - * This is the same as piping data through "... | openssl enc -base64" on the command line. - * - * Code courtesy of DaveDribin (http://www.dribin.org/dave/) - * Taken from http://www.cocoadev.com/index.pl?BaseSixtyFour -**/ -- (NSString *)encodeBase64 -{ - return [self encodeBase64WithNewlines: YES]; -} - -/** - * Encodes the current data in base64, and creates and returns an NSString from the result. - * This is the same as piping data through "... | openssl enc -base64" on the command line. - * - * Code courtesy of DaveDribin (http://www.dribin.org/dave/) - * Taken from http://www.cocoadev.com/index.pl?BaseSixtyFour -**/ -- (NSString *)encodeBase64WithNewlines:(BOOL)encodeWithNewlines -{ - // Create a memory buffer which will contain the Base64 encoded string - BIO * mem = BIO_new(BIO_s_mem()); - - // Push on a Base64 filter so that writing to the buffer encodes the data - BIO * b64 = BIO_new(BIO_f_base64()); - if (!encodeWithNewlines) - BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); - mem = BIO_push(b64, mem); - - // Encode all the data - BIO_write(mem, [self bytes], [self length]); - BIO_flush(mem); - - // Create a new string from the data in the memory buffer - char * base64Pointer; - long base64Length = BIO_get_mem_data(mem, &base64Pointer); - // we use an NSData here since the base64pointer is not null terminated - // the byte array the NSData return should be - // so making an NSString from that will be okay - NSData * base64data = [NSData dataWithBytes:base64Pointer length:base64Length]; - NSString * base64String = [NSString stringWithUTF8String:[base64data bytes]]; - - // Clean up and go home - BIO_free_all(mem); - - if (!encodeWithNewlines) - base64String = [[base64String componentsSeparatedByString:@"\n"] componentsJoinedByString:@""]; - - return base64String; -} - -- (NSData *)decodeBase64 -{ - return [self decodeBase64WithNewLines:YES]; -} - -- (NSData *)decodeBase64WithNewLines:(BOOL)encodedWithNewlines -{ - // Create a memory buffer containing Base64 encoded string data - BIO * mem = BIO_new_mem_buf((void *) [self bytes], [self length]); - - // Push a Base64 filter so that reading from the buffer decodes it - BIO * b64 = BIO_new(BIO_f_base64()); - if (!encodedWithNewlines) - BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); - mem = BIO_push(b64, mem); - - // Decode into an NSMutableData - NSMutableData * data = [NSMutableData data]; - char inbuf[512]; - int inlen; - while ((inlen = BIO_read(mem, inbuf, sizeof(inbuf))) > 0) - [data appendBytes: inbuf length: inlen]; - - // Clean up and go home - BIO_free_all(mem); - return data; -} - -- (NSString *)hexval -{ - NSMutableString *hex = [NSMutableString string]; - unsigned char *bytes = (unsigned char *)[self bytes]; - char temp[3]; - int i = 0; - - for (i = 0; i < [self length]; i++) { - temp[0] = temp[1] = temp[2] = 0; - (void)sprintf(temp, "%02x", bytes[i]); - [hex appendString:[NSString stringWithUTF8String:temp]]; - } - - return hex; -} - -- (NSString *)hexdump -{ - NSMutableString *ret=[NSMutableString stringWithCapacity:[self length]*2]; - /* dumps size bytes of *data to string. Looks like: - * [0000] 75 6E 6B 6E 6F 77 6E 20 - * 30 FF 00 00 00 00 39 00 unknown 0.....9. - * (in a single line of course) - */ - unsigned int size= [self length]; - const unsigned char *p = [self bytes]; - unsigned char c; - int n; - char bytestr[4] = {0}; - char addrstr[10] = {0}; - char hexstr[ 16*3 + 5] = {0}; - char charstr[16*1 + 5] = {0}; - for(n=1;n<=size;n++) { - if (n%16 == 1) { - /* store address for this line */ - snprintf(addrstr, sizeof(addrstr), "%.4x", - (unsigned int)((long)p-(long)self) ); - } - - c = *p; - if (isalnum(c) == 0) { - c = '.'; - } - - /* store hex str (for left side) */ - snprintf(bytestr, sizeof(bytestr), "%02X ", *p); - strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1); - - /* store char str (for right side) */ - snprintf(bytestr, sizeof(bytestr), "%c", c); - strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1); - - if(n%16 == 0) { - /* line completed */ - //printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); - [ret appendString:[NSString stringWithFormat:@"[%4.4s] %-50.50s %s\n", - addrstr, hexstr, charstr]]; - hexstr[0] = 0; - charstr[0] = 0; - } else if(n%8 == 0) { - /* half line: add whitespaces */ - strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1); - strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1); - } - p++; /* next byte */ - } - - if (strlen(hexstr) > 0) { - /* print rest of buffer if not empty */ - //printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); - [ret appendString:[NSString stringWithFormat:@"[%4.4s] %-50.50s %s\n", - addrstr, hexstr, charstr]]; - } - return ret; -} - -@end - -@interface SSCrypto (PrivateAPI) -- (void)setupOpenSSL; -- (void)cleanupOpenSSL; -@end - -// SSCrypto object -@implementation SSCrypto - -/** - * Generic constructor. - * Simply configures internal OpenSSL setup. -**/ -- (id)init -{ - if(self = [super init]) - { - // Call private method to handle the setup for internal OpenSSL stuff - [self setupOpenSSL]; - } - return self; -} - -/** - * Symmetric key constructor. - * Configures the instance to use symmetric encryption/decryption using the given symmetric key. -**/ -- (id)initWithSymmetricKey:(NSData *)k -{ - if(self = [super init]) - { - // Call private method to handle the setup for internal OpenSSL stuff - [self setupOpenSSL]; - - [self setSymmetricKey:k]; - [self setIsSymmetric:YES]; - } - return self; -} - -/** - * Public key only constructor. - * Configures the instance to use non-symmetric encryption/decryption, and to use the given public key. -**/ -- (id)initWithPublicKey:(NSData *)pub -{ - return [self initWithPublicKey:pub privateKey:nil]; -} - -/** - * Private key only constructor. - * Configures the instance to use non-symmetric encryption/decryption, and to use the given private key. -**/ -- (id)initWithPrivateKey:(NSData *)priv -{ - return [self initWithPublicKey:nil privateKey:priv]; -} - -/** - * Public and Private key constructor. - * Configures the instance to use non-symmetric encryption/decryption, and to use the given public and private keys. -**/ -- (id)initWithPublicKey:(NSData *)pub privateKey:(NSData *)priv; -{ - if(self = [super init]) - { - // Call private method to handle the setup for internal OpenSSL stuff - [self setupOpenSSL]; - - // Store the publicKey variable (if not nil) - if(pub != nil) - [self setPublicKey:pub]; - - // Store the privateKey variable (if not nil) - if(priv != nil) - [self setPrivateKey:priv]; - - // Since we're using public and private keys, we can assume we're not using symmetric encryption - [self setIsSymmetric:NO]; - } - return self; -} - -/** - * This method sets up everything needed to use the OpenSSL libraries later within the code. - * This method should be called by every constructor. -**/ -- (void)setupOpenSSL -{ - // OpenSSL keeps an internal table of digest algorithms and ciphers. - // It uses this table to lookup ciphers via functions such as EVP_get_cipher_byname(). - // OpenSSL_add_all_digests() adds all digest algorithms to the table. - // OpenSSL_add_all_ciphers() adds all cipher algorithms to the table. - // OpenSSL_add_all_algorithms() adds all algorithms to the table (digests and ciphers). - // EVP_cleanup() removes all ciphers and digests from the table. - // - // A typical application will call OpenSSL_add_all_algorithms() initially and EVP_cleanup() before exiting. - - OpenSSL_add_all_algorithms(); - - // ERR_load_crypto_strings() registers the error strings for all libcrypto functions. - // SSL_load_error_strings() does the same, but also registers the libssl error strings. - // ERR_free_strings() frees all previously loaded error strings. - // - // One of these functions should be called before generating textual error messages. - // However, this is not required when memory usage is an issue. - - ERR_load_crypto_strings(); -} - -/** - * Standard deallocation method. -**/ -- (void)dealloc -{ - // Cleanup all OpenSSL stuff - [self cleanupOpenSSL]; - - // Release all instance variables - [symmetricKey release]; - [cipherText release]; - [clearText release]; - [publicKey release]; - [privateKey release]; - - // Move up the inheritance chain - [super dealloc]; -} - -- (void)cleanupOpenSSL -{ - // EVP_cleanup() removes all ciphers and digests from the table. - EVP_cleanup(); - - // ERR_free_strings() frees all previously loaded error strings. - ERR_free_strings(); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Getter, Setter Methods: -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Returns whether or not symmetric encryption is to be used. - * If symmetric encryption is in use, then calls to encrypt or decrypt operate using symmetric encryption/decryption. - * Otherwise, it is assumed that asymmetric encryption/decryption is to be used. -**/ -- (BOOL)isSymmetric -{ - return isSymmetric; -} - -- (void)setIsSymmetric:(BOOL)flag -{ - isSymmetric = flag; -} - -- (NSData *)symmetricKey -{ - return symmetricKey; -} - -- (void)setSymmetricKey:(NSData *)k -{ - [k retain]; - [symmetricKey release]; - symmetricKey = k; -} - -/** - * Returns the public key currently in use. -**/ -- (NSData *)publicKey -{ - return publicKey; -} - -/** - * Sets the public key to use. - * Public keys are used to verify signed data, or to encrypt data. (ToDo) -**/ -- (void)setPublicKey:(NSData *)k -{ - [k retain]; - [publicKey release]; - publicKey = k; -} - -/** - * Returns the private key currently in use. -**/ -- (NSData *)privateKey -{ - return privateKey; -} - -/** - * Sets the private key to use. - * Private keys are used to sign data, or to decrypt data. (ToDo) - * - * The data that is provided should from a file (such as private.pem) that was generated by openssl. -**/ -- (void)setPrivateKey:(NSData *)k -{ - [k retain]; - [privateKey release]; - privateKey = k; -} - -/** - * Returns the clear text as plain NSData. - * The plain text contains the text that was previously set. - * It's the known text, which is to be encrypted, decrypted, etc. -**/ -- (NSData *)clearTextAsData -{ - return clearText; -} - -/** - * Returns the clear text formatted as an NSString. - * The plain text contains the text that was previously set. - * It's the known text, which is to be encrypted, decrypted, etc. -**/ -- (NSString *)clearTextAsString -{ - return [[[NSString alloc] initWithData:[self clearTextAsData] encoding:NSUTF8StringEncoding] autorelease]; -} - -/** - * Sets the clear text using the given data. - * The clear text will be used for encryption, decryption, etc. - * - * Note that the given data reference is retained and later used, so it shouldn't be externally modified. -**/ -- (void)setClearTextWithData:(NSData *)c -{ - [c retain]; - [clearText release]; - clearText = c; -} - -/** - * Sets the clear text using the given string. - * The clear text will be used for encryption, signing, and digests. - **/ -- (void)setClearTextWithString:(NSString *)c -{ - [clearText release]; - - // BUG FIX : PLL (2009/02/21) - // - // [c length] : Returns the number of Unicode characters in the receiver. - // For example "éàç test" in UTF8 is 11 bytes (c3 a9 c3 a0 c3 a7 20 74 65 73 74) - // but only 8 Unicode characters. - // So this will truncate the text and result in one error. - // - // clearText = [[NSData alloc] initWithBytes:[c UTF8String] length:[c length]]; - - // The number of bytes required to store the receiver in the encoding enc in a non-external representation. The length does not include space for a terminating NULL character. - unsigned int length = [c lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - clearText = [[NSData alloc] initWithBytes:[c UTF8String] length:length]; -} - -/** - * Returns the cipher text as plain NSData. - * The cipher text contains the most recent encrypted data. (Result of call to encrypt) -**/ -- (NSData *)cipherTextAsData -{ - return cipherText; -} - -/** - * Returns the ciper text formatted as an NSString. - * The ciper text contains the most recent encrypted data. (Result of call to encrypt) -**/ -- (NSString *)cipherTextAsString -{ - return [[[NSString alloc] initWithData:[self cipherTextAsData] encoding:NSUTF8StringEncoding] autorelease]; -} - -/** - * Sets the cipher text using the given data. - * The cipher text will be used for decryption and verifying. -**/ -- (void)setCipherText:(NSData *)c -{ - [c retain]; - [cipherText release]; - cipherText = c; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Decryption methods: -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Peforms decryption, and returns resulting clear text data. - * If symmetric decryption is being used, performs symmetric decryption using aes128. - * Otherwise, performs decryption using the private key. -**/ -- (NSData *)decrypt -{ - if([self isSymmetric] && [self symmetricKey]) - { - return [self decrypt:@"aes128"]; - } - else if([self privateKey]) - { - return [self decrypt:nil]; - } - else - { - NSLog(@"No symmetric key or private key is set!"); - return nil; - } -} - -/** - * Decrypts the cipher text data. - * If symmetric decryption is being used, then the decryption is done using the given cipher. - * Otherwise, asymmetric decryptions is used, and the data is encrypted using the private key. - * - * Returns the clear text data that is the result of the decryption. - * The resulting clear text data may also be later retrieved with the clearTextAsData or clearTextAsString methods. -**/ -- (NSData *)decrypt:(NSString *)cipherName -{ - // If there is no cipher text set, or the cipher text is an empty string (zero length data) - // then there is nothing to decrypt, and we may as well return nil - if(cipherText == nil || [cipherText length] == 0) - { - return nil; - } - - unsigned char *outbuf, iv[EVP_MAX_IV_LENGTH]; - int outlen, templen, inlen; - inlen = [cipherText length]; - unsigned char *input = (unsigned char *)[cipherText bytes]; - - if([self isSymmetric]) - { - // Use symmetric decryption... - - unsigned char evp_key[EVP_MAX_KEY_LENGTH] = {"\0"}; - EVP_CIPHER_CTX cCtx; - const EVP_CIPHER *cipher; - - if(cipherName) - { - cipher = EVP_get_cipherbyname((const char *)[cipherName UTF8String]); - if(!cipher) - { - NSLog(@"cannot get cipher with name %@", cipherName); - return nil; - } - } - else - { - cipher = EVP_bf_cbc(); - if(!cipher) - { - NSLog(@"cannot get cipher with name %@", @"EVP_bf_cbc"); - return nil; - } - } - - // Sometimes OpenSSL encrypted data contains an 8 byte salt. - // This is indicated by the "Salted__" prefix in the encrypted data. - - NSData *salt = nil; - - if([cipherText length] > 8+8) - { - if(strncmp((const char *)[cipherText bytes], "Salted__", 8) == 0) - { - salt = [cipherText subdataWithRange:NSMakeRange(8, 8)]; - - input += 16; - inlen -= 16; - } - } - - EVP_BytesToKey(cipher, EVP_md5(), [salt bytes], - [symmetricKey bytes], [symmetricKey length], 1, evp_key, iv); - - EVP_CIPHER_CTX_init(&cCtx); - - if (!EVP_DecryptInit(&cCtx, cipher, evp_key, iv)) - { - NSLog(@"EVP_DecryptInit() failed!"); - EVP_CIPHER_CTX_cleanup(&cCtx); - return nil; - } - EVP_CIPHER_CTX_set_key_length(&cCtx, EVP_MAX_KEY_LENGTH); - - // The data buffer passed to EVP_DecryptUpdate() should have sufficient room for - // (input_length + cipher_block_size) bytes unless the cipher block size is 1 in which - // case input_length bytes is sufficient. - - if(EVP_CIPHER_CTX_block_size(&cCtx) > 1) - outbuf = (unsigned char *)calloc(inlen + EVP_CIPHER_CTX_block_size(&cCtx), sizeof(unsigned char)); - else - outbuf = (unsigned char *)calloc(inlen, sizeof(unsigned char)); - - NSAssert(outbuf, @"Cannot allocate memory for buffer!"); - - if (!EVP_DecryptUpdate(&cCtx, outbuf, &outlen, input, inlen)) - { - NSLog(@"EVP_DecryptUpdate() failed!"); - EVP_CIPHER_CTX_cleanup(&cCtx); - return nil; - } - - if (!EVP_DecryptFinal(&cCtx, outbuf + outlen, &templen)) - { - NSLog(@"EVP_DecryptFinal() failed!"); - EVP_CIPHER_CTX_cleanup(&cCtx); - return nil; - } - - outlen += templen; - EVP_CIPHER_CTX_cleanup(&cCtx); - } - else - { - // Use asymmetric decryption... - - if([self privateKey] == nil) - { - NSLog(@"Cannot decrypt without the private key, which is currently nil"); - return nil; - } - - BIO *privateBIO = NULL; - RSA *privateRSA = NULL; - - if(!(privateBIO = BIO_new_mem_buf((unsigned char*)[[self privateKey] bytes], [[self privateKey] length]))) - { - NSLog(@"BIO_new_mem_buf() failed!"); - return nil; - } - - if(!PEM_read_bio_RSAPrivateKey(privateBIO, &privateRSA, NULL, NULL)) - { - NSLog(@"PEM_read_bio_RSAPrivateKey() failed!"); - return nil; - } - - // RSA_check_key() returns 1 if rsa is a valid RSA key, and 0 otherwise. - - unsigned long check = RSA_check_key(privateRSA); - if(check != 1) - { - NSLog(@"RSA_check_key() failed with result %d!", check); - return nil; - } - - // RSA_size() returns the RSA modulus size in bytes. - // It can be used to determine how much memory must be allocated for an RSA encrypted value. - - outbuf = (unsigned char *)malloc(RSA_size(privateRSA)); - - if(!(outlen = RSA_private_decrypt(inlen, input, outbuf, privateRSA, RSA_PKCS1_PADDING))) - { - NSLog(@"RSA_private_decrypt() failed!"); - return nil; - } - - if(outlen == -1) - { - NSLog(@"Decrypt error: %s (%s)", - ERR_error_string(ERR_get_error(), NULL), - ERR_reason_error_string(ERR_get_error())); - return nil; - } - - if (privateBIO) BIO_free(privateBIO); - if (privateRSA) RSA_free(privateRSA); - } - - // Store the decrypted data as the clear text - [self setClearTextWithData:[NSData dataWithBytes:outbuf length:outlen]]; - - // Release the outbuf, since it was malloc'd - if (outbuf) { - free(outbuf); - } - - return [self clearTextAsData]; -} - -/** - * Verifies (decrypts) the cipher text data using the public key. - * The resulting clear text data is returned. - * - * The resulting clear text data may also be later retrieved with the clearTextAsData or clearTextAsString methods. - **/ -- (NSData *)verify -{ - // If there is no cipher text set, or the cipher text is an empty string (zero length data) - // then there is nothing to decrypt, and we may as well return nil - if(cipherText == nil || [cipherText length] == 0) - { - return nil; - } - - unsigned char *outbuf; - int outlen, inlen; - inlen = [cipherText length]; - unsigned char *input = (unsigned char *)[cipherText bytes]; - - if([self publicKey] == nil) - { - NSLog(@"Cannot verify (decrypt) without the public key, which is currently nil"); - return nil; - } - - BIO *publicBIO = NULL; - RSA *publicRSA = NULL; - - if(!(publicBIO = BIO_new_mem_buf((unsigned char *)[[self publicKey] bytes], [[self publicKey] length]))) - { - NSLog(@"BIO_new_mem_buf() failed!"); - return nil; - } - - if(!PEM_read_bio_RSA_PUBKEY(publicBIO, &publicRSA, NULL, NULL)) - { - NSLog(@"PEM_read_bio_RSA_PUBKEY() failed!"); - return nil; - } - - // RSA_size() returns the RSA modulus size in bytes. - // It can be used to determine how much memory must be allocated for an RSA encrypted value. - - outbuf = (unsigned char *)malloc(RSA_size(publicRSA)); - - if(!(outlen = RSA_public_decrypt(inlen, input, outbuf, publicRSA, RSA_PKCS1_PADDING))) - { - NSLog(@"RSA_public_decrypt() failed!"); - return nil; - } - - if(outlen == -1) - { - NSLog(@"Decrypt error: %s (%s)", - ERR_error_string(ERR_get_error(), NULL), - ERR_reason_error_string(ERR_get_error())); - return nil; - } - - if (publicBIO) BIO_free(publicBIO); - if (publicRSA) RSA_free(publicRSA); - - // Store the decrypted data as the clear text - [self setClearTextWithData:[NSData dataWithBytes:outbuf length:outlen]]; - - // Release the outbuf, since it was malloc'd - if (outbuf) { - free(outbuf); - } - - return [self clearTextAsData]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Encryption methods: -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Peforms encryption, and returns resulting ciper text data. - * If symmetric encryption is being used, performs symmetric encryption using aes128. - * Otherwise, performs encryption using the public key. -**/ -- (NSData *)encrypt -{ - if([self isSymmetric] && [self symmetricKey]) - { - return [self encrypt:@"aes128"]; - } - else if([self publicKey]) - { - return [self encrypt:nil]; - } - else - { - NSLog(@"No symmetric key or public key is set!"); - return nil; - } -} - -/** - * Encrypts the clear text data. - * If symmetric encryption is being used, then the encryption is done using the given cipher. - * Otherwise, asymmetric encryption is used, and the data is encrypted using the public key. - * - * Returns the cipher text data that is the result of the encryption. - * The resulting cipher text data may also be later retrieved with the cipherTextAsData or cipherTextAsString methods. -**/ -- (NSData *)encrypt:(NSString *)cipherName -{ - // If there is no clear text set, or the clear text is an empty string (zero length data) - // then there is nothing to encrypt, and we may as well return nil - if(clearText == nil || [clearText length] == 0) - { - return nil; - } - - unsigned char *input = (unsigned char *)[clearText bytes]; - unsigned char *outbuf, iv[EVP_MAX_IV_LENGTH]; - int outlen, templen, inlen; - inlen = [clearText length]; - - if([self isSymmetric]) - { - // Perform symmetric encryption... - - unsigned char evp_key[EVP_MAX_KEY_LENGTH] = {"\0"}; - EVP_CIPHER_CTX cCtx; - const EVP_CIPHER *cipher; - - if (cipherName){ - cipher = EVP_get_cipherbyname((const char *)[cipherName UTF8String]); - if (!cipher){ - NSLog(@"cannot get cipher with name %@", cipherName); - return nil; - } - } else { - cipher = EVP_bf_cbc(); - if (!cipher){ - NSLog(@"cannot get cipher with name %@", @"EVP_bf_cbc"); - return nil; - } - } - - EVP_BytesToKey(cipher, EVP_md5(), NULL, - [[self symmetricKey] bytes], [[self symmetricKey] length], 1, evp_key, iv); - EVP_CIPHER_CTX_init(&cCtx); - - if (!EVP_EncryptInit(&cCtx, cipher, evp_key, iv)) { - NSLog(@"EVP_EncryptInit() failed!"); - EVP_CIPHER_CTX_cleanup(&cCtx); - return nil; - } - EVP_CIPHER_CTX_set_key_length(&cCtx, EVP_MAX_KEY_LENGTH); - - // The data buffer passed to EVP_EncryptUpdate() should have sufficient room for - // (input_length + cipher_block_size - 1) - - outbuf = (unsigned char *)calloc(inlen + EVP_CIPHER_CTX_block_size(&cCtx) - 1, sizeof(unsigned char)); - NSAssert(outbuf, @"Cannot allocate memory for buffer!"); - - if (!EVP_EncryptUpdate(&cCtx, outbuf, &outlen, input, inlen)) - { - NSLog(@"EVP_EncryptUpdate() failed!"); - EVP_CIPHER_CTX_cleanup(&cCtx); - return nil; - } - if (!EVP_EncryptFinal(&cCtx, outbuf + outlen, &templen)) - { - NSLog(@"EVP_EncryptFinal() failed!"); - EVP_CIPHER_CTX_cleanup(&cCtx); - return nil; - } - outlen += templen; - EVP_CIPHER_CTX_cleanup(&cCtx); - - } - else - { - // Perform asymmetric encryption... - - if([self publicKey] == nil) - { - NSLog(@"Cannot encrypt without the public key, which is currently nil"); - return nil; - } - - BIO *publicBIO = NULL; - RSA *publicRSA = NULL; - - if(!(publicBIO = BIO_new_mem_buf((unsigned char*)[[self publicKey] bytes], [[self publicKey] length]))) - { - NSLog(@"BIO_new_mem_buf() failed!"); - return nil; - } - - if(!PEM_read_bio_RSA_PUBKEY(publicBIO, &publicRSA, NULL, NULL)) - { - NSLog(@"PEM_read_bio_RSA_PUBKEY() failed!"); - return nil; - } - - // RSA_size() returns the RSA modulus size in bytes. - // It can be used to determine how much memory must be allocated for an RSA encrypted value. - - outbuf = (unsigned char *)malloc(RSA_size(publicRSA)); - - if(!(outlen = RSA_public_encrypt(inlen, input, (unsigned char*)outbuf, publicRSA, RSA_PKCS1_PADDING))) - { - NSLog(@"RSA_public_encrypt failed!"); - return nil; - } - - if(outlen == -1) - { - NSLog(@"Encrypt error: %s (%s)", - ERR_error_string(ERR_get_error(), NULL), - ERR_reason_error_string(ERR_get_error())); - return nil; - } - - if (publicBIO) BIO_free(publicBIO); - if (publicRSA) RSA_free(publicRSA); - } - - // Store the encrypted data as the cipher text - [self setCipherText:[NSData dataWithBytes:outbuf length:outlen]]; - - // Release the outbuf, since it was malloc'd - if(outbuf) { - free(outbuf); - } - - return [self cipherTextAsData]; -} - -/** - * Signs (encrypts) the clear text data using the private key. - * The resulting cipher text data is returned, and may later be verified (decrypted) using the public key. - * - * The resulting cipher text data may also be later retrieved with the cipherTextAsData or cipherTextAsString methods. -**/ -- (NSData *)sign -{ - // If there is no clear text set, or the clear text is an empty string (zero length data) - // then there is nothing to encrypt, and we may as well return nil - if(clearText == nil || [clearText length] == 0) - { - return nil; - } - - unsigned char *input = (unsigned char *)[clearText bytes]; - unsigned char *outbuf; - int outlen, inlen; - inlen = [clearText length]; - - if([self privateKey] == nil) - { - NSLog(@"Cannot sign (encrypt) without the private key, which is currently nil"); - return nil; - } - - BIO *privateBIO = NULL; - RSA *privateRSA = NULL; - - if(!(privateBIO = BIO_new_mem_buf((unsigned char*)[[self privateKey] bytes], [[self privateKey] length]))) - { - NSLog(@"BIO_new_mem_buf() failed!"); - return nil; - } - - if(!PEM_read_bio_RSAPrivateKey(privateBIO, &privateRSA, NULL, NULL)) - { - NSLog(@"PEM_read_bio_RSAPrivateKey() failed!"); - return nil; - } - - // RSA_check_key() returns 1 if rsa is a valid RSA key, and 0 otherwise. - - unsigned long check = RSA_check_key(privateRSA); - if(check != 1) - { - NSLog(@"RSA_check_key() failed with result %d!", check); - return nil; - } - - // RSA_size() returns the RSA modulus size in bytes. - // It can be used to determine how much memory must be allocated for an RSA encrypted value. - - outbuf = (unsigned char *)malloc(RSA_size(privateRSA)); - - if(!(outlen = RSA_private_encrypt(inlen, input, (unsigned char*)outbuf, privateRSA, RSA_PKCS1_PADDING))) - { - NSLog(@"RSA_private_encrypt failed!"); - return nil; - } - - if(outlen == -1) - { - NSLog(@"Encrypt error: %s (%s)", - ERR_error_string(ERR_get_error(), NULL), - ERR_reason_error_string(ERR_get_error())); - return nil; - } - - if (privateBIO) BIO_free(privateBIO); - if (privateRSA) RSA_free(privateRSA); - - // Store the encrypted data as the cipher text - [self setCipherText:[NSData dataWithBytes:outbuf length:outlen]]; - - // Release the outbuf, since it was malloc'd - if(outbuf) { - free(outbuf); - } - - return [self cipherTextAsData]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Other methods: -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Description forthcoming... -**/ -- (NSData *)digest:(NSString *)digestName -{ - if(clearText == nil) { - return nil; - } - - unsigned char outbuf[EVP_MAX_MD_SIZE]; - unsigned int templen, inlen; - unsigned char *input=(unsigned char*)[clearText bytes]; - EVP_MD_CTX ctx; - const EVP_MD *digest = NULL; - - inlen = [clearText length]; - - if(inlen==0) - return nil; - if(digestName) { - digest = EVP_get_digestbyname((const char*)[digestName UTF8String]); - if (!digest) { - NSLog(@"cannot get digest with name %@",digestName); - return nil; - } - } else { - digest=EVP_md5(); - if(!digest) { - NSLog(@"cannot get digest with name %@",@"MD5"); - return nil; - } - } - - EVP_MD_CTX_init(&ctx); - EVP_DigestInit(&ctx,digest); - if(!EVP_DigestUpdate(&ctx,input,inlen)) { - NSLog(@"EVP_DigestUpdate() failed!"); - EVP_MD_CTX_cleanup(&ctx); - return nil; - } - if (!EVP_DigestFinal(&ctx, outbuf, &templen)) { - NSLog(@"EVP_DigesttFinal() failed!"); - EVP_MD_CTX_cleanup(&ctx); - return nil; - } - EVP_MD_CTX_cleanup(&ctx); - - return [NSData dataWithBytes:outbuf length:templen]; -} - -- (NSString *)description -{ - NSString *format = @"clearText: %@, cipherText: %@, symmetricKey: %@, publicKey: %@, privateKey: %@"; - NSString *desc = [NSString stringWithFormat:format, [clearText hexdump], [cipherText hexdump], - [symmetricKey hexdump], [publicKey hexdump], [privateKey hexdump]]; - return desc; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Class methods: -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -+ (NSData *)generateRSAPrivateKeyWithLength:(int)length -{ - RSA *key = NULL; - do { - key = RSA_generate_key(length, RSA_F4, NULL, NULL); - } while (1 != RSA_check_key(key)); - - BIO *bio = BIO_new(BIO_s_mem()); - - if (!PEM_write_bio_RSAPrivateKey(bio, key, NULL, NULL, 0, NULL, NULL)) - { - NSLog(@"cannot write private key to memory"); - return nil; - } - if (key) RSA_free(key); - - char *pbio_data = NULL; - int data_len = BIO_get_mem_data(bio, &pbio_data); - NSData *result = [NSData dataWithBytes:pbio_data length:data_len]; - - if (bio) - BIO_free(bio); - - return result; -} - -+ (NSData *)generateRSAPublicKeyFromPrivateKey:(NSData *)privateKey -{ - BIO *privateBIO = NULL; - RSA *privateRSA = NULL; - - if (!(privateBIO = BIO_new_mem_buf((unsigned char*)[privateKey bytes], [privateKey length]))) - { - NSLog(@"BIO_new_mem_buf() failed!"); - return nil; - } - - if (!PEM_read_bio_RSAPrivateKey(privateBIO, &privateRSA, NULL, NULL)) - { - NSLog(@"PEM_read_bio_RSAPrivateKey() failed!"); - return nil; - } - - // RSA_check_key() returns 1 if rsa is a valid RSA key, and 0 otherwise. - - unsigned long check = RSA_check_key(privateRSA); - if (check != 1) - { - NSLog(@"RSA_check_key() failed with result %d!", check); - return nil; - } - - BIO *bio = BIO_new(BIO_s_mem()); - - if (!PEM_write_bio_RSA_PUBKEY(bio, privateRSA)) - { - NSLog(@"cannot write public key to memory"); - return nil; - } - if (privateRSA) RSA_free(privateRSA); - - char *pbio_data = NULL; - int data_len = BIO_get_mem_data(bio, &pbio_data); - NSData *result = [NSData dataWithBytes:pbio_data length:data_len]; - - if (bio) - BIO_free(bio); - - return result; -} - -+ (NSData *)getKeyDataWithLength:(int)length -{ - NSData *randData = nil; - unsigned char *buffer; - - buffer = (unsigned char *)calloc(length*4, sizeof(unsigned char)); - NSAssert((buffer != NULL), @"Cannot calloc memory for buffer."); - - if (!RAND_bytes(buffer, length)){ - free(buffer); - } - - randData = [NSData dataWithBytes:buffer length:length]; - free(buffer); - - return randData; -} - -// PBKDF2 support functions -// Thanks to Chris Benedict (chrisbdaemon@gmail.com) for the code -+ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt -{ - return [SSCrypto getKeyDataWithLength:length fromPassword:pass withSalt:salt withIterations:1000]; -} - -+ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt withIterations:(int)count -{ - NSData *key = nil; - unsigned char *buffer = (unsigned char *)calloc(length, sizeof(unsigned char)); - NSAssert((buffer != NULL), @"Cannot calloc memory for buffer."); - const char *password = [pass UTF8String]; - const char *saltVal = [salt UTF8String]; - - if(!PKCS5_PBKDF2_HMAC_SHA1(password, [pass length], (unsigned char *)saltVal, [salt length], count, length, buffer)) { - return nil; - } - - key = [NSData dataWithBytes:buffer length:length]; - free(buffer); - - return key; -} - -+ (NSData *)getSHA1ForData:(NSData *)d -{ - unsigned length = [d length]; - const void *buffer = [d bytes]; - unsigned char *md = (unsigned char *)calloc(SHA_DIGEST_LENGTH, sizeof(unsigned char)); - NSAssert((md != NULL), @"Cannot calloc memory for buffer."); - - (void)SHA1(buffer, length, md); - - return [NSData dataWithBytesNoCopy:md length:SHA_DIGEST_LENGTH freeWhenDone:YES]; -} - -+ (NSData *)getMD5ForData:(NSData *)d -{ - unsigned length = [d length]; - const void *buffer = [d bytes]; - unsigned char *md = (unsigned char *)calloc(MD5_DIGEST_LENGTH, sizeof(unsigned char)); - NSAssert((md != NULL), @"Cannot calloc memory for buffer."); - - (void)MD5(buffer, length, md); - - return [NSData dataWithBytesNoCopy:md length:MD5_DIGEST_LENGTH freeWhenDone:YES]; -} - -@end diff --git a/Tools/NativeHost/Server.h b/Tools/NativeHost/Server.h deleted file mode 100644 index a11e9d701..000000000 --- a/Tools/NativeHost/Server.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// Server.h -// NativeHost -// -// Created by Francisco Tolmasky on 8/18/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - -@interface Server : NSObject -{ - NSFileHandle * outputFile; - NSFileHandle * errorFile; - NSTask * process; -} - -- (BOOL)start; -- (void)stop; - -@end diff --git a/Tools/NativeHost/Server.m b/Tools/NativeHost/Server.m deleted file mode 100644 index 5439bc967..000000000 --- a/Tools/NativeHost/Server.m +++ /dev/null @@ -1,193 +0,0 @@ -// -// Server.m -// NativeHost -// -// Created by Francisco Tolmasky on 8/18/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "Server.h" -#import "AppController.h" - -#import -#import - -@implementation Server - -- (BOOL)start -{ - NSBundle *mainBundle = [NSBundle mainBundle]; - NSString *serverPath = [mainBundle pathForResource:@"NativeHostServer" ofType:@"" inDirectory:@"Server"]; - - if (!serverPath) - { - return YES; - } - - // find an available port - struct sockaddr_in addr; - int sockfd; - int attempts = 0; - - while (SERVER_PORT == 9191 && attempts++ < 5) - { - // Create a socket - sockfd = socket( AF_INET, SOCK_STREAM, 0 ); - - // Setup its address structure - bzero( &addr, sizeof(struct sockaddr_in)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl( INADDR_ANY ); - addr.sin_port = htons( 0 ); - - // Bind it to an address and port - bind( sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr)); - - // Set it listening for connections - listen( sockfd, 5 ); - - // Find out what port the socket was bound to - socklen_t namelen = sizeof(struct sockaddr_in); - getsockname( sockfd, (struct sockaddr *)&addr, &namelen ); - - if (addr.sin_port <= 1024) - addr.sin_port = 9191; - else - SERVER_PORT = addr.sin_port; - - shutdown(sockfd, 2); - } - - if (SERVER_PASSWORD == nil) - { - CFUUIDRef uuidObj = CFUUIDCreate(nil); - SERVER_PASSWORD = (NSString*)CFUUIDCreateString(nil, uuidObj); - CFRelease(uuidObj); - } - - if (SERVER_USER == nil) - { - CFUUIDRef uuidObj = CFUUIDCreate(nil); - SERVER_USER = (NSString*)CFUUIDCreateString(nil, uuidObj); - CFRelease(uuidObj); - // usernames can't have "-" in them - SERVER_USER = [[SERVER_USER autorelease] stringByReplacingOccurrencesOfString:@"-" withString:@""]; - } - - // setup environment variables - NSDictionary *env = [[[NSProcessInfo processInfo] environment] mutableCopy]; - [env setValue:[mainBundle resourcePath] forKey:@"NATIVEHOST_RESOURCES"]; - [env setValue:[[NSNumber numberWithInt:SERVER_PORT] stringValue] forKey:@"NATIVEHOST_SERVER_PORT"]; - [env setValue:SERVER_USER forKey:@"NATIVEHOST_SERVER_USER"]; - [env setValue:SERVER_PASSWORD forKey:@"NATIVEHOST_SERVER_PASSWORD"]; - - // create pipes for stdout and stderr - NSPipe * outputPipe = [NSPipe pipe]; - outputFile = [outputPipe fileHandleForReading]; - NSPipe * errorPipe = [NSPipe pipe]; - errorFile = [errorPipe fileHandleForReading]; - - // setup the process - process = [[NSTask alloc] init]; - [process setLaunchPath:serverPath]; - [process setStandardOutput:outputPipe]; - [process setStandardError:errorPipe]; - [process setEnvironment:env]; - [env release]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(serverDidTerminate:) - name:NSTaskDidTerminateNotification - object:process]; - - [process launch]; - - BOOL didStartup = NO; - NSData * data = nil; - - while (!didStartup && (data = [outputFile availableData]) && [data length]) - { - NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - if (string) - { - NHLog(@"SERVER-OUT", string); - - didStartup = [string rangeOfString:@"Jack is starting up"].location != NSNotFound; - - [string release]; - } - } - NSLog(@"Server has started."); - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(didReadStdOut:) - name:NSFileHandleReadCompletionNotification - object:outputFile]; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(didReadStdErr:) - name:NSFileHandleReadCompletionNotification - object:errorFile]; - - [outputFile readInBackgroundAndNotify]; - [errorFile readInBackgroundAndNotify]; - - return didStartup; -} - -- (void)stop -{ - [process terminate]; -} - -- (void)didReadStdOut:(NSNotification *)aNotification -{ - NSString * string = [[NSString alloc] initWithData:[[aNotification userInfo] objectForKey:NSFileHandleNotificationDataItem] - encoding:NSASCIIStringEncoding]; - NHLog(@"SERVER-OUT", string); - [string release]; - [outputFile readInBackgroundAndNotify]; -} - -- (void)didReadStdErr:(NSNotification *)aNotification -{ - NSString * string = [[NSString alloc] initWithData:[[aNotification userInfo] objectForKey:NSFileHandleNotificationDataItem] - encoding:NSASCIIStringEncoding]; - NHLog(@"SERVER-ERR", string); - [string release]; - [errorFile readInBackgroundAndNotify]; -} - -- (void)serverDidTerminate:(NSNotification *)note -{ - if ([process terminationStatus] != 0) - { - NSString *appName = [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"]; - if (appName == nil) - appName = [[NSProcessInfo processInfo] processName]; - - if (SERVER_PORT != 9191 && [self start]) - { - NSRunAlertPanel(@"Unexpected Error", - [NSString stringWithFormat:@"%@ was not able to complete the last action you performed. Try again, and report the problem if it continues to occur.", appName], - @"OK", nil, nil); - } - else - { - NSRunAlertPanel(@"Unexpected Error", - [NSString stringWithFormat:@"A fatal error occurred. %@ could not recover and must terminate.", appName], - @"Terminate", nil, nil); - exit(1); - } - } -} - -- (void)dealloc -{ - [process release]; - [super dealloc]; -} - -@end diff --git a/Tools/NativeHost/WebPasteboardProxy.h b/Tools/NativeHost/WebPasteboardProxy.h deleted file mode 100644 index 887b95f4c..000000000 --- a/Tools/NativeHost/WebPasteboardProxy.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// WebPasteboardProxy.h -// NativeHost -// -// Created by Ross Boucher on 12/12/09. -// Copyright 2009 280 North. All rights reserved. -// - -#import - - -@interface WebPasteboardProxy : NSObject -{ - NSPasteboard *pasteboard; -} - -+ (id)pasteboardWithName:(NSString *)aName; - -@end diff --git a/Tools/NativeHost/WebPasteboardProxy.m b/Tools/NativeHost/WebPasteboardProxy.m deleted file mode 100644 index 6eba5c038..000000000 --- a/Tools/NativeHost/WebPasteboardProxy.m +++ /dev/null @@ -1,95 +0,0 @@ -// -// WebPasteboardProxy.m -// NativeHost -// -// Created by Ross Boucher on 12/12/09. -// Copyright 2009 280 North. All rights reserved. -// - -#import "WebPasteboardProxy.h" -#import "WebScripObject+Objective-J.h" -#import "BridgedMethods.h" - -NSMutableDictionary *WebPasteboardDictionary = nil; - -@implementation WebPasteboardProxy - -+ (void)initialize -{ - WebPasteboardDictionary = [[NSMutableDictionary dictionary] retain]; -} - -+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector -{ - return NO; -} - -+ (id)pasteboardWithName:(NSString *)aName -{ - if ([aName isEqual:@"CPGeneralPboard"]) - return [self pasteboardWithName:NSGeneralPboard]; - - id proxy = [WebPasteboardDictionary objectForKey:aName]; - if (!proxy) - { - proxy = [[self alloc] initWithPasteboard:[NSPasteboard pasteboardWithName:aName]]; - [WebPasteboardDictionary setObject:proxy forKey:aName]; - [proxy release]; - } - - return proxy; -} - -- (id)initWithPasteboard:(NSPasteboard *)aPasteboard -{ - if (self = [super init]) - { - pasteboard = [aPasteboard retain]; - } - - return self; -} - -- (void)dealloc -{ - [pasteboard release]; - [super dealloc]; -} - -- (int)changeCount -{ - return [pasteboard changeCount]; -} - -- (void)declareTypes:(WebScriptObject *)args -{ - [pasteboard declareTypes:[BridgedMethods arrayFromWebScriptObject:args] owner:self]; -} - -- (void)addTypes:(WebScriptObject *)args -{ - [pasteboard addTypes:[BridgedMethods arrayFromWebScriptObject:args ] owner:self]; -} - -- (NSArray *)types -{ - return [pasteboard types]; -} - -- (NSString *)stringForType:(NSString *)aType -{ - return [pasteboard stringForType:aType]; -} - -- (void)pasteboard:(NSPasteboard *)aPasteboard provideDataForType:(NSString *)aType -{ - NSString *name = aPasteboard == [NSPasteboard generalPasteboard] ? @"CPGeneralPboard" : [aPasteboard name]; - - NSString *data = [[[NSApp delegate] windowScriptObject] evaluateObjectiveJReturningString: - [NSString stringWithFormat:@"[[CPPasteboard pasteboardWithName:'%@'] stringForType:'%@']", name, aType] - ]; - - [aPasteboard setString:data forType:aType]; -} - -@end diff --git a/Tools/NativeHost/WebScripObject+Objective-J.h b/Tools/NativeHost/WebScripObject+Objective-J.h deleted file mode 100644 index 4b448574d..000000000 --- a/Tools/NativeHost/WebScripObject+Objective-J.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// WebScripObject+Objective-J.h -// NativeHost -// -// Created by Francisco Tolmasky on 9/1/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import -#import - - -@interface WebScriptObject (ObjectiveJ) - -- (id)evaluateObjectiveJ:(NSString *)aString; -- (NSString *)evaluateObjectiveJReturningString:(NSString *)aString; - -- (id)bridgeSelector:(SEL)aSelector; -- (id)bridgeSelector:(SEL)aSelector withObject:(id)anObject; -- (id)bridgeSelector:(SEL)aSelector withObjects:(NSArray *)array; - -@end diff --git a/Tools/NativeHost/WebScripObject+Objective-J.m b/Tools/NativeHost/WebScripObject+Objective-J.m deleted file mode 100644 index d1be2df47..000000000 --- a/Tools/NativeHost/WebScripObject+Objective-J.m +++ /dev/null @@ -1,46 +0,0 @@ -// -// WebScripObject+Objective-J.m -// NativeHost -// -// Created by Francisco Tolmasky on 9/1/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "WebScripObject+Objective-J.h" - - -@implementation WebScriptObject (ObjectiveJ) - -- (id)evaluateObjectiveJ:(NSString *)aString -{ - return [self evaluateWebScript:[NSString stringWithFormat:@"(ObjectiveJ.eval(decodeURIComponent(\"%@\")))", [aString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], nil]]; -} - -- (NSString *)evaluateObjectiveJReturningString:(NSString *)aString -{ - return [self evaluateWebScript:[NSString stringWithFormat:@"String(ObjectiveJ.eval(decodeURIComponent(\"%@\")))", [aString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], nil]]; -} - -- (id)bridgeSelector:(SEL)aSelector -{ - return [self bridgeSelector:aSelector withObjects:nil]; -} - -- (id)bridgeSelector:(SEL)aSelector withObject:(id)anObject -{ - return [self bridgeSelector:aSelector withObjects:[NSArray arrayWithObject:anObject]]; -} - -- (id)bridgeSelector:(SEL)aSelector withObjects:(NSArray *)objects -{ - [self evaluateWebScript:@"objj_object.prototype.__objj_msgSend = function() { return objj_msgSend.apply(null, arguments); }"]; - - NSArray * arguments = [NSArray arrayWithObjects:self, NSStringFromSelector(aSelector), nil]; - - if (objects) - arguments = [arguments arrayByAddingObjectsFromArray:objects]; - - return [self callWebScriptMethod:@"__objj_msgSend" withArguments:arguments]; -} - -@end diff --git a/Tools/NativeHost/WebWindow.h b/Tools/NativeHost/WebWindow.h deleted file mode 100644 index a7feb9fac..000000000 --- a/Tools/NativeHost/WebWindow.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// WebWindow.h -// NativeHost -// -// Created by Francisco Tolmasky on 10/18/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import - - -typedef enum _CPWindowShadowStyle -{ - CPStandardWindowShadowStyle = 0, - CPMenuWindowShadowStyle = 1, - CPPanelWindowShadowStyle = 2, - CPCustomWindowShadowStyle = 3 -} CPWindowShadowStyle; - -@interface WebWindow : NSWindow -{ - NSView * leftMouseDownView; - NSView * rightMouseDownView; - - WebView * webView; - NSView * shadowView; - - BOOL hasShadow; - CPWindowShadowStyle shadowStyle; -} - -+ (WebWindow *)webWindow; - -- (WebView *)webView; - -- (BOOL)hitTest:(NSPoint)aPoint; - -- (BOOL)hasShadow; -- (void)setHasShadow:(BOOL)shouldHaveShadow; - -- (void)setShadowStyle:(CPWindowShadowStyle)aStyle; -- (CPWindowShadowStyle)shadowStyle; - -@end diff --git a/Tools/NativeHost/WebWindow.m b/Tools/NativeHost/WebWindow.m deleted file mode 100644 index 1dc25e4a1..000000000 --- a/Tools/NativeHost/WebWindow.m +++ /dev/null @@ -1,515 +0,0 @@ -// -// WebWindow.m -// NativeHost -// -// Created by Francisco Tolmasky on 10/18/09. -// Copyright 2009 280 North, Inc.. All rights reserved. -// - -#import "WebWindow.h" - - -static NSMutableArray * DisabledWindows; - -CFMachPortRef tap_port; - -CGEventRef headTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) -{ - // It's dangerous to fail in this code: could disable mousedown system-wide. So just try catch it all. - @try - { - if (type == kCGEventLeftMouseDown) - { - CGPoint location = CGEventGetLocation(event); - NSPoint NSLocation = NSMakePoint(location.x, location.y); - - for (NSWindow * window in [NSApp windows]) - { - if ([window isKindOfClass:[WebWindow class]] && ![(WebWindow *)window hitTest:NSLocation]) - { - [window setIgnoresMouseEvents:YES]; - [window performSelector:@selector(setIgnoresMouseEvents:) withObject:NO afterDelay:1.0]; - - [DisabledWindows addObject:window]; - } - } - } - else if (type == kCGEventTapDisabledByTimeout) - CGEventTapEnable(tap_port, YES); - - } - @catch (NSException * anException) - { - } - - return event; -} - - -@interface WebWindowContentView : NSView -{ -} -@end - -@implementation WebWindow - -+ (void)enableAllWindows -{ - [DisabledWindows makeObjectsPerformSelector:@selector(stopIgnoringMouseEvents)]; - [DisabledWindows removeAllObjects]; -} - -+ (void)initialize -{ - if (self != [WebWindow class]) - return; - - DisabledWindows = [[NSMutableArray alloc] init]; - - //| CGEventMaskBit(kCGEventTapDisabledByTimeout) - tap_port = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, - kCGEventTapOptionDefault, - CGEventMaskBit(kCGEventLeftMouseDown), - headTapCallback, NULL); - - if (NULL == tap_port) - { - fprintf(stderr, "Error creating event tap\n"); - return; - } - - /* Create a run loop source from the tap port, add it to my run loop - * and start executing the loop - */ - CFRunLoopSourceRef tap_source = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap_port, 0); - - if (NULL == tap_source) - { - fprintf(stderr, "Error converting port to run loop source\n"); - - if (tap_port != NULL) - CFRelease(tap_port); - - return; - } - - CFRunLoopAddSource(CFRunLoopGetCurrent(), tap_source, kCFRunLoopCommonModes); -} - -- (id)initWithContentRect:(NSRect)aContentRect styleMask:(NSUInteger)windowStyle backing:(NSBackingStoreType)aBufferingType defer:(BOOL)shouldDeferCreation -{ - self = [super initWithContentRect:aContentRect styleMask:NSBorderlessWindowMask backing:aBufferingType defer:shouldDeferCreation]; - - if (self) - { - id delegate = [NSApp delegate]; - - shadowView = [[WebWindowContentView alloc] init]; - - [self setContentView:shadowView]; - - webView = [[WebView alloc] initWithFrame:NSZeroRect]; - - [webView setDrawsBackground:NO]; - [webView setUIDelegate:delegate]; - [webView setFrameLoadDelegate:delegate]; - [webView setResourceLoadDelegate:delegate]; - [webView setPolicyDelegate:delegate]; - [webView setShouldCloseWithWindow:YES]; - - [shadowView addSubview:webView]; - - [self setBackgroundColor:[NSColor clearColor]]; - [self setOpaque:NO]; - [self setIgnoresMouseEvents:NO]; - [self setReleasedWhenClosed:YES]; - [super setHasShadow:NO]; - } - - return self; -} - -- (void)setFrame:(NSRect)aFrame display:(BOOL)shouldDisplay -{ - [webView setFrame:NSMakeRect(33.0, 33.0, NSWidth(aFrame), NSHeight(aFrame))]; - [super setFrame:NSInsetRect(aFrame, -33.0, -33.0) display:YES]; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResizeNotification object:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidBecomeKeyNotification object:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResignKeyNotification object:self]; - - [shadowView release]; - [webView release]; - [super dealloc]; -} - -- (BOOL)canBecomeKeyWindow -{ - // Necessary since this apparently returns NO for borderless windows. - return YES; -} - -- (NSView *)webHitTest:(NSPoint)aPoint -{ - NSPoint locationInWebView = [[self contentView] convertPoint:aPoint fromView:nil]; - - return [(NSView *)[self contentView] hitTest:locationInWebView]; -} - -- (void)sendEvent:(NSEvent *)anEvent -{ - NSInteger type = [anEvent type]; - - if (type == NSLeftMouseDown) - { - NSView * view = [self webHitTest:[anEvent locationInWindow]]; - - leftMouseDownView = view; - - [view mouseDown:anEvent]; - } - - else if (type == NSLeftMouseDragged) - [leftMouseDownView mouseDragged:anEvent]; - - else if (type == NSLeftMouseUp) - [leftMouseDownView mouseUp:anEvent]; - - else if (type == NSRightMouseDown) - { - NSView * view = [self webHitTest:[anEvent locationInWindow]]; - - rightMouseDownView = view; - - [view rightMouseDown:anEvent]; - } - else if (type == NSRightMouseDragged) - [rightMouseDownView rightMouseDragged:anEvent]; - - else if (type == NSRightMouseUp) - [rightMouseDownView rightMouseUp:anEvent]; - - else - [super sendEvent:anEvent]; - - // FIXME: other -} - -// Override this to avoid the beep from unhandled events. -- (void)keyDown:(NSEvent *)anEvent -{ -} - -+ (WebWindow *)webWindow -{ - return [[WebWindow alloc] initWithContentRect:NSZeroRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]; -} - -- (WebView *)webView -{ - return webView; -} - -- (void)updateShadow -{ - [super setHasShadow:hasShadow && shadowStyle == CPCustomWindowShadowStyle]; - [shadowView setNeedsDisplay:YES]; -} - -- (BOOL)hasShadow -{ - return hasShadow; -} - -- (void)setHasShadow:(BOOL)shouldHaveShadow -{ - if (hasShadow == shouldHaveShadow) - return; - - hasShadow = shouldHaveShadow; - - [self updateShadow]; -} - -- (CPWindowShadowStyle)shadowStyle -{ - return shadowStyle; -} - -- (void)setShadowStyle:(CPWindowShadowStyle)aStyle -{ - if (shadowStyle == aStyle) - return; - - shadowStyle = aStyle; - - [self updateShadow]; -} - -- (BOOL)hitTest:(NSPoint)aPoint -{ - NSInteger windowNumber = [[[webView windowScriptObject] valueForKey:@"cpWindowNumber"] intValue]; - -#if LOGGING - WebScriptObject * frame = [[[NSApp delegate] windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"(objj_msgSend(objj_msgSend(CPApp, \"windowWithWindowNumber:\", %d), \"frame\"))", windowNumber]], - * origin = [frame valueForKey:@"origin"], - * size = [frame valueForKey:@"size"]; - - NSLog(@"(%f, %f) in { %f, %f, %f, %f }", aPoint.x, aPoint.y, [[origin valueForKey:@"x"] floatValue], [[origin valueForKey:@"y"] floatValue], [[size valueForKey:@"width"] floatValue], [[size valueForKey:@"height"] floatValue]); -#endif - - return [[[[NSApp delegate] windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"(CGRectContainsPoint(objj_msgSend(objj_msgSend(CPApp, \"windowWithWindowNumber:\", %d), \"frame\"), CGPointMake(%f, %f)))", windowNumber, aPoint.x, aPoint.y]] boolValue]; -} - -- (void)stopIgnoringMouseEvents -{ - [self setIgnoresMouseEvents:NO]; -} - -- (void)becomeKeyWindow -{ - [super becomeKeyWindow]; - - [self updateShadow]; -} - -- (void)resignKeyWindow -{ - [super resignKeyWindow]; - - [self updateShadow]; -} - -@end - -@interface NSImage (Additions) - -- (void)drawInRect:(NSRect)aRect slices:(CGFloat [])slices; - -@end - -@implementation NSImage (Additions) - -- (void)drawInRect:(NSRect)aRect slices:(CGFloat [])slices -{ - NSRect imageBounds = NSMakeRect(0.0, 0.0, [self size].width, [self size].height); - - [self drawInRect:NSMakeRect(0.0, 0.0, slices[0], slices[1]) - fromRect:NSMakeRect(0.0, 0.0, slices[0], slices[1]) - operation:NSCompositeSourceOver - fraction:1.0]; - - [self drawInRect:NSMakeRect(NSMaxX(aRect) - slices[2], 0.0, slices[2], slices[1]) - fromRect:NSMakeRect(NSMaxX(imageBounds) - slices[2], 0.0, slices[2], slices[1]) - operation:NSCompositeSourceOver - fraction:1.0]; - - [self drawInRect:NSMakeRect(0.0, NSMaxY(aRect) - slices[3], slices[0], slices[3]) - fromRect:NSMakeRect(0.0, NSMaxY(imageBounds) - slices[3], slices[0], slices[3]) - operation:NSCompositeSourceOver - fraction:1.0]; - - [self drawInRect:NSMakeRect(NSMaxX(aRect) - slices[2], NSMaxY(aRect) - slices[3], slices[2], slices[3]) - fromRect:NSMakeRect(NSMaxX(imageBounds) - slices[2], NSMaxY(imageBounds) - slices[3], slices[2], slices[3]) - operation:NSCompositeSourceOver - fraction:1.0]; - - [self drawInRect:NSMakeRect(slices[0], 0.0, NSWidth(aRect) - slices[0] - slices[2], slices[1]) - fromRect:NSMakeRect(slices[0], 0.0, 1.0, slices[1]) - operation:NSCompositeSourceOver - fraction:1.0]; - - [self drawInRect:NSMakeRect(0.0, slices[1], slices[0], NSHeight(aRect) - slices[1] - slices[3]) - fromRect:NSMakeRect(0.0, slices[1], slices[0], 1.0) - operation:NSCompositeSourceOver - fraction:1.0]; - - [self drawInRect:NSMakeRect(NSMaxX(aRect) - slices[2], slices[1], slices[2], NSHeight(aRect) - slices[1] - slices[3]) - fromRect:NSMakeRect(NSMaxX(imageBounds) - slices[2], slices[1], slices[2], 1.0) - operation:NSCompositeSourceOver - fraction:1.0]; - - [self drawInRect:NSMakeRect(slices[0], NSMaxY(aRect) - slices[3], NSWidth(aRect) - slices[0] - slices[2], slices[3]) - fromRect:NSMakeRect(slices[0], NSMaxY(imageBounds) - slices[3], 1.0, slices[3]) - operation:NSCompositeSourceOver - fraction:1.0]; -} - -@end - -@implementation WebWindowContentView : NSView -{ -} - -static float OUTlINE_HORIZONTAL_INSET = 33.0; -static float OUTlINE_VERTICAL_INSET = 33.0; - -- (void)drawStandardActiveShadowInRect:(NSRect)aRect -{ - CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; - - CGRect bounds = CGRectInset(*(CGRect *)&aRect, OUTlINE_HORIZONTAL_INSET - 0.5, OUTlINE_VERTICAL_INSET - 0.5); - - CGColorRef shadowColor = CGColorCreateGenericGray(0.0, 0.8); - CGContextSetShadowWithColor (context, CGSizeMake(0.0, -10.0), 100.0, shadowColor); - CGColorRelease(shadowColor); - - CGColorRef fillColor = CGColorCreateGenericGray(1.0, 1.0); - CGColorRef strokeColor = CGColorCreateGenericGray(0.0, 0.2); - - CGContextSetFillColorWithColor(context, fillColor); - CGContextSetStrokeColorWithColor(context, strokeColor); - - CGColorRelease(fillColor); - CGColorRelease(strokeColor); - - CGContextBeginPath(context); - - CGContextAddArc(context, CGRectGetMinX(bounds) + 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI, M_PI_2, YES); - CGContextAddArc(context, CGRectGetMaxX(bounds) - 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI_2, 0, YES); - CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), CGRectGetMinY(bounds)); - CGContextAddLineToPoint(context, CGRectGetMinX(bounds), CGRectGetMinY(bounds)); - - CGContextClosePath(context); - - CGContextDrawPath(context, kCGPathFillStroke); -} - -- (void)drawStandardInactiveShadowInRect:(NSRect)aRect -{ - CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; - - CGRect bounds = CGRectInset(*(CGRect *)&aRect, OUTlINE_HORIZONTAL_INSET - 0.5, OUTlINE_VERTICAL_INSET - 0.5); - - CGColorRef shadowColor = CGColorCreateGenericGray(0.0, 0.5); - CGContextSetShadowWithColor (context, CGSizeMake(0.0, -10.0), 40.0, shadowColor); - CGColorRelease(shadowColor); - - CGColorRef fillColor = CGColorCreateGenericGray(1.0, 1.0); - CGColorRef strokeColor = CGColorCreateGenericGray(0.0, 0.2); - - CGContextSetFillColorWithColor(context, fillColor); - CGContextSetStrokeColorWithColor(context, strokeColor); - - CGColorRelease(fillColor); - CGColorRelease(strokeColor); - - CGContextBeginPath(context); - - CGContextAddArc(context, CGRectGetMinX(bounds) + 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI, M_PI_2, YES); - CGContextAddArc(context, CGRectGetMaxX(bounds) - 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI_2, 0, YES); - CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), CGRectGetMinY(bounds)); - CGContextAddLineToPoint(context, CGRectGetMinX(bounds), CGRectGetMinY(bounds)); - - CGContextClosePath(context); - - CGContextDrawPath(context, kCGPathFillStroke); -} - -- (void)drawMenuShadowInRect:(NSRect)aRect -{ - CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; - - CGRect bounds = CGRectInset(*(CGRect *)&aRect, OUTlINE_HORIZONTAL_INSET - 0.5, OUTlINE_VERTICAL_INSET - 0.5); - - CGColorRef shadowColor = CGColorCreateGenericGray(0.0, 0.5); - CGContextSetShadowWithColor (context, CGSizeMake(0.0, -10.0), 30.0, shadowColor); - CGColorRelease(shadowColor); - - CGColorRef fillColor = CGColorCreateGenericGray(1.0, 1.0); - CGColorRef strokeColor = CGColorCreateGenericGray(0.0, 0.2); - - CGContextSetFillColorWithColor(context, fillColor); - CGContextSetStrokeColorWithColor(context, strokeColor); - - CGColorRelease(fillColor); - CGColorRelease(strokeColor); - - CGContextBeginPath(context); - - CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI, M_PI_2, YES); - CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI_2, 0, YES); - CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 0, 3 * M_PI_2, YES); - CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 3 * M_PI_2, M_PI, YES); - - CGContextClosePath(context); - - CGContextDrawPath(context, kCGPathFill);//Stroke); - -/* - CGContextBeginPath(context); - - CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI, M_PI_2, YES); - CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI_2, 0, YES); - CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 0, 3 * M_PI_2, YES); - CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 3 * M_PI_2, M_PI, YES); - - CGContextClosePath(context); - - CGContextSetFillColorWithColor(context, CGColorGetConstantColor(kCGColorClear)); - - CGContextSetBlendMode(context, kCGBlendModeCopy); - CGContextDrawPath(context, kCGPathFill); -*/ -} - -- (NSImage *)shadowImageWithSelector:(SEL)aSelector -{ - static NSMutableDictionary * images = nil; - - if (!images) - images = [[NSMutableDictionary alloc] init]; - - NSString * name = NSStringFromSelector(aSelector); - NSImage * image = [images objectForKey:name]; - - if (!image) - { - image = [[NSImage alloc] initWithSize:NSMakeSize(100.0, 100.0)]; - - [image lockFocus]; - objc_msgSend(self, aSelector, NSMakeRect(0.0, 0.0, 100.0, 100.0)); - [image unlockFocus]; - - [images setObject:image forKey:name]; - - [image release]; - } - - return image; -} - -- (void)drawShadowWithSelector:(SEL)aSelector inRect:(NSRect)aRect -{ - CGFloat slices[] = { 40.0, 49.0, 40.0, 49.0 }; - - if (NSWidth(aRect) > 100.0 || NSHeight(aRect) > 100.0) - [[self shadowImageWithSelector:aSelector] drawInRect:aRect slices:slices]; - else - objc_msgSend(self, aSelector, aRect); -} - -- (void)drawRect:(NSRect)aRect -{ - WebWindow * window = (WebWindow *)[self window]; - NSRect bounds = [self bounds]; - - if (![window hasShadow]) - return; - - if ([window shadowStyle] == CPStandardWindowShadowStyle) - if ([window isKeyWindow]) - return [self drawShadowWithSelector:@selector(drawStandardActiveShadowInRect:) inRect:bounds]; - else - return [self drawShadowWithSelector:@selector(drawStandardInactiveShadowInRect:) inRect:bounds]; - - - if ([window shadowStyle] == CPMenuWindowShadowStyle) - return [self drawShadowWithSelector:@selector(drawMenuShadowInRect:) inRect:bounds]; -} - -@end - diff --git a/Tools/NativeHost/icon.icns b/Tools/NativeHost/icon.icns deleted file mode 100644 index cd9ecb6bb..000000000 Binary files a/Tools/NativeHost/icon.icns and /dev/null differ diff --git a/Tools/NativeHost/main.m b/Tools/NativeHost/main.m deleted file mode 100644 index 2a040439e..000000000 --- a/Tools/NativeHost/main.m +++ /dev/null @@ -1,23 +0,0 @@ -// -// main.m -// NativeHost -// -// Created by Francisco Tolmasky on 5/24/09. -// Copyright 280 North, Inc. 2009. All rights reserved. -// - -#import -#import "Application.h" - -int interactive = 0; - -int main(int argc, char *argv[]) -{ - if (argc > 1 && strcmp(argv[1], "-i") == 0) { - interactive = 1; - } - - [Application sharedApplication]; - - return NSApplicationMain(argc, (const char **) argv); -} diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj index 350946963..59d960f67 100644 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj +++ b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj @@ -31,8 +31,6 @@ 6841F2461AF98CE600CFE60E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6841F2451AF98CE600CFE60E /* Images.xcassets */; }; 6841F26C1AF98DDD00CFE60E /* mod_pbxproj.py in Resources */ = {isa = PBXBuildFile; fileRef = 6841F2691AF98DDD00CFE60E /* mod_pbxproj.py */; }; 6841F26E1AF98DDD00CFE60E /* pbxprojModifier.py in Resources */ = {isa = PBXBuildFile; fileRef = 6841F26B1AF98DDD00CFE60E /* pbxprojModifier.py */; }; - 6841F27C1AF990C300CFE60E /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 6841F27A1AF990C300CFE60E /* Debug.xcconfig */; }; - 6841F27D1AF990C300CFE60E /* Release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 6841F27B1AF990C300CFE60E /* Release.xcconfig */; }; 6841F2A51AF9932300CFE60E /* project.pbxproj in Resources */ = {isa = PBXBuildFile; fileRef = 6841F28A1AF9932300CFE60E /* project.pbxproj */; }; 6841F2B71AFA83D500CFE60E /* XCCUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 6841F2B61AFA83D500CFE60E /* XCCUserDefaults.m */; }; 6841F2BF1AFA965300CFE60E /* XCCTaskLauncher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6841F2BE1AFA965300CFE60E /* XCCTaskLauncher.m */; }; @@ -324,7 +322,7 @@ 6841F2331AF98CE600CFE60E /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0630; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "cappuccino-project"; TargetAttributes = { 6841F23A1AF98CE600CFE60E = { @@ -364,10 +362,8 @@ 021B94671B20D1F800F12DDA /* OperationsView.xib in Resources */, 021B94711B20E31F00F12DDA /* SettingsView.xib in Resources */, 0258004B1B1E67090000EB7D /* supawhich in Resources */, - 6841F27C1AF990C300CFE60E /* Debug.xcconfig in Resources */, 6841F26E1AF98DDD00CFE60E /* pbxprojModifier.py in Resources */, 6841F2A51AF9932300CFE60E /* project.pbxproj in Resources */, - 6841F27D1AF990C300CFE60E /* Release.xcconfig in Resources */, 0257A65B1B3A2B0000015C1F /* MainMenu.xib in Resources */, 6841F26C1AF98DDD00CFE60E /* mod_pbxproj.py in Resources */, 021B94691B20D6FC00F12DDA /* ErrorsView.xib in Resources */, @@ -437,8 +433,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -447,6 +445,7 @@ DEPLOYMENT_LOCATION = YES; DSTROOT = /; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -462,7 +461,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -483,8 +482,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -502,7 +503,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; @@ -518,6 +519,7 @@ INFOPLIST_FILE = XcodeCapp/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_BUNDLE_IDENTIFIER = org.cappuccino.xcodecapp; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -532,6 +534,7 @@ INFOPLIST_FILE = XcodeCapp/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_BUNDLE_IDENTIFIER = org.cappuccino.xcodecapp; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/Tools/XcodeCapp/XcodeCapp/AppDelegate.h b/Tools/XcodeCapp/XcodeCapp/AppDelegate.h index 0681f4678..cc9a28653 100644 --- a/Tools/XcodeCapp/XcodeCapp/AppDelegate.h +++ b/Tools/XcodeCapp/XcodeCapp/AppDelegate.h @@ -32,4 +32,4 @@ - (IBAction)openAbout:(id)aSender; - (IBAction)openPreferences:(id)aSender; -@end \ No newline at end of file +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Base.lproj/MainMenu.xib b/Tools/XcodeCapp/XcodeCapp/Base.lproj/MainMenu.xib index 197b1cbb8..61be0ea93 100644 --- a/Tools/XcodeCapp/XcodeCapp/Base.lproj/MainMenu.xib +++ b/Tools/XcodeCapp/XcodeCapp/Base.lproj/MainMenu.xib @@ -1,9 +1,9 @@ - + - + @@ -55,6 +55,12 @@ + + + + + + @@ -72,12 +78,6 @@ - - - - - - @@ -380,7 +380,6 @@ - @@ -404,7 +403,6 @@ - @@ -417,16 +415,13 @@ - - - @@ -434,7 +429,6 @@ - @@ -448,7 +442,6 @@ - - @@ -513,7 +499,6 @@ - @@ -537,19 +522,15 @@ - - @@ -562,7 +543,6 @@ - - - @@ -616,7 +592,6 @@ - @@ -624,7 +599,6 @@ - @@ -637,7 +611,6 @@ - @@ -648,9 +621,7 @@ - - @@ -664,7 +635,6 @@ - - - - - - diff --git a/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectController.m b/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectController.m index 28aaff1b1..9d90bbc43 100644 --- a/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectController.m +++ b/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectController.m @@ -43,7 +43,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { XCCCappuccinoProjectController *controller = (__bridge XCCCappuccinoProjectController *)userData; NSArray *paths = (__bridge NSArray *)eventPaths; - + [controller _handleFSEventsWithPaths:paths flags:eventFlags ids:eventIds]; } @@ -64,11 +64,11 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n self.cappuccinoProject = [[XCCCappuccinoProject alloc] initWithPath:aPath]; self.mainXcodeCappController = aController; self->sourceProcessingOperations = [@{} mutableCopy]; - self->operationQueue = [[NSApp delegate] mainOperationQueue]; - + self->operationQueue = [((AppDelegate *)[NSApp delegate]) mainOperationQueue]; + [self _reinitializeProjectController]; } - + return self; } @@ -83,16 +83,16 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n - (void)_reinitializeTaskLauncher { NSArray *binaryPaths = @[]; - + if ([self.cappuccinoProject.binaryPaths count]) binaryPaths = [self.cappuccinoProject.binaryPaths valueForKeyPath:@"name"]; - + self->taskLauncher = [[XCCTaskLauncher alloc] initWithEnvironmentPaths:binaryPaths]; - + if (!self->taskLauncher.isValid) { [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; - + NSRunAlertPanel( self.cappuccinoProject.nickname, @"XcodeCapp was unable to find all necessary executables in your environment:\n\n" @@ -102,7 +102,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n nil, nil, [self->taskLauncher.executables componentsJoinedByString:@", "]); - + [self _reinitializeProjectController]; } } @@ -183,7 +183,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n BOOL projectExists, projectIsDirectory; projectExists = [fm fileExistsAtPath:self.cappuccinoProject.XcodeProjectPath isDirectory:&projectIsDirectory]; - + BOOL supportExists, supportIsDirectory; supportExists = [fm fileExistsAtPath:self.cappuccinoProject.supportPath isDirectory:&supportIsDirectory]; @@ -197,43 +197,43 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n - (BOOL)_isXcodeSupportCompatible { double appCompatibilityVersion = [[[NSBundle mainBundle] objectForInfoDictionaryKey:XCCCompatibilityVersionKey] doubleValue]; - + NSNumber *projectCompatibilityVersion = @([self.cappuccinoProject.version intValue]); - + if (projectCompatibilityVersion == nil) { NSLog(@"No compatibility version in project"); return NO; } - + NSLog(@"XcodeCapp/project compatibility version: %0.1f/%0.1f", projectCompatibilityVersion.doubleValue, appCompatibilityVersion); - + return projectCompatibilityVersion.doubleValue >= appCompatibilityVersion; } - (void)_createXcodeProject { [self _removeXcodeProject]; - + NSFileManager *fm = [NSFileManager defaultManager]; - + [fm createDirectoryAtPath:self.cappuccinoProject.XcodeProjectPath withIntermediateDirectories:YES attributes:nil error:nil]; - + NSString *pbxPath = [self.cappuccinoProject.XcodeProjectPath stringByAppendingPathComponent:@"project.pbxproj"]; - + [fm copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"project" ofType:@"pbxproj"] toPath:pbxPath error:nil]; - + NSMutableString *content = [NSMutableString stringWithContentsOfFile:pbxPath encoding:NSUTF8StringEncoding error:nil]; - + [content writeToFile:pbxPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; - + NSLog(@"Xcode support project created at: %@", self.cappuccinoProject.XcodeProjectPath); } - (void)_removeXcodeProject { NSFileManager *fm = [NSFileManager defaultManager]; - + if ([fm fileExistsAtPath:self.cappuccinoProject.XcodeProjectPath]) [fm removeItemAtPath:self.cappuccinoProject.XcodeProjectPath error:nil]; } @@ -241,20 +241,20 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n - (void)_createXcodeSupportDirectory { [self _removeXcodeSupportDirectory]; - + [[NSFileManager defaultManager] createDirectoryAtPath:self.cappuccinoProject.supportPath withIntermediateDirectories:YES attributes:nil error:nil]; - + [self.cappuccinoProject saveSettings]; - + NSLog(@".XcodeSupport directory created at: %@", self.cappuccinoProject.supportPath); } - (void)_removeXcodeSupportDirectory { [XcodeProjectCloser closeXcodeProjectForProject:self.cappuccinoProject.projectPath]; - + NSFileManager *fm = [NSFileManager defaultManager]; - + if ([fm fileExistsAtPath:self.cappuccinoProject.supportPath]) [fm removeItemAtPath:self.cappuccinoProject.supportPath error:nil]; } @@ -272,13 +272,13 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n NSArray *subpaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.cappuccinoProject.supportPath error:nil]; NSMutableArray *orphanFiles = [@[] mutableCopy]; NSFileManager *fm = [NSFileManager defaultManager]; - + for (NSString *path in subpaths) { if ([XCCCappuccinoProject isHeaderFile:path] && ![path.lastPathComponent isEqualToString:@"xcc_general_include.h"]) { NSString *sourcePath = [self.cappuccinoProject sourcePathForShadowPath:path]; - + if (![fm fileExistsAtPath:sourcePath]) [orphanFiles addObject:sourcePath]; } @@ -291,15 +291,15 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n NSString *shadowBasePath = [self.cappuccinoProject shadowBasePathForProjectSourcePath:sourcePath]; NSString *shadowHeaderPath = [shadowBasePath stringByAppendingPathExtension:@"h"]; NSString *shadowImplementationPath = [shadowBasePath stringByAppendingPathExtension:@"m"]; - + [fm removeItemAtPath:shadowHeaderPath error:nil]; [fm removeItemAtPath:shadowImplementationPath error:nil]; - + [self removeOperationErrorsRelatedToSourcePath:sourcePath errorType:XCCDefaultOperationErrorType]; [pathsToRemove addObject:sourcePath]; } - + [self.mainXcodeCappController.errorsViewController reload]; if (self->pendingPBXOperation) @@ -329,14 +329,14 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n - (void)_updateXcodeSupportFilesWithRenamedDirectories:(NSArray *)directories { NSLog(@"Renamed directories: %@", directories); - + NSFileManager *fm = [NSFileManager defaultManager]; - + for (NSString *directory in directories) { if ([directory isEqualToString:self.cappuccinoProject.projectPath]) continue; - + if ([fm fileExistsAtPath:directory]) { if ([directory hasPrefix:self.cappuccinoProject.projectPath]) @@ -549,7 +549,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { if (![self _doesNotificationBelongToCurrentProject:note]) return; - + [self operationDidEnd:note.object type:note.name userInfo:note.userInfo]; } @@ -560,17 +560,17 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { if (!operationError.fileName) operationError.fileName = @"/No Filename"; - + [self willChangeValueForKey:@"errors"]; - + if (!self.errors[operationError.fileName]) self.errors[operationError.fileName] = [@[] mutableCopy]; - + [self.errors[operationError.fileName] addObject:operationError]; - + [self didChangeValueForKey:@"errors"]; self.numberOfErrors++; - + [self _notifyUserWithOperationError:operationError]; } @@ -578,14 +578,14 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { if (!operationError.fileName) operationError.fileName = @"/No Filename"; - + [self willChangeValueForKey:@"errors"]; - + [self.errors[operationError.fileName] removeObject:operationError]; - + if (![self.errors[operationError.fileName] count]) [self.errors removeObjectForKey:operationError.fileName]; - + [self didChangeValueForKey:@"errors"]; self.numberOfErrors--; } @@ -601,11 +601,11 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n - (void)removeOperationErrorsRelatedToSourcePath:(NSString *)aPath errorType:(int)anErrorType { NSMutableArray *errorsToRemove = [@[] mutableCopy]; - + for (XCCOperationError *operationError in self.errors[aPath]) if ([operationError.fileName isEqualToString:aPath] && (operationError.errorType == anErrorType || anErrorType == XCCDefaultOperationErrorType)) [errorsToRemove addObject:operationError]; - + for (XCCOperationError *error in errorsToRemove) [self removeOperationError:error]; } @@ -619,11 +619,11 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { if (numberOfErrors == _numberOfErrors) return; - + [self willChangeValueForKey:@"numberOfErrors"]; _numberOfErrors = numberOfErrors; [self didChangeValueForKey:@"numberOfErrors"]; - + if (!_numberOfErrors) self.errorsCountString = @""; else @@ -882,9 +882,9 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n NSMutableArray *modifiedPaths = [@[] mutableCopy]; NSMutableArray *renamedDirectories = [@[] mutableCopy]; NSFileManager *fm = [NSFileManager defaultManager]; - + BOOL needUpdate = NO; - + for (size_t i = 0; i < paths.count; ++i) { FSEventStreamEventFlags flags = eventFlags[i]; @@ -896,27 +896,27 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n if (rootChanged || needRescan) { NSLog(@"Watched path changed: %@", path); - + [self _handleProjectPathChange:path]; return; } BOOL isHistoryDoneSentinalEvent = (flags & kFSEventStreamEventFlagHistoryDone) != 0; - + if (isHistoryDoneSentinalEvent) { NSLog(@"History done sentinal event"); continue; } - + BOOL isMountEvent = (flags & kFSEventStreamEventFlagMount) || (flags & kFSEventStreamEventFlagUnmount); - + if (isMountEvent) { NSLog(@"Volume %@: %@", (flags & kFSEventStreamEventFlagMount) ? @"mounted" : @"unmounted", path); continue; } - + BOOL inodeMetaModified = (flags & kFSEventStreamEventFlagItemInodeMetaMod) != 0; BOOL isFile = (flags & kFSEventStreamEventFlagItemIsFile) != 0; @@ -926,21 +926,21 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n BOOL modified = (flags & kFSEventStreamEventFlagItemModified) != 0; BOOL created = (flags & kFSEventStreamEventFlagItemCreated) != 0; BOOL removed = (flags & kFSEventStreamEventFlagItemRemoved) != 0; - + if (isDir) { if (created && [path isEqualToString:self.cappuccinoProject.projectPath.stringByResolvingSymlinksInPath]) return; - + if ((renamed || created || removed) && ![XCCCappuccinoProject shouldIgnoreDirectoryNamed:path.lastPathComponent] && ![XCCCappuccinoProject pathMatchesIgnoredPaths:path cappuccinoProjectIgnoredPathPredicates:self.cappuccinoProject.ignoredPathPredicates]) { NSLog(@"Renamed directory: %@", path); - + [renamedDirectories addObject:path]; } - + continue; } else if ((isFile || isSymlink) && @@ -957,27 +957,27 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { // If a xib is deleted, delete its cib. There is no need to update when a xib is deleted, // it is inside a folder in Xcode, which updates automatically. - + if (![fm fileExistsAtPath:path]) { NSString *cibPath = [path.stringByDeletingPathExtension stringByAppendingPathExtension:@"cib"]; - + if ([fm fileExistsAtPath:cibPath]) [fm removeItemAtPath:cibPath error:nil]; - + continue; } } - + needUpdate = YES; } else if ((isFile || isSymlink) && (renamed || removed) && !(modified || created) && [XCCCappuccinoProject isCibFile:path]) { NSLog(@"FSEvent accepted: %@ (%@)", path, [XCCFSEventLogUtils dumpFSEventFlags:flags]); - + // If a cib is deleted, mark its xib as needing update so the cib is regenerated NSString *xibPath = [path.stringByDeletingPathExtension stringByAppendingPathExtension:@"xib"]; - + if ([fm fileExistsAtPath:xibPath]) { [modifiedPaths addObject:xibPath]; @@ -993,7 +993,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n [self.cappuccinoProject reloadXcodeCappIgnoreFile]; } } - + // If directories were renamed, we take the easy way out and reset the project if (renamedDirectories.count) [self _updateXcodeSupportFilesWithRenamedDirectories:renamedDirectories]; @@ -1015,9 +1015,9 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; NSString *app, *type; - + BOOL success = [workspace getInfoForFile:filePath application:&app type:&type]; - + return success ? app : nil; } @@ -1032,14 +1032,14 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { if (!applicationIdentifier) return; - + NSFileManager *fm = [NSFileManager defaultManager]; NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; NSBundle *bundle = [NSBundle bundleWithPath:applicationIdentifier]; NSString *identifier = bundle.bundleIdentifier; NSString *executablePath = nil; XCCLineSpecifier lineSpecifier = kLineSpecifierNone; - + if ([identifier hasPrefix:@"com.sublimetext."]) { lineSpecifier = kLineSpecifierColon; @@ -1086,34 +1086,34 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n { executablePath = [[bundle bundlePath] stringByAppendingPathComponent:@"Contents/Developer/usr/bin/xed"]; } - + if (!executablePath || ![fm isExecutableFileAtPath:executablePath]) { [workspace openFile:path]; return; } - + NSArray *args; - + switch (lineSpecifier) { case kLineSpecifierNone: args = @[path]; break; - + case kLineSpecifierColon: args = @[[NSString stringWithFormat:@"%1$@:%2$ld", path, line]]; break; - + case kLineSpecifierMinusL: args = @[@"-l", [NSString stringWithFormat:@"%ld", line], path]; break; - + case kLineSpecifierPlus: args = @[[NSString stringWithFormat:@"+%ld", line], path]; break; } - + [self->taskLauncher runTaskWithCommand:executablePath arguments:args returnType:kTaskReturnTypeNone]; } @@ -1128,7 +1128,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n note.actionButtonTitle = @"Show"; note.otherButtonTitle = @"Close"; note.userInfo = @{@"cappuccinoProjectPath" : self.cappuccinoProject.projectPath, @"sourcePath": anOperationError.fileName}; - + [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:note]; } @@ -1138,7 +1138,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n - (void)reinitializeProjectFromSettings { NSLog(@"Saving Cappuccino configuration project %@", self.cappuccinoProject.projectPath); - + [self _cancelAllProjectRelatedOperations]; [self.cappuccinoProject saveSettings]; @@ -1196,26 +1196,26 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n BOOL isOpened = YES; NSFileManager *fm = [NSFileManager defaultManager]; BOOL exists = [fm fileExistsAtPath:self.cappuccinoProject.XcodeProjectPath isDirectory:&isDirectory]; - + if (exists && isDirectory) { NSLog(@"Opening Xcode project at: %@", self.cappuccinoProject.XcodeProjectPath); - + isOpened = [[NSWorkspace sharedWorkspace] openFile:self.cappuccinoProject.XcodeProjectPath]; } - + if (!exists || !isDirectory || !isOpened) { NSString *text; - + if (!isOpened) text = @"The project exists, but failed to open."; else text = [NSString stringWithFormat:@"%@ %@.", self.cappuccinoProject.XcodeProjectPath, !exists ? @"does not exist" : @"is not an Xcode project"]; - + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; NSInteger response = NSRunAlertPanel(@"The project could not be opened.", @"%@\n\nWould you like to regenerate the project?", @"Yes", @"No", nil, text); - + if (response == NSAlertFirstButtonReturn) [self resetProject:self]; } @@ -1231,7 +1231,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n NSFileManager *fm = [NSFileManager defaultManager]; NSArray *contents = [fm contentsOfDirectoryAtPath:self.cappuccinoProject.projectPath error:nil]; NSString *firstObjjFile; - + for (NSString *file in contents) { if ([[file pathExtension] isEqualToString:@"j"]) @@ -1240,15 +1240,15 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n break; } } - + if (!firstObjjFile) return; - + NSString *applicationIdentifier = [self _managingApplicationIdenfierForFilePath:[self.cappuccinoProject.projectPath stringByAppendingPathComponent:firstObjjFile]]; - + if (!applicationIdentifier) return; - + [self launchEditorForPath:self.cappuccinoProject.projectPath line:0 applicationIdentifier:applicationIdentifier]; } @@ -1268,5 +1268,3 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n } @end - - diff --git a/Tools/XcodeCapp/XcodeCapp/XCCSourceProcessingOperation.m b/Tools/XcodeCapp/XcodeCapp/XCCSourceProcessingOperation.m index 7e02e0732..382f7756b 100644 --- a/Tools/XcodeCapp/XcodeCapp/XCCSourceProcessingOperation.m +++ b/Tools/XcodeCapp/XcodeCapp/XCCSourceProcessingOperation.m @@ -90,10 +90,15 @@ NSString * const XCCNib2CibDidEndNotification = @"XCCNib2C } - (NSDictionary*)_launchTaskWithCommand:(NSString*)aCommand arguments:(NSArray*)arguments +{ + return [self _launchTaskWithCommand:aCommand arguments:arguments currentDirectoryPath:nil]; +} + +- (NSDictionary*)_launchTaskWithCommand:(NSString*)aCommand arguments:(NSArray*)arguments currentDirectoryPath:(NSString *)aDirectory { NSLog(@"Running processing task: %@ on file: %@", aCommand, self.sourcePath); - self->task = [self->taskLauncher taskWithCommand:aCommand arguments:arguments]; + self->task = [self->taskLauncher taskWithCommand:aCommand arguments:arguments currentDirectoryPath:aDirectory]; [self _updateOperationInformation]; @@ -125,7 +130,7 @@ NSString * const XCCNib2CibDidEndNotification = @"XCCNib2C [self dispatchNotificationName:XCCNib2CibDidStartNotification]; NSArray *arguments = @[@"--no-colors", self.sourcePath]; - NSDictionary *result = [self _launchTaskWithCommand:@"nib2cib" arguments:arguments]; + NSDictionary *result = [self _launchTaskWithCommand:@"nib2cib" arguments:arguments currentDirectoryPath:self.cappuccinoProject.projectPath]; int code = [result[@"status"] intValue]; if (code != 0) diff --git a/Tools/capp/Resources/Templates/NibApplication/Jakefile b/Tools/capp/Resources/Templates/NibApplication/Jakefile index a25464947..fd053cf00 100644 --- a/Tools/capp/Resources/Templates/NibApplication/Jakefile +++ b/Tools/capp/Resources/Templates/NibApplication/Jakefile @@ -82,18 +82,6 @@ task ("deploy", ["release"], function() printResults("Deployment") }); -task ("desktop", ["release"], function() -{ - FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); - require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "__project.nameasidentifier__.app")); - printResults("Desktop") -}); - -task ("run-desktop", ["desktop"], function() -{ - OS.system([FILE.join("Build", "Desktop", projectName, "__project.nameasidentifier__.app", "Contents", "MacOS", "NativeHost"), "-i"]); -}); - function printResults(configuration) { print("----------------------------"); diff --git a/Tools/capp_env/capp_env b/Tools/capp_env/capp_env index 66ce4e65d..519cf1972 100755 --- a/Tools/capp_env/capp_env +++ b/Tools/capp_env/capp_env @@ -75,7 +75,7 @@ def install_cappuccino_base(env_path): """ Install latest version of Cappuccino Base """ - exec_shell("curl https://raw.githubusercontent.com/cappuccino/cappuccino/v0.9.7-1/bootstrap.sh >/tmp/cb.sh") + exec_shell("curl https://raw.githubusercontent.com/cappuccino/cappuccino/master/bootstrap.sh >/tmp/cb.sh") exec_shell("bash /tmp/cb.sh --directory '%s/narwhal' --noprompt" % (env_path)) exec_shell("rm /tmp/cb.sh") diff --git a/Tools/nib2cib/Converter.j b/Tools/nib2cib/Converter.j index 09407a086..19db97fee 100644 --- a/Tools/nib2cib/Converter.j +++ b/Tools/nib2cib/Converter.j @@ -165,9 +165,9 @@ ConverterConversionException = @"ConverterConversionException"; if (system.engine === "rhino") plistContents = String(java.lang.String(plistContents).replaceAll("\\\\s*CF\\$UID\\s*\\<\/key\\>", "CP\\$UID")); else - plistContents = plistContents.replace(/\\s*CF\$UID\s*\<\/key\>/g, "CP$UID"); + plistContents = plistContents.replace(new RegExp("\\\\s*CF\\$UID\\s*\\<\\/key\\>", "g"), "CP$UID"); - plistContents = plistContents.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]<\/string>/g, function(c) + plistContents = plistContents.replace(new RegExp("[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]<\\/string>", "g"), function(c) { CPLog.warn("Warning: converting character 0x" + c.charCodeAt(8).toString(16) + " to base64 representation"); return "" + CFData.encodeBase64String(c.charAt(8)) + ""; diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index 812a94d5a..5962f4c6b 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -45,6 +45,7 @@ @import "NSImage.j" @import "NSImageView.j" @import "NSLayoutConstraint.j" +@import "NSLayoutManager.j" @import "NSLevelIndicator.j" @import "NSLocalizableString.j" @import "NSMatrix.j" @@ -54,6 +55,7 @@ @import "NSNibConnector.j" @import "NSObjectController.j" @import "NSOutlineView.j" +@import "NSParagraphStyle.j" @import "NSPopUpButton.j" @import "NSPredicateEditor.j" @import "NSResponder.j" @@ -73,7 +75,12 @@ @import "NSTableView.j" @import "NSTabView.j" @import "NSTabViewItem.j" +@import "NSText.j" +@import "NSTextContainer.j" @import "NSTextField.j" +@import "NSTextStorage.j" +@import "NSTextView.j" +@import "NSTextViewSharedData.j" @import "NSTokenField.j" @import "NSToolbar.j" @import "NSToolbarFlexibleSpaceItem.j" @@ -92,7 +99,6 @@ @import "NSAppearance.j" @import "NSVisualEffectView.j" - function CP_NSMapClassName(aClassName) { if (aClassName.indexOf("NS") === 0) diff --git a/Tools/nib2cib/NSAttributedString.j b/Tools/nib2cib/NSAttributedString.j index 0f4c86695..166dc2088 100644 --- a/Tools/nib2cib/NSAttributedString.j +++ b/Tools/nib2cib/NSAttributedString.j @@ -40,5 +40,7 @@ @implementation NSMutableAttributedString : NSAttributedString { + } + @end diff --git a/Tools/nib2cib/NSLayoutManager.j b/Tools/nib2cib/NSLayoutManager.j new file mode 100644 index 000000000..eb3e3f56c --- /dev/null +++ b/Tools/nib2cib/NSLayoutManager.j @@ -0,0 +1,63 @@ +/* + * NSText.j + * nib2cib + * + * Created by Alexendre Wilhelm. + * Copyright 2014 The Cappuccino Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@class Nib2Cib + +@implementation CPLayoutManager (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + _textStorage = [aCoder decodeObjectForKey:@"NSTextStorage"]; + [_textStorage addLayoutManager:self]; + + return self; +} + +@end + +@implementation NSLayoutManager : CPLayoutManager +{ + +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self NS_initWithCoder:aCoder]; + + if (self) + { + + } + + return self; +} + +- (Class)classForKeyedArchiver +{ + return [CPLayoutManager class]; +} + +@end diff --git a/Tools/nib2cib/NSParagraphStyle.j b/Tools/nib2cib/NSParagraphStyle.j new file mode 100644 index 000000000..420735706 --- /dev/null +++ b/Tools/nib2cib/NSParagraphStyle.j @@ -0,0 +1,66 @@ +/* + * NSParagraphStyle.j + * nib2cib + * + * Created by Alexendre Wilhelm. + * Copyright 2014 The Cappuccino Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@class Nib2Cib + +@implementation CPParagraphStyle (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + return self; +} + +@end + +@implementation NSParagraphStyle : CPParagraphStyle +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self NS_initWithCoder:aCoder]; + + if (self) + { + _alignment = [aCoder decodeIntForKey:@"NSAlignment"]; + _firstLineHeadIndent = [aCoder decodeIntForKey:@"NSFirstLineHeadIndent"]; + _headIndent = [aCoder decodeIntForKey:@"NSHeadIndent"]; + _lineSpacing = [aCoder decodeIntForKey:@"NSLineSpacing"]; + _maximumLineHeight = [aCoder decodeIntForKey:@"NSMaxLineHeight"]; + _minimumLineHeight = [aCoder decodeIntForKey:@"NSMinLineHeight"]; + _paragraphSpacing = [aCoder decodeIntForKey:@"NSParagraphSpacing"]; + _tailIndent = [aCoder decodeIntForKey:@"NSTailIndent"]; + } + + return self; +} + +- (Class)classForKeyedArchiver +{ + return [CPParagraphStyle class]; +} + +@end \ No newline at end of file diff --git a/Tools/nib2cib/NSText.j b/Tools/nib2cib/NSText.j new file mode 100644 index 000000000..9aa4c1c43 --- /dev/null +++ b/Tools/nib2cib/NSText.j @@ -0,0 +1,61 @@ +/* + * NSText.j + * nib2cib + * + * Created by Alexendre Wilhelm. + * Copyright 2014 The Cappuccino Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@class Nib2Cib + +@implementation CPText (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + if (self = [super NS_initWithCoder:aCoder]) + { + } + + return self; +} + +@end + +@implementation NSText : CPText +{ + +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self NS_initWithCoder:aCoder]; + + if (self) + { + } + + return self; +} + +- (Class)classForKeyedArchiver +{ + return [CPText class]; +} + +@end diff --git a/Tools/nib2cib/NSTextContainer.j b/Tools/nib2cib/NSTextContainer.j new file mode 100644 index 000000000..eb21910a0 --- /dev/null +++ b/Tools/nib2cib/NSTextContainer.j @@ -0,0 +1,64 @@ +/* + * NSTextContainer.j + * nib2cib + * + * Created by Alexendre Wilhelm. + * Copyright 2014 The Cappuccino Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@class Nib2Cib + +@implementation CPTextContainer (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + _size = CGSizeMake([aCoder decodeIntForKey:@"NSWidth"], 1e7); + + _layoutManager = [aCoder decodeObjectForKey:@"NSLayoutManager"]; + [_layoutManager addTextContainer:self]; + + return self; +} + +@end + +@implementation NSTextContainer : CPTextContainer +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self NS_initWithCoder:aCoder]; + + if (self) + { + + } + + return self; +} + +- (Class)classForKeyedArchiver +{ + return [CPTextContainer class]; +} + +@end diff --git a/Tools/nib2cib/NSTextStorage.j b/Tools/nib2cib/NSTextStorage.j new file mode 100644 index 000000000..3c6b1e548 --- /dev/null +++ b/Tools/nib2cib/NSTextStorage.j @@ -0,0 +1,74 @@ +/* + * NSTextStorage.j + * nib2cib + * + * Created by Alexendre Wilhelm. + * Copyright 2014 The Cappuccino Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@class Nib2Cib + +@global CPForegroundColorAttributeName + +@implementation CPTextStorage (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + var xibAttributes = [aCoder decodeObjectForKey:@"NSAttributes"], + cibAttributes = @{}; + + if ([xibAttributes containsKey:@"NSColor"]) + [cibAttributes setObject:[xibAttributes valueForKey:@"NSColor"] forKey:CPForegroundColorAttributeName]; + + if ([xibAttributes containsKey:@"NSFont"]) + [cibAttributes setObject:[xibAttributes valueForKey:@"NSFont"] forKey:CPFontAttributeName]; + + if ([xibAttributes containsKey:@"NSParagraphStyle"]) + [cibAttributes setObject:[xibAttributes valueForKey:@"NSParagraphStyle"] forKey:CPParagraphStyleAttributeName]; + + self = [super initWithString:[aCoder decodeObjectForKey:@"NSString"] attributes:cibAttributes]; + + return self; +} + +@end + +@implementation NSTextStorage : CPTextStorage +{ + +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self NS_initWithCoder:aCoder]; + + if (self) + { + + } + + return self; +} + +- (Class)classForKeyedArchiver +{ + return [CPTextStorage class]; +} + +@end diff --git a/Tools/nib2cib/NSTextView.j b/Tools/nib2cib/NSTextView.j new file mode 100644 index 000000000..2c7492ead --- /dev/null +++ b/Tools/nib2cib/NSTextView.j @@ -0,0 +1,74 @@ +/* + * NSTextView.j + * nib2cib + * + * Created by Alexendre Wilhelm. + * Copyright 2014 The Cappuccino Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@import "NSTextViewSharedData.j" + +@class Nib2Cib + +@implementation CPTextView (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder textViewSharedData:(CPTextViewSharedData)aTextViewSharedData +{ + if (self = [super NS_initWithCoder:aCoder]) + { + _textContainer = [aCoder decodeObjectForKey:@"NSTextContainer"]; + + [self setEditable:[aTextViewSharedData isEditable]]; + [self setSelectable:[aTextViewSharedData isSelectable]]; + [self setRichText:[aTextViewSharedData isRichText]]; + [self setAllowsUndo:[aTextViewSharedData allowsUndo]]; + [self setUsesFontPanel:[aTextViewSharedData usesFontPanel]]; + + [self setBackgroundColor:[aTextViewSharedData backgroundColor]]; + [self setInsertionPointColor:[aTextViewSharedData insertionColor]]; + [self setSelectedTextAttributes:[aTextViewSharedData selectedTextAttributes]]; + [[self textContainer] setWidthTracksTextView:YES]; + } + + return self; +} + +@end + +@implementation NSTextView : CPTextView +{ + +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + if (self = [self NS_initWithCoder:aCoder textViewSharedData:[aCoder decodeObjectForKey:@"NSSharedData"]]) + { + + } + + return self; +} + +- (Class)classForKeyedArchiver +{ + return [CPTextView class]; +} + +@end diff --git a/Tools/nib2cib/NSTextViewSharedData.j b/Tools/nib2cib/NSTextViewSharedData.j new file mode 100644 index 000000000..8c4ad513f --- /dev/null +++ b/Tools/nib2cib/NSTextViewSharedData.j @@ -0,0 +1,100 @@ +/* + * NSTextView.j + * nib2cib + * + * Created by Alexendre Wilhelm. + * Copyright 2014 The Cappuccino Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +@import +@import + +@class Nib2Cib + +@implementation CPTextViewSharedData : CPObject +{ + BOOL _allowsUndo @accessors(getter=allowsUndo); + BOOL _editable @accessors(getter=isEditable); + BOOL _richText @accessors(getter=isRichText); + BOOL _selectable @accessors(getter=isSelectable); + BOOL _usesFontPanel @accessors(getter=usesFontPanel); + CPColor _backgroundColor @accessors(getter=backgroundColor); + CPColor _insertionColor @accessors(getter=insertionColor); + CPDictionary _selectedTextAttributes @accessors(getter=selectedTextAttributes); +} + +- (id)init +{ + if (self = [super init]) + { + + } + + return self; +} + +@end + + +@implementation CPTextViewSharedData (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + if (self = [super init]) + { + var flags = [aCoder decodeIntForKey:@"NSFlags"]; + + _allowsUndo = (flags & 0x0000400) ? YES : NO; + _editable = (flags & 0x00000002) ? YES : NO; + _richText = (flags & 0x00000004) ? YES : NO; + _selectable = (flags & 0x00000001) ? YES : NO; + _usesFontPanel = (flags & 0x00000020) ? YES : NO; + + _backgroundColor = [aCoder decodeObjectForKey:@"NSBackgroundColor"]; + _insertionColor = [aCoder decodeObjectForKey:@"NSInsertionColor"]; + _selectedTextAttributes = [aCoder decodeObjectForKey:@"NSSelectedAttributes"]; + } + + return self; +} + +@end + +@implementation NSTextViewSharedData : CPTextViewSharedData +{ + +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self NS_initWithCoder:aCoder]; + + if (self) + { + + } + + return self; +} + +- (Class)classForKeyedArchiver +{ + return [CPTextViewSharedData class]; +} + +@end diff --git a/Tools/nib2cib/Nib2Cib.j b/Tools/nib2cib/Nib2Cib.j index 868a02557..684756271 100644 --- a/Tools/nib2cib/Nib2Cib.j +++ b/Tools/nib2cib/Nib2Cib.j @@ -204,7 +204,10 @@ var FILE = require("file"), [self loadThemesFromList:themeList]; [self loadFrameworks:options.frameworks verbosity:options.verbosity]; - [self loadNSClassesFromBundle:[CPBundle mainBundle]]; + + var mainBundle = [CPBundle mainBundle]; + [mainBundle loadWithDelegate:nil]; + [self loadNSClassesFromBundle:mainBundle]; var frameworkList = []; @@ -230,6 +233,8 @@ var FILE = require("file"), CPLog.info("Aux themes : " + themeList.slice(1).join(", ")); CPLog.info("Config file : " + (configInfo.path || "")); CPLog.info("System Font : " + [CPFont systemFontSize] + "px " + [CPFont systemFontFace]); + CPLog.info("NSClasses : " + userNSClasses); + CPLog.info("-------------------------------------------------------------\n"); var converter = [[Converter alloc] initWithInputPath:inputPath outputPath:outputPath];