├── Munki Manifest Selector ├── en.lproj │ ├── InfoPlist.strings │ ├── Credits.rtf │ └── MainMenu.xib ├── Munki Manifest SelectorTests │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── Munki_Manifest_SelectorTests.h │ ├── Munki_Manifest_SelectorTests.m │ └── Munki Manifest SelectorTests-Info.plist ├── Munki Manifest Selector │ ├── Munki Manifest Selector-Prefix.pch │ ├── MMMainWindow.h │ ├── MMMainWindow.m │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ └── Munki Manifest Selector-Info.plist ├── main.m ├── AppDelegate.h ├── AppDelegate.m └── Munki Manifest Selector.xcodeproj │ └── project.pbxproj ├── .gitignore ├── README.md └── DeployStudioScripts └── launch-munki-manifest-selector.sh /Munki Manifest Selector/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest SelectorTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest Selector/Munki Manifest Selector-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'Munki Manifest Selector' target in the 'Munki Manifest Selector' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest Selector/MMMainWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // MMMainWindow.h 3 | // Munki Manifest Selector 4 | // 5 | // Created by Joseph M. Wollard on 3/14/13. 6 | // Copyright (c) 2013 Denison University. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MMMainWindow : NSWindow 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Munki Manifest Selector/en.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \vieww9600\viewh8400\viewkind0 5 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 6 | 7 | \f0\b\fs24 \cf0 Engineering: 8 | \b0 \ 9 | Joe Wollard} -------------------------------------------------------------------------------- /Munki Manifest Selector/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Munki Manifest Selector 4 | // 5 | // Created by Joseph M. Wollard on 1/20/13. 6 | // Copyright (c) 2013 Denison University. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | return NSApplicationMain(argc, (const char **)argv); 14 | } 15 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest SelectorTests/Munki_Manifest_SelectorTests.h: -------------------------------------------------------------------------------- 1 | // 2 | // Munki_Manifest_SelectorTests.h 3 | // Munki Manifest SelectorTests 4 | // 5 | // Created by Joseph M. Wollard on 1/20/13. 6 | // Copyright (c) 2013 Denison University. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface Munki_Manifest_SelectorTests : SenTestCase 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest SelectorTests/Munki_Manifest_SelectorTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // Munki_Manifest_SelectorTests.m 3 | // Munki Manifest SelectorTests 4 | // 5 | // Created by Joseph M. Wollard on 1/20/13. 6 | // Copyright (c) 2013 Denison University. All rights reserved. 7 | // 8 | 9 | #import "Munki_Manifest_SelectorTests.h" 10 | 11 | @implementation Munki_Manifest_SelectorTests 12 | 13 | - (void)setUp 14 | { 15 | [super setUp]; 16 | 17 | // Set-up code here. 18 | } 19 | 20 | - (void)tearDown 21 | { 22 | // Tear-down code here. 23 | 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample 28 | { 29 | STFail(@"Unit tests are not implemented yet in Munki Manifest SelectorTests"); 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Munki-Manifest-Selector 2 | ======================= 3 | 4 | A script+application that provides the selection of a Munki manifest template as part of a Deploy Studio workflow. 5 | 6 | **For a more detailed description, please visit http://denisonmac.wordpress.com/2013/02/09/munki-manifest-selector/** 7 | 8 | **Compiled download: https://dl.dropbox.com/u/12228667/Linked%20Files/Munki%20Manifest%20Selector.dmg** 9 | 10 | To install, compile the Xcode project then copy the resulting application and script found within DeployStudioScripts/ to your Scripts directory within DeployStudio's repo. In DeployStudio, add a *Generic* task in your workflow and direct it to the launch-munki-manifest-selector.sh. The script is simply used to launch Munki Manifest Selector.app with some default options selected. 11 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest SelectorTests/Munki Manifest SelectorTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | edu.denison.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest Selector/MMMainWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // MMMainWindow.m 3 | // Munki Manifest Selector 4 | // 5 | // Created by Joseph M. Wollard on 3/14/13. 6 | // Copyright (c) 2013 Denison University. All rights reserved. 7 | // 8 | 9 | #import "MMMainWindow.h" 10 | 11 | @implementation MMMainWindow 12 | 13 | 14 | 15 | - (void)awakeFromNib 16 | { 17 | // Make sure the window is able to popup in front of any other window. 18 | [self center]; 19 | // [self setLevel:NSScreenSaverWindowLevel]; 20 | } 21 | 22 | 23 | 24 | 25 | - (BOOL)canBecomeKeyWindow 26 | { 27 | return YES; 28 | } 29 | 30 | 31 | 32 | 33 | - (BOOL)acceptsFirstResponder 34 | { 35 | return YES; 36 | } 37 | 38 | 39 | 40 | 41 | - (BOOL)canBecomeMainWindow 42 | { 43 | return YES; 44 | } 45 | 46 | 47 | - (BOOL)canBecomeVisibleWithoutLogin 48 | { 49 | return YES; 50 | } 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /DeployStudioScripts/launch-munki-manifest-selector.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script launches Munki Manifest Selector.app with a few default 4 | # options. 5 | # 6 | # The keys/arguments supported by Munki Manifest Selector.app are: 7 | # --targetVolume (required) Prepended to "/Library/Preferences/ManagedInstalls.plist" 8 | # 9 | # Flags: 10 | # 11 | # --InstallAppleSoftwareUpdates 12 | # --SuppressAutoInstall 13 | # --SuppressLoginwindowInstall 14 | # --SuppressStopButtonOnInstall 15 | # --SuppressUserNotification 16 | # --SuppressUserNotification 17 | # --InstallRequiresLogout 18 | # --ShowRemovalDetail 19 | # 20 | # Named Arguments: 21 | # 22 | # --SoftwareRepoURL 23 | # --SoftwareUpdateServerURL 24 | # --DaysBetweenNotifications - This differs from Munki's values and must be one of "Hourly", "Daily", "Weekly" or "Monthly". This is for display purposes only and will be translated to a integer before the plist is written. 25 | # 26 | 27 | 28 | BASE_DIR=`dirname "${0}"` 29 | $BASE_DIR/Munki\ Manifest\ Selector.app/Contents/MacOS/Munki\ Manifest\ Selector\ 30 | --targetVolume "${DS_LAST_SELECTED_TARGET}"\ 31 | --InstallAppleSoftwareUpdates\ 32 | --DaysBetweenNotifications Daily\ 33 | --ShowRemovalDetail 34 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest Selector/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "scale" : "1x", 6 | "size" : "16x16" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "2x", 11 | "size" : "16x16" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "scale" : "1x", 16 | "size" : "32x32" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "scale" : "2x", 21 | "size" : "32x32" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "scale" : "1x", 26 | "size" : "128x128" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "scale" : "2x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "scale" : "1x", 36 | "size" : "256x256" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "scale" : "2x", 41 | "size" : "256x256" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "scale" : "1x", 46 | "size" : "512x512" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "scale" : "2x", 51 | "size" : "512x512" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest Selector/Munki Manifest Selector-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | edu.denison.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 2014.05.28 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSMinimumSystemVersion 26 | ${MACOSX_DEPLOYMENT_TARGET} 27 | LSUIElement 28 | 29 | Manifests URL 30 | http://example.com/Manifests.plist 31 | NSHumanReadableCopyright 32 | Copyright © 2013 Denison University. All rights reserved. 33 | NSMainNibFile 34 | MainMenu 35 | NSPrincipalClass 36 | NSApplication 37 | 38 | 39 | -------------------------------------------------------------------------------- /Munki Manifest Selector/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Munki Manifest Selector 4 | // 5 | // Created by Joseph M. Wollard on 1/20/13. 6 | // Copyright (c) 2013 Denison University. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef enum 12 | { 13 | MMS_CLEAN_EXIT_CODE = 0, 14 | MMS_INCOMPLETE_PLIST_EXIT_CODE = 1, 15 | MMS_INVALID_PLIST_VALUE_EXIT_CODE = 2, 16 | MMS_MISSING_OR_INVALID_TARGET_VOLUME_EXIT_CODE = 3 17 | } MMS_EXIT_CODE; 18 | 19 | @interface AppDelegate : NSObject 20 | { 21 | NSString *targetVolume; 22 | } 23 | 24 | @property (assign) IBOutlet NSWindow *window; 25 | @property (strong) IBOutlet NSPopUpButton *manifestPopupMenu; 26 | @property (assign) IBOutlet NSPopover *popover; 27 | @property (strong) NSString *selectedManifestName; 28 | @property (strong) NSMutableDictionary *manifestDict; 29 | 30 | @property BOOL enableMunkiBootstrapMode; 31 | 32 | @property BOOL installAppleSoftwareUpdates; 33 | @property BOOL suppressAutoinstall; 34 | @property BOOL suppressUserNotification; 35 | @property BOOL suppressLoginwindowInstall; 36 | @property BOOL suppressStopButtonOnInstall; 37 | @property BOOL installRequiresLogout; 38 | @property BOOL showRemovalDetail; 39 | @property (strong) NSString *daysBetweenNotifications; 40 | 41 | - (IBAction)useSelectedManifest:(id)aSender; 42 | - (IBAction)reloadManifests:(id)aSender; 43 | - (IBAction)setSelectedManifest:(NSPopUpButton *)aSender; 44 | - (IBAction)showAdvancedOptions:(NSButton *)aButton; 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /Munki Manifest Selector/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // Munki Manifest Selector 4 | // 5 | // Created by Joseph M. Wollard on 1/20/13. 6 | // Copyright (c) 2013 Denison University. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @implementation AppDelegate 12 | @synthesize manifestPopupMenu, 13 | selectedManifestName, 14 | manifestDict, 15 | enableMunkiBootstrapMode; 16 | 17 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 18 | { 19 | [self setManifestDict: [NSMutableDictionary dictionary]]; 20 | NSArray *arguments = [[NSProcessInfo processInfo] arguments]; 21 | 22 | // Hide all other applications. 23 | //[NSApp hideOtherApplications:self]; 24 | [NSApp activateIgnoringOtherApps:YES]; 25 | 26 | 27 | // set the default values 28 | [self setEnableMunkiBootstrapMode:NO]; 29 | [manifestDict setObject:[self convertBool:NO] forKey:@"InstallAppleSoftwareUpdates"]; 30 | [manifestDict setObject:[self convertBool:NO] forKey:@"SuppressAutoInstall"]; 31 | [manifestDict setObject:[self convertBool:NO] forKey:@"SuppressLoginwindowInstall"]; 32 | [manifestDict setObject:[self convertBool:NO] forKey:@"SuppressStopButtonOnInstall"]; 33 | [manifestDict setObject:[self convertBool:NO] forKey:@"SuppressUserNotification"]; 34 | [manifestDict setObject:[self convertBool:NO] forKey:@"SuppressUserNotification"]; 35 | [manifestDict setObject:[self convertBool:NO] forKey:@"InstallRequiresLogout"]; 36 | [manifestDict setObject:[self convertBool:NO] forKey:@"ShowRemovalDetail"]; 37 | [manifestDict setObject:@"" forKey:@"SoftwareRepoURL"]; 38 | [manifestDict setObject:@"" forKey:@"SoftwareUpdateServerURL"]; 39 | [manifestDict setObject:@"Hourly" forKey:@"DaysBetweenNotifications"]; 40 | 41 | 42 | // Attempt to populate the manifests. 43 | [self reloadManifests:nil]; 44 | 45 | [self.manifestDict addObserver:self 46 | forKeyPath:@"SuppressAutoInstall" 47 | options:NSKeyValueObservingOptionOld 48 | context:nil]; 49 | [self.manifestDict addObserver:self 50 | forKeyPath:@"SuppressLoginwindowInstall" 51 | options:NSKeyValueObservingOptionOld 52 | context:nil]; 53 | 54 | 55 | // Loop over the provided arguments and set the manifestDict values accordingly. 56 | NSArray *manifestKeys = [manifestDict allKeys]; 57 | for(int i = 1; i < [arguments count]; i++) 58 | { 59 | NSString *arg = [arguments objectAtIndex:i]; 60 | NSString *cleanArg = [arg stringByReplacingOccurrencesOfString:@"-" withString:@""]; 61 | if ([manifestKeys containsObject:cleanArg]) 62 | { 63 | if ([cleanArg isEqualToString:@"DaysBetweenNotifications"]) 64 | { 65 | NSString *value = [arguments objectAtIndex:++i]; 66 | if ([value isEqualToString:@"1"]) 67 | [manifestDict setObject:@"Daily" forKey:@"DaysBetweenNotifications"]; 68 | else if ([value isEqualToString:@"7"]) 69 | [manifestDict setObject:@"Weekly" forKey:@"DaysBetweenNotifications"]; 70 | else if ([value isEqualToString:@"30"]) 71 | [manifestDict setObject:@"Monthly" forKey:@"DaysBetweenNotifications"]; 72 | } 73 | else if ([cleanArg isEqualToString:@"SoftwareRepoURL"]) 74 | [manifestDict setObject:[arguments objectAtIndex:++i] forKey:@"SoftwareRepoURL"]; 75 | else if ([cleanArg isEqualToString:@"SoftwareUpdateServerURL"]) 76 | [manifestDict setObject:[arguments objectAtIndex:++i] forKey:@"SoftwareUpdateServerURL"]; 77 | else 78 | [manifestDict setObject:[self convertBool:YES] forKey:cleanArg]; 79 | } 80 | else if ([cleanArg isEqualToString:@"targetVolume"]) 81 | targetVolume = [arguments objectAtIndex:++i]; 82 | else if ([cleanArg isEqualToString:@"enableMunkiBootstrapMode"]) 83 | [self setEnableMunkiBootstrapMode:YES]; 84 | else 85 | NSLog(@"Discarding unrecognized argument '%@'", arg); 86 | } 87 | 88 | // Make sure targetVolume was one of the arguments and that the value of that argument is valid. 89 | BOOL isDir; 90 | if (targetVolume == nil 91 | || [[NSFileManager defaultManager] fileExistsAtPath:targetVolume isDirectory:&isDir] == NO 92 | || isDir == NO) 93 | { 94 | targetVolume = @"/"; 95 | NSLog(@"Missing -targetVolume argument. Using default value '/'"); 96 | // exit(MMS_MISSING_OR_INVALID_TARGET_VOLUME_EXIT_CODE); 97 | } 98 | } 99 | 100 | 101 | 102 | 103 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 104 | { 105 | NSNumber *value = [object valueForKeyPath:keyPath]; 106 | 107 | if ([keyPath isEqualToString:@"SuppressAutoInstall"] && value == [self convertBool:YES]) 108 | [manifestDict setObject:[self convertBool:NO] forKey:@"SuppressLoginwindowInstall"]; 109 | 110 | else if ([keyPath isEqualToString:@"SuppressLoginwindowInstall"] && value == [self convertBool:YES]) 111 | [manifestDict setObject:[self convertBool:NO] forKey:@"SuppressAutoInstall"]; 112 | } 113 | 114 | 115 | 116 | 117 | - (IBAction)reloadManifests:(id)aSender 118 | { 119 | NSBundle *bundle = [NSBundle mainBundle]; 120 | NSDictionary *infoDict = [bundle infoDictionary]; 121 | 122 | // Make sure the 'Manifests URL' key exists in the Info.plist file. 123 | if ([[infoDict allKeys] containsObject:@"Manifests URL"] == NO 124 | || [infoDict objectForKey:@"Manifests URL"] == nil) 125 | { 126 | [self runAlertWithTitle:@"Unable to read 'Manifests URL'" 127 | andMessage:@"Check the value of 'Manifests URL' within Info.plist. The key doesn't appear to exist." 128 | usingExitCode:MMS_INCOMPLETE_PLIST_EXIT_CODE]; 129 | return; 130 | } 131 | 132 | NSURL *mURL = [NSURL URLWithString:[infoDict objectForKey:@"Manifests URL"]]; 133 | NSDictionary *aDict = [NSDictionary dictionaryWithContentsOfURL:mURL]; 134 | 135 | // Make sure the value of 'Manifests URL' is valid. 136 | if (aDict == nil || [[aDict allKeys] count] == 0) 137 | { 138 | [self runAlertWithTitle:@"Unable load Manifests URL." 139 | andMessage:@"Check the value of 'Manifests URL' within Info.plist. The the value is either incorrect, or the plist it points to is invalid." 140 | usingExitCode:MMS_INVALID_PLIST_VALUE_EXIT_CODE]; 141 | } 142 | else { 143 | // Add a placeholder of '-' to the list and sort it alphabetically. 144 | NSMutableArray *manifests = [[aDict objectForKey:@"ManifestGroups"] mutableCopy]; 145 | [manifests addObject:@"-"]; 146 | NSArray *sortedManifests = [manifests sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 147 | [manifestPopupMenu removeAllItems]; 148 | [manifestPopupMenu addItemsWithTitles:sortedManifests]; 149 | [self setSelectedManifestName:nil]; 150 | } 151 | } 152 | 153 | 154 | 155 | 156 | - (IBAction)setSelectedManifest:(NSPopUpButton *)aSender 157 | { 158 | NSString *selectedTitle = [aSender titleOfSelectedItem]; 159 | if ([selectedTitle isEqualToString:@"-"]) 160 | [self setSelectedManifestName:nil]; 161 | else 162 | [self setSelectedManifestName:selectedTitle]; 163 | } 164 | 165 | 166 | 167 | 168 | - (IBAction)useSelectedManifest:(id)aSender 169 | { 170 | // NSArray *manifestNameParts = [self.selectedManifestName componentsSeparatedByString:@"/"]; 171 | // NSString *templateManifestName = [NSString stringWithFormat:@"__%@Template", [manifestNameParts lastObject]]; 172 | NSString *templateManifestName = [NSString stringWithFormat:@"%@/generic", self.selectedManifestName]; 173 | [manifestDict setObject:templateManifestName forKey:@"ClientIdentifier"]; 174 | 175 | if ([[manifestDict objectForKey:@"DaysBetweenNotifications"] isEqualToString:@"Hourly"]) 176 | [manifestDict setObject:[NSNumber numberWithInt:0] forKey:@"DaysBetweenNotifications"]; 177 | else if ([[manifestDict objectForKey:@"DaysBetweenNotifications"] isEqualToString:@"Daily"]) 178 | [manifestDict setObject:[NSNumber numberWithInt:1] forKey:@"DaysBetweenNotifications"]; 179 | else if ([[manifestDict objectForKey:@"DaysBetweenNotifications"] isEqualToString:@"Weekly"]) 180 | [manifestDict setObject:[NSNumber numberWithInt:7] forKey:@"DaysBetweenNotifications"]; 181 | else if ([[manifestDict objectForKey:@"DaysBetweenNotifications"] isEqualToString:@"Monthly"]) 182 | [manifestDict setObject:[NSNumber numberWithInt:30] forKey:@"DaysBetweenNotifications"]; 183 | 184 | // Delete the SoftwareUpdateServerURL key if it hasn't been set. 185 | if ([[manifestDict objectForKey:@"SoftwareUpdateServerURL"] isEqualToString:@""]) 186 | [manifestDict removeObjectForKey:@"SoftwareUpdateServerURL"]; 187 | 188 | NSString *clientManifestPath = [targetVolume stringByAppendingPathComponent:@"/Library/Preferences/ManagedInstalls.plist"]; 189 | 190 | // Write the manifest file to ManagedInstalls.plist on the target volume. 191 | [manifestDict writeToFile:clientManifestPath atomically:YES]; 192 | 193 | // Enable bootstrap mode if specified. 194 | if ([self enableMunkiBootstrapMode] == YES) 195 | { 196 | [[NSFileManager defaultManager] createFileAtPath:[targetVolume stringByAppendingPathComponent:@"/Users/Shared/.com.googlecode.munki.checkandinstallatstartup"] 197 | contents:nil 198 | attributes:nil]; 199 | } 200 | [NSApp terminate:self]; 201 | } 202 | 203 | 204 | 205 | 206 | - (NSNumber *)convertBool:(BOOL)aBool 207 | { 208 | return [NSNumber numberWithBool:aBool]; 209 | } 210 | 211 | 212 | 213 | 214 | - (IBAction)showAdvancedOptions:(NSButton *)aButton 215 | { 216 | [_popover setBehavior:NSPopoverBehaviorTransient]; 217 | [_popover showRelativeToRect:[aButton bounds] 218 | ofView:aButton 219 | preferredEdge:NSMaxYEdge]; 220 | } 221 | 222 | 223 | 224 | 225 | - (void)runAlertWithTitle:(NSString *)aTitle andMessage:(NSString *)aMessage usingExitCode:(MMS_EXIT_CODE)anExitCode 226 | { 227 | NSAlert *alert = [NSAlert alertWithMessageText:aTitle 228 | defaultButton:@"Okay" 229 | alternateButton:nil 230 | otherButton:nil 231 | informativeTextWithFormat:@"%@", aMessage]; 232 | [alert runModal]; 233 | [self sendToSTDOUT:aMessage]; 234 | exit(anExitCode); 235 | } 236 | 237 | 238 | 239 | 240 | - (void)sendToSTDOUT:(NSString *)aMessage 241 | { 242 | printf("%s", [aMessage cStringUsingEncoding:[NSString defaultCStringEncoding]]); 243 | } 244 | 245 | 246 | 247 | 248 | - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)anApp 249 | { 250 | if (self.selectedManifestName == nil) 251 | return NSTerminateCancel; 252 | return NSTerminateNow; 253 | } 254 | @end 255 | -------------------------------------------------------------------------------- /Munki Manifest Selector/Munki Manifest Selector.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D44585A516AC7D4A00626525 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D44585A316AC7D4A00626525 /* InfoPlist.strings */; }; 11 | D44585A716AC7D4A00626525 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D44585A616AC7D4A00626525 /* main.m */; }; 12 | D44585AB16AC7D4A00626525 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = D44585A916AC7D4A00626525 /* Credits.rtf */; }; 13 | D44585AE16AC7D4A00626525 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D44585AD16AC7D4A00626525 /* AppDelegate.m */; }; 14 | D44585B116AC7D4A00626525 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = D44585AF16AC7D4A00626525 /* MainMenu.xib */; }; 15 | D4B88FE216F1F69A0085472E /* MMMainWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = D4B88FE116F1F69A0085472E /* MMMainWindow.m */; }; 16 | D4EBA81D1936257E00253324 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D4EBA81C1936257E00253324 /* Images.xcassets */; }; 17 | D4EBA81E193627E600253324 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D445859A16AC7D4A00626525 /* Cocoa.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | D445859616AC7D4A00626525 /* Munki Manifest Selector.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Munki Manifest Selector.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | D445859A16AC7D4A00626525 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 23 | D445859D16AC7D4A00626525 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 24 | D445859E16AC7D4A00626525 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 25 | D445859F16AC7D4A00626525 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 26 | D44585A216AC7D4A00626525 /* Munki Manifest Selector-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Munki Manifest Selector-Info.plist"; sourceTree = ""; }; 27 | D44585A416AC7D4A00626525 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 28 | D44585A616AC7D4A00626525 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../main.m; sourceTree = ""; }; 29 | D44585A816AC7D4A00626525 /* Munki Manifest Selector-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Munki Manifest Selector-Prefix.pch"; sourceTree = ""; }; 30 | D44585AA16AC7D4A00626525 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 31 | D44585AC16AC7D4A00626525 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ../AppDelegate.h; sourceTree = ""; }; 32 | D44585AD16AC7D4A00626525 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ../AppDelegate.m; sourceTree = ""; }; 33 | D44585B016AC7D4A00626525 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; 34 | D44585B816AC7D4A00626525 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; 35 | D44585BF16AC7D4A00626525 /* Munki Manifest SelectorTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Munki Manifest SelectorTests-Info.plist"; sourceTree = ""; }; 36 | D44585C116AC7D4A00626525 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 37 | D44585C316AC7D4B00626525 /* Munki_Manifest_SelectorTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Munki_Manifest_SelectorTests.h; sourceTree = ""; }; 38 | D44585C416AC7D4B00626525 /* Munki_Manifest_SelectorTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Munki_Manifest_SelectorTests.m; sourceTree = ""; }; 39 | D4B88FE016F1F69A0085472E /* MMMainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMMainWindow.h; sourceTree = ""; }; 40 | D4B88FE116F1F69A0085472E /* MMMainWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMMainWindow.m; sourceTree = ""; }; 41 | D4EBA81C1936257E00253324 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 42 | /* End PBXFileReference section */ 43 | 44 | /* Begin PBXFrameworksBuildPhase section */ 45 | D445859316AC7D4A00626525 /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | D4EBA81E193627E600253324 /* Cocoa.framework in Frameworks */, 50 | ); 51 | runOnlyForDeploymentPostprocessing = 0; 52 | }; 53 | /* End PBXFrameworksBuildPhase section */ 54 | 55 | /* Begin PBXGroup section */ 56 | D445858B16AC7D4A00626525 = { 57 | isa = PBXGroup; 58 | children = ( 59 | D44585A016AC7D4A00626525 /* Munki Manifest Selector */, 60 | D44585BD16AC7D4A00626525 /* Munki Manifest SelectorTests */, 61 | D445859916AC7D4A00626525 /* Frameworks */, 62 | D445859716AC7D4A00626525 /* Products */, 63 | ); 64 | sourceTree = ""; 65 | }; 66 | D445859716AC7D4A00626525 /* Products */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | D445859616AC7D4A00626525 /* Munki Manifest Selector.app */, 70 | ); 71 | name = Products; 72 | sourceTree = ""; 73 | }; 74 | D445859916AC7D4A00626525 /* Frameworks */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | D445859A16AC7D4A00626525 /* Cocoa.framework */, 78 | D44585B816AC7D4A00626525 /* SenTestingKit.framework */, 79 | D445859C16AC7D4A00626525 /* Other Frameworks */, 80 | ); 81 | name = Frameworks; 82 | sourceTree = ""; 83 | }; 84 | D445859C16AC7D4A00626525 /* Other Frameworks */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | D445859D16AC7D4A00626525 /* AppKit.framework */, 88 | D445859E16AC7D4A00626525 /* CoreData.framework */, 89 | D445859F16AC7D4A00626525 /* Foundation.framework */, 90 | ); 91 | name = "Other Frameworks"; 92 | sourceTree = ""; 93 | }; 94 | D44585A016AC7D4A00626525 /* Munki Manifest Selector */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | D44585AC16AC7D4A00626525 /* AppDelegate.h */, 98 | D44585AD16AC7D4A00626525 /* AppDelegate.m */, 99 | D44585AF16AC7D4A00626525 /* MainMenu.xib */, 100 | D4B88FE016F1F69A0085472E /* MMMainWindow.h */, 101 | D4B88FE116F1F69A0085472E /* MMMainWindow.m */, 102 | D4EBA81C1936257E00253324 /* Images.xcassets */, 103 | D44585A116AC7D4A00626525 /* Supporting Files */, 104 | ); 105 | path = "Munki Manifest Selector"; 106 | sourceTree = ""; 107 | }; 108 | D44585A116AC7D4A00626525 /* Supporting Files */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | D44585A216AC7D4A00626525 /* Munki Manifest Selector-Info.plist */, 112 | D44585A316AC7D4A00626525 /* InfoPlist.strings */, 113 | D44585A616AC7D4A00626525 /* main.m */, 114 | D44585A816AC7D4A00626525 /* Munki Manifest Selector-Prefix.pch */, 115 | D44585A916AC7D4A00626525 /* Credits.rtf */, 116 | ); 117 | name = "Supporting Files"; 118 | sourceTree = ""; 119 | }; 120 | D44585BD16AC7D4A00626525 /* Munki Manifest SelectorTests */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | D44585C316AC7D4B00626525 /* Munki_Manifest_SelectorTests.h */, 124 | D44585C416AC7D4B00626525 /* Munki_Manifest_SelectorTests.m */, 125 | D44585BE16AC7D4A00626525 /* Supporting Files */, 126 | ); 127 | path = "Munki Manifest SelectorTests"; 128 | sourceTree = ""; 129 | }; 130 | D44585BE16AC7D4A00626525 /* Supporting Files */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | D44585BF16AC7D4A00626525 /* Munki Manifest SelectorTests-Info.plist */, 134 | D44585C016AC7D4A00626525 /* InfoPlist.strings */, 135 | ); 136 | name = "Supporting Files"; 137 | sourceTree = ""; 138 | }; 139 | /* End PBXGroup section */ 140 | 141 | /* Begin PBXNativeTarget section */ 142 | D445859516AC7D4A00626525 /* Munki Manifest Selector */ = { 143 | isa = PBXNativeTarget; 144 | buildConfigurationList = D44585C816AC7D4B00626525 /* Build configuration list for PBXNativeTarget "Munki Manifest Selector" */; 145 | buildPhases = ( 146 | D445859216AC7D4A00626525 /* Sources */, 147 | D445859316AC7D4A00626525 /* Frameworks */, 148 | D445859416AC7D4A00626525 /* Resources */, 149 | ); 150 | buildRules = ( 151 | ); 152 | dependencies = ( 153 | ); 154 | name = "Munki Manifest Selector"; 155 | productName = "Munki Manifest Selector"; 156 | productReference = D445859616AC7D4A00626525 /* Munki Manifest Selector.app */; 157 | productType = "com.apple.product-type.application"; 158 | }; 159 | /* End PBXNativeTarget section */ 160 | 161 | /* Begin PBXProject section */ 162 | D445858D16AC7D4A00626525 /* Project object */ = { 163 | isa = PBXProject; 164 | attributes = { 165 | LastUpgradeCheck = 0450; 166 | ORGANIZATIONNAME = "Denison University"; 167 | }; 168 | buildConfigurationList = D445859016AC7D4A00626525 /* Build configuration list for PBXProject "Munki Manifest Selector" */; 169 | compatibilityVersion = "Xcode 3.2"; 170 | developmentRegion = English; 171 | hasScannedForEncodings = 0; 172 | knownRegions = ( 173 | en, 174 | ); 175 | mainGroup = D445858B16AC7D4A00626525; 176 | productRefGroup = D445859716AC7D4A00626525 /* Products */; 177 | projectDirPath = ""; 178 | projectRoot = ""; 179 | targets = ( 180 | D445859516AC7D4A00626525 /* Munki Manifest Selector */, 181 | ); 182 | }; 183 | /* End PBXProject section */ 184 | 185 | /* Begin PBXResourcesBuildPhase section */ 186 | D445859416AC7D4A00626525 /* Resources */ = { 187 | isa = PBXResourcesBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | D44585A516AC7D4A00626525 /* InfoPlist.strings in Resources */, 191 | D4EBA81D1936257E00253324 /* Images.xcassets in Resources */, 192 | D44585AB16AC7D4A00626525 /* Credits.rtf in Resources */, 193 | D44585B116AC7D4A00626525 /* MainMenu.xib in Resources */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | /* End PBXResourcesBuildPhase section */ 198 | 199 | /* Begin PBXSourcesBuildPhase section */ 200 | D445859216AC7D4A00626525 /* Sources */ = { 201 | isa = PBXSourcesBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | D44585A716AC7D4A00626525 /* main.m in Sources */, 205 | D44585AE16AC7D4A00626525 /* AppDelegate.m in Sources */, 206 | D4B88FE216F1F69A0085472E /* MMMainWindow.m in Sources */, 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | }; 210 | /* End PBXSourcesBuildPhase section */ 211 | 212 | /* Begin PBXVariantGroup section */ 213 | D44585A316AC7D4A00626525 /* InfoPlist.strings */ = { 214 | isa = PBXVariantGroup; 215 | children = ( 216 | D44585A416AC7D4A00626525 /* en */, 217 | ); 218 | name = InfoPlist.strings; 219 | path = ..; 220 | sourceTree = ""; 221 | }; 222 | D44585A916AC7D4A00626525 /* Credits.rtf */ = { 223 | isa = PBXVariantGroup; 224 | children = ( 225 | D44585AA16AC7D4A00626525 /* en */, 226 | ); 227 | name = Credits.rtf; 228 | sourceTree = SOURCE_ROOT; 229 | }; 230 | D44585AF16AC7D4A00626525 /* MainMenu.xib */ = { 231 | isa = PBXVariantGroup; 232 | children = ( 233 | D44585B016AC7D4A00626525 /* en */, 234 | ); 235 | name = MainMenu.xib; 236 | path = ..; 237 | sourceTree = ""; 238 | }; 239 | D44585C016AC7D4A00626525 /* InfoPlist.strings */ = { 240 | isa = PBXVariantGroup; 241 | children = ( 242 | D44585C116AC7D4A00626525 /* en */, 243 | ); 244 | name = InfoPlist.strings; 245 | sourceTree = ""; 246 | }; 247 | /* End PBXVariantGroup section */ 248 | 249 | /* Begin XCBuildConfiguration section */ 250 | D44585C616AC7D4B00626525 /* Debug */ = { 251 | isa = XCBuildConfiguration; 252 | buildSettings = { 253 | ALWAYS_SEARCH_USER_PATHS = NO; 254 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 255 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 256 | CLANG_CXX_LIBRARY = "libc++"; 257 | CLANG_ENABLE_OBJC_ARC = YES; 258 | CLANG_WARN_EMPTY_BODY = YES; 259 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 260 | COPY_PHASE_STRIP = NO; 261 | GCC_C_LANGUAGE_STANDARD = gnu99; 262 | GCC_DYNAMIC_NO_PIC = NO; 263 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 264 | GCC_OPTIMIZATION_LEVEL = 0; 265 | GCC_PREPROCESSOR_DEFINITIONS = ( 266 | "DEBUG=1", 267 | "$(inherited)", 268 | ); 269 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 270 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 271 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 273 | GCC_WARN_UNUSED_VARIABLE = YES; 274 | MACOSX_DEPLOYMENT_TARGET = 10.9; 275 | ONLY_ACTIVE_ARCH = YES; 276 | SDKROOT = macosx; 277 | }; 278 | name = Debug; 279 | }; 280 | D44585C716AC7D4B00626525 /* Release */ = { 281 | isa = XCBuildConfiguration; 282 | buildSettings = { 283 | ALWAYS_SEARCH_USER_PATHS = NO; 284 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 285 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 286 | CLANG_CXX_LIBRARY = "libc++"; 287 | CLANG_ENABLE_OBJC_ARC = YES; 288 | CLANG_WARN_EMPTY_BODY = YES; 289 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 290 | COPY_PHASE_STRIP = YES; 291 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 292 | GCC_C_LANGUAGE_STANDARD = gnu99; 293 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 294 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 295 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 296 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 297 | GCC_WARN_UNUSED_VARIABLE = YES; 298 | MACOSX_DEPLOYMENT_TARGET = 10.9; 299 | SDKROOT = macosx; 300 | }; 301 | name = Release; 302 | }; 303 | D44585C916AC7D4B00626525 /* Debug */ = { 304 | isa = XCBuildConfiguration; 305 | buildSettings = { 306 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 307 | COMBINE_HIDPI_IMAGES = YES; 308 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 309 | GCC_PREFIX_HEADER = "Munki Manifest Selector/Munki Manifest Selector-Prefix.pch"; 310 | INFOPLIST_FILE = "$(SRCROOT)/Munki Manifest Selector/Munki Manifest Selector-Info.plist"; 311 | MACOSX_DEPLOYMENT_TARGET = 10.9; 312 | PRODUCT_NAME = "$(TARGET_NAME)"; 313 | WRAPPER_EXTENSION = app; 314 | }; 315 | name = Debug; 316 | }; 317 | D44585CA16AC7D4B00626525 /* Release */ = { 318 | isa = XCBuildConfiguration; 319 | buildSettings = { 320 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 321 | COMBINE_HIDPI_IMAGES = YES; 322 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 323 | GCC_PREFIX_HEADER = "Munki Manifest Selector/Munki Manifest Selector-Prefix.pch"; 324 | INFOPLIST_FILE = "$(SRCROOT)/Munki Manifest Selector/Munki Manifest Selector-Info.plist"; 325 | MACOSX_DEPLOYMENT_TARGET = 10.9; 326 | PRODUCT_NAME = "$(TARGET_NAME)"; 327 | WRAPPER_EXTENSION = app; 328 | }; 329 | name = Release; 330 | }; 331 | /* End XCBuildConfiguration section */ 332 | 333 | /* Begin XCConfigurationList section */ 334 | D445859016AC7D4A00626525 /* Build configuration list for PBXProject "Munki Manifest Selector" */ = { 335 | isa = XCConfigurationList; 336 | buildConfigurations = ( 337 | D44585C616AC7D4B00626525 /* Debug */, 338 | D44585C716AC7D4B00626525 /* Release */, 339 | ); 340 | defaultConfigurationIsVisible = 0; 341 | defaultConfigurationName = Release; 342 | }; 343 | D44585C816AC7D4B00626525 /* Build configuration list for PBXNativeTarget "Munki Manifest Selector" */ = { 344 | isa = XCConfigurationList; 345 | buildConfigurations = ( 346 | D44585C916AC7D4B00626525 /* Debug */, 347 | D44585CA16AC7D4B00626525 /* Release */, 348 | ); 349 | defaultConfigurationIsVisible = 0; 350 | defaultConfigurationName = Release; 351 | }; 352 | /* End XCConfigurationList section */ 353 | }; 354 | rootObject = D445858D16AC7D4A00626525 /* Project object */; 355 | } 356 | -------------------------------------------------------------------------------- /Munki Manifest Selector/en.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 12C60 6 | 3084 7 | 1187.34 8 | 625.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 3084 12 | 13 | 14 | IBNSLayoutConstraint 15 | NSBox 16 | NSButton 17 | NSButtonCell 18 | NSCustomObject 19 | NSCustomView 20 | NSMenu 21 | NSMenuItem 22 | NSPopUpButton 23 | NSPopUpButtonCell 24 | NSPopover 25 | NSTextField 26 | NSTextFieldCell 27 | NSView 28 | NSViewController 29 | NSWindowTemplate 30 | 31 | 32 | com.apple.InterfaceBuilder.CocoaPlugin 33 | 34 | 35 | PluginDependencyRecalculationVersion 36 | 37 | 38 | 39 | 40 | NSApplication 41 | 42 | 43 | FirstResponder 44 | 45 | 46 | NSApplication 47 | 48 | 49 | 1 50 | 2 51 | {{335, 390}, {433, 118}} 52 | 1954021376 53 | Munki Manifest Selector 54 | MMMainWindow 55 | 56 | 57 | 58 | 59 | 256 60 | 61 | 62 | 63 | 268 64 | {{17, 81}, {273, 17}} 65 | 66 | 67 | 68 | _NS:1535 69 | YES 70 | 71 | 68157504 72 | 272630784 73 | Select a 'group' manifest for this computer 74 | 75 | LucidaGrande 76 | 13 77 | 1044 78 | 79 | _NS:1535 80 | 81 | 82 | 6 83 | System 84 | controlColor 85 | 86 | 3 87 | MC42NjY2NjY2NjY3AA 88 | 89 | 90 | 91 | 6 92 | System 93 | controlTextColor 94 | 95 | 3 96 | MAA 97 | 98 | 99 | 100 | NO 101 | 102 | 103 | 104 | 268 105 | {{17, 49}, {367, 26}} 106 | 107 | 108 | 109 | _NS:9 110 | YES 111 | 112 | -2076180416 113 | 2048 114 | 115 | _NS:9 116 | 117 | 109199360 118 | 129 119 | 120 | 121 | 400 122 | 75 123 | 124 | 125 | Item 1 126 | 127 | 1048576 128 | 2147483647 129 | 1 130 | 131 | NSImage 132 | NSMenuCheckmark 133 | 134 | 135 | NSImage 136 | NSMenuMixedState 137 | 138 | _popUpItemAction: 139 | 140 | 141 | YES 142 | 143 | OtherViews 144 | 145 | 146 | 147 | 148 | Item 2 149 | 150 | 1048576 151 | 2147483647 152 | 153 | 154 | _popUpItemAction: 155 | 156 | 157 | 158 | 159 | Item 3 160 | 161 | 1048576 162 | 2147483647 163 | 164 | 165 | _popUpItemAction: 166 | 167 | 168 | 169 | 170 | 171 | -1 172 | 1 173 | YES 174 | YES 175 | 2 176 | 177 | NO 178 | 179 | 180 | 181 | 268 182 | {{315, 13}, {72, 32}} 183 | 184 | 185 | _NS:9 186 | YES 187 | 188 | 67108864 189 | 134217728 190 | Okay 191 | 192 | _NS:9 193 | 194 | -2038284288 195 | 129 196 | 197 | 198 | 200 199 | 25 200 | 201 | NO 202 | 203 | 204 | 205 | 268 206 | {{389, 54}, {24, 19}} 207 | 208 | 209 | 210 | _NS:9 211 | YES 212 | 213 | 67108864 214 | 134217728 215 | 216 | 217 | LucidaGrande-Bold 218 | 12 219 | 16 220 | 221 | _NS:9 222 | 223 | -2030288896 224 | 173 225 | 226 | NSImage 227 | NSRefreshFreestandingTemplate 228 | 229 | 230 | 231 | 200 232 | 25 233 | 234 | NO 235 | 236 | 237 | 238 | 268 239 | {{20, 15}, {20, 25}} 240 | 241 | 242 | 243 | _NS:9 244 | YES 245 | 246 | 67108864 247 | 134217728 248 | Button 249 | 250 | _NS:9 251 | 252 | -2042347520 253 | 129 254 | 255 | NSImage 256 | NSAdvanced 257 | 258 | 259 | 260 | 200 261 | 25 262 | 263 | NO 264 | 265 | 266 | 267 | 268 268 | {{46, 21}, {221, 18}} 269 | 270 | 271 | 272 | _NS:9 273 | YES 274 | 275 | -2080374784 276 | 268435456 277 | Enable Munki's bootstrap mode 278 | 279 | _NS:9 280 | 281 | 1211912448 282 | 2 283 | 284 | NSImage 285 | NSSwitch 286 | 287 | 288 | NSSwitch 289 | 290 | 291 | 292 | 200 293 | 25 294 | 295 | NO 296 | 297 | 298 | {433, 118} 299 | 300 | 301 | 302 | 303 | {{0, 0}, {1920, 1058}} 304 | {10000000000000, 10000000000000} 305 | YES 306 | 307 | 308 | AppDelegate 309 | 310 | 311 | NSFontManager 312 | 313 | 314 | 315 | 316 | 0 317 | 0 318 | 0.0 319 | 0.0 320 | YES 321 | 322 | 323 | 324 | 268 325 | 326 | 327 | 328 | 268 329 | {{17, 23}, {156, 14}} 330 | 331 | 332 | _NS:1535 333 | YES 334 | 335 | 68157504 336 | 71435264 337 | Software Update Server URL: 338 | 339 | LucidaGrande 340 | 11 341 | 3100 342 | 343 | _NS:1535 344 | 345 | 346 | 347 | 348 | NO 349 | 350 | 351 | 352 | 268 353 | {{178, 20}, {293, 19}} 354 | 355 | _NS:9 356 | YES 357 | 358 | -1804599231 359 | 272761856 360 | 361 | 362 | _NS:9 363 | 364 | YES 365 | 366 | 6 367 | System 368 | textBackgroundColor 369 | 370 | 3 371 | MQA 372 | 373 | 374 | 375 | 6 376 | System 377 | textColor 378 | 379 | 380 | 381 | NO 382 | 383 | 384 | 385 | 268 386 | 387 | {{178, 47}, {293, 19}} 388 | 389 | 390 | _NS:9 391 | YES 392 | 393 | -1804599231 394 | 272761856 395 | 396 | 397 | http://example.com/munki_repo 398 | _NS:9 399 | 400 | YES 401 | 402 | 403 | 404 | NO 405 | 406 | 407 | 408 | 268 409 | {{17, 50}, {156, 14}} 410 | 411 | 412 | _NS:1535 413 | YES 414 | 415 | 68157504 416 | 71435264 417 | Software Repo URL: 418 | 419 | _NS:1535 420 | 421 | 422 | 423 | 424 | NO 425 | 426 | 427 | 428 | 12 429 | {{12, 173}, {467, 5}} 430 | 431 | 432 | _NS:9 433 | {0, 0} 434 | 435 | 67108864 436 | 0 437 | Box 438 | 439 | 440 | 441 | 3 442 | MCAwLjgwMDAwMDAxMTkAA 443 | 444 | 445 | 3 446 | 2 447 | 0 448 | NO 449 | 450 | 451 | 452 | 268 453 | {{143, 83}, {91, 26}} 454 | 455 | 456 | _NS:9 457 | YES 458 | 459 | -2076180416 460 | 2048 461 | 462 | _NS:9 463 | 464 | 109199360 465 | 129 466 | 467 | 468 | 400 469 | 75 470 | 471 | 472 | Hourly 473 | 474 | 1048576 475 | 2147483647 476 | 1 477 | 478 | 479 | _popUpItemAction: 480 | 481 | 482 | YES 483 | 484 | OtherViews 485 | 486 | 487 | 488 | 489 | Daily 490 | 491 | 1048576 492 | 2147483647 493 | 494 | 495 | _popUpItemAction: 496 | 497 | 498 | 499 | 500 | Weekly 501 | 502 | 1048576 503 | 2147483647 504 | 505 | 506 | _popUpItemAction: 507 | 508 | 509 | 510 | 511 | Monthly 512 | 513 | 1048576 514 | 2147483647 515 | 516 | 517 | _popUpItemAction: 518 | 519 | 520 | 521 | 522 | 523 | 1 524 | YES 525 | YES 526 | 2 527 | 528 | NO 529 | 530 | 531 | 532 | 268 533 | {{17, 88}, {124, 17}} 534 | 535 | 536 | _NS:1535 537 | YES 538 | 539 | 68157504 540 | 272630784 541 | Check for updates: 542 | 543 | _NS:1535 544 | 545 | 546 | 547 | 548 | NO 549 | 550 | 551 | 552 | 268 553 | {{254, 151}, {159, 18}} 554 | 555 | 556 | _NS:9 557 | YES 558 | 559 | -2080374784 560 | 268435456 561 | Suppress Auto-Install 562 | 563 | _NS:9 564 | 565 | 1211912448 566 | 2 567 | 568 | 569 | 570 | 571 | 200 572 | 25 573 | 574 | NO 575 | 576 | 577 | 578 | 268 579 | {{18, 111}, {153, 18}} 580 | 581 | 582 | _NS:9 583 | YES 584 | 585 | -2080374784 586 | 268435456 587 | Show Removal Detail 588 | 589 | _NS:9 590 | 591 | 1211912448 592 | 2 593 | 594 | 595 | 596 | 597 | 200 598 | 25 599 | 600 | NO 601 | 602 | 603 | 604 | 268 605 | {{18, 131}, {167, 18}} 606 | 607 | 608 | _NS:9 609 | YES 610 | 611 | -2080374784 612 | 268435456 613 | Install Requires Logout 614 | 615 | _NS:9 616 | 617 | 1211912448 618 | 2 619 | 620 | 621 | 622 | 623 | 200 624 | 25 625 | 626 | NO 627 | 628 | 629 | 630 | 268 631 | {{254, 91}, {219, 18}} 632 | 633 | 634 | _NS:9 635 | YES 636 | 637 | -2080374784 638 | 268435456 639 | Suppress Stop Button on Install 640 | 641 | _NS:9 642 | 643 | 1211912448 644 | 2 645 | 646 | 647 | 648 | 649 | 200 650 | 25 651 | 652 | NO 653 | 654 | 655 | 656 | 268 657 | {{254, 131}, {209, 18}} 658 | 659 | 660 | _NS:9 661 | YES 662 | 663 | -2080374784 664 | 268435456 665 | Suppress Loginwindow Install 666 | 667 | _NS:9 668 | 669 | 1211912448 670 | 2 671 | 672 | 673 | 674 | 675 | 200 676 | 25 677 | 678 | NO 679 | 680 | 681 | 682 | 268 683 | {{254, 111}, {189, 18}} 684 | 685 | 686 | _NS:9 687 | YES 688 | 689 | -2080374784 690 | 268435456 691 | Suppress User Notification 692 | 693 | _NS:9 694 | 695 | 1211912448 696 | 2 697 | 698 | 699 | 700 | 701 | 200 702 | 25 703 | 704 | NO 705 | 706 | 707 | 708 | 268 709 | {{18, 151}, {215, 18}} 710 | 711 | 712 | _NS:9 713 | YES 714 | 715 | -2080374784 716 | 268435456 717 | Install Apple Software Updates 718 | 719 | _NS:9 720 | 721 | 1211912448 722 | 2 723 | 724 | 725 | 726 | 727 | 200 728 | 25 729 | 730 | NO 731 | 732 | 733 | 734 | 268 735 | {{163, 184}, {165, 20}} 736 | 737 | 738 | _NS:1535 739 | YES 740 | 741 | 68157504 742 | 272630784 743 | ClientManifest Options 744 | 745 | Helvetica 746 | 16 747 | 16 748 | 749 | _NS:1535 750 | 751 | 752 | 753 | 754 | NO 755 | 756 | 757 | {491, 224} 758 | 759 | _NS:9 760 | NSView 761 | 762 | 763 | 764 | 765 | 766 | 767 | delegate 768 | 769 | 770 | 771 | 495 772 | 773 | 774 | 775 | initialFirstResponder 776 | 777 | 778 | 779 | 586 780 | 781 | 782 | 783 | window 784 | 785 | 786 | 787 | 532 788 | 789 | 790 | 791 | manifestPopupMenu 792 | 793 | 794 | 795 | 577 796 | 797 | 798 | 799 | reloadManifests: 800 | 801 | 802 | 803 | 578 804 | 805 | 806 | 807 | useSelectedManifest: 808 | 809 | 810 | 811 | 579 812 | 813 | 814 | 815 | setSelectedManifest: 816 | 817 | 818 | 819 | 582 820 | 821 | 822 | 823 | popover 824 | 825 | 826 | 827 | 837 828 | 829 | 830 | 831 | showAdvancedOptions: 832 | 833 | 834 | 835 | 838 836 | 837 | 838 | 839 | enabled: selectedManifestName 840 | 841 | 842 | 843 | 844 | 845 | enabled: selectedManifestName 846 | enabled 847 | selectedManifestName 848 | 849 | NSValueTransformerName 850 | NSIsNotNil 851 | 852 | 2 853 | 854 | 855 | 584 856 | 857 | 858 | 859 | value: enableMunkiBootstrapMode 860 | 861 | 862 | 863 | 864 | 865 | value: enableMunkiBootstrapMode 866 | value 867 | enableMunkiBootstrapMode 868 | 2 869 | 870 | 871 | 662 872 | 873 | 874 | 875 | view 876 | 877 | 878 | 879 | 706 880 | 881 | 882 | 883 | contentViewController 884 | 885 | 886 | 887 | 672 888 | 889 | 890 | 891 | value: manifestDict.InstallAppleSoftwareUpdates 892 | 893 | 894 | 895 | 896 | 897 | value: manifestDict.InstallAppleSoftwareUpdates 898 | value 899 | manifestDict.InstallAppleSoftwareUpdates 900 | 2 901 | 902 | 903 | 900 904 | 905 | 906 | 907 | value: manifestDict.SuppressUserNotification 908 | 909 | 910 | 911 | 912 | 913 | value: manifestDict.SuppressUserNotification 914 | value 915 | manifestDict.SuppressUserNotification 916 | 2 917 | 918 | 919 | 904 920 | 921 | 922 | 923 | value: manifestDict.SuppressLoginwindowInstall 924 | 925 | 926 | 927 | 928 | 929 | value: manifestDict.SuppressLoginwindowInstall 930 | value 931 | manifestDict.SuppressLoginwindowInstall 932 | 2 933 | 934 | 935 | 903 936 | 937 | 938 | 939 | value: manifestDict.SuppressStopButtonOnInstall 940 | 941 | 942 | 943 | 944 | 945 | value: manifestDict.SuppressStopButtonOnInstall 946 | value 947 | manifestDict.SuppressStopButtonOnInstall 948 | 2 949 | 950 | 951 | 905 952 | 953 | 954 | 955 | value: manifestDict.InstallRequiresLogout 956 | 957 | 958 | 959 | 960 | 961 | value: manifestDict.InstallRequiresLogout 962 | value 963 | manifestDict.InstallRequiresLogout 964 | 2 965 | 966 | 967 | 907 968 | 969 | 970 | 971 | value: manifestDict.ShowRemovalDetail 972 | 973 | 974 | 975 | 976 | 977 | value: manifestDict.ShowRemovalDetail 978 | value 979 | manifestDict.ShowRemovalDetail 980 | 2 981 | 982 | 983 | 908 984 | 985 | 986 | 987 | selectedValue: manifestDict.DaysBetweenNotifications 988 | 989 | 990 | 991 | 992 | 993 | selectedValue: manifestDict.DaysBetweenNotifications 994 | selectedValue 995 | manifestDict.DaysBetweenNotifications 996 | 2 997 | 998 | 999 | 909 1000 | 1001 | 1002 | 1003 | value: manifestDict.SuppressAutoInstall 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | value: manifestDict.SuppressAutoInstall 1010 | value 1011 | manifestDict.SuppressAutoInstall 1012 | 2 1013 | 1014 | 1015 | 910 1016 | 1017 | 1018 | 1019 | value: manifestDict.SoftwareRepoURL 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | value: manifestDict.SoftwareRepoURL 1026 | value 1027 | manifestDict.SoftwareRepoURL 1028 | 2 1029 | 1030 | 1031 | 1013 1032 | 1033 | 1034 | 1035 | value: manifestDict.SoftwareUpdateServerURL 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | value: manifestDict.SoftwareUpdateServerURL 1042 | value 1043 | manifestDict.SoftwareUpdateServerURL 1044 | 2 1045 | 1046 | 1047 | 1049 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 0 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | -2 1060 | 1061 | 1062 | File's Owner 1063 | 1064 | 1065 | -1 1066 | 1067 | 1068 | First Responder 1069 | 1070 | 1071 | -3 1072 | 1073 | 1074 | Application 1075 | 1076 | 1077 | 371 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 372 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 5 1092 | 0 1093 | 1094 | 6 1095 | 1 1096 | 1097 | 8 1098 | 1099 | 1000 1100 | 1101 | 6 1102 | 24 1103 | 3 1104 | 1105 | 1106 | 1107 | 6 1108 | 0 1109 | 1110 | 6 1111 | 1 1112 | 1113 | 20 1114 | 1115 | 1000 1116 | 1117 | 8 1118 | 29 1119 | 3 1120 | 1121 | 1122 | 1123 | 4 1124 | 0 1125 | 1126 | 4 1127 | 1 1128 | 1129 | 20 1130 | 1131 | 1000 1132 | 1133 | 8 1134 | 29 1135 | 3 1136 | 1137 | 1138 | 1139 | 6 1140 | 0 1141 | 1142 | 6 1143 | 1 1144 | 1145 | 0.0 1146 | 1147 | 1000 1148 | 1149 | 6 1150 | 24 1151 | 2 1152 | 1153 | 1154 | 1155 | 10 1156 | 0 1157 | 1158 | 10 1159 | 1 1160 | 1161 | 0.0 1162 | 1163 | 1000 1164 | 1165 | 6 1166 | 24 1167 | 2 1168 | 1169 | 1170 | 1171 | 5 1172 | 0 1173 | 1174 | 6 1175 | 1 1176 | 1177 | 8 1178 | 1179 | 1000 1180 | 1181 | 6 1182 | 24 1183 | 3 1184 | 1185 | 1186 | 1187 | 4 1188 | 0 1189 | 1190 | 4 1191 | 1 1192 | 1193 | 15 1194 | 1195 | 1000 1196 | 1197 | 3 1198 | 9 1199 | 3 1200 | 1201 | 1202 | 1203 | 5 1204 | 0 1205 | 1206 | 5 1207 | 1 1208 | 1209 | 20 1210 | 1211 | 1000 1212 | 1213 | 8 1214 | 29 1215 | 3 1216 | 1217 | 1218 | 1219 | 3 1220 | 0 1221 | 1222 | 3 1223 | 1 1224 | 1225 | 0.0 1226 | 1227 | 1000 1228 | 1229 | 6 1230 | 24 1231 | 2 1232 | 1233 | 1234 | 1235 | 5 1236 | 0 1237 | 1238 | 5 1239 | 1 1240 | 1241 | 20 1242 | 1243 | 1000 1244 | 1245 | 8 1246 | 29 1247 | 3 1248 | 1249 | 1250 | 1251 | 3 1252 | 0 1253 | 1254 | 4 1255 | 1 1256 | 1257 | 8 1258 | 1259 | 1000 1260 | 1261 | 9 1262 | 40 1263 | 3 1264 | 1265 | 1266 | 1267 | 5 1268 | 0 1269 | 1270 | 5 1271 | 1 1272 | 1273 | 20 1274 | 1275 | 1000 1276 | 1277 | 9 1278 | 40 1279 | 3 1280 | 1281 | 1282 | 1283 | 3 1284 | 0 1285 | 1286 | 3 1287 | 1 1288 | 1289 | 20 1290 | 1291 | 1000 1292 | 1293 | 9 1294 | 40 1295 | 3 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | 1306 | 420 1307 | 1308 | 1309 | 1310 | 1311 | 494 1312 | 1313 | 1314 | 1315 | 1316 | 536 1317 | 1318 | 1319 | 1320 | 1321 | 1322 | 1323 | 1324 | 537 1325 | 1326 | 1327 | 1328 | 1329 | 538 1330 | 1331 | 1332 | 1333 | 1334 | 539 1335 | 1336 | 1337 | 1338 | 1339 | 540 1340 | 1341 | 1342 | 1343 | 1344 | 1345 | 1346 | 1347 | 541 1348 | 1349 | 1350 | 1351 | 1352 | 1353 | 1354 | 1355 | 542 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 1364 | 1365 | 543 1366 | 1367 | 1368 | 1369 | 1370 | 544 1371 | 1372 | 1373 | 1374 | 1375 | 545 1376 | 1377 | 1378 | 1379 | 1380 | 547 1381 | 1382 | 1383 | 1384 | 1385 | 550 1386 | 1387 | 1388 | 1389 | 1390 | 1391 | 1392 | 1393 | 551 1394 | 1395 | 1396 | 1397 | 1398 | 556 1399 | 1400 | 1401 | 1402 | 1403 | 1404 | 7 1405 | 0 1406 | 1407 | 0 1408 | 1 1409 | 1410 | 24 1411 | 1412 | 1000 1413 | 1414 | 3 1415 | 9 1416 | 1 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | 557 1423 | 1424 | 1425 | 1426 | 1427 | 620 1428 | 1429 | 1430 | 1431 | 1432 | 626 1433 | 1434 | 1435 | 1436 | 1437 | 628 1438 | 1439 | 1440 | 1441 | 1442 | 656 1443 | 1444 | 1445 | 1446 | 1447 | 658 1448 | 1449 | 1450 | 1451 | 1452 | 659 1453 | 1454 | 1455 | 1456 | 1457 | 660 1458 | 1459 | 1460 | 1461 | 1462 | 670 1463 | 1464 | 1465 | Popover View Controller 1466 | 1467 | 1468 | 671 1469 | 1470 | 1471 | 1472 | 1473 | 673 1474 | 1475 | 1476 | 1477 | 1478 | 3 1479 | 0 1480 | 1481 | 4 1482 | 1 1483 | 1484 | 6 1485 | 1486 | 1000 1487 | 1488 | 6 1489 | 24 1490 | 3 1491 | 1492 | 1493 | 1494 | 6 1495 | 0 1496 | 1497 | 6 1498 | 1 1499 | 1500 | 20 1501 | 1502 | 1000 1503 | 1504 | 8 1505 | 29 1506 | 3 1507 | 1508 | 1509 | 1510 | 5 1511 | 0 1512 | 1513 | 5 1514 | 1 1515 | 1516 | 0.0 1517 | 1518 | 1000 1519 | 1520 | 6 1521 | 24 1522 | 2 1523 | 1524 | 1525 | 1526 | 11 1527 | 0 1528 | 1529 | 11 1530 | 1 1531 | 1532 | 0.0 1533 | 1534 | 1000 1535 | 1536 | 6 1537 | 24 1538 | 2 1539 | 1540 | 1541 | 1542 | 5 1543 | 0 1544 | 1545 | 5 1546 | 1 1547 | 1548 | 0.0 1549 | 1550 | 1000 1551 | 1552 | 6 1553 | 24 1554 | 2 1555 | 1556 | 1557 | 1558 | 11 1559 | 0 1560 | 1561 | 11 1562 | 1 1563 | 1564 | 0.0 1565 | 1566 | 1000 1567 | 1568 | 6 1569 | 24 1570 | 2 1571 | 1572 | 1573 | 1574 | 11 1575 | 0 1576 | 1577 | 11 1578 | 1 1579 | 1580 | 0.0 1581 | 1582 | 1000 1583 | 1584 | 6 1585 | 24 1586 | 2 1587 | 1588 | 1589 | 1590 | 5 1591 | 0 1592 | 1593 | 5 1594 | 1 1595 | 1596 | 0.0 1597 | 1598 | 1000 1599 | 1600 | 6 1601 | 24 1602 | 2 1603 | 1604 | 1605 | 1606 | 6 1607 | 0 1608 | 1609 | 6 1610 | 1 1611 | 1612 | 20 1613 | 1614 | 1000 1615 | 1616 | 8 1617 | 29 1618 | 3 1619 | 1620 | 1621 | 1622 | 5 1623 | 0 1624 | 1625 | 6 1626 | 1 1627 | 1628 | 8 1629 | 1630 | 1000 1631 | 1632 | 6 1633 | 24 1634 | 3 1635 | 1636 | 1637 | 1638 | 3 1639 | 0 1640 | 1641 | 4 1642 | 1 1643 | 1644 | 8 1645 | 1646 | 1000 1647 | 1648 | 6 1649 | 24 1650 | 3 1651 | 1652 | 1653 | 1654 | 4 1655 | 0 1656 | 1657 | 4 1658 | 1 1659 | 1660 | 20 1661 | 1662 | 1000 1663 | 1664 | 8 1665 | 29 1666 | 3 1667 | 1668 | 1669 | 1670 | 5 1671 | 0 1672 | 1673 | 5 1674 | 1 1675 | 1676 | 0.0 1677 | 1678 | 1000 1679 | 1680 | 6 1681 | 24 1682 | 2 1683 | 1684 | 1685 | 1686 | 6 1687 | 0 1688 | 1689 | 6 1690 | 1 1691 | 1692 | 20 1693 | 1694 | 1000 1695 | 1696 | 8 1697 | 29 1698 | 3 1699 | 1700 | 1701 | 1702 | 5 1703 | 0 1704 | 1705 | 6 1706 | 1 1707 | 1708 | 8 1709 | 1710 | 1000 1711 | 1712 | 6 1713 | 24 1714 | 3 1715 | 1716 | 1717 | 1718 | 3 1719 | 0 1720 | 1721 | 4 1722 | 1 1723 | 1724 | 20 1725 | 1726 | 1000 1727 | 1728 | 6 1729 | 24 1730 | 3 1731 | 1732 | 1733 | 1734 | 10 1735 | 0 1736 | 1737 | 10 1738 | 1 1739 | 1740 | 0.0 1741 | 1742 | 1000 1743 | 1744 | 6 1745 | 24 1746 | 2 1747 | 1748 | 1749 | 1750 | 5 1751 | 0 1752 | 1753 | 5 1754 | 1 1755 | 1756 | 20 1757 | 1758 | 1000 1759 | 1760 | 8 1761 | 29 1762 | 3 1763 | 1764 | 1765 | 1766 | 10 1767 | 0 1768 | 1769 | 10 1770 | 1 1771 | 1772 | 0.0 1773 | 1774 | 1000 1775 | 1776 | 6 1777 | 24 1778 | 2 1779 | 1780 | 1781 | 1782 | 5 1783 | 0 1784 | 1785 | 6 1786 | 1 1787 | 1788 | 8 1789 | 1790 | 1000 1791 | 1792 | 6 1793 | 24 1794 | 3 1795 | 1796 | 1797 | 1798 | 9 1799 | 0 1800 | 1801 | 9 1802 | 1 1803 | 1804 | 0.0 1805 | 1806 | 1000 1807 | 1808 | 6 1809 | 24 1810 | 2 1811 | 1812 | 1813 | 1814 | 3 1815 | 0 1816 | 1817 | 3 1818 | 1 1819 | 1820 | 20 1821 | 1822 | 1000 1823 | 1824 | 8 1825 | 29 1826 | 3 1827 | 1828 | 1829 | 1830 | 5 1831 | 0 1832 | 1833 | 5 1834 | 1 1835 | 1836 | 20 1837 | 1838 | 1000 1839 | 1840 | 8 1841 | 29 1842 | 3 1843 | 1844 | 1845 | 1846 | 3 1847 | 0 1848 | 1849 | 4 1850 | 1 1851 | 1852 | 8 1853 | 1854 | 1000 1855 | 1856 | 6 1857 | 24 1858 | 3 1859 | 1860 | 1861 | 1862 | 5 1863 | 0 1864 | 1865 | 5 1866 | 1 1867 | 1868 | 20 1869 | 1870 | 1000 1871 | 1872 | 8 1873 | 29 1874 | 3 1875 | 1876 | 1877 | 1878 | 5 1879 | 0 1880 | 1881 | 5 1882 | 1 1883 | 1884 | 20 1885 | 1886 | 1000 1887 | 1888 | 8 1889 | 29 1890 | 3 1891 | 1892 | 1893 | 1894 | 3 1895 | 0 1896 | 1897 | 4 1898 | 1 1899 | 1900 | 6 1901 | 1902 | 1000 1903 | 1904 | 6 1905 | 24 1906 | 3 1907 | 1908 | 1909 | 1910 | 3 1911 | 0 1912 | 1913 | 4 1914 | 1 1915 | 1916 | 6 1917 | 1918 | 1000 1919 | 1920 | 6 1921 | 24 1922 | 3 1923 | 1924 | 1925 | 1926 | 5 1927 | 0 1928 | 1929 | 5 1930 | 1 1931 | 1932 | 20 1933 | 1934 | 1000 1935 | 1936 | 8 1937 | 29 1938 | 3 1939 | 1940 | 1941 | 1942 | 3 1943 | 0 1944 | 1945 | 4 1946 | 1 1947 | 1948 | 8 1949 | 1950 | 1000 1951 | 1952 | 6 1953 | 24 1954 | 3 1955 | 1956 | 1957 | 1958 | 5 1959 | 0 1960 | 1961 | 5 1962 | 1 1963 | 1964 | 20 1965 | 1966 | 1000 1967 | 1968 | 8 1969 | 29 1970 | 3 1971 | 1972 | 1973 | 1974 | 3 1975 | 0 1976 | 1977 | 4 1978 | 1 1979 | 1980 | 8 1981 | 1982 | 1000 1983 | 1984 | 6 1985 | 24 1986 | 3 1987 | 1988 | 1989 | 1990 | 5 1991 | 0 1992 | 1993 | 5 1994 | 1 1995 | 1996 | 12 1997 | 1998 | 1000 1999 | 2000 | 8 2001 | 29 2002 | 3 2003 | 2004 | 2005 | 2006 | 6 2007 | 0 2008 | 2009 | 6 2010 | 1 2011 | 2012 | 12 2013 | 2014 | 1000 2015 | 2016 | 8 2017 | 29 2018 | 3 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | 2030 | 2031 | 2032 | 2033 | 2034 | 2035 | 2036 | 2037 | 2038 | 2039 | 676 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | 2047 | 677 2048 | 2049 | 2050 | 2051 | 2052 | 679 2053 | 2054 | 2055 | 2056 | 2057 | 693 2058 | 2059 | 2060 | 2061 | 2062 | 2063 | 8 2064 | 0 2065 | 2066 | 0 2067 | 1 2068 | 2069 | 25 2070 | 2071 | 1000 2072 | 2073 | 3 2074 | 9 2075 | 1 2076 | 2077 | 2078 | 2079 | 7 2080 | 0 2081 | 2082 | 0 2083 | 1 2084 | 2085 | 20 2086 | 2087 | 1000 2088 | 2089 | 3 2090 | 9 2091 | 1 2092 | 2093 | 2094 | 2095 | 2096 | 2097 | 694 2098 | 2099 | 2100 | 2101 | 2102 | 701 2103 | 2104 | 2105 | 2106 | 2107 | 703 2108 | 2109 | 2110 | 2111 | 2112 | 705 2113 | 2114 | 2115 | 2116 | 2117 | 587 2118 | 2119 | 2120 | 2121 | 2122 | 2123 | 2124 | 2125 | 588 2126 | 2127 | 2128 | 2129 | 2130 | 713 2131 | 2132 | 2133 | 2134 | 2135 | 714 2136 | 2137 | 2138 | 2139 | 2140 | 724 2141 | 2142 | 2143 | 2144 | 2145 | 2146 | 2147 | 2148 | 725 2149 | 2150 | 2151 | 2152 | 2153 | 734 2154 | 2155 | 2156 | 2157 | 2158 | 2159 | 2160 | 2161 | 735 2162 | 2163 | 2164 | 2165 | 2166 | 740 2167 | 2168 | 2169 | 2170 | 2171 | 2172 | 2173 | 2174 | 741 2175 | 2176 | 2177 | 2178 | 2179 | 746 2180 | 2181 | 2182 | 2183 | 2184 | 2185 | 2186 | 2187 | 747 2188 | 2189 | 2190 | 2191 | 2192 | 750 2193 | 2194 | 2195 | 2196 | 2197 | 2198 | 2199 | 2200 | 751 2201 | 2202 | 2203 | 2204 | 2205 | 754 2206 | 2207 | 2208 | 2209 | 2210 | 2211 | 2212 | 2213 | 755 2214 | 2215 | 2216 | 2217 | 2218 | 764 2219 | 2220 | 2221 | 2222 | 2223 | 794 2224 | 2225 | 2226 | 2227 | 2228 | 2229 | 2230 | 2231 | 795 2232 | 2233 | 2234 | 2235 | 2236 | 819 2237 | 2238 | 2239 | 2240 | 2241 | 2242 | 7 2243 | 0 2244 | 2245 | 0 2246 | 1 2247 | 2248 | 85 2249 | 2250 | 1000 2251 | 2252 | 3 2253 | 9 2254 | 1 2255 | 2256 | 2257 | 2258 | 2259 | 2260 | 820 2261 | 2262 | 2263 | 2264 | 2265 | 2266 | 2267 | 2268 | 821 2269 | 2270 | 2271 | 2272 | 2273 | 2274 | 2275 | 2276 | 2277 | 2278 | 2279 | 822 2280 | 2281 | 2282 | 2283 | 2284 | 823 2285 | 2286 | 2287 | 2288 | 2289 | 824 2290 | 2291 | 2292 | 2293 | 2294 | 832 2295 | 2296 | 2297 | 2298 | 2299 | 836 2300 | 2301 | 2302 | 2303 | 2304 | 847 2305 | 2306 | 2307 | 2308 | 2309 | 2310 | 2311 | 2312 | 848 2313 | 2314 | 2315 | 2316 | 2317 | 869 2318 | 2319 | 2320 | 2321 | 2322 | 924 2323 | 2324 | 2325 | 2326 | 2327 | 926 2328 | 2329 | 2330 | 2331 | 2332 | 930 2333 | 2334 | 2335 | 2336 | 2337 | 936 2338 | 2339 | 2340 | 2341 | 2342 | 937 2343 | 2344 | 2345 | 2346 | 2347 | 941 2348 | 2349 | 2350 | 2351 | 2352 | 942 2353 | 2354 | 2355 | 2356 | 2357 | 958 2358 | 2359 | 2360 | 2361 | 2362 | 959 2363 | 2364 | 2365 | 2366 | 2367 | 960 2368 | 2369 | 2370 | 2371 | 2372 | 962 2373 | 2374 | 2375 | 2376 | 2377 | 964 2378 | 2379 | 2380 | 2381 | 2382 | 965 2383 | 2384 | 2385 | 2386 | 2387 | 966 2388 | 2389 | 2390 | 2391 | 2392 | 969 2393 | 2394 | 2395 | 2396 | 2397 | 971 2398 | 2399 | 2400 | 2401 | 2402 | 972 2403 | 2404 | 2405 | 2406 | 2407 | 973 2408 | 2409 | 2410 | 2411 | 2412 | 977 2413 | 2414 | 2415 | 2416 | 2417 | 978 2418 | 2419 | 2420 | 2421 | 2422 | 986 2423 | 2424 | 2425 | 2426 | 2427 | 2428 | 2429 | 2430 | 987 2431 | 2432 | 2433 | 2434 | 2435 | 990 2436 | 2437 | 2438 | 2439 | 2440 | 2441 | 2442 | 2443 | 991 2444 | 2445 | 2446 | 2447 | 2448 | 999 2449 | 2450 | 2451 | 2452 | 2453 | 1011 2454 | 2455 | 2456 | 2457 | 2458 | 1014 2459 | 2460 | 2461 | 2462 | 2463 | 2464 | 2465 | 2466 | 1015 2467 | 2468 | 2469 | 2470 | 2471 | 1019 2472 | 2473 | 2474 | 2475 | 2476 | 1020 2477 | 2478 | 2479 | 2480 | 2481 | 2482 | 2483 | 2484 | 1021 2485 | 2486 | 2487 | 2488 | 2489 | 1025 2490 | 2491 | 2492 | 2493 | 2494 | 1050 2495 | 2496 | 2497 | 2498 | 2499 | 1054 2500 | 2501 | 2502 | 2503 | 2504 | 1055 2505 | 2506 | 2507 | 2508 | 2509 | 1056 2510 | 2511 | 2512 | 2513 | 2514 | 1057 2515 | 2516 | 2517 | 2518 | 2519 | 1058 2520 | 2521 | 2522 | 2523 | 2524 | 1060 2525 | 2526 | 2527 | 2528 | 2529 | 1062 2530 | 2531 | 2532 | 2533 | 2534 | 1063 2535 | 2536 | 2537 | 2538 | 2539 | 2540 | 2541 | com.apple.InterfaceBuilder.CocoaPlugin 2542 | com.apple.InterfaceBuilder.CocoaPlugin 2543 | com.apple.InterfaceBuilder.CocoaPlugin 2544 | com.apple.InterfaceBuilder.CocoaPlugin 2545 | 2546 | com.apple.InterfaceBuilder.CocoaPlugin 2547 | com.apple.InterfaceBuilder.CocoaPlugin 2548 | com.apple.InterfaceBuilder.CocoaPlugin 2549 | 2550 | com.apple.InterfaceBuilder.CocoaPlugin 2551 | com.apple.InterfaceBuilder.CocoaPlugin 2552 | com.apple.InterfaceBuilder.CocoaPlugin 2553 | com.apple.InterfaceBuilder.CocoaPlugin 2554 | com.apple.InterfaceBuilder.CocoaPlugin 2555 | com.apple.InterfaceBuilder.CocoaPlugin 2556 | com.apple.InterfaceBuilder.CocoaPlugin 2557 | com.apple.InterfaceBuilder.CocoaPlugin 2558 | com.apple.InterfaceBuilder.CocoaPlugin 2559 | com.apple.InterfaceBuilder.CocoaPlugin 2560 | com.apple.InterfaceBuilder.CocoaPlugin 2561 | com.apple.InterfaceBuilder.CocoaPlugin 2562 | 2563 | 2564 | com.apple.InterfaceBuilder.CocoaPlugin 2565 | {{380, 496}, {480, 360}} 2566 | 2567 | 2568 | 2569 | 2570 | 2571 | 2572 | 2573 | 2574 | 2575 | 2576 | 2577 | 2578 | 2579 | 2580 | 2581 | 2582 | com.apple.InterfaceBuilder.CocoaPlugin 2583 | com.apple.InterfaceBuilder.CocoaPlugin 2584 | com.apple.InterfaceBuilder.CocoaPlugin 2585 | 2586 | com.apple.InterfaceBuilder.CocoaPlugin 2587 | com.apple.InterfaceBuilder.CocoaPlugin 2588 | com.apple.InterfaceBuilder.CocoaPlugin 2589 | com.apple.InterfaceBuilder.CocoaPlugin 2590 | 2591 | com.apple.InterfaceBuilder.CocoaPlugin 2592 | com.apple.InterfaceBuilder.CocoaPlugin 2593 | com.apple.InterfaceBuilder.CocoaPlugin 2594 | com.apple.InterfaceBuilder.CocoaPlugin 2595 | com.apple.InterfaceBuilder.CocoaPlugin 2596 | com.apple.InterfaceBuilder.CocoaPlugin 2597 | com.apple.InterfaceBuilder.CocoaPlugin 2598 | 2599 | com.apple.InterfaceBuilder.CocoaPlugin 2600 | com.apple.InterfaceBuilder.CocoaPlugin 2601 | 2602 | 2603 | 2604 | 2605 | com.apple.InterfaceBuilder.CocoaPlugin 2606 | com.apple.InterfaceBuilder.CocoaPlugin 2607 | 2608 | com.apple.InterfaceBuilder.CocoaPlugin 2609 | com.apple.InterfaceBuilder.CocoaPlugin 2610 | com.apple.InterfaceBuilder.CocoaPlugin 2611 | com.apple.InterfaceBuilder.CocoaPlugin 2612 | com.apple.InterfaceBuilder.CocoaPlugin 2613 | com.apple.InterfaceBuilder.CocoaPlugin 2614 | com.apple.InterfaceBuilder.CocoaPlugin 2615 | com.apple.InterfaceBuilder.CocoaPlugin 2616 | com.apple.InterfaceBuilder.CocoaPlugin 2617 | com.apple.InterfaceBuilder.CocoaPlugin 2618 | com.apple.InterfaceBuilder.CocoaPlugin 2619 | 2620 | 2621 | 2622 | 2623 | 2624 | 2625 | 2626 | 2627 | 2628 | 2629 | 2630 | 2631 | 2632 | 2633 | 2634 | 2635 | 2636 | 2637 | 2638 | 2639 | 2640 | 2641 | 2642 | 2643 | 2644 | 2645 | 2646 | 2647 | 2648 | 2649 | 2650 | 2651 | 2652 | 2653 | 2654 | 2655 | com.apple.InterfaceBuilder.CocoaPlugin 2656 | 2657 | com.apple.InterfaceBuilder.CocoaPlugin 2658 | com.apple.InterfaceBuilder.CocoaPlugin 2659 | com.apple.InterfaceBuilder.CocoaPlugin 2660 | 2661 | 2662 | 2663 | 2664 | 2665 | com.apple.InterfaceBuilder.CocoaPlugin 2666 | com.apple.InterfaceBuilder.CocoaPlugin 2667 | com.apple.InterfaceBuilder.CocoaPlugin 2668 | com.apple.InterfaceBuilder.CocoaPlugin 2669 | com.apple.InterfaceBuilder.CocoaPlugin 2670 | com.apple.InterfaceBuilder.CocoaPlugin 2671 | com.apple.InterfaceBuilder.CocoaPlugin 2672 | 2673 | com.apple.InterfaceBuilder.CocoaPlugin 2674 | com.apple.InterfaceBuilder.CocoaPlugin 2675 | 2676 | com.apple.InterfaceBuilder.CocoaPlugin 2677 | com.apple.InterfaceBuilder.CocoaPlugin 2678 | 2679 | com.apple.InterfaceBuilder.CocoaPlugin 2680 | com.apple.InterfaceBuilder.CocoaPlugin 2681 | 2682 | com.apple.InterfaceBuilder.CocoaPlugin 2683 | com.apple.InterfaceBuilder.CocoaPlugin 2684 | 2685 | com.apple.InterfaceBuilder.CocoaPlugin 2686 | com.apple.InterfaceBuilder.CocoaPlugin 2687 | 2688 | com.apple.InterfaceBuilder.CocoaPlugin 2689 | com.apple.InterfaceBuilder.CocoaPlugin 2690 | com.apple.InterfaceBuilder.CocoaPlugin 2691 | 2692 | com.apple.InterfaceBuilder.CocoaPlugin 2693 | com.apple.InterfaceBuilder.CocoaPlugin 2694 | 2695 | 2696 | 2697 | 2698 | com.apple.InterfaceBuilder.CocoaPlugin 2699 | com.apple.InterfaceBuilder.CocoaPlugin 2700 | com.apple.InterfaceBuilder.CocoaPlugin 2701 | com.apple.InterfaceBuilder.CocoaPlugin 2702 | com.apple.InterfaceBuilder.CocoaPlugin 2703 | com.apple.InterfaceBuilder.CocoaPlugin 2704 | com.apple.InterfaceBuilder.CocoaPlugin 2705 | com.apple.InterfaceBuilder.CocoaPlugin 2706 | 2707 | com.apple.InterfaceBuilder.CocoaPlugin 2708 | com.apple.InterfaceBuilder.CocoaPlugin 2709 | com.apple.InterfaceBuilder.CocoaPlugin 2710 | com.apple.InterfaceBuilder.CocoaPlugin 2711 | com.apple.InterfaceBuilder.CocoaPlugin 2712 | com.apple.InterfaceBuilder.CocoaPlugin 2713 | com.apple.InterfaceBuilder.CocoaPlugin 2714 | 2715 | com.apple.InterfaceBuilder.CocoaPlugin 2716 | com.apple.InterfaceBuilder.CocoaPlugin 2717 | com.apple.InterfaceBuilder.CocoaPlugin 2718 | com.apple.InterfaceBuilder.CocoaPlugin 2719 | com.apple.InterfaceBuilder.CocoaPlugin 2720 | com.apple.InterfaceBuilder.CocoaPlugin 2721 | com.apple.InterfaceBuilder.CocoaPlugin 2722 | com.apple.InterfaceBuilder.CocoaPlugin 2723 | com.apple.InterfaceBuilder.CocoaPlugin 2724 | com.apple.InterfaceBuilder.CocoaPlugin 2725 | com.apple.InterfaceBuilder.CocoaPlugin 2726 | com.apple.InterfaceBuilder.CocoaPlugin 2727 | com.apple.InterfaceBuilder.CocoaPlugin 2728 | com.apple.InterfaceBuilder.CocoaPlugin 2729 | com.apple.InterfaceBuilder.CocoaPlugin 2730 | com.apple.InterfaceBuilder.CocoaPlugin 2731 | 2732 | com.apple.InterfaceBuilder.CocoaPlugin 2733 | com.apple.InterfaceBuilder.CocoaPlugin 2734 | 2735 | com.apple.InterfaceBuilder.CocoaPlugin 2736 | com.apple.InterfaceBuilder.CocoaPlugin 2737 | com.apple.InterfaceBuilder.CocoaPlugin 2738 | 2739 | 2740 | 2741 | 2742 | 2743 | 1063 2744 | 2745 | 2746 | 2747 | 2748 | AppDelegate 2749 | NSObject 2750 | 2751 | id 2752 | NSPopUpButton 2753 | NSButton 2754 | id 2755 | 2756 | 2757 | 2758 | reloadManifests: 2759 | id 2760 | 2761 | 2762 | setSelectedManifest: 2763 | NSPopUpButton 2764 | 2765 | 2766 | showAdvancedOptions: 2767 | NSButton 2768 | 2769 | 2770 | useSelectedManifest: 2771 | id 2772 | 2773 | 2774 | 2775 | NSPopUpButton 2776 | NSPopover 2777 | NSWindow 2778 | 2779 | 2780 | 2781 | manifestPopupMenu 2782 | NSPopUpButton 2783 | 2784 | 2785 | popover 2786 | NSPopover 2787 | 2788 | 2789 | window 2790 | NSWindow 2791 | 2792 | 2793 | 2794 | IBProjectSource 2795 | ./Classes/AppDelegate.h 2796 | 2797 | 2798 | 2799 | MMMainWindow 2800 | NSWindow 2801 | 2802 | IBProjectSource 2803 | ./Classes/MMMainWindow.h 2804 | 2805 | 2806 | 2807 | NSLayoutConstraint 2808 | NSObject 2809 | 2810 | IBProjectSource 2811 | ./Classes/NSLayoutConstraint.h 2812 | 2813 | 2814 | 2815 | 2816 | 0 2817 | IBCocoaFramework 2818 | 2819 | com.apple.InterfaceBuilder.CocoaPlugin.macosx 2820 | 2821 | 2822 | YES 2823 | 3 2824 | 2825 | {32, 32} 2826 | {11, 11} 2827 | {10, 3} 2828 | {14, 14} 2829 | {15, 15} 2830 | 2831 | YES 2832 | 2833 | 2834 | --------------------------------------------------------------------------------