From 2ab1768f17e3810b13d5ccf55c0ec700a5da97f5 Mon Sep 17 00:00:00 2001 From: Andy Vandijck Date: Fri, 20 Jun 2025 18:47:56 +0200 Subject: [PATCH 1/2] Add support for FAT64, add more commands, do some fixes Add support for FAT64, add more commands, do some fixes --- .DS_Store | Bin 0 -> 10244 bytes .gitignore | 2 + CDFatArch64.h | 34 ++++ CDFatArch64.m | 137 +++++++++++++++ Source/.DS_Store | Bin 0 -> 18436 bytes Source/CDClassDump.m | 4 + Source/CDFatArch.h | 4 +- Source/CDFatArch.m | 44 +++-- Source/CDFatArch64.h | 34 ++++ Source/CDFatArch64.m | 112 ++++++++++++ Source/CDFatFile.h | 5 +- Source/CDFatFile.m | 160 ++++++++++++++---- Source/CDFile.m | 46 ++++- Source/CDLCBuildVersion.m | 57 +++++-- Source/CDLoadCommand.m | 16 ++ Source/CDMachOFile.h | 2 + Source/CDMachOFile.m | 72 +++++++- Source/CDObjectiveC2Processor.m | 51 ++++-- Source/CDObjectiveCProcessor.m | 5 +- UnitTests/TestFatFile_armv7_v7s.m | 1 + class-dump.m | 2 +- class-dump.xcodeproj/project.pbxproj | 82 ++++++++- .../IDEFindNavigatorScopes.plist | 5 + .../UserInterfaceState.xcuserstate | Bin 0 -> 69537 bytes .../xcshareddata/xcschemes/all.xcscheme | 79 +++++++++ .../xcschemes/xcschememanagement.plist | 47 +++++ default.profraw | Bin 0 -> 81800 bytes deprotect.m | 2 +- 28 files changed, 906 insertions(+), 97 deletions(-) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 CDFatArch64.h create mode 100644 CDFatArch64.m create mode 100644 Source/.DS_Store create mode 100644 Source/CDFatArch64.h create mode 100644 Source/CDFatArch64.m create mode 100644 class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/IDEFindNavigatorScopes.plist create mode 100644 class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 class-dump.xcodeproj/xcshareddata/xcschemes/all.xcscheme create mode 100644 class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 default.profraw diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b9a2fb6f547bcf9ae79bece484b13343b377d9af GIT binary patch literal 10244 zcmeHMO>Y}T7=9;BnsuBHr?E>Lfn?zeQqz#ODMCW1j+4?x5E5cHP1Fyww%5)kn;mO+ z9mkCl`3xt10G#2(6^TE1Ya(KW zR_zv1mWVW5LZ-%X8_>jaarL#KU}P4O0Z&w0wRp8+@k-xZHJ}(!3@8Q^1BwB~z<+}Q zyt75qlD<@T#eiZ!G4MA7Vt>fu5;7mit}o@*ftx%6Kn`PAHuP~0keF;B^MUO8QbM8A zKRvJj%7P;X^Wk`&71JT}f$aLyhZFPR!~)AKIH53U9k{HVPAuW2mBIkD$68jR@=_}bJbb^*?g+3ykJX#`$sEUXSa4_Un`v5&|`bRLz+AQ#f5o3x6tI&tV|B5qTR$NYdU`X;1n9J(GN zu21O!-KS4z9TFbIIV1QV!DYab1;$)yw+5yUVDlzzfIkC1m~lO{v!kQ|_=j{~s^ER4#?)po$W$lVfk5VLU+`(hO$n#Koe>hnO>PS}I7f6h4u z#v`^g+J~1NWX?RiJ{pvx5sqhQ4e^PpTt`jsA!9GXu;40Ov`p7qSonnvT^b&_JgSXqN$pv2m$!?a z?zP;4?mQ8{N}OAjUSF?lnMS*uN-uNU(@ooOB*3g0nDX?oY1eqWz*~0BmDr;HKuc(e za_ZXg@!iGSbJ@jP3nz2gFG@7>KoTG*Jo$nET?8FdUe0y2yd6U z#hrrHGM+RXvsP^CRnu;4d&ZGhG+!9y)RoxOO{4bwY^c;}Vov&OK&pG-7=|tNt=H?W z;cbWdJLS}rTXnc)ZE)B0Om6Qyb;0$jXB@2Bbq`yZ5KhWG?@4uk()INm0)45asgUp31(K z?hOT!m27Ssi9{~H5sYYb14*|=TPU6v^c8(g-_eis6a7km&`UPTuCuq<4YtTWWcS!Z z_8Hq`Rkq7aw&&xAdJ8SK-%w*Nenb}fu;|zpw;LE2n31y=OsoXND3|>X07*GsI2H5aQaixH6@8lEbMSN?|;`$tyXkuR1mlA@T{2UJ{ oKgZ*T_#7{faTr@bUpDmfq669WC3 +#import "CDDataCursor.h" +#import "CDFatFile.h" +#import "CDMachOFile.h" + +@implementation CDFatArch64 +{ + __weak CDFatFile *_fatFile; + bool _isSwapped; + + // This is essentially struct fat_arch, but this way our property accessors can be synthesized. + cpu_type_t _cputype; + cpu_subtype_t _cpusubtype; + uint64_t _offset; + uint64_t _size; + uint32_t _align; + uint32_t _reserved; + + CDMachOFile *_machOFile; // Lazily create this. +} + +- (id)initWithMachOFile:(CDMachOFile *)machOFile bigendian:(bool)isBigEndian +{ + if ((self = [super init])) { + _machOFile = machOFile; + + if (isBigEndian == true) { + _cputype = _machOFile.cputype; + _cpusubtype = _machOFile.cpusubtype; + _offset = 0; // Would be filled in when this is written to disk + _size = (uint64_t)[_machOFile.data length]; + _align = 12; // 2**12 = 4096 (0x1000) + _reserved = 0; + _isSwapped = false; + } else { + _cputype = OSSwapInt32(_machOFile.cputype); + _cpusubtype = OSSwapInt32(_machOFile.cpusubtype); + _offset = 0; // Would be filled in when this is written to disk + _size = OSSwapInt64((uint64_t)[_machOFile.data length]); + _align = 0x0C000000; // 2**12 = 4096 (0x1000) + _reserved = 0; + _isSwapped = true; + } + } + + return self; +} + +- (id)initWithDataCursor:(CDDataCursor *)cursor bigendian:(bool)isBigEndian +{ + if ((self = [super init])) { + if (isBigEndian == true) { + _cputype = [cursor readBigInt32]; + _cpusubtype = [cursor readBigInt32]; + _offset = [cursor readBigInt64]; + _size = [cursor readBigInt64]; + _align = [cursor readBigInt32]; + _reserved = [cursor readBigInt32]; + _isSwapped = false; + } else { + _cputype = [cursor readLittleInt32]; + _cpusubtype = [cursor readLittleInt32]; + _offset = [cursor readLittleInt64]; + _size = [cursor readLittleInt64]; + _align = [cursor readLittleInt32]; + _reserved = [cursor readLittleInt32]; + _isSwapped = true; + } + + //NSLog(@"self: %@", self); + } + + return self; +} + +#pragma mark - Debugging + +- (NSString *)description; +{ + return [NSString stringWithFormat:@"64 bit ABI? %d, cputype: 0x%08x, cpusubtype: 0x%08x, offset: 0x%16llx (%16llu), size: 0x%16llx (%16llu), align: 2^%u (%x), arch name: %@", + self.uses64BitABI, self.cputype, self.cpusubtype, self.offset, self.offset, self.size, self.size, + self.align, 1 << self.align, self.archName]; +} + +#pragma mark - + +- (cpu_type_t)maskedCPUType; +{ + return self.cputype & ~CPU_ARCH_MASK; +} + +- (cpu_subtype_t)maskedCPUSubtype; +{ + return self.cpusubtype & ~CPU_SUBTYPE_MASK; +} + +- (BOOL)uses64BitABI; +{ + return CDArchUses64BitABI(self.arch); +} + +- (BOOL)uses64BitLibraries; +{ + return CDArchUses64BitLibraries(self.arch); +} + +- (CDArch)arch; +{ + CDArch arch = { self.cputype, self.cpusubtype }; + + return arch; +} + +// Must not return nil. +- (NSString *)archName; +{ + return CDNameForCPUType(self.cputype, self.cpusubtype); +} + +- (CDMachOFile *)machOFile; +{ + if (_machOFile == nil) { + NSData *data = [NSData dataWithBytesNoCopy:((uint8_t *)[self.fatFile.data bytes] + self.offset) length:self.size freeWhenDone:NO]; + _machOFile = [[CDMachOFile alloc] initWithData:data filename:self.fatFile.filename searchPathState:self.fatFile.searchPathState]; + } + + return _machOFile; +} + +@end diff --git a/Source/.DS_Store b/Source/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..39f428e260d9ae4a449035c19b5a079121702794 GIT binary patch literal 18436 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 + NSString *CDErrorDomain_ClassDump = @"CDErrorDomain_ClassDump"; NSString *CDErrorKey_Exception = @"CDErrorKey_Exception"; @@ -201,6 +203,8 @@ - (void)recursivelyVisit:(CDVisitor *)visitor; [visitor didEndVisiting]; } +extern intptr_t _dyld_get_image_slide(const struct mach_header* mh); + - (CDMachOFile *)machOFileWithName:(NSString *)name; { NSString *adjustedName = nil; diff --git a/Source/CDFatArch.h b/Source/CDFatArch.h index 6d920f82244..dafd6cecdc4 100644 --- a/Source/CDFatArch.h +++ b/Source/CDFatArch.h @@ -10,8 +10,8 @@ @interface CDFatArch : NSObject -- (id)initWithMachOFile:(CDMachOFile *)machOFile; -- (id)initWithDataCursor:(CDDataCursor *)cursor; +- (id)initWithMachOFile:(CDMachOFile *)machOFile bigendian:(bool)isBigEndian; +- (id)initWithDataCursor:(CDDataCursor *)cursor bigendian:(bool)isBigEndian; @property (assign) cpu_type_t cputype; @property (assign) cpu_subtype_t cpusubtype; diff --git a/Source/CDFatArch.m b/Source/CDFatArch.m index cc7f2a1735c..ce77da65039 100644 --- a/Source/CDFatArch.m +++ b/Source/CDFatArch.m @@ -24,31 +24,47 @@ @implementation CDFatArch CDMachOFile *_machOFile; // Lazily create this. } -- (id)initWithMachOFile:(CDMachOFile *)machOFile; +- (id)initWithMachOFile:(CDMachOFile *)machOFile bigendian:(bool)isBigEndian { if ((self = [super init])) { _machOFile = machOFile; NSParameterAssert([machOFile.data length] < 0x100000000); - - _cputype = _machOFile.cputype; - _cpusubtype = _machOFile.cpusubtype; - _offset = 0; // Would be filled in when this is written to disk - _size = (uint32_t)[_machOFile.data length]; - _align = 12; // 2**12 = 4096 (0x1000) + + if (isBigEndian == false) { + _cputype = OSSwapInt32(_machOFile.cputype); + _cpusubtype = OSSwapInt32(_machOFile.cpusubtype); + _offset = 0; // Would be filled in when this is written to disk + _size = OSSwapInt32((uint32_t)[_machOFile.data length]); + _align = 0x0C000000; + } else { + _cputype = _machOFile.cputype; + _cpusubtype = _machOFile.cpusubtype; + _offset = 0; // Would be filled in when this is written to disk + _size = (uint32_t)[_machOFile.data length]; + _align = 12; // 2**12 = 4096 (0x1000) + } } return self; } -- (id)initWithDataCursor:(CDDataCursor *)cursor; +- (id)initWithDataCursor:(CDDataCursor *)cursor bigendian:(bool)isBigEndian { if ((self = [super init])) { - _cputype = [cursor readBigInt32]; - _cpusubtype = [cursor readBigInt32]; - _offset = [cursor readBigInt32]; - _size = [cursor readBigInt32]; - _align = [cursor readBigInt32]; - + if (isBigEndian == false) { + _cputype = [cursor readLittleInt32]; + _cpusubtype = [cursor readLittleInt32]; + _offset = [cursor readLittleInt32]; + _size = [cursor readLittleInt32]; + _align = [cursor readLittleInt32]; + } else { + _cputype = [cursor readBigInt32]; + _cpusubtype = [cursor readBigInt32]; + _offset = [cursor readBigInt32]; + _size = [cursor readBigInt32]; + _align = [cursor readBigInt32]; + } + //NSLog(@"self: %@", self); } diff --git a/Source/CDFatArch64.h b/Source/CDFatArch64.h new file mode 100644 index 00000000000..a567630d796 --- /dev/null +++ b/Source/CDFatArch64.h @@ -0,0 +1,34 @@ +// -*- mode: ObjC -*- + +// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files. +// Copyright (C) 1997-2019 Steve Nygard. + +#import "CDFile.h" // For CDArch + +@class CDDataCursor; +@class CDFatFile, CDMachOFile; + +@interface CDFatArch64 : NSObject + +- (id)initWithMachOFile:(CDMachOFile *)machOFile bigendian:(bool)isBigEndian; +- (id)initWithDataCursor:(CDDataCursor *)cursor bigendian:(bool)isBigEndian; + +@property (assign) cpu_type_t cputype; +@property (assign) cpu_subtype_t cpusubtype; +@property (assign) uint64_t offset; +@property (assign) uint64_t size; +@property (assign) uint32_t align; + +@property (nonatomic, readonly) cpu_type_t maskedCPUType; +@property (nonatomic, readonly) cpu_subtype_t maskedCPUSubtype; +@property (nonatomic, readonly) BOOL uses64BitABI; +@property (nonatomic, readonly) BOOL uses64BitLibraries; + +@property (weak) CDFatFile *fatFile; + +@property (nonatomic, readonly) CDArch arch; +@property (nonatomic, readonly) NSString *archName; + +@property (nonatomic, readonly) CDMachOFile *machOFile; + +@end diff --git a/Source/CDFatArch64.m b/Source/CDFatArch64.m new file mode 100644 index 00000000000..def75122220 --- /dev/null +++ b/Source/CDFatArch64.m @@ -0,0 +1,112 @@ +// -*- mode: ObjC -*- + +// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files. +// Copyright (C) 1997-2019 Steve Nygard. + +#import "CDFatArch.h" + +#include +#import "CDDataCursor.h" +#import "CDFatFile.h" +#import "CDMachOFile.h" + +@implementation CDFatArch64 +{ + __weak CDFatFile *_fatFile; + + // This is essentially struct fat_arch, but this way our property accessors can be synthesized. + cpu_type_t _cputype; + cpu_subtype_t _cpusubtype; + uint64_t _offset; + uint64_t _size; + uint32_t _align; + + CDMachOFile *_machOFile; // Lazily create this. +} + +- (id)initWithMachOFile:(CDMachOFile *)machOFile; +{ + if ((self = [super init])) { + _machOFile = machOFile; + NSParameterAssert([machOFile.data length] < 0x100000000); + + _cputype = _machOFile.cputype; + _cpusubtype = _machOFile.cpusubtype; + _offset = 0; // Would be filled in when this is written to disk + _size = (uint64_t)[_machOFile.data length]; + _align = 12; // 2**12 = 4096 (0x1000) + } + + return self; +} + +- (id)initWithDataCursor:(CDDataCursor *)cursor; +{ + if ((self = [super init])) { + _cputype = [cursor readBigInt32]; + _cpusubtype = [cursor readBigInt32]; + _offset = [cursor readBigInt64]; + _size = [cursor readBigInt64]; + _align = [cursor readBigInt32]; + + //NSLog(@"self: %@", self); + } + + return self; +} + +#pragma mark - Debugging + +- (NSString *)description; +{ + return [NSString stringWithFormat:@"64 bit ABI? %d, cputype: 0x%08x, cpusubtype: 0x%08x, offset: 0x%08x (%8u), size: 0x%08x (%8u), align: 2^%u (%x), arch name: %@", + self.uses64BitABI, self.cputype, self.cpusubtype, self.offset, self.offset, self.size, self.size, + self.align, 1 << self.align, self.archName]; +} + +#pragma mark - + +- (cpu_type_t)maskedCPUType; +{ + return self.cputype & ~CPU_ARCH_MASK; +} + +- (cpu_subtype_t)maskedCPUSubtype; +{ + return self.cpusubtype & ~CPU_SUBTYPE_MASK; +} + +- (BOOL)uses64BitABI; +{ + return CDArchUses64BitABI(self.arch); +} + +- (BOOL)uses64BitLibraries; +{ + return CDArchUses64BitLibraries(self.arch); +} + +- (CDArch)arch; +{ + CDArch arch = { self.cputype, self.cpusubtype }; + + return arch; +} + +// Must not return nil. +- (NSString *)archName; +{ + return CDNameForCPUType(self.cputype, self.cpusubtype); +} + +- (CDMachOFile *)machOFile; +{ + if (_machOFile == nil) { + NSData *data = [NSData dataWithBytesNoCopy:((uint8_t *)[self.fatFile.data bytes] + self.offset) length:self.size freeWhenDone:NO]; + _machOFile = [[CDMachOFile alloc] initWithData:data filename:self.fatFile.filename searchPathState:self.fatFile.searchPathState]; + } + + return _machOFile; +} + +@end diff --git a/Source/CDFatFile.h b/Source/CDFatFile.h index d5a8d08c024..68519cc675a 100644 --- a/Source/CDFatFile.h +++ b/Source/CDFatFile.h @@ -5,14 +5,17 @@ #import "CDFile.h" -@class CDFatArch; +@class CDFatArch, CDFatArch64; @interface CDFatFile : CDFile @property (readonly) NSMutableArray *arches; @property (nonatomic, readonly) NSArray *archNames; +@property (nonatomic, readonly) bool isFat64; +@property (nonatomic, readonly) bool isSwapped; - (void)addArchitecture:(CDFatArch *)fatArch; +- (void)addArchitecture64:(CDFatArch64 *)fatArch; - (BOOL)containsArchitecture:(CDArch)arch; @end diff --git a/Source/CDFatFile.m b/Source/CDFatFile.m index 5b806ebb915..327aec354a2 100644 --- a/Source/CDFatFile.m +++ b/Source/CDFatFile.m @@ -9,12 +9,15 @@ #include #import "CDDataCursor.h" +#import "CDFatArch64.h" #import "CDFatArch.h" #import "CDMachOFile.h" @implementation CDFatFile { NSMutableArray *_arches; + bool _isFat64; + bool _isSwapped; } - (id)init; @@ -33,20 +36,49 @@ - (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState: struct fat_header header; header.magic = [cursor readBigInt32]; - + + if ((header.magic == FAT_CIGAM) || (header.magic == FAT_CIGAM_64)) { + _isSwapped = true; + } else { + _isSwapped = false; + } + //NSLog(@"(testing fat) magic: 0x%x", header.magic); - if (header.magic != FAT_MAGIC) { + if ((header.magic != FAT_MAGIC) && (header.magic != FAT_MAGIC_64) && (header.magic != FAT_CIGAM) && (header.magic != FAT_CIGAM_64)) { return nil; } - + _arches = [[NSMutableArray alloc] init]; - - header.nfat_arch = [cursor readBigInt32]; + + if (_isSwapped == true) { + header.nfat_arch = [cursor readLittleInt32]; + } else { + header.nfat_arch = [cursor readBigInt32]; + } + //NSLog(@"nfat_arch: %u", header.nfat_arch); for (NSUInteger index = 0; index < header.nfat_arch; index++) { - CDFatArch *arch = [[CDFatArch alloc] initWithDataCursor:cursor]; - arch.fatFile = self; - [_arches addObject:arch]; + if (header.magic == FAT_MAGIC) { + CDFatArch *arch = [[CDFatArch alloc] initWithDataCursor:cursor bigendian:true]; + arch.fatFile = self; + [_arches addObject:arch]; + _isFat64 = false; + } else if (header.magic == FAT_CIGAM) { + CDFatArch *arch = [[CDFatArch alloc] initWithDataCursor:cursor bigendian:false]; + arch.fatFile = self; + [_arches addObject:arch]; + _isFat64 = false; + } else if (header.magic == FAT_CIGAM_64) { + CDFatArch64 *arch = [[CDFatArch64 alloc] initWithDataCursor:cursor bigendian:false]; + arch.fatFile = self; + [_arches addObject:arch]; + _isFat64 = true; + } else { + CDFatArch64 *arch = [[CDFatArch64 alloc] initWithDataCursor:cursor bigendian:true]; + arch.fatFile = self; + [_arches addObject:arch]; + _isFat64 = true; + } } } @@ -78,37 +110,77 @@ - (NSString *)description; // Returns YES on success, NO on failure. - (BOOL)bestMatchForArch:(CDArch *)ioArchPtr; { - cpu_type_t targetType = ioArchPtr->cputype & ~CPU_ARCH_MASK; + cpu_type_t targetType = 0; - // Target architecture, 64 bit - for (CDFatArch *fatArch in self.arches) { - if (fatArch.maskedCPUType == targetType && fatArch.uses64BitABI) { - if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; - return YES; - } + if (_isSwapped == true) { + targetType = OSSwapInt32(ioArchPtr->cputype) & OSSwapInt32(~CPU_ARCH_MASK); + } else { + targetType = ioArchPtr->cputype & ~CPU_ARCH_MASK; } - // Target architecture, 32 bit - for (CDFatArch *fatArch in self.arches) { - if (fatArch.maskedCPUType == targetType && fatArch.uses64BitABI == NO) { - if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; - return YES; + if (_isFat64 == false) { + // Target architecture, 64 bit + for (CDFatArch *fatArch in self.arches) { + if (fatArch.maskedCPUType == targetType && fatArch.uses64BitABI) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } } - } - // Any architecture, 64 bit - for (CDFatArch *fatArch in self.arches) { - if (fatArch.uses64BitABI) { - if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; - return YES; + // Target architecture, 32 bit + for (CDFatArch *fatArch in self.arches) { + if (fatArch.maskedCPUType == targetType && fatArch.uses64BitABI == NO) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } + } + + // Any architecture, 64 bit + for (CDFatArch *fatArch in self.arches) { + if (fatArch.uses64BitABI) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } + } + + // Any architecture, 32 bit + for (CDFatArch *fatArch in self.arches) { + if (fatArch.uses64BitABI == NO) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } + } + } else { + // Target architecture, 64 bit + for (CDFatArch64 *fatArch in self.arches) { + if (fatArch.maskedCPUType == targetType && fatArch.uses64BitABI) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } + } + + // Target architecture, 32 bit + for (CDFatArch64 *fatArch in self.arches) { + if (fatArch.maskedCPUType == targetType && fatArch.uses64BitABI == NO) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } + } + + // Any architecture, 64 bit + for (CDFatArch64 *fatArch in self.arches) { + if (fatArch.uses64BitABI) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } } - } - // Any architecture, 32 bit - for (CDFatArch *fatArch in self.arches) { - if (fatArch.uses64BitABI == NO) { - if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; - return YES; + // Any architecture, 32 bit + for (CDFatArch64 *fatArch in self.arches) { + if (fatArch.uses64BitABI == NO) { + if (ioArchPtr != NULL) *ioArchPtr = fatArch.arch; + return YES; + } } } @@ -121,6 +193,16 @@ - (BOOL)bestMatchForArch:(CDArch *)ioArchPtr; return NO; } +- (CDFatArch64 *)fatArchWithArch64:(CDArch)cdarch; +{ + for (CDFatArch64 *arch in self.arches) { + if (arch.cputype == cdarch.cputype && arch.maskedCPUSubtype == (cdarch.cpusubtype & ~CPU_SUBTYPE_MASK)) + return arch; + } + + return nil; +} + - (CDFatArch *)fatArchWithArch:(CDArch)cdarch; { for (CDFatArch *arch in self.arches) { @@ -133,6 +215,10 @@ - (CDFatArch *)fatArchWithArch:(CDArch)cdarch; - (CDMachOFile *)machOFileWithArch:(CDArch)cdarch; { + if (_isFat64 == true) { + return [[self fatArchWithArch64:cdarch] machOFile]; + } + return [[self fatArchWithArch:cdarch] machOFile]; } @@ -152,6 +238,12 @@ - (NSString *)architectureNameDescription; #pragma mark - +- (void)addArchitecture64:(CDFatArch64 *)fatArch; +{ + fatArch.fatFile = self; + [self.arches addObject:fatArch]; +} + - (void)addArchitecture:(CDFatArch *)fatArch; { fatArch.fatFile = self; @@ -160,6 +252,10 @@ - (void)addArchitecture:(CDFatArch *)fatArch; - (BOOL)containsArchitecture:(CDArch)arch; { + if (_isFat64 == true) { + return [self fatArchWithArch64:arch] != nil; + } + return [self fatArchWithArch:arch] != nil; } diff --git a/Source/CDFile.m b/Source/CDFile.m index 44a952c3617..b1e31f8712e 100644 --- a/Source/CDFile.m +++ b/Source/CDFile.m @@ -41,9 +41,23 @@ } break; } - case CPU_TYPE_ARM | CPU_ARCH_ABI64: { + case CPU_TYPE_X86_64: { switch (cpusubtype) { - case CPU_SUBTYPE_ARM_ALL: return @"arm64"; // Not recognized in 10.8.4 + case CPU_SUBTYPE_X86_64_ALL: return @"x86_64"; // Not recognized in 10.8.4 + case CPU_SUBTYPE_X86_64_H: return @"x86_64h"; // Not recognized in 10.8.4 + } + break; + } + case CPU_TYPE_ARM64: { + switch (cpusubtype) { + case CPU_SUBTYPE_ARM64_ALL: return @"arm64"; // Not recognized in 10.8.4 + case CPU_SUBTYPE_ARM64E: return @"arm64e"; // Not recognized in 10.8.4 + } + break; + } + case CPU_TYPE_ARM64_32: { + switch (cpusubtype) { + case CPU_SUBTYPE_ARM64_32_ALL: return @"arm64_32"; // Not recognized in 10.8.4 } break; } @@ -66,12 +80,27 @@ CDArch CDArchFromName(NSString *name) const NXArchInfo *archInfo = NXGetArchInfoFromName([name UTF8String]); if (archInfo == NULL) { - if ([name isEqualToString:@"armv7s"]) { // Not recognized in 10.8.4 + if ([name isEqualToString:@"arm64"]) { // Not recognized in 10.8.4 + arch.cputype = CPU_TYPE_ARM64; + arch.cpusubtype = CPU_SUBTYPE_ARM64_ALL; + } else if ([name isEqualToString:@"arm64e"]) { // Not recognized in 10.8.4 + arch.cputype = CPU_TYPE_ARM64; + arch.cpusubtype = CPU_SUBTYPE_ARM64E; + } else if ([name isEqualToString:@"arm64_32"]) { // Not recognized in 10.8.4 + arch.cputype = CPU_TYPE_ARM64_32; + arch.cpusubtype = CPU_SUBTYPE_ARM64_32_ALL; + } else if ([name isEqualToString:@"armv7s"]) { // Not recognized in 10.8.4 arch.cputype = CPU_TYPE_ARM; arch.cpusubtype = 11; - } else if ([name isEqualToString:@"arm64"]) { // Not recognized in 10.8.4 - arch.cputype = CPU_TYPE_ARM | CPU_ARCH_ABI64; - arch.cpusubtype = CPU_SUBTYPE_ARM_ALL; + } else if ([name isEqualToString:@"x86_64"]) { // Not recognized in 10.8.4 + arch.cputype = CPU_TYPE_X86_64; + arch.cpusubtype = CPU_SUBTYPE_X86_64_ALL; + } else if ([name isEqualToString:@"x86_64h"]) { // Not recognized in 10.8.4 + arch.cputype = CPU_TYPE_X86_64; + arch.cpusubtype = CPU_SUBTYPE_X86_64_H; + } else if ([name isEqualToString:@"i386"]) { // Not recognized in 10.8.4 + arch.cputype = CPU_TYPE_I386; + arch.cpusubtype = CPU_SUBTYPE_I386_ALL; } else { NSString *ignore; @@ -121,7 +150,12 @@ @implementation CDFile // Returns CDFatFile or CDMachOFile + (id)fileWithContentsOfFile:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; { +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 + NSData *data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:filename] options:NSDataReadingMappedIfSafe error:nil]; +#else NSData *data = [NSData dataWithContentsOfMappedFile:filename]; +#endif + CDFatFile *fatFile = [[CDFatFile alloc] initWithData:data filename:filename searchPathState:searchPathState]; if (fatFile != nil) return fatFile; diff --git a/Source/CDLCBuildVersion.m b/Source/CDLCBuildVersion.m index a635c82d3c0..4644aab6410 100644 --- a/Source/CDLCBuildVersion.m +++ b/Source/CDLCBuildVersion.m @@ -10,15 +10,38 @@ static NSString *NSStringFromBuildVersionPlatform(uint32_t platform) { switch (platform) { - case PLATFORM_MACOS: return @"macOS"; - case PLATFORM_IOS: return @"iOS"; - case PLATFORM_TVOS: return @"tvOS"; - case PLATFORM_WATCHOS: return @"watchOS"; - case PLATFORM_BRIDGEOS: return @"bridgeOS"; - case PLATFORM_IOSMAC: return @"iOS Mac"; - case PLATFORM_IOSSIMULATOR: return @"iOS Simulator"; - case PLATFORM_TVOSSIMULATOR: return @"tvOS Simulator"; - case PLATFORM_WATCHOSSIMULATOR: return @"watchOS Simulator"; + case PLATFORM_ANY: return @"any"; + case PLATFORM_MACOS: return @"macOS"; + case PLATFORM_IOS: return @"iOS"; + case PLATFORM_TVOS: return @"tvOS"; + case PLATFORM_WATCHOS: return @"watchOS"; + case PLATFORM_BRIDGEOS: return @"bridgeOS"; +#ifndef PLATFORM_IOSMAC + case PLATFORM_MACCATALYST: return @"macCatalyst"; +#else /* PLATFORM_IOSMAC */ + case PLATFORM_IOSMAC: return @"iOS Mac"; +#endif /* PLATFORM_IOSMAC */ + case PLATFORM_IOSSIMULATOR: return @"iOS Simulator"; + case PLATFORM_TVOSSIMULATOR: return @"tvOS Simulator"; + case PLATFORM_WATCHOSSIMULATOR: return @"watchOS Simulator"; + case PLATFORM_DRIVERKIT: return @"DriverKit"; + case PLATFORM_VISIONOS: return @"visionOS"; + case PLATFORM_VISIONOSSIMULATOR: return @"visionOS Simulator"; + + case PLATFORM_FIRMWARE: return @"firmware"; + case PLATFORM_SEPOS: return @"sepOS"; + + case PLATFORM_MACOS_EXCLAVECORE: return @"exclaveCore"; + case PLATFORM_MACOS_EXCLAVEKIT: return @"exclaveKit"; + case PLATFORM_IOS_EXCLAVECORE: return @"iOS exclaveCore"; + case PLATFORM_IOS_EXCLAVEKIT: return @"iOS exclaveKit"; + case PLATFORM_TVOS_EXCLAVECORE: return @"tvOS exclaveCore"; + case PLATFORM_TVOS_EXCLAVEKIT: return @"tvOS exclaveKit"; + case PLATFORM_WATCHOS_EXCLAVECORE: return @"watchOS exclaveCore"; + case PLATFORM_WATCHOS_EXCLAVEKIT: return @"watchOS exclaveKit"; + case PLATFORM_VISIONOS_EXCLAVECORE:return @"visionOS exclaveCore"; + case PLATFORM_VISIONOS_EXCLAVEKIT: return @"visionOS exclaveKit"; + default: return [NSString stringWithFormat:@"Unknown platform %x", platform]; } } @@ -26,9 +49,19 @@ static NSString *NSStringFromBuildVersionTool(uint32_t tool) { switch (tool) { - case TOOL_CLANG: return @"clang"; - case TOOL_SWIFT: return @"swift"; - case TOOL_LD: return @"ld"; + case TOOL_CLANG: return @"clang"; + case TOOL_SWIFT: return @"swift"; + case TOOL_LD: return @"ld"; + case TOOL_LLD: return @"lld"; + + case TOOL_METAL: return @"metal"; + case TOOL_AIRLLD: return @"airlld"; + case TOOL_AIRNT: return @"airnt"; + case TOOL_AIRNT_PLUGIN: return @"airnt-plugin"; + case TOOL_AIRPACK: return @"airpack"; + case TOOL_GPUARCHIVER: return @"gpuarchiver"; + case TOOL_METAL_FRAMEWORK: return @"metal-framework"; + default: return [NSString stringWithFormat:@"Unknown tool %x", tool]; } } diff --git a/Source/CDLoadCommand.m b/Source/CDLoadCommand.m index 132991933b6..6db9ed20243 100644 --- a/Source/CDLoadCommand.m +++ b/Source/CDLoadCommand.m @@ -97,6 +97,14 @@ + (id)loadCommandWithDataCursor:(CDMachOFileDataCursor *)cursor; case LC_BUILD_VERSION: targetClass = [CDLCBuildVersion class]; break; + case LC_DYLD_EXPORTS_TRIE: targetClass = [CDLCLinkeditData class]; break; + case LC_DYLD_CHAINED_FIXUPS: targetClass = [CDLCLinkeditData class]; break; + case LC_FILESET_ENTRY: targetClass = [CDLCLinkeditData class]; break; + case LC_ATOM_INFO: targetClass = [CDLCLinkeditData class]; break; + case LC_FUNCTION_VARIANTS: targetClass = [CDLCLinkeditData class]; break; + case LC_FUNCTION_VARIANT_FIXUPS: targetClass = [CDLCLinkeditData class]; break; + + case LC_TARGET_TRIPLE: case LC_LINKER_OPTION: case LC_LINKER_OPTIMIZATION_HINT: case LC_VERSION_MIN_TVOS: @@ -208,6 +216,14 @@ - (NSString *)commandName; case LC_VERSION_MIN_WATCHOS: return @"LC_VERSION_MIN_WATCHOS"; case LC_NOTE: return @"LC_NOTE"; case LC_BUILD_VERSION: return @"LC_BUILD_VERSION"; + + case LC_DYLD_EXPORTS_TRIE: return @"LC_DYLD_EXPORTS_TRIE"; + case LC_DYLD_CHAINED_FIXUPS: return @"LC_DYLD_CHAINED_FIXUPS"; + case LC_FILESET_ENTRY: return @"LC_FILESET_ENTRY"; + case LC_ATOM_INFO: return @"LC_ATOM_INFO"; + case LC_FUNCTION_VARIANTS: return @"LC_FUNCTION_VARIANTS"; + case LC_FUNCTION_VARIANT_FIXUPS: return @"LC_FUNCTION_VARIANT_FIXUPS"; + case LC_TARGET_TRIPLE: return @"LC_TARGET_TRIPLE"; default: break; diff --git a/Source/CDMachOFile.h b/Source/CDMachOFile.h index ede5197499d..b64aa0ab046 100644 --- a/Source/CDMachOFile.h +++ b/Source/CDMachOFile.h @@ -86,6 +86,8 @@ typedef enum : NSUInteger { - (CDLCDylib *)dylibLoadCommandForLibraryOrdinal:(NSUInteger)ordinal; +- (id) initWithMachOData:(const struct mach_header *)data size:(size_t)length; + @property (nonatomic, readonly) BOOL hasObjectiveC1Data; @property (nonatomic, readonly) BOOL hasObjectiveC2Data; @property (nonatomic, readonly) Class processorClass; diff --git a/Source/CDMachOFile.m b/Source/CDMachOFile.m index 8902f838b0f..9cd169e590a 100644 --- a/Source/CDMachOFile.m +++ b/Source/CDMachOFile.m @@ -84,6 +84,57 @@ - (id)init; return self; } +- (id) initWithMachOData:(const struct mach_header *)data size:(size_t)length +{ + if (data == NULL) { + return nil; + } + + _byteOrder = CDByteOrder_LittleEndian; + + CDDataCursor *cursor = [[CDDataCursor alloc] initWithData:[NSData dataWithBytes:data length:length]]; + _magic = [cursor readBigInt32]; + if (_magic == MH_MAGIC || _magic == MH_MAGIC_64) { + _byteOrder = CDByteOrder_BigEndian; + } else if (_magic == MH_CIGAM || _magic == MH_CIGAM_64) { + _byteOrder = CDByteOrder_LittleEndian; + } else { + return nil; + } + + _uses64BitABI = (_magic == MH_MAGIC_64) || (_magic == MH_CIGAM_64); + + if (_byteOrder == CDByteOrder_LittleEndian) { + _cputype = [cursor readLittleInt32]; + _cpusubtype = [cursor readLittleInt32]; + _filetype = [cursor readLittleInt32]; + _ncmds = [cursor readLittleInt32]; + _sizeofcmds = [cursor readLittleInt32]; + _flags = [cursor readLittleInt32]; + if (_uses64BitABI) { + _reserved = [cursor readLittleInt32]; + } + } else { + _cputype = [cursor readBigInt32]; + _cpusubtype = [cursor readBigInt32]; + _filetype = [cursor readBigInt32]; + _ncmds = [cursor readBigInt32]; + _sizeofcmds = [cursor readBigInt32]; + _flags = [cursor readBigInt32]; + if (_uses64BitABI) { + _reserved = [cursor readBigInt32]; + } + } + + NSAssert(_uses64BitABI == CDArchUses64BitABI((CDArch){ .cputype = _cputype, .cpusubtype = _cpusubtype }), @"Header magic should match cpu arch", nil); + + NSUInteger headerOffset = _uses64BitABI ? sizeof(struct mach_header_64) : sizeof(struct mach_header); + CDMachOFileDataCursor *fileCursor = [[CDMachOFileDataCursor alloc] initWithFile:self offset:headerOffset]; + [self _readLoadCommands:fileCursor count:_ncmds]; + + return self; +} + - (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; { if ((self = [super initWithData:data filename:filename searchPathState:searchPathState])) { @@ -243,6 +294,10 @@ - (NSString *)filetypeDescription; case MH_DYLIB_STUB: return @"DYLIB_STUB"; case MH_DSYM: return @"DSYM"; case MH_KEXT_BUNDLE: return @"KEXT_BUNDLE"; + case MH_FILESET: return @"FILESET"; + case MH_GPU_EXECUTE: return @"GPU_EXECUTE"; + case MH_GPU_DYLIB: return @"GPU_DYLIB"; + default: break; } @@ -276,6 +331,14 @@ - (NSString *)flagDescription; if (flags & MH_SETUID_SAFE) [setFlags addObject:@"SETUID_SAFE"]; if (flags & MH_NO_REEXPORTED_DYLIBS) [setFlags addObject:@"NO_REEXPORTED_DYLIBS"]; if (flags & MH_PIE) [setFlags addObject:@"PIE"]; + if (flags & MH_DEAD_STRIPPABLE_DYLIB) [setFlags addObject:@"DEAD_STRIPPABLE_DYLIB"]; + if (flags & MH_HAS_TLV_DESCRIPTORS) [setFlags addObject:@"HAS_TLV_DESCRIPTORS"]; + if (flags & MH_NO_HEAP_EXECUTION) [setFlags addObject:@"NO_HEAP_EXECUTION"]; + if (flags & MH_APP_EXTENSION_SAFE) [setFlags addObject:@"APP_EXTENSION_SAFE"]; + if (flags & MH_NLIST_OUTOFSYNC_WITH_DYLDINFO) [setFlags addObject:@"NLIST_OUTOFSYNC_WITH_DYLDINFO"]; + if (flags & MH_SIM_SUPPORT) [setFlags addObject:@"SIM_SUPPORT"]; + if (flags & MH_IMPLICIT_PAGEZERO) [setFlags addObject:@"IMPLICIT_PAGEZERO"]; + if (flags & MH_DYLIB_IN_CACHE) [setFlags addObject:@"DYLIB_IN_CACHE"]; return [setFlags componentsJoinedByString:@" "]; } @@ -331,8 +394,8 @@ - (NSString *)stringAtAddress:(NSUInteger)address; CDLCSegment *segment = [self segmentContainingAddress:address]; if (segment == nil) { - NSLog(@"Error: Cannot find offset for address 0x%08lx in stringAtAddress:", address); - exit(5); + /*NSLog(@"Error: Cannot find offset for address 0x%08lx in stringAtAddress:", address); + exit(5);*/ return nil; } @@ -362,8 +425,9 @@ - (NSUInteger)dataOffsetForAddress:(NSUInteger)address; CDLCSegment *segment = [self segmentContainingAddress:address]; if (segment == nil) { - NSLog(@"Error: Cannot find offset for address 0x%08lx in dataOffsetForAddress:", address); - exit(5); + /*NSLog(@"Error: Cannot find offset for address 0x%08lx in dataOffsetForAddress:", address); + exit(5);*/ + return 0; } // if ([segment isProtected]) { diff --git a/Source/CDObjectiveC2Processor.m b/Source/CDObjectiveC2Processor.m index 2003fcb04d8..80ef2bd4a80 100644 --- a/Source/CDObjectiveC2Processor.m +++ b/Source/CDObjectiveC2Processor.m @@ -41,6 +41,10 @@ - (void)loadClasses; CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithSection:section]; while ([cursor isAtEnd] == NO) { uint64_t val = [cursor readPtr]; + + if (val == 0) + return; + CDOCClass *aClass = [self loadClassAtAddress:val]; if (aClass != nil) { [self addClass:aClass withAddress:val]; @@ -70,7 +74,8 @@ - (CDOCProtocol *)protocolAtAddress:(uint64_t)address; [self.protocolUniquer setProtocol:protocol withAddress:address]; CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; - NSParameterAssert([cursor offset] != 0); + if ([cursor offset] == 0) + return nil; struct cd_objc2_protocol objc2Protocol; objc2Protocol.isa = [cursor readPtr]; @@ -91,7 +96,8 @@ - (CDOCProtocol *)protocolAtAddress:(uint64_t)address; objc2Protocol.extendedMethodTypes = [cursor readPtr]; if (objc2Protocol.extendedMethodTypes != 0) { extendedMethodTypesCursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:objc2Protocol.extendedMethodTypes]; - NSParameterAssert([extendedMethodTypesCursor offset] != 0); + if ([extendedMethodTypesCursor offset] == 0) + return nil; } } @@ -141,7 +147,8 @@ - (CDOCCategory *)loadCategoryAtAddress:(uint64_t)address; return nil; CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; - NSParameterAssert([cursor offset] != 0); + if ([cursor offset] == 0) + return nil; struct cd_objc2_category objc2Category; objc2Category.name = [cursor readPtr]; @@ -203,16 +210,17 @@ - (CDOCClass *)loadClassAtAddress:(uint64_t)address; { if (address == 0) return nil; - + CDOCClass *class = [self classWithAddress:address]; if (class) return class; - + //NSLog(@"%s, address=%016lx", __cmd, address); CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; - NSParameterAssert([cursor offset] != 0); - + if ([cursor offset] == 0) + return nil; + struct cd_objc2_class objc2Class; objc2Class.isa = [cursor readPtr]; objc2Class.superclass = [cursor readPtr]; @@ -229,7 +237,9 @@ - (CDOCClass *)loadClassAtAddress:(uint64_t)address; //NSLog(@"%016lx %016lx %016lx %016lx", objc2Class.isa, objc2Class.superclass, objc2Class.cache, objc2Class.vtable); //NSLog(@"%016lx %016lx %016lx %016lx", objc2Class.data, objc2Class.reserved1, objc2Class.reserved2, objc2Class.reserved3); - NSParameterAssert(objc2Class.data != 0); + if (objc2Class.data == 0) + return nil; + [cursor setAddress:objc2Class.data]; struct cd_objc2_class_ro_t objc2ClassData; @@ -315,12 +325,14 @@ - (NSArray *)loadPropertiesAtAddress:(uint64_t)address; struct cd_objc2_list_header listHeader; CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; - NSParameterAssert([cursor offset] != 0); + if ([cursor offset] == 0) + return nil; + //NSLog(@"property list data offset: %lu", [cursor offset]); listHeader.entsize = [cursor readInt32]; listHeader.count = [cursor readInt32]; - NSParameterAssert(listHeader.entsize == 2 * [self.machOFile ptrSize]); + //NSParameterAssert(listHeader.entsize == 2 * [self.machOFile ptrSize]); for (uint32_t index = 0; index < listHeader.count; index++) { struct cd_objc2_property objc2Property; @@ -345,7 +357,8 @@ - (NSArray *)loadMethodsOfMetaClassAtAddress:(uint64_t)address; return nil; CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; - NSParameterAssert([cursor offset] != 0); + if ([cursor offset] == 0) + return nil; struct cd_objc2_class objc2Class; objc2Class.isa = [cursor readPtr]; @@ -359,7 +372,9 @@ - (NSArray *)loadMethodsOfMetaClassAtAddress:(uint64_t)address; //NSLog(@"%016lx %016lx %016lx %016lx", objc2Class.isa, objc2Class.superclass, objc2Class.cache, objc2Class.vtable); //NSLog(@"%016lx %016lx %016lx %016lx", objc2Class.data, objc2Class.reserved1, objc2Class.reserved2, objc2Class.reserved3); - NSParameterAssert(objc2Class.data != 0); + if (objc2Class.data == 0) + return nil; + [cursor setAddress:objc2Class.data]; struct cd_objc2_class_ro_t objc2ClassData; @@ -393,7 +408,9 @@ - (NSArray *)loadMethodsAtAddress:(uint64_t)address extendedMethodTypesCursor:(C if (address != 0) { CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; - NSParameterAssert([cursor offset] != 0); + if ([cursor offset] == 0) + return nil; + //NSLog(@"method list data offset: %lu", [cursor offset]); struct cd_objc2_list_header listHeader; @@ -401,7 +418,7 @@ - (NSArray *)loadMethodsAtAddress:(uint64_t)address extendedMethodTypesCursor:(C // See getEntsize() from http://www.opensource.apple.com/source/objc4/objc4-532.2/runtime/objc-runtime-new.h listHeader.entsize = [cursor readInt32] & ~(uint32_t)3; listHeader.count = [cursor readInt32]; - NSParameterAssert(listHeader.entsize == 3 * [self.machOFile ptrSize]); + //NSParameterAssert(listHeader.entsize == 3 * [self.machOFile ptrSize]); for (uint32_t index = 0; index < listHeader.count; index++) { struct cd_objc2_method objc2Method; @@ -435,14 +452,16 @@ - (NSArray *)loadIvarsAtAddress:(uint64_t)address; if (address != 0) { CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; - NSParameterAssert([cursor offset] != 0); + if ([cursor offset] == 0) + return nil; + //NSLog(@"ivar list data offset: %lu", [cursor offset]); struct cd_objc2_list_header listHeader; listHeader.entsize = [cursor readInt32]; listHeader.count = [cursor readInt32]; - NSParameterAssert(listHeader.entsize == 3 * [self.machOFile ptrSize] + 2 * sizeof(uint32_t)); + //NSParameterAssert(listHeader.entsize == 3 * [self.machOFile ptrSize] + 2 * sizeof(uint32_t)); for (uint32_t index = 0; index < listHeader.count; index++) { struct cd_objc2_ivar objc2Ivar; diff --git a/Source/CDObjectiveCProcessor.m b/Source/CDObjectiveCProcessor.m index 9a672226d01..813ab29c8ac 100644 --- a/Source/CDObjectiveCProcessor.m +++ b/Source/CDObjectiveCProcessor.m @@ -108,7 +108,10 @@ - (void)addClass:(CDOCClass *)aClass withAddress:(uint64_t)address; - (CDOCClass *)classWithAddress:(uint64_t)address; { - return [_classesByAddress objectForKey:[NSNumber numberWithUnsignedLongLong:address]]; + if (address != 0) + return [_classesByAddress objectForKey:[NSNumber numberWithUnsignedLongLong:address]]; + + return nil; } - (void)addClassesFromArray:(NSArray *)array; diff --git a/UnitTests/TestFatFile_armv7_v7s.m b/UnitTests/TestFatFile_armv7_v7s.m index 25ac9a2eb3f..b2ddebb87c0 100644 --- a/UnitTests/TestFatFile_armv7_v7s.m +++ b/UnitTests/TestFatFile_armv7_v7s.m @@ -6,6 +6,7 @@ #import #import "CDFatArch.h" +#import "CDFatArch64.h" #import "CDFatFile.h" #import "CDMachOFile.h" diff --git a/class-dump.m b/class-dump.m index 2a1ac2b0ae9..9e46b80f12b 100644 --- a/class-dump.m +++ b/class-dump.m @@ -29,7 +29,7 @@ void print_usage(void) " where options are:\n" " -a show instance variable offsets\n" " -A show implementation addresses\n" - " --arch choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, armv6, armv7, armv7s, arm64)\n" + " --arch choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, x86_64h, armv6, armv7, armv7s, arm64, arm64e, arm64_32)\n" " -C only display classes matching regular expression\n" " -f find string in method name\n" " -H generate header files in current directory, or directory specified with -o\n" diff --git a/class-dump.xcodeproj/project.pbxproj b/class-dump.xcodeproj/project.pbxproj index e448a7f9940..633ac60458c 100644 --- a/class-dump.xcodeproj/project.pbxproj +++ b/class-dump.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -127,6 +127,9 @@ 01FB2152222A86C40012A5D3 /* blowfish.c in Sources */ = {isa = PBXBuildFile; fileRef = 01FB2150222A86C40012A5D3 /* blowfish.c */; }; 0D288C10187BC2EE0026E2A0 /* CDOCClassReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D288C0E187BC2EE0026E2A0 /* CDOCClassReference.h */; }; 0D288C11187BC2EE0026E2A0 /* CDOCClassReference.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D288C0F187BC2EE0026E2A0 /* CDOCClassReference.m */; }; + AB64CEA52E0576620020F05E /* CDFatArch64.h in Headers */ = {isa = PBXBuildFile; fileRef = AB64CEA42E0576620020F05E /* CDFatArch64.h */; }; + AB64CEA72E0579920020F05E /* CDFatArch64.m in Sources */ = {isa = PBXBuildFile; fileRef = AB64CEA62E0579920020F05E /* CDFatArch64.m */; }; + AB64CEA92E05ADBA0020F05E /* dyld_priv.h in Headers */ = {isa = PBXBuildFile; fileRef = AB64CEA82E05ADBA0020F05E /* dyld_priv.h */; }; C270B5C616C54AD6006CA75D /* ULEB128.m in Sources */ = {isa = PBXBuildFile; fileRef = C270B5C516C54AD5006CA75D /* ULEB128.m */; }; C270B5C816C54B0C006CA75D /* ULEB128.h in Headers */ = {isa = PBXBuildFile; fileRef = C270B5C716C54B0A006CA75D /* ULEB128.h */; }; /* End PBXBuildFile section */ @@ -403,6 +406,9 @@ 01FB2150222A86C40012A5D3 /* blowfish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = blowfish.c; path = ThirdParty/blowfish.c; sourceTree = ""; }; 0D288C0E187BC2EE0026E2A0 /* CDOCClassReference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDOCClassReference.h; path = Source/CDOCClassReference.h; sourceTree = ""; }; 0D288C0F187BC2EE0026E2A0 /* CDOCClassReference.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDOCClassReference.m; path = Source/CDOCClassReference.m; sourceTree = ""; }; + AB64CEA42E0576620020F05E /* CDFatArch64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CDFatArch64.h; sourceTree = ""; }; + AB64CEA62E0579920020F05E /* CDFatArch64.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CDFatArch64.m; sourceTree = ""; }; + AB64CEA82E05ADBA0020F05E /* dyld_priv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dyld_priv.h; sourceTree = ""; }; C270B5C516C54AD5006CA75D /* ULEB128.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ULEB128.m; path = Source/ULEB128.m; sourceTree = ""; }; C270B5C716C54B0A006CA75D /* ULEB128.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ULEB128.h; path = Source/ULEB128.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -647,6 +653,8 @@ 01EB82A413A591D7003EDE60 /* CDFatFile.m */, 01EB82A113A591D7003EDE60 /* CDFatArch.h */, 01EB82A213A591D7003EDE60 /* CDFatArch.m */, + AB64CEA42E0576620020F05E /* CDFatArch64.h */, + AB64CEA62E0579920020F05E /* CDFatArch64.m */, 01EB82DB13A591D8003EDE60 /* CDMachOFile.h */, 01EB82DC13A591D8003EDE60 /* CDMachOFile.m */, 01EB82FD13A591D8003EDE60 /* CDSection.h */, @@ -727,6 +735,7 @@ 0179B9EA14F204AA00EC98F7 /* CDLCSourceVersion.m */, 0132DD4321816C09009CE078 /* CDLCBuildVersion.h */, 0132DD4421816C09009CE078 /* CDLCBuildVersion.m */, + AB64CEA82E05ADBA0020F05E /* dyld_priv.h */, ); name = "Load Commands"; sourceTree = ""; @@ -800,10 +809,12 @@ 0168C98713E4AB3200926EC3 /* CDLCFunctionStarts.h in Headers */, 018BFD4214F65DB600190F07 /* CDExtensions.h in Headers */, 01FB2151222A86C40012A5D3 /* blowfish.h in Headers */, + AB64CEA52E0576620020F05E /* CDFatArch64.h in Headers */, 0179B9E614F2025E00EC98F7 /* CDLCMain.h in Headers */, 0179B9EB14F204AA00EC98F7 /* CDLCSourceVersion.h in Headers */, 0179B9F714F20E9800EC98F7 /* CDLCDataInCode.h in Headers */, 0194945C1673F8F400A29005 /* CDProtocolUniquer.h in Headers */, + AB64CEA92E05ADBA0020F05E /* dyld_priv.h in Headers */, C270B5C816C54B0C006CA75D /* ULEB128.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -906,14 +917,16 @@ 01EB825613A590D9003EDE60 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1000; + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1640; }; buildConfigurationList = 01EB825913A590D9003EDE60 /* Build configuration list for PBXProject "class-dump" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 01EB825413A590D9003EDE60; productRefGroup = 01EB826013A590D9003EDE60 /* Products */; @@ -977,6 +990,7 @@ 013D1F2C13A5AEA100BF0A67 /* CDLCSegment.m in Sources */, 013D1F2F13A5AEA100BF0A67 /* CDLCSubClient.m in Sources */, 013D1F3013A5AEA100BF0A67 /* CDLCSubFramework.m in Sources */, + AB64CEA72E0579920020F05E /* CDFatArch64.m in Sources */, 013D1F3113A5AEA100BF0A67 /* CDLCSubLibrary.m in Sources */, 013D1F3213A5AEA100BF0A67 /* CDLCSubUmbrella.m in Sources */, 013D1F3313A5AEA100BF0A67 /* CDLCSymbolTable.m in Sources */, @@ -1128,13 +1142,18 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "deprotect-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = com.stevenygard.deprotect; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Debug; }; @@ -1142,13 +1161,18 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "deprotect-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = com.stevenygard.deprotect; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Release; }; @@ -1157,8 +1181,10 @@ buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "MachObjC-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1168,8 +1194,10 @@ buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "MachObjC-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1183,6 +1211,7 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", @@ -1196,7 +1225,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "UnitTests/UnitTests-Info.plist"; - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", @@ -1216,6 +1245,7 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; ENABLE_NS_ASSERTIONS = NO; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", @@ -1226,7 +1256,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "UnitTests/UnitTests-Info.plist"; - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", @@ -1245,13 +1275,18 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "formatType-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = com.stevenygard.formatType; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Debug; }; @@ -1259,13 +1294,18 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "formatType-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = com.stevenygard.formatType; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Release; }; @@ -1274,6 +1314,8 @@ buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = 11.0; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1283,6 +1325,8 @@ buildSettings = { CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = 11.0; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1291,6 +1335,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; @@ -1304,14 +1349,19 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Developer ID Application"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = W6E3273XL3; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -1331,8 +1381,9 @@ GCC_WARN_UNUSED_FUNCTION = NO; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = /; - MACOSX_DEPLOYMENT_TARGET = 10.8; + MACOSX_DEPLOYMENT_TARGET = 11.5; ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = None; SDKROOT = macosx; WARNING_CFLAGS = ( "-fdiagnostics-show-option", @@ -1351,6 +1402,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; @@ -1364,14 +1416,19 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Developer ID Application"; COPY_PHASE_STRIP = YES; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = W6E3273XL3; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -1384,7 +1441,8 @@ GCC_WARN_UNUSED_FUNCTION = NO; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = /; - MACOSX_DEPLOYMENT_TARGET = 10.8; + MACOSX_DEPLOYMENT_TARGET = 11.5; + PROVISIONING_PROFILE_SPECIFIER = None; SDKROOT = macosx; WARNING_CFLAGS = ( "-fdiagnostics-show-option", @@ -1403,13 +1461,18 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "class-dump-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = "com.stevenygard.class-dump"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Debug; }; @@ -1417,8 +1480,11 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "class-dump-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 11.0; OTHER_LDFLAGS = ( "-all_load", "-ObjC", @@ -1427,7 +1493,9 @@ "___info_plist", Info.plist, ); + PRODUCT_BUNDLE_IDENTIFIER = "com.stevenygard.class-dump"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Release; }; diff --git a/class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/IDEFindNavigatorScopes.plist b/class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 00000000000..5dd5da85fdb --- /dev/null +++ b/class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/UserInterfaceState.xcuserstate b/class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..ca534f9db1e5aa02261e86b44fd307120983b5e7 GIT binary patch literal 69537 zcmeF4cVHC7_rP~%XK(Lr`yIW8-V=InA)%Kbp|=>410o>_xr8F3J18KcbVU#pF4Q1R z5U|k{P!Xl0QYln;?JsG z`v`|P%<&xI1kS;UoV#zu(Y{Q7N_twqiiw#?!&Bg|o)xpwGx}CcAM%hdDa-HS(B#Dl zy4Eeevu~U)IXYD6Am`*&$iGx^msPIIcVQ0GGf$$R%<^xFjx_%iuL21a*uJ7xXIj8 z+%#?`H-~$HTgWZqR&Xo1Ra`E&n%l^|#=XVu~r~~TAZAG0>XVeAtK=G(A8iJBgGV-CJXc!uWGLauWhDHz6f8GFUv>p z<@oA+9lkN&oNvLm{A&JXeht5tU&n9ZxAL#?Z}B_%_xXeTasCAV8GnZV zivN~y1QASlLWn>dL?lk)B5tCR!lX1QL&}nBq&lfVYLeQdK50%`khY{9=|nn{KBO<{ zNBWZiWEdGvQpiJO1Q|s#$rwV(MDjR!hD;|jNDf&_mXYOT1zAZ}kzBHxyiC@UO=K(i zl$;*3JJx8 z;zDVmj8I;vAk+|Q3bh2kFh&?FJR(dGs4!8OEKCum2~P_%g;~P0!gIm`;RWF(VX?4O zSSG9za)q_RI$@)*N!Tj9CcGtV6Ltx23wwokg%5=N!a?DXa7;KZoDfb5p9^0IzY4zz z*M;AOKZF~?O$X;d4(#9^qC<6Pj-rlYj^d7Tj`EI5j>?YOjyjIIj(Uzpj%JSLj#x)q z#~{aGM}p%)N1|hhBgv8M@HvJ$hB-z!G97-$c*i4-364pQ$&M+GS&rF`IgYuG=N$_j ziyX@w%N^Ss+Z{U`I~}_mZ#&*`>~`#N>~*~B_`q@4al~=damsPp@tNZr$G47ij;oGq zjvpOAIev58aNHC*(J8vba$=?kBvuxyh*iaEVs){G7$r6o8;Om@)?&2SM(iSX z6}yRXV!YT#Ob{Ow6U8B7k~l(46`v3%iIc@C;*;W3@hNed__X+pI9;4A&KDPmFNitf zQgNBMMqDed6JHZw7vB)y6nBX4h#!di#jnM);y2>A;yLlW_?`H@ctN}<{vcize-p2Z zzdMOja5|j2({Os6UT0BfNoNITMQ0^vEoY>&owL2OgR`Tvle4q4i?gexyHHHxz4%X zxxx90bF=d;=Wgd7=U(SW&I8U*ohO_pou`~%IKOsYa9(sdT%ybAa=F|t$tAlKm+I17 zx~q_@q^p#xw5yV($&V*&eh%(=j!en?n-ez;l}*IL&)*Iw7VuJ>H;yY{(0 zaP4<}==#WYz;)1d)OFHz%JsGDtm_-s53WnD%dYFL-(7#WZn&}A;TGLax9&FF)!fzH zHQY7bwcL^JD0gjl9d})KJ$EB_OLseWdv^zS4|lw~r@NQCpL>wo=N{@F<{s|OaF23N zbwA~v=6>4!jC;C!hI^)amV35)j(eW_MfXeY74DVpRqhS$SKJ%jZ@IU*x4U<^-*La| ze$V~B`;hyv`#bmd?hEdV?jPKj+?U-~+*jS#+&{X1l{g7WSaM5}Buho4qEa!bxKvsy zCsmWGOEsjLQhlj`)K%&x#Yx?z2c#ZSywp?bCH0p2NCTuHQj(M`rAi~EG-6CO@`cgV8U6g*1E=iZAU!~t>rK0NF2R$=UK~d5k<(9w$F6kCz{jC&*NOQl2V5 zCC`@U$aCd|@*?>~d8NEc&Xrfo>*S5{8}gg-5&5WmOg=7uEPo<@DxZ)~%BSSh@|W^C z`LcXPzA9grf0zGIM8&DN6t|)(9;Jj*QmLoZR~je{l}1WqrHRs1X{Iz+S}4&<2c@I( zfYL*WR|YAAl?3HMC0QA+WGJJQOyyx^yfR0bt30bbr_58HSLQ1VloynR$|7ZnvQk;E zY*1cNURT~w-cwYSO-gf$AW2u$rJg zs3xl;)KoP~%~nUNkE)NUruvjRO?_H@MxCWTt1ePsR5zg(zo>YM6Y>Na(| zx!fwo; zt$n6_u6?0>t$nXu(|*)`(r#!sbxwEdk}m6tZs>*e(s~)aq25SutT)k{>do}#dJDa! z-b!z+$LgK+E_zqJm)=|NqbKS^^dvo5AFikBS$eiUT7Oi3OrNJeug}*P=r8CC^+o!N z`b+v^eTlwIe_3Cnzp8K6x9HpT9r{jvpZ!0aA>%Zu~>c8pN_22bB z^c(t3gENpJ7_y-ls!_x!Y7{fd8x@R-MkS+~QOjsxG&C9+jg2Now9&@sZwxR78iS0% zMuPF6k!TDtl8j_yxRGvT7^94F#>2*V<8k8&W0En$m}$&1W*g5L3ygq~W4vL!X}o1@ zGqxK$jGe|V<89*|W4H01alrW4_{8|s_|iCId}UlTelRW>myI8dUya{9*u#5DdP;dp zd&+pqdLlgKJmozVJQY2aJk>n4J&iq0JWV~Zp0=KLp7x&3o;Xh*PhZc2o1jPp$JJnnhIGs!c2mAtCg@D}nG^_K9K_C|Oscq@CW zd24#3ymh?|yiL5#z0uzG-VWZ5-Z*b}?*ra=Z*OmZ?}OfCZ<;sVo8cYh9p`=6JKp=4 zccOQa_ZjbW?=0_J??Ue)?~C3g-lg8xy>EEm^uFcY=H2ey;oa%o<$c@xj(4|rk9V*4 zUGIC|54<0HKkfm+J>@;^{mlEd_XqDK?`7{5?^W*~-W%SVh4?~Zp`wL~6)Ik+ zM4^&}N);;Gt72MqYU*K5;Z#oJbk55a>C-Jfa)fW3zd!sNnp5NQB4_s*UcIUdM!9lheUtZlwp}L*-7r5n40bL zx64c)*)6_@&!3f^nK&fX7n}&iCT1lj=!IFkQqq#s$8_|!gU*Og%Jlit2Ip;Umzg-y zm!KER+t4#{NSnmWj{e>${uHPxL9cwru0DzOzCI~g!{bxZhNb%8pai`v6pT*Ff=OFm zN5J-&^t7zZ^wd;eW`bV)R#oZgsYCLerX|~FcVPbG8Z>I$q+!E`(Y2!6)QhQAzfBVu zftct9wPNenj;>p;PP_Vb+thbC6ZF!xBkDJdsMEN1?T9+H8#Rfj4L{ajb?P>Vum__F z7tPgN!8PTYam~3FTuZJM*V;5pkLfiFnT5?FX3-VU`7vB9*OqGsL(u`czL?q5>}3vw zff&RFL5H@+4^JP{Epc?putex|Yg68z(V0HzdIL)J%1TL1$x8A0`=lgi4Y!JQO!H^J zTsA%PR2 zwBDDTcPvcD+h?X{XIML6^6pR2E9BMDEj=qG$>$HAE%J8Iy~d%wLb)o@{P3S7h;Gv*ICc9QQCco_nOfr6JM)mA=-mKL5aO z@v$i&?dfTWnd1UbYC_*`@o~W@g@seT_Qa=y7(hY$940rBE3$;6W|bw}<7QQ+Xc&Tb zJ?0STt|{D;+|&fU1PmSnygQ4Z^zdb5`uw0~5?L$E>Snb#gC8-(j;$cf6T#7=HwYc5 zx2)(S7zMvC8PtNWUrLs5Wbon#`9q`G5w`dT`;!=|-P8Rbv*~H|qW9u6g9`uAeVtxH z)VxKDmo8hOQneaUb?P-}+_XijHnHtGbn4RmkkjQ>duAkN4etj6;v3r`B`qsQl9m2J zty(KNdt^r6u8B#*p>JaPw;h}1OJe~Zzm5(e-S7GE%|zh)%t zuQjMkdSY@!O!~-?iD}7xorhwz?P}x*C|1`KkYw0e-#+*oCv0t4Bp@~F*DEb0t0yRH zKkRQ}AJtrk{mrTdq~`sSVPMm<05aI$(%#>oAM9@(8IYp;4^7V;nV7{c2MWa41sYz1 z0&P7@B-q&AKI@k+!^VzkKw?`v+ePa=1Y5ht!G&}i&~tc7W-{xRtZ}*sg&wdAMb2Cj z55;=I7)ZSa#l*%iBN+>$896f0r+=VtzY1LFzY48qJA=Ol1`MpwdbG8*LhI=}tlykq zSSvyht~mtUdO~1rG{7>6o660FFxpB8p{?V#aeKMFXexxgW}yY>B@}=_*9Hi3ZAZHx z$aN4xTc4pX(FJq`UB?{8Sj0Lm3?Z%3xH7JRqi{0_XtjaxRaXdL^~T8%ym|=x@goqj zdeUk>M%KUFpwPdefAB0zKRnGn14gp#*o;)m_{L>trKY6$dZ+ltSm8+qY)IGSaMQUN z+=P2BpP&y(=$X|%rgxo&vAuiVItOUex(#prdD|(ORQMZ(PM6R-KA~QnTjhd?#e>mG z8`d!y6i3R?6fn!yWz6Dc10&tyyJlyx2H(S~+lAJ;RzBT$n9%Ig7klAtgq=$_yi;co^QAF$l-wpe zD=Qt2Vea28-Q_n$or5_WF&&4BDaA|NHmh4~@`p;5E>reyz8g#eqcbxT#|6qniFaY7XdE@WYr>6V$K4i&a5}jzKQ!R4@zm9e0VljtJzOG*k?-O=Te8R0+&#V=$~OA>-5*4C)9lq$@28muL8D z=Qn)loxgBaZA^aTer96%li76%_lw!>FU686&ELVnz44zM+_*Rc9lb+<3zz&K9o%zu z$4g5^MfZZUmo*i51cUEmzeC! zjHq5EA}c*2!?v>#=|dy30IY~AcQ2cq;!jG*q+%Id%h zt*2HE{^m3)MmF!_-Rj`uz|Y86Gc8(S)W-*cxcw9aT9 z+-47giVSe^KuPFkZ?jJTd63uaYxZX*txC4vm)SkjH`JGz=}XRwWCSf~-rTNZEZE#~ z`AWus<2EckbKLD^4zZ{lD5Bzv&3-|z1eHXk@>DY_$xX0IltE<|n**#8!XeOFN%p^0}^qE7=Vdn7F zs4l7p>aYQ7h#G-XY=WAiW~jNDVm@S!FjLKu<~Z|din>yiLeWDMrJ6MccTF6dGBV|1 z@EFL8z0Qhd@wNtJX8GXX~AGbFX*&TJk1K?SRo26G~Ewcj&Z5J{Z2TbU**lYrPtc=W*kq||&BSFCx63O}F0AOD2-M+-&vB9Rnhi}ejn%udY; z)@_BKB0?vHttlB0I%H?-Zk?t};<)teEO4Lfkk1_zcVyFj@aZA06%neqJ6pcthdKTo z(FwoK^^eQ&rFBe$&>s9@j}pw~xSC5)H#2Ps>Taep5i`KB=3R5p3$VnXCn_62y-;s6 z!yIi6uq)_?2607lP=7Q44KzoYnWjGn4dyDM2hA*q+hv;-2SIhW9EO4HFFSq-8UX%e zUE4Kr7|brRlYRZ5kF2Y#&^qP8d{hiasbOat$yGw><`{?zj%BJ!3-+)zY^--Hv>v!4 zSjRD#sAi+lAns$(STqhj43pMJ&;(SEH6au%?vidzU zj!aBRyH%V8SlN)o4YljMwa=VnjyIn)rpwGC` z@D&xCJ|-;{LP7qhq&$lr6`!7+ndFPg7c#M~dKp>{9D>l<17r_+0Igsbd$(QS9idey z7p?A}0jOD>WIkm=G_c7%wdPjCBFD1WFT|D}vRbnits4Msu_Y=8tw$TU3Ab+ok?x+D zG{Tq6B(5z4^2b?6ZbX|B^r|p=`NZeeQ07-j0rV=nxO*;dN!u1wb_v>QK68upH_$Gw z=5q8VdJAoX_|6Wr)0}S3FlU;x%-QCg<>+nn4%!Xhd$~&HT=Q9qs+e;r>H>7u$gf&0 z!a);3rX!@dz1Fr4puE6L!N#N!{z29@rmXAKt1*BP(m5q9IT&&-4dMCh)MOT!eC^`>Qh0*@dDMRxe-PX0R zGl+uK87CQfr_gEinK|D)VE$_M`xv5HXV6#ZYY>mK=o|DcI)~1q@6h)U>$-@3K$k!p z*dm>8l)42IKIND|vlJ1Vl7%7_`9}@L9uUa7EfNH&fwW-8Bcv|wEN|r7%g%E;eL)X#o=nr$D z`I5QB%(=AA@O2Ol)4TIHqp*%ybqLPtS}TsTT{W3hZF2%v{VgS19mo z?~#H^B*2tNo^xmK(}Vk#-d(}q!c4)K%Pm#X`M**ncW?G#T!PbZNp3xaGt02l=8#0c zZvgz8=}U!Z*k~VwtyY;U6ZC>SX;1~=a=3i2ZtK_Yz-LM-8U@JpY6AlW(=?vLI>ir;KAkMD!3}HhO0xcwkEEHBOzp4 z+gxL=HP@Nz%?;)&=0ugqQBCR|~FlJaPd?!%eH6;yvuMBW(@4A~cJSH91t0oQuH?Zto%XCZ|Z6#Hi zdmL6GHRx^Sp#fzogq5-KGeMOVnLc!=-v{1VculvLVxed-qTw~cB}Hdv4NuR66NT?) zhN4}1Dw~Mjt+&QxCT4Vjn*BinaR*d<3GQfaWqv&P^tcNUiMyhD>|?$LP_R!w{fIrX zJ#indNC5Z3z0EhwHv_mY?q|Mb?q)7jM0euq^N)JOcVC6_11zVq|u9O7f6#Sw4T9 zuJ3B!VSEZ*j@Ytp2BLHgeRLHnEP+5sn<}Dn>*`()NL*1C&e%?DLN}U zIhlpbnp)R41A{Nf7EoCIdz(QF;Ghq9*L~pza4I^FpT*Ci3;20FA6)|XGuQmoJP0P` z7xUvgObT9z7v-6h-ZCdaPuFs6ZRhef=hHR^8-nKG z*xk*692K@*hzz0Et9tI8ibx4DLYhE*dgx`OZsLL~ zr`F@X(@!$}8j6kUAKAT7j4v6~i+l;ti$62HcpbX!LRiPaWUm$r>c+9@7h6fi{N<)$ zN{ug%&hr)dO6US#g|7-q?GH1TBGLTK{D`8;6bX0eHNFO4)7EPg@#gh>ijA)ea>du< z>+=oxhUV|)O^P^*P@a0@%kxda`~Abb!Mx?7w|mRCJIh{M&)w!M+na9ll0%#L_Dma6 z2kt;2)&ONs)^pH$@UfGDQkSDn%MaIz>hOxSIi^3J6y}8To-mkAB7VjE zfTBu&aXf@#Y6YWYOby?1O_{-X9fDB&8x&QA1O&egHf-m2Ko}t@8`2+XSz-PvMb#+k z9Hzt}K6;*ihu?j>XG&2WimKn$H|6*7AKcR6wJEBRUx^A3U!cl`JK1^y!c1AmFX%wOTJQdF0sdKA^C zr~yR{DQZMfV~Uzk)RdxTx%`hI9rvr{Rq}r@9oO8}aV;&slA@0HHC(}KI3j_DBVc!0 zgftw{?&?{Fpdm#_ae#&tCB-OeMN#VjDM3K*L{rqhz%(0)AQeHgk#eLwsX$R1iee~= z%^{UYWv1EMQq=BW*KDK~r;*5Tb#)hSk<@{rb;FB>dy94_Hz19JnvFDKnytg1`-t`d zElG4xm66s=m38{_1A_Bu(w=m%R)6KwPr;aWfOKTRI<{mid?!m_g<{+Z)?T{-UC0Bl z=!tYC-AEkiPEj|C;wXY&9#~3xka#qg^rEN-MSaYP6jEoBlne;}Ky0i? zz9PZeS;*XOYbr^D1ST0tQQsvbouYn!k-{W?NMVvJl1)*6iU#E+Hpp1=2mp~UiAg4K z70F{14KTrD9B5X|>(L6WCtK@t>=ryhz!|yY;Hhvhc-({8!3k!?TU`uCKY4pVh|DDO z;nox~i_9i-$XxO)d5+8@&r_60(GZG~C`zUXpd3okFp7q+v{X5)JYqMgz>lTHVH~V5 zD`Z*{^crl$?G<{-5E%2Pr}|hrv`fm6OqRX2R&)iUnAQy~cP-u1&cWp`U;WQ&@7^)C zC+y2tdCfm7+|`$rm<-vE{KZ*@>h5iU5zk+g-G_76qVd^7{No@4J~Ds#s6Q(ony;|g zU;ZQhwC#CoDe_&a$090$k=HXl$kbu7hOCA3&^&G{SqF*rZt>xYIF7h^chwLVM$X@a;MQIcPFBue#q9~IhKSfy-0UDzz8bi@oioh>_n4<9%J;G{x zpX?(ako~A0SBV^e&mnS{93lJ3F>;*w6B8(!NrgA5upJbGN`;;5YZn#Xp~7+4NQG~x z@U5jUiuDLCGqg0EorZu!2EY!nli>OYYhO@8{q52-+0KF1txfSs!+q?AsnXV;Fna8{ z6!E^STgmTWez0PX>@?6LSt)73Rms8BC|lAGi&ldxLD+3UaOX-TSS^y|Ym=RlnhfWO zPEEbNpugkLZa!bKFBufG-A?OXE@-OPl9rys0j%WqiR=a|sIP>zpRHO<8wL$cvzB^v zOdFaG0sw7dacbXKSe?OET0%92tn0|%TA2FZd3j7egBPaR3Cg^d)b0XnwAqT6R9N+$ zd}{@W)m3dEBb6Mi4K5fmhM-^JtZksxBQnzARuO-2ALJR6gSi889u?2U^U3$*0=YuHLngZq0c6Gncu=K2u9X!c(P6Ieth za^&qb-mq$<|7~nGZ~1rR@Y|{tc&pmS|MzNdZ>`|8s-2XexBTy}KeT=^Ut1Nc(kTgg z^nX<;%Qag!)#U41!DH16%NhRG8jIk3Ex3U4)~bfvySAuR?X(1av)$b23|QM_t+DZk z7QiHCWJCpt06C0`^^NwWvX#nFkb}wsFh}~MVBq57`$j^BC%ECZGV!sU^LG1_M?}R3 zm3~yn#zh71s~p4bXN+pcl37755IL0H8o{JVJj>5sbohO+!}Qp&m* zxX+}KeKGg44kdY9YH|WB85^CywsKZ&GZOU1f2X$FdVFL^*9#SeDzLgis3cUTXck4Y z142~+X25f(@G$cP{$Ab}uFlF62fyptsx>=<>5MzG#`((F&50DcGt*N}h$24-b%eS? zJ)yqP0M8d136073LQ|oc(41TlS_-YmB_Ud9Bg6=?si7E<&gQ$dR<3Ir9=Qi_&Sv@)oXAR_y6P$R9SXgx)*P_!wirUZ&M zQ?!+$*Fi^7^kz_BZ3C5Mu3)WvK!g5o9=_omoS@hpm0Q~Vyq zUr`=Yz6|A?Q@%fiKo>uc@|!4skn-PC;-sV!B{7sFP%@5^d6aCTr)sn%I?uw|qrW3M!6nhmvNf!qUlhk%_03DrO}oB-meOp0W>iXAQYtLy3+njs$Cz zH7;(kw1S|ZL!V)6SV?dtd&n9 zg9{8O+VDU5#rbO7X|;J{g5LJ;^ozAV1{TP6i3v`9Le5bB{@7#H{px=!k9l|D+^&T7 zS(R={(6`tP{$~wNLC9k}n2&T#OoNqWcc`ud*44b0ptrHF=3d0|R`;_NIo3Vw`TPE; zRq-1MI^5oQ?+c&rF7F*-#+h2LZbHNQ38^VVzy-)>7CyC3_11qcLa-1GRw$=ru^C4G zx<9k(-u^#`P|)rUw;jwcg$s}b5zYu-3116mg>Qs!g>%Ar;XC1bigr@8i=wwFdWWLj z6z!pCFGUdNc#op@bA^jmyiB+vTxB5);U^Zf*k>m}KBVYGFm8cP-p_&*d=|t(APeFE zZ~TK$7R2F%EQrH}>ah<+`^|@fUy$WhLqqM*9q_cEfWvTjDEf$^0|7@NM`4N%QgpPy zR@pd8I7$aI0gh5E6L2WtDB~zg(P0X!#qV5b6O4{HDg^JAGDtPMnN=J$Ao}a5>Zs3Z1hh1qic&t z?b!e1FfU|@9gU%AlklP&;>WD`d3o%Bso81mSI?ar4J&V~^@yB(Cy}FtqjfMx;%LQk zB&YtWEA75(=YXt6uA{x9gQKIPlcTevi=(TfnpHAu4~&EaxD zRCzx|-&x8Yc)DW-WB4bEe*U)^eip!dE*#8_ zo0rTj(zMNowDX4*_AdWq4P$sd6kQNrbi+@Lek+GMdN-|(T;2C{T^$(Se#xTP?uZv1 zODu*LGlqX-3{MQI!^>gaXCJb{@d{&jrDK&N*Rk61vSW>7tz(^Iy<-DKzf<%FMK>tA zNijz;q8J`R%u`G#7IGaMLkw?mY<0W_48H*kV@HT#?54N~#YG{DfQ#LS_#c4yJqGdn z6pJ>*`x(R^f=NCACK)@yBx4t7(SCZGo^Fr!F~=v2uj7u7DV8Xf1CCD}Cn#1Z)(Z~e z&mCu&6pnR#2}T*KObS8wAEsCflR~3Sl-;!R4tNenj^jJW_l^q`8x(se_A-bsIW7al zxDdsK|80nW1~PvMCv(vwukNPDI#qi1bi2oti)R`zh_6G@-@}X2=xLE9&DNVYuC4pi z{OsQzXG>rUSrF^CmnJMRDa2#$s*2Sga$~Wgm*GP+Zme29S&Bh3xTeA~pvR5u1w5D6UR%jeyuf zY)NrVit92+3gj*zF-B|;NQ$vyTd^I*(8x%NqjJO!*e7EvsT)xxD4OyRjcydGvLsIMsMSF!8J+<)31-%zVd(GZoR@*-(PRmz@a!OsL1MvD>AKGh1QWFklpquC5yu>kcTpm8~;@W_8}w1u?*xi zFJ$1^EzYjZq@aXeRimVGD&e%f2#z;PwLqCMOT#g`bz zi^LZx?nrT`fVfy(LUCt`gOB_vkb6D$!j#n}{?!v@ybx@AGhRd-^?53?3H!=D* zh_8qnDUPGKJH-!xK^8ZQTNwI1D31S^4YK$aAiXUd=?97pI1}}G^p>q1m)BX-e*Y(o z{+&>CS9sCNr#8L%Rk!F-TOMgSZ@^Mx*)95ai|<r)-V(oL@Fv>u z`t0x)9(5nye*oS~4BpEW53%9B#^C)?{E2-iPNF#3`UZGQ==P%=#Xp=JgZG9A^P`~@ z4+}Vv6J|)mDNZXeBkUBN5@6_bI$cgT#VHhnUq2$pDPx}#lzA#6aU?t2J>QS}A0t_R z*PI`67UDE#;c&LDEi1;K(>g!3Wy0C-a?>U)1Pq%qDxm)9avqD4!rU9#^+;N zKC?OxLuV;x*`V@rmSM^(9WZp33o5USaOG93d5A=3WoNY@yw0i&-ps!`%048@*%aV) z)^^r$)^*l%)^|2=Hgq;}Hg>|gfGmo$DIQHRSmCi0kE8fuipNv@2*nd}oy{zGovoa$ zozYw+XAFb)Q5#-L@iP=pXQp??eR>O?UgrZquM@1%V^jFd$1>QbQT+73Y<8WG0>qDnLwsZNNyn}i z+O(M0?DcsArqHc(5uFP?Nx zvnYOwQ9P4TJR->c^X|(QT#l`^C@0H@e8@mMInlpShv|YmobVL+7!PSy3Gc!y3g=G!0<-K@Ft2E*$i)C z42RvoZIALc=T3&!cIOU?U!r(%z`4u$HpSpM=M)^j?>hG}=^N{OpIM#&NFTn=;Jxst z!gtVll(BordDwY`;-wTXqj))E_qg+8#_kG=SN_}Vo(3R43kUKpH|99MgraA{i~i}2 zInJ}ra~7}PGG24E^<;=Jm-=KRt5lk;ciFV0^newpGm6tAUt9mVS@ z-azpy6vI>m#N^dn=k*Y-HyvADh^yq{8LpdcTwf1{pZ74MyZ1h@1rMyt0AO7ninoM- zbrl9+T}4nmS1}fT-pazy)>CUH>W_!8b(L|I1Nm^3bwLdB4T|3kxXQaA3i%erI|>Y2 zS5+5ebOBpeb%yOW5JFe2pwZYK#x1-Jv%+z^adlk{0bW-w1cT`zaH@XM*6K2m{yPFWF6-?Rt)3JI6KG1#aCbiceGg zS&nO->v@Ll=M;bO?_>KCu(&v!#U+_sgNOS@E8Cm>@MfQ$D)M6*B6Z3&s;#lRf?|# zTwl7*Q2ZmszZ4v~-@3kIGC0+{^k zj^;qFn}?z#yy(i*D$U>fqeHiO{GmZrr}lrB&2+72j&pj$P*=F&!TCXm-4Z~|qrd7v z`w)-2G(hb3x(m4ryNkGsx{JAsyGyuBx=T@>r#zv&KzRq{ManxV@1ne$@)G6cTz44@ zVt0ARRyW*;?5+$D^PxMCDX%flnJ>v8E_EN`f``~$A0T!&pu8G_*xeW)<|l|hvJZP& z4#b;--*8i=_3RLLD|Z_Z4|i*KH05>58v%EWJC^bu$`@mR6iBw$-O=3@aCCQacXoH7 zyqEHYC|@|o-OU{bhLi`HDEhA(Qg?4)tWP*&==*)=Qv+=muRgYg|6}sy9EM|mC^{g# z=;6W_f2_YSIxww_-sov3j8I_TZ$r z;koAUAV>EI#%}4qI?g^M(>;N)>vw0lv)!ZJW87oiwYxE?nL+F?k9lV$&B4C%P1d3`QTEG0*N)d zbKPs$Nmk>rl&=l3X7^f%HS={qe#3<~c8cA!P42A>`B&YW-CHOR7f_$_4Zs4sUw6L& z7MO2H`9}9-f$ur_^mk45Avff0-FL~`iZ4I)dD(|zJIuI|-Ftji?Z+7MyP@cwaOB-9 z1H#(YF&9@&zIk==j#rN`3v7j&;RVJKc3TsO5j^{qkPW-GsBW18Nj5ZN}2?wK92I;DgQu@ zKWpLTWJtJ4}`CbVgnl6PGn#yJI_YM8U{WdrMaza4 zO*voV*%o`c4xOAe{qvq%VK~TIOW*@$P<|BUGrk2^(a{ zzQep{E(7`5`yl@VAiu#tev|T(Y>>AzkaxI{v_pEE@{=hBh9*;f3V^&(pKFizyV5=e z@_W+zl%GoZrvlOk(tgTMqx`IbGsK6aV+_f|(h=z><)5bfGnAj6BORAMX7k}0l%M&p z&xfVYfV0oTIVnm6)*Y%L-Gt1{VKd@uM#PH3r*?v@$~Ai#+`j@ zR_9xW_#5dw>*Q~lA)d_)@plLU4s-7I4D+Tv^tJZbT#4tPu=42#enU{$SZr1aZpHKM(lz)Np3n{;d@-I^UCCV?R{E}Q* zwCI&3>o!7JWAp}WdY9X`5%RCxhqvJ2l}iJ>av93Q%YuSAB)J^GE0>omun*;zQhu5B z4e*M(Gc??Cb-5M@h+IRiN%<9&Um1`iWta@FqWro7gIBIE!y`g-xe?`aDZiTX zFXzZjHoX9aPU#H8G+IW{-=N{@`W_2dOE4PKB?ZS&b+H%+U zHWk}Fx58g~=K~8ipUQ(*?kIO*o!p7RyB^?`yD~2t?&-TrJV1Qj9-4T$caUAV7h`uL zm|nSS(0AGJXYk4cwHsw)*XBN3Ep9rg1GgX@lGj7g4dF#!nD$YH-+Q#HvEXcpq$P)o zC*DGSlf1=(cQb<*p11Jly=HgWTk^XM-fi-Bd564H-X*^+za#IK_sDxGe~9wX<3}hw zB%MD-`Qw!TnDU=c{!_}I$d%s^5_0#XcdXm6giy4*7YaO{?!?m zu<=mcYvnigeiWcpG$^Wv7cDdOrBfs0yB(PFNw4NtZXTMG2d&~&iUgrm3NvWGW6=H* zRCQ;si;&^DpURfzIF{mE< zQ2tkzJAyB;w`J|2?xa9UHlTD?x={W)<$n(--IO@W|3L}QpeT^MuhLWL3kWK`l-^1o z%HN>;O-i^Nr5`{zfD!~063ou__ajUH(bC>y4EvCh2wV*b=c;YdwNqlM$83Mvyk0%G z%R_7#hT?;wL&J;4Omq+WWp(@SUK!E6@q*oPn{FYPq6G7|W0eu$Z4d$oD)11L!;}bN z2pZ&LduaU1XbaqI0GEh=b(DR`Bgzy8?gZsgTs)2~8iV6eMfRcs*RaZeJ zH=?9Pff-=6h*|=WREw&`)Z&yhrlbiaO>@+e*rx)V&6ojh{x2I~wF0N96~j5B>2<2_ zO6b^Oam0tuYi=(AB-JWVv}$|mZhhS72s!f9Ys*M@HZGc}jD#&lEFvD#h(n{?F{Hm?hXtj+RqsFRj z)plxowS(G`l2}UGQqqo+_LOv>1h#adq%$R5DCwH3cDDFc<8ULkVndB*{C2bXeZYK= z@@&Bd8FU}tg2z`)WcUuDB+kay$M7904Q3w-Z&ZSWZ}1!N?QIYCNHv4WRhpVkNe@cm z1L`O>laij4^eHeatd3Ew7ecG>LTF0ZQzFzyfT2do zY^|j_8;Z^eFZ%TU-@lER7d>oZ#E(-wC->C7h5U2sd<)&@8M=f2s@Lq%d`Zn^=q^^5 zr~x%cU8*iqm#Zt(mFg-A@3$s9`9(hPEcX@>Q>tpdG6P%8`AY7vy!OEWZhbn;TIqFjM} zD4EQ%yTNZTxmQA?t<}(&E2q`eVBYg2B~t@hlvbOPrzm-*z`)fSXpq~5^pM70|462R z6lzU_Cim$uaE(_5yJ@Yo7+_axtwn2XD49;l3`%C^Xt7#bHu0TB$?Si9;;VJxG_7km zkdH6F{=x3zog-JaZRWU{t33iHSA*x?X?J<<-GuL&B-ekf%cZp^c3nC>B*A18--e-y z??t;SdTafH7;AkQ#?Sp#2ik`uXb%C#+Jjo6HbhI(k~N<;R2!xZ*HS3F?U2l;WC0~F zP_mGcMU=cq34}`)Q?evi8xg`dU3o?u1sMAo#`YQw0x|@#s|^g}`-?RG35+Sj7!<0# zNJE>%FrEw;!-tZkL5$fqV4P%+_A}Z{hVgU_7+Frqihwptn@!0|O4c%r3ncEW&C_0B zKt8X{*Fbi_i_4{Cb&j@BTf~5TnUXdCK9Ea+vSr~wZYp%7!|RvZ#nEzcm(K~69%ewU zgrcj$i&iFuhK*d;`RMvl%fEYOWY^1iKCt$(w$4&xYnd8b$0%g$GbmXfuEwhO(!1M( zvqgK|qW3jMFI%MXr^nfc?9lcxdUtBOw70c)wB6bsZLjvO_MY}WC9hJlnUXD(Y^CHi zN?xbr4NBgm<=sjSijI<++UVD)S*_oFz+JE15E_l~j`;x(Xh7x;`hISU< zg#{YHpWyNgSf|1M&%0GnyP#cS=w8%*pkx;%ZwIu?+7(K`Io(@u7WilFH%oMXWum*A zi6A^H97K0dxai8UAt}_6E&%X4)_I*!c!Mc!M!x8e-A7IyYz@Hc9w_P!FZxoSDbt(zI;?-W#5b4XlE>Uy zPzjIkEgl3{FUG+A@UME!?y|CabpTh7(97xN^$L1LcywrGy^3B{uSUrMN?=ZOh!W`c zBa|Ga4gOv*5ftE{RJBTfYsHb0bCv2%oCwG zuih5GRbuq^@aYI?UP?{|zhMD~zEBU?!`)4P03<|@)4Nmh86}?w^d5RVC0|hTO@Y~6 zxFKR7!?2&;UxzT$mz02l`6@>r1Ry3*@--vzEIZphGII|>s=v$YAsv#q`dyN^o6f3l zA6OOl;hIKsor5#ZZ(|syK+%W7F+8|>bJqqdVh%o4@dMx4vbDG7*%B#gWduYb!!8qR}eH??AE!5CQ1y$a;u%qllOnn-Im+J5YB>f3} zl0I3VqCcrm)nPhxfs%`qfR4UI$z@7FLtmxj8YMqc@>8z2pMV##yG!&OO6-Li`f`9*UxDhe4~4fQKNS1|bnSO`>udE5Os3Z9>nXWT z$?pOE6@4Qme^7xdFsrL?)!$(DW32uq5y+9drG09RlOHU6~MY;ZrDK^U!Ct5# z6s1B1DpZ8Yu2AW|zg+PCvVnnIgQtSMP{VKlxrS&s*@p^+sZhlF26l()_Nzw>&G3MT z7`g$2Sd0qA1BTZqM1>Mmh$t|#YZN!&Rb@Fw38SP@iV7vE0No_h5hT(UKoBDs!4qB^)j;B{!whhIVsjRe$p1LgV&)3LF~Mp=gcpqEGym`B;%A z9rw*0KXOgcjiVaoacD#ub%NTD|%;pxHAoSbaKG(8(CCnM1{ryW3(}b3Qefcyuhrm@rdylJIMra zABCpiJ{l&tk3zG%x{sua-L%QZQ;hy8#*@ZWDzu91W*J_t{YJY>v+qR)pH?U3`qlCr;bj+p<%d-K-pI@jbD z{Vy0VTJSDn@WwEB%^>~F!sxfVY^kx1!Mn^@Zmcj?8mo+4W3}m|{uCYD@?W27zd3bjHg2en1UWuhz}S?jbl{kNrgTI2ki;tG!wtE#wlie*eVSJ z-cAW;yvr($c`a-S{MvxW8Rr;hjc<%^snC}S{ix7C$2f0%2N7yv02K!Q>k(?>3Xpg; zoWy+xGRl%poqH|#zxLicuBo(X7!GLc6cd^aLy_J>k2L9oE(sAZ5CTMqlt2=CJs=<* zk=`S{BOp~kK&pTk5S1pVi@o=Cb-xo?ym$BBd-u8D@A>`Se_j<2xz3bp=9-ynW==`* z{)n{Y0Bx4jegHu~{yQkwJM?=|h~<{^ZbD2>@(Vfejj)cJ8u+sJ+lJeIWw|Zk@AUQ? z3T!Kk3v^o;6t)ev9kv6u6SfPs8@30=0RtV52tZu`s4D<<1E8P=!3ggTKs^8`8GxRy zg>i4VEsTda?SaKE>?F%ygZ~E@E-*KU30}>w+QvKy-28u-4cg}vW%JCw|A_Vd$#+-?%X>lrXiSv-94vyZ zgsm7{>quA>41h)3)4tCToDu+y1E8@0^b7#)Byb=5Z@wAcm8CCPH-B$mxgeH`eL)S2 z=#H}An&mpP`RXKC94rwcQwEENorQr(W;_5r3qTXfU`eoK7?@-x0?;G?nj9sK+mH&k zpeg901J#pyw-L4A_O=@`OwP3jS*cqYmqDG|RL^^eJ9mL|+=o4e@>P z5THHzlBo1xgg%i@a;H$qByh?1ZJNU$fxe#;{f}}QkZHbN#9#|hu^^-0fo<}@5xx9L ze}FplJE%X}(FT>@D|M5KCDHr$L^ib5#CEueTL{(+y9jH6wZht9mtgI%4p=9w3)T(m zfnA36!unwSuq&_u*dS~Ob`>@Z8-b0&#$e;H3D`B*By0*c4Z9AT0iam`6x4bS0L=xU zc>pvYfEEDILI7F>K#Kt=sPR$&$^f7j0B9KiEeD_#0JIW-Rsqmz09pe;YXN8-0Idh0 z4FI$efHncpW&nB-fVKe8Rsh-tKrcm|WJ0(g-H;yGT$CEvsbDiF`*?y5gpfrTlYB^2 zqE}d$fxS6ekDza5VXccr>!HojSbGA_&<2CHvfM8$(O%pV1arXb3h8 z+1&@^85X8*Wnf6app7jFATSzhZfF4>F`G=5STl?bKhTKVzBn+hMNr5Sz!DB1!iD~Gc>odW=)rXHPp4(gnP__6Z#jN zp{1^#xgo(s*9M%ip#j0h7L?QC2ia#VaN&P}o9o(I>YIS7x5Qv=bkQJjYh9KeH_5+b z!T(Nw{|=8aG&kCWe#3$m|2yh7h8Sy*7aE-7Cer&qNdTIHjjoM7!Q4vM;CB<-1pmYW zKm0EqR#+258xU@DU5(6jjejiY7Z$L@zksc6tZ-JLe>(IZjYz&Rj7%a#|*V>w3Y-43>y~zO1#sWRM2@2Y@uCFfwL-cWTp#+76{k9mO z&{noK`i2BueSJd=hM;R}fVLu_Ev;=g^$b1)0n$s<;0dCG0^RP5IXWdQOckF#@tFD+#i1I32=%3$!x4_vBp;a zFdOOrli66?fZ-A(ylHlFEF%A;+dqqBi_zP}N3!s>!T8}tLV&63_Z{*Ck;>Y)Xsp2E z<%M94`V-wrG;kv`*9A3vLf6KUpo{r!L$lr772wJ&S~mZYmX!-D(LJDm7b|S!N$yxFG=T zVda9qPpN6w=p?EcDfk3!BTv|*V+sdfh{S+{ZNgp#9BdQzMTt7HG666p!_cYV z!eEGAUN<0IaIgn;g$ZGah=tqYEHRe;US1dASV;JW!cKt6Eo5&L`;XifeiH5o&X6_6 zfI9)up(yDMNFu1(?~t2UFyJIO8LVgFr{L~zu<0=jK*6eRvscmnT@}XKE;Pl3ZmPPT*11AhH>>Ed6Q_MY+y+LD*$sMjcyC(#~`Kwi3V0S-|HZ~ z;0?s@cw&Er_eXdZgH5GT;rS#K_Uf-XvCeQs=*Q#TI~0ZYVSg4uA?Z0Mqpg@F-BB-!Wp~5iH1Z-=J7fdy|{2 zcM3wa>x>9ICN5Ry8bBM4pv~k$<=JPDlG78`yb)=%A ztbzhkT}@pPg+#K3koteXArPtFs>+)}WWjS;LS)0iq#SHE&Ru}#!NIirCIFphnel%` z^M75s@7gcf&_1|McLiDN^nLKc#^CMXgHC7+* z9ss=$Kpz0mp8)7O*yR&-Akz%J$nInpFR%*Zp?@#`4Zg1?xM*}%l}X^{`~5JQc7jX= zi)&UVfqUZw#=s0mq>_m~^gofElAk5rLU!GEu@$gbds z6}b6=cPhds*bbLQ{Rl5pa3~O#z!XLpw>D~a)w*d5A*{&G)GdTFNDs=$*9+Z$J7%R~IQLsNSwx*K7h5;Rn zq|$#6s7G}5#E^W6R3i8lTwvAu_s|FXjyY4F4Ja1%Q48pq~Kf z=O}3romU%Iyj>xPBkT|alLrFf;$h=qXT?)DBAsZpck6B!UoSF^uAnf-#=d1Mbldh_ zcA^0r>tZj;G8ZrppkhVo6kj`0%J;;827bj|Tq%K@%Mt^|b&}h6s|SH@?AVE=QYiE& zwkGaNUgoHUoM30DxOMqh-atI0Jb;`(#=uQKffP0xMmFx@ZAEaVJ1byC( z?g7HFw(cKqb=Z5BJ8JumsBKaFpi#?x&z3O3G&;%K7R}D7G_Oqjs<)L#iAoQ&dup+8MPgYIm8cntIe8@S+576dcTDHb}69 z_<;$FU}PM%Hwwn$dH|%pNtx9SrBKmspns81kx8J{^8Yx?YSR7d3^#;(8`ILt`nbc! ziu!;WwcGfW^j-60Ff>qnK(D=EZ38aJMy?5BU~Qc&F&6%GA{eT5sZ?Tc85U;)uJ!ld zL1WvHm8JCWqJS9o4q%A>vvx0>wE2rs5Zck{H`}=2Xajz9CW2A>ch=^%VTTu7K=i*D zhwOmth3tojLL?!I5H$!IVh%YD!9XYwe@GZ47Lp9fgA_oDASI9*NHe4pG6Wfhj6%jC z*C11nImjC15#%-G8{1AcZnk}F2iXMK4zmfdiLhz1>9aYqg|LOO0c1-Kn znQXai`D}%3#cZW)?QD10-m!gV`@;5>?N|0~>^s?avvaU>v%}bV*!kF%*)7?v*=^WQ zu)DB(vInt;vY%m3V9#YQWG`oLXYXO3X1~Gyfc-K1EB3eSpSEyp;ob-a>}(rHi0g01 z-wxoH!a#rio>lQ|<$*f>SPd|_B9?(e+aTef3R$0i%SCv0@POClD&Y@#cJb_nKjz`! z0k>cvAp7kC;A6SESPD2hZH%sV?#IJa~PgO8#&DVMSS8dFo$u%Qrw8a z2qGPUR6nY$0-DG^h%iJ3f`lA}=z!*dgWw@fdp!2|>#QaIg~h5IMg^$9Axm- zPU#$V9CI8WIANR^PAsP_r$6|t|2fX{oLQVXoOzrDoJE`^oQ<5#oGqMfob8;QoZXz4 zIr}(oa6aJt#I>92Fqb0uprQqr9hU<<90V<1Xi};I86s=I#M+0lmRJ z&wZEsXYhWwU3>R{H@@u!Z*`N~tF{-r7q{1rXOw4#=QA&aSCTiCH;1=@w~cpzcZ7G0 zcY^mi?+xBr-kZFyd4J{G!w2W%<>Tku$A{n(<`d-;R<165+ zf0F+OKa>BH090U)0H*-A08C(?zyX0n0*3{J1keIL0_OzU1O@~q1SSQh1!e@80*eC6 z0(S-01nvv`B=E~V?tPN`4E7!0huw$UXTR^{KF57Q2d*4gJn-ni(*w^BygKmaz`KK7 z2L%qQ98^1q5`+mJ78Di~6%-eg6qFV;60{QZ67&)DJ)C+t=WzMqn!|O68xFS|Zadt5 zxbyHm#5M#Mf*S!t96*R5BoIi1B0?FVg)m285O@R`5rv3GoI%7P&LR>K$%s@$IwAv+ ziO5DYAes;t5v_*-q6g837(iS_j3UMnw}qfW{6fM)szP`nx=^A}gV2o7TcP*D z5Mg#;3{90s}$RQCK5d)DEA~X?ykwB4Pkx-Fv zkw}q?BHbbbB10m>BBLVXBJ(0^A`e9#i#!#1F7id>tLQe-Bcf8GXi=P~ov4E-UesNb zEE*shBpME3xBZ7%^Kh7cn=nQ(|N>Pca`cUoom! zxY#+dDzQsq17d4p_r+d`y%+l^_F3$kI7FOXe5?3AaT#$HaZPb;@nhn8;s)X*aX`F6 zyhHq^_+#<+5^xD#34V!v5(gv>NgS3Ck`R&5l+czqCZQ)`AYmk7B5_>8K>{z~B;hRK zBH4SSnO1Tq;tkP^w4jt~8tU5ot4Nigc=UgY<;-tn|F}ZRrK+ z`_j*(Ur4`_ek1)(`h)Z*8K}%InLRR`GH@AQ8Gf04GMX~>GN)v`WhgR!GBlYGnJ}3M znJAfPnL3$enQyY&WqD-9WhG@5Wl^%)vc|GlS$A2oELApA_Ka+t>{;0q*)-X6vgc(> zWE*8K%67|MmK~R!mYtDh%HEQ_BfBWOEPG$}joeN-n4F}XoSdQDDLD_h({f&NK61Wt zR5`j_fLxl~Il1$4S#mjYd2$7E<#Kg$4RTF#7v);zuE-6_U6mV=o0YpMcT4V$+`8N& zxhHbZtClT#>0br?{rLuJ}mt ziQ-Ge*NSfy-z#lZ+OMRcq@|>zq^D${WTb>vGFP%xa#uR7oZwN>|EIDp6u6l_^yy^(zf1O)JePF_q?&)|Bom{iO6z>7CL?rO!%Vl(#9vmHCtf zl=myUE7O$&l!KH*mB*BCDnC(vuKY^*t?~!u&&t0j|Ej{S0#(_ea!3WCBCH~+BBmm# zBBLU&f>cpfQB_e_u~ng~nyi|pnxUGhTBKU3TBBO8+N9c| z+NRpB+NnCMI-xqHI-`11^|tDw>arR{?U0(38d6PJO-=2nny#9Gnz0&M%}kB1R;f0s zHlwzz_Db!I+86a5>Ic*hsY|KLt0UEw)lupi>e}kZ)UDKQ)K98As-IS;sQanY)q~YT z)g#oS)YH_<)f?2C)mzmssrRYhQD0KOi-MroQCm^lQM*ukP@E`k6bvPel0zX;N+=bS z8VZHdL!nXTC@Yi=3X3A5Tu~&HJBp49Kn0;fQ1PflR5B_Rm4~WCRikQA^{6h?H0lOw z4s{E)fLcbaqVA*CQIAp2j?=1t9en(s9~YHiipskK{+ zQwy%etHrOiPfJ2eMeC@Rrk0MDftHb$iI%CBy_Snsh*qRlj#iCUyH>x}pw_U~nASC| zIjvh-3tCHBceU2Eo@ldcb7=Exi)zbiD`+cet7@aP^|TGNjkHa)O|{LnPix0(*J=-G z&uGtT&uib&UeaFCexvr&gyyr&*^}r(LH@XF_LEXIf`Qhp98C zGp}=7XF+G_*sfzokGUVqJ~nXdwXTS+jjp>cUH7bRfo`#Gm2RtUr|wnV8@f#0S>2nu z_w=^tZPVMSw?~gl52nYfC!lvgPf$-tPgGA_PfAZ#PeJdv9#-#!o`asF9zl<&=cac` zkF4jVN719|`RfJgh3JLp<>DnG zeH@KNpFlgH9nsEcSM(_~8SRCpps8qobPzfe9f1bWXVCHJM05%|9ep01jm|?CqD#;h z&=u%vbRD_@-HpDC?n4itznbnc-DApWy4N(*lwn$CT47pk`oQ$H>08tHrk~7EW=3Wv zW~OEqX7Og3X4z)BW(8)C%|4iYGW*%=t2tnvYMySMVV-4v$9&!Vk@*wz=N3o{ZHr?T zdKQKj2^QHFxfb~rMHVX-Pc5EXytH^@Sz*~?*=E^p*=4oUiqA^GYQNPXD^IH+s}QR& zt4OO}s|l+~t7)qn*88l*tR<|atYxiztV6BCts||Yk82)BA2&O0aoqZN*6|C+%a2zc zud#vHaM*C!?6u*s!P}5+JZ-#fd~Gh;^x4eX%-h_tS+conbI;}{n@2WJZC=>C#%#mv z#O%g!V7M?a3@?Tsvk!9+BZxs@v@m!~6y^eE1oI5bjg`k*Vm+~RY#=rS8-|U=ree=w z&ttQ(x!8PcA+`qFh`oqy!**dWWBaiK*cDqgTTWZJEw8PB?IBx)t%&UrTV-1IY#nW#ZQX6jwqCXrTR+?r zE6xMwiSxnv;v#X$I0mj9SB0y^HQ<_Yt+;kv7w$5yA2)})g}Z}W#4Y1iarbdQ;U40i z;GW@LoY;Lr>V)M9-xHZ9x=*Z}_-c314rQljXJ}_)XKIJB!`l(;TqJyZ826?YGMF(XEeFtj? zl7okXr-P4!p99??&>_Sj+#$*##v#|Cz@f;Y#DU>Z?oj1W>rn5|~NfLoOHbDc+2sD<73CCjxQYFI(~5c?D)lLmlMB}jFY^RqLYe~x|4>J zwv(=tfs?V5sT0A;#mUX-l#_>(r<0G9pA*d~z$wTn#3{$A-D$z;7XpG{L^w@IAXF2E z3DbldggL@I;V$73;VIz-;WgnM;RE3l;b-UV&U>7>oMF!V&ikDYIUjb`b0#=@In$g2 zoP(XioMW8hoXxv;rxb=mH+%Z0;*+Xe0-;UeuK z>mu)hbWwIubwRmkxM;f^bJ24lxJ0;IaJlO8$d%Jo(e=2iuWO2Hwrieip=+^gm20zW zt82S!m+NKMKG!R*gRa+I=Ui{OF1X%xz32Lq>qED#ZsKmrZYVbmH*Gh4HzPN+o0*$~ zo1@!lH$OMJTcBHr8{ih>7U!1WmgH9Nc9XQ7#7#OxQXnakz-Q!1CrOT^(#bvmvuLF$GGF%?cGnhySaP2`?}NI1Kfk%L*2vOBi)nT z&$(y1=eQTTm$+YWFLxhxf8hSw{ge9__ir9-9y>gCdvJJgd%!$2Jn$Z=9yuQ69vvQC z9)lj&J??ot@ObUI`r=B}J_j>Yp@_X*{6!w(%l=W2bRPpYu1TRks%c6;`EUhy3Cyx}?Lx#s!E^Qq?x&)1%xJb(85>ILy)_Y(0k_lod}_saCD z@~ZJ_@#^?&g-MsFJ8ZTvwLs#hI=EtRlL=`HN3UGb-fL|jlE61 zExfJ0G2R~Dp5ETx6mLIox_5wgkavi8xOb#C;9cz9>%Hc)#Yf!7!pF}i-KWWC(&whn zZJ$M-WuJAQmp-q3-uk@v`RMbRvW>Ev!b#an;iK%M9Ha9KPYQVPf#OdIp@dT+ zDF7v%QbZ}IR8eXv4U{%YJEe$}7EsIR`SwXdr$$=Am>)Hl^P-M7g1f^WHR zm2bUolkY{}R^LJ2>%I?sANoG=eeV0p_pR>--_O3k`2On0?#J)9-|wKGpdZ3d#81pm z(ofn?&QHNl(a*}y$1lUL&F{9~H>xmIm+DLnr^ZnesL9k+Y7VuOT1Ks)R#R)K_0&dc zGqsmGNFAn*QKzUg)LH6H>Khs_O_(N5lcdSekThkQ8VyA=p;^!zXhfPD&7F3d=0~H` z0%^gtP+B={p7xOrp>xm?bYZ$QU7c=5x1d|m@pK~Hm41ruN%x`q(P{K(dK$f)UPZ5^ zH_)5ut@L(!7yUB5pFT*xMPHyV(O2lJ^!xO6`Xl-i`g8hA`fGnqe_8+I{xts_|6c#K z07$^$0L=iy0FwZ-0E+-z03m=F;2J;*a1S5{1O$WzL<9fivg zy}*}2>_JU zTF|+m^Fdibxj_X%#X+S(WkD4|RY6yS?gwuVmJGHCrUmB&w+G)0eiQs9_*)2D$d-^j zA-o|1A^SrPg&YnM3K0oW2vG@9577uY7NQ?w6k-xW3OO5+6_OuP7*Y~a9#R!j8&V(A z6VexQErc0zGvs#2V#vLa2O$qbo`gILRS z=wj${=xXRsp^rkJhCUDdC2VJyV3<&tXqb4IRG4g-LYPvRY8Wa^GwgU6HVhYL7v>P= z80H-28b%892s<6-6_yZI9X1*EA{-X39*z$W4bKnn2)`0O6h0C@7JegqA$&P}HT-_~ zdibO8_u)T>e~o}dKqGcU?2h1wP>8UIaEKsAxJ9@}oR08|phpBo1V@BMlt;`*e2j!d zazr8`g(IaS)g#R!Eg~Hv36aD|w@7lNS0p9UFET1JCNefMBQhs4FS0O_5m_Et6Kz~er~x>D2802TKs0a$NCC2eJfHw521KJv1elAW0PakVl!ehV>@E!V%K6H z#XgOF5&Js!Q|y=6uW^t#_BiP{^SFq(__)lts<@iCmbm^nX53udTHJcvL`m{Xq9+9;1tn!AwI$t7`Z-xJ*&x{?IX<~Ec_?`@`Fb)lc`kW5c|G}Y z^0VZZ$#0V1C4Wf%lmboJmBNw2ox+=||EH(p}S|(i75?)6>$=rRS%YrB|lcq}Qi6rC&^M zO}~^rm_C|5kv^5qOuw0aJAEPj>$&~s#Lvl{L!MJUr*=;JobEY;b4KS(&iS1yJ9qWm z)VYOo&(FO)_bCIKA&{{@Lp(z!Lp}qUp_+lp(9F=zu*k5^aLjPYaLaJd@XDZMP&4Qm zF&XI@6&ckTbs3Er7c<&2Ix@O5dNZzM3}xKTSjGY$(df6KAFCm)Xd1tGnw(3 ziJ57c8JSs`Ihk#lw=y4OKF)la`6Bae=7-GBnP0MYWpQNf&l1WK%@WU&%0gx-WvOPN zvNW>rS*ckaSy!^AvR1S1Wj)RMl)XEfBYS`L;cTI7(QL_VnQZxNWcIOai)@!{Qnp97 zXSPqaUp75EFgqkWJUc2oD?2wkKf5ryIGd4Oo?V$;on4pRklmC$nf)|}D+ifln-iK- zlGB&7obz+;mfUT*J9BsE^5h=MJ)A3)E0TL8S3Fla7nQ4-tCMSxYn*GEYo1HaP0r2B zEzV`+mgQFG*5x+lHs|)|4(49ZozK0KyOeu3cRlw}?$g{Cxv%o}=IQ5o<@x7D=Vj&P z0zdfxkd_I&>Q{rQLT5&0tdV)>H!GWqiPiuo$} zrui26R{6*CG5NTB`}~vnj`_~{F8OZxKz?cd)%^8>T?GmS*aBKXMnO|SXF*RvU%{1v z@d9SS&4OD63k6FBD+Q|s&kNoZyf64v@U;+9xTO$UC{buwXj5okh%Y1*x)hQNy$XE_ z{R(M?6@?>(FAF~vL5l>6_7{m1DHQ1!85Y?TohY&|!WR*X+=|?b$VEX#p+#qlQi{@w zGKzAF@{5X!N{SkbdWvR>W{c*F?i4K*-7UIT^i$EJqNhbKinkPRE8bDOt9VZ_S23)Z zx0t_pfAPU$!D5YKhvJCh(&DSdPf9pTWJ}CT$R*Sg|B|4Rkdl~^2m3M>08D&#tz0_h9CpUP-18@v>9d$YlaQOmf^r~WH>Wi7=DZh z#(73IBaczYC}CV+R4}R;b&N*FMaBqYoN^)XOx=w91UitjcW4Y|HG*PL?^A5z2^VK4rABfU@ASh%%t; zOj%r6P1#7><_?pq#Q9#@`MUQk|MezE*&`AGR} z`R($>^5yb-MxGP{4ycPQ^4pks3ge#C0+7*}zT!noFzJgHU zQbDTlsPL@tsqm|at4OFwsz|9wtH`LxtjMXzt0=4}t|+bOtyrprR0>xbReDvXS2k5n zS3a$LSNXB>=gMEIpjDhzd#iY=_^b9;9jp?plCDyyQmRs|(x}p|(yh|3a;}Q0O0UYQ z%Bjk)Dyh0qRZ&${)n3(AHBvQIHB&WPHD9${b+_tX)lXFqt9Mi*t6i(Ts)MVOt5d6U zs>`c8s=KO3s;^Z~RnJu4tiD~nSiM~Rtom~eXU*Oko*Mp|{WXVb5H%t-Vl|RAGBvt2 z1~o=CCN-ut7B$v2m>Sy}yBdcYd`)moZq4PIm0I>%iCXho&)US=s@mq-*4p;k&f0<6 ziQ1{!ncCUf`P$pHKh-{|eO~*j_I>TA+Ap-N`a)tS~=)!Ecx>+I|Bb%Z)%oo`)u z-I==hy2QGay3D%ly1cr=y5hS2x<~c<>qY7n>h
n-a~*89}^)`!UDH+nZx8iN{v#xsrajfssZjcJYN8jBmt z8Y>%X8XFrgHnugkH_kSGXxh@WqiI(YM-!}xw@ILBf0JaBOcScSExy=R5#m$W7^5&}M+UEY|!RD*YBh6#Y*P5rBZ#2&~&o|$0UTFS!k?-Qs zi};IC7b`DLTzuTJqvc48Tnn;Axka@_r^Tejti`hBcnh`#*J9T~YB}BF-QwHg-xAak z+7jMU+S1!H(Q>0@uH{zCLd#mqgO-Oak6WI$^0XSYy0`kahPS4-X0#TxR=4)F_O?#6 zUT?k8I@fxqb*c4k>ssrp*0-(i+t}N-x9x1()3&#br;WdDUz)IRJd)f!vhug>6ueCGV=h|p{!FFLn$ZtL9Hxu=t>6V}PwDbRVKQ?OI0Q?(P- zsnMy`sne;~Y1nDpiS9J-wCuF*^zKaVZ0=-se&{;bb*zif7134DRo+$ARohkHb*Zbb zYoP0D*J#&7*JRgp*G$)P*S)Tvx*l~s?|Rksw(EVjK(|V_UN^eiyxXeVrrW+7-|f^* z>~`%=?r!M5+x@8feb0`bT|Mv~M2}LBN{?QTagS+_dC&14Y|n`v`yP)T&z_*3@Sez? z=$`nV#GaI%w4UOgx}GaNLp>us<2{o-*L#>fH+ydPEcUGQyzTkW^Qq_Oo?m)?z07`j z>*Z~icV6Cond7q5W%On5%W0QeFW5c7; z?@j2)_cr!k>wVGtr4Q1_-Usd5)yL7t-3RLv>J#ll_Nn)2^lA6$ z_L=mV^;z^;_u2G?_7(O`_ucAy(D$+Lb3c1OSHEz-Xg{)FwO_qoqyJdHe!o$_N&ks{ zxBlS%u>Q#Y=>FLLv;9f^sr~2rGy8M;>-(GfFZQ?gU+VAd@9FRBztTU{Kiogs|KQ4& zE8u9S*ua4S!2zKGkpYzkujREZe-2wdp!vW&~?123MetUjYv9Vj(7?#R_`uA-?7+=|+XD-Odj@3(af5_GuffPcU@&noXRvm# zez0q>Z}7_C(BRnMwZZAZnZdh*_XeL1J|Fyf@Yf->p{+wZhxQC{4ecF549O1Z4H*uZ z44DmC4jmuD4xJcs7;+qP9`YXw8VVT-8;TeLhRzJd4V@iI8cG>T8>%0=HuUo9-m5BC zPhO3@T70$l>cZ9gSJ$sTzWVg)yQ^P^A;VjSw+-(c-aX7Q%r$&)SZG*uSbSJ!SbkV> zSb6yPFnt&pjvG!GP8v=hK0lm2oI6}KTszz`+&4The06wqczXE8@a*vX@a++{5#bT+ zh~voVk?@hok+UONBh@3dBON1`NBTwvMn*=)M^F0OwcC$CxRxzC!!`|CSoTtCm0j$6I~ORC;BG_Cx$1+Caz6PPu!T8n|M6&Y~sbl ztBE%g?Tsw2E`r7ohHLh(KU@~YjWHNp-c`|J>V=`wlf3j$@WO8uw?&Pz{x04?xKTrNLwPkAC)Q+j$Qyfz| zQ_fQfQyEhwQ!P_%Q@v9YQ_E9#r=Cr{o_ag=Vd~4&w`s^U`}E#v!D*4{BhwPoveOFF ziqp!|`qS3am}%U!{WN~sY1(s|J{>q6G95l0HJvb>Je@Y3F`YG?Gd()};rfy5w$~}w zldfl8&$*s|z3_U&^^WV^*L$yDxjrI`Z|b4Gi{aK?Pb zZzg3XcZM-jK2tSQGt)jZG&3?YJ~KIUeTF%6bLQU6Pcx5Zp3FR(c`@^9=FJU(8_G9M z-T-beZj9Wx&g5b8GxswOF%e7=rWjL_DZ`X!Dl%1=>P!u$HdB{rz%*u>GA)?aObipp zv}fX(1f~m<#Pnc#GJTkSOgb}=8O)4ko?*5#`!R?arfUYwnty)}Dh_UqiXxgB$|bE6@}QEpFm&+TF~$S$wnf=Hkr-GCx1qPU-`2csc-#1P?CsRs>9;3t&)&Xy2Y%<^9l<+x zcZhdf@8sTL+$p>B;Lh_qFBc3JEEcR6FblQ|P7BTp;R|sKl?x3EQw#SOUM;*`_^|MK z;g^MPiz18Ci|UISi`t92iw28Ei`YfGMaM%G zSh85XShv`)*tB?gacFU5aeQ%dadvTj@y_DX;>zN$OKMBbOWsS=CI6+MrSPSwrI@AI zrG%x-rJ|*ZrN*U;OWjKYOCw9ymu@dDEPc2iH z{gz9Y8iFvQ)w$LA z)w`?ftB+Tot-f4+z4~npy0&9&_ZsIK@0!5cfi=N3#2R`naII{uVy$JZYwhw{|JvZ% z_}b*!^)=?&+}iTmgSF>t@7K4kZ(rwL7hFHGF0+nWH(E!po3C4~+pOEJ+pUwi&QCa0{pa literal 0 HcmV?d00001 diff --git a/class-dump.xcodeproj/xcshareddata/xcschemes/all.xcscheme b/class-dump.xcodeproj/xcshareddata/xcschemes/all.xcscheme new file mode 100644 index 00000000000..b985ef87658 --- /dev/null +++ b/class-dump.xcodeproj/xcshareddata/xcschemes/all.xcscheme @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist b/class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000000..4320481686d --- /dev/null +++ b/class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,47 @@ + + + + + SchemeUserState + + MachObjC.xcscheme_^#shared#^_ + + orderHint + 2 + + all.xcscheme_^#shared#^_ + + orderHint + 0 + + class-dump.xcscheme_^#shared#^_ + + orderHint + 3 + + deprotect.xcscheme_^#shared#^_ + + orderHint + 4 + + formatType.xcscheme_^#shared#^_ + + orderHint + 1 + + + SuppressBuildableAutocreation + + 0165B8B01827137D00CC647F + + primary + + + 01B02D2E13A5B5D50047BC53 + + primary + + + + + diff --git a/default.profraw b/default.profraw new file mode 100644 index 0000000000000000000000000000000000000000..f66b003b6a489f65d37ce0499c139b7d419d31ca GIT binary patch literal 81800 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 GxBmer3nD@Q literal 0 HcmV?d00001 diff --git a/deprotect.m b/deprotect.m index e10921b0e29..c9e8ead0696 100644 --- a/deprotect.m +++ b/deprotect.m @@ -24,7 +24,7 @@ void print_usage(void) "Usage: deprotect [options] \n" "\n" " where options are:\n" - " --arch choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, armv6, armv7, armv7s, arm64)\n" + " --arch choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, x86_64h, armv6, armv7, armv7s, arm64, arm64e, arm64_32)\n" , CLASS_DUMP_VERSION ); From 52ce448d362d64046b24f8c29c871ca7d779f263 Mon Sep 17 00:00:00 2001 From: Andy Vandijck Date: Sat, 21 Jun 2025 11:45:08 +0200 Subject: [PATCH 2/2] Add initial Swift ignore support and add dyld shared cache lookups Add initial Swift ignore support and add dyld shared cache lookups --- CDFatArch64.m | 2 +- Source/CDClassDump.m | 10 +- Source/CDDataCursor.m | 76 ++++++- Source/CDFatArch.m | 2 +- Source/CDFatFile.h | 1 + Source/CDFatFile.m | 4 +- Source/CDFile.h | 4 +- Source/CDFile.m | 24 ++- Source/CDLCDyldInfo.m | 7 +- Source/CDMachOFile.h | 4 + Source/CDMachOFile.m | 187 ++++++++++++++++-- Source/CDObjectiveC2Processor.m | 34 ++-- class-dump.m | 23 ++- .../UserInterfaceState.xcuserstate | Bin 69537 -> 67404 bytes .../xcschemes/xcschememanagement.plist | 8 +- default.profraw | Bin 81800 -> 82824 bytes deprotect.m | 2 +- 17 files changed, 328 insertions(+), 60 deletions(-) diff --git a/CDFatArch64.m b/CDFatArch64.m index a7c2c4c73aa..9727f3cb6ee 100644 --- a/CDFatArch64.m +++ b/CDFatArch64.m @@ -128,7 +128,7 @@ - (CDMachOFile *)machOFile; { if (_machOFile == nil) { NSData *data = [NSData dataWithBytesNoCopy:((uint8_t *)[self.fatFile.data bytes] + self.offset) length:self.size freeWhenDone:NO]; - _machOFile = [[CDMachOFile alloc] initWithData:data filename:self.fatFile.filename searchPathState:self.fatFile.searchPathState]; + _machOFile = [[CDMachOFile alloc] initWithData:data filename:self.fatFile.filename searchPathState:self.fatFile.searchPathState isCache:NO]; } return _machOFile; diff --git a/Source/CDClassDump.m b/Source/CDClassDump.m index 231d1488421..f7540ceef2e 100644 --- a/Source/CDClassDump.m +++ b/Source/CDClassDump.m @@ -24,6 +24,8 @@ NSString *CDErrorKey_Exception = @"CDErrorKey_Exception"; +extern NSString *cacheName; + @interface CDClassDump () @end @@ -236,7 +238,13 @@ - (CDMachOFile *)machOFileWithName:(NSString *)name; CDMachOFile *machOFile = _machOFilesByName[adjustedName]; if (machOFile == nil) { - CDFile *file = [CDFile fileWithContentsOfFile:adjustedName searchPathState:self.searchPathState]; + CDFile *file = nil; + + if (cacheName != nil) + file = [CDFile fileWithContentsOfFile:adjustedName cache:cacheName searchPathState:self.searchPathState isCache:YES]; + + if (file == nil) + file = [CDFile fileWithContentsOfFile:adjustedName cache:nil searchPathState:self.searchPathState isCache:NO]; if (file == nil || [self loadFile:file error:NULL] == NO) NSLog(@"Warning: Failed to load: %@", adjustedName); diff --git a/Source/CDDataCursor.m b/Source/CDDataCursor.m index abd60a482f0..47b74f4fba3 100644 --- a/Source/CDDataCursor.m +++ b/Source/CDDataCursor.m @@ -30,15 +30,28 @@ - (const void *)bytes; - (void)setOffset:(NSUInteger)newOffset; { - if (newOffset <= [_data length]) { - _offset = newOffset; - } else { - [NSException raise:NSRangeException format:@"Trying to seek past end of data."]; + if (newOffset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + _offset = -'S'; + } + else + { + if (newOffset <= [_data length]) { + _offset = newOffset; + } else { + [NSException raise:NSRangeException format:@"Trying to seek past end of data."]; + } } } - (void)advanceByLength:(NSUInteger)length; { + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + _offset += 10; + return; + } + if (_offset + length <= [_data length]) { _offset += length; } else { @@ -57,6 +70,11 @@ - (uint8_t)readByte; { uint8_t result; + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return 0; + } + if (_offset + sizeof(result) <= [_data length]) { result = OSReadLittleInt16([_data bytes], _offset) & 0xFF; _offset += sizeof(result); @@ -72,6 +90,11 @@ - (uint16_t)readLittleInt16; { uint16_t result; + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return 0; + } + if (_offset + sizeof(result) <= [_data length]) { result = OSReadLittleInt16([_data bytes], _offset); _offset += sizeof(result); @@ -87,6 +110,11 @@ - (uint32_t)readLittleInt32; { uint32_t result; + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return 0; + } + if (_offset + sizeof(result) <= [_data length]) { result = OSReadLittleInt32([_data bytes], _offset); _offset += sizeof(result); @@ -102,6 +130,11 @@ - (uint64_t)readLittleInt64; { uint64_t result; + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return 0; + } + if (_offset + sizeof(result) <= [_data length]) { // uint8_t *ptr = [_data bytes] + _offset; // NSLog(@"%016llx: %02x %02x %02x %02x %02x %02x %02x %02x", _offset, ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]); @@ -119,6 +152,11 @@ - (uint16_t)readBigInt16; { uint16_t result; + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return 0; + } + if (_offset + sizeof(result) <= [_data length]) { result = OSReadBigInt16([_data bytes], _offset); _offset += sizeof(result); @@ -134,6 +172,11 @@ - (uint32_t)readBigInt32; { uint32_t result; + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return 0; + } + if (_offset + sizeof(result) <= [_data length]) { result = OSReadBigInt32([_data bytes], _offset); _offset += sizeof(result); @@ -149,6 +192,11 @@ - (uint64_t)readBigInt64; { uint64_t result; + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return 0; + } + if (_offset + sizeof(result) <= [_data length]) { result = OSReadBigInt64([_data bytes], _offset); _offset += sizeof(result); @@ -192,6 +240,11 @@ - (double)readLittleFloat64; - (void)appendBytesOfLength:(NSUInteger)length intoData:(NSMutableData *)data; { + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return; + } + if (_offset + length <= [_data length]) { [data appendBytes:(uint8_t *)[_data bytes] + _offset length:length]; _offset += length; @@ -202,6 +255,11 @@ - (void)appendBytesOfLength:(NSUInteger)length intoData:(NSMutableData *)data; - (void)readBytesOfLength:(NSUInteger)length intoBuffer:(void *)buf; { + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return; + } + if (_offset + length <= [_data length]) { memcpy(buf, (uint8_t *)[_data bytes] + _offset, length); _offset += length; @@ -217,6 +275,11 @@ - (BOOL)isAtEnd; - (NSString *)readCString; { + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + return @"Swift"; + } + return [self readStringOfLength:strlen((const char *)[_data bytes] + _offset) encoding:NSASCIIStringEncoding]; } @@ -248,6 +311,11 @@ - (NSString *)readStringOfLength:(NSUInteger)length encoding:(NSStringEncoding)e return str; } } else { + if (_offset == -'S') { + NSLog(@"Warning: Maybe meet a Swift object at 2 of %s",__cmd); + return @"Swift"; + } + [NSException raise:NSRangeException format:@"Trying to read past end in %s", __cmd]; } diff --git a/Source/CDFatArch.m b/Source/CDFatArch.m index ce77da65039..827e9ea38f4 100644 --- a/Source/CDFatArch.m +++ b/Source/CDFatArch.m @@ -119,7 +119,7 @@ - (CDMachOFile *)machOFile; { if (_machOFile == nil) { NSData *data = [NSData dataWithBytesNoCopy:((uint8_t *)[self.fatFile.data bytes] + self.offset) length:self.size freeWhenDone:NO]; - _machOFile = [[CDMachOFile alloc] initWithData:data filename:self.fatFile.filename searchPathState:self.fatFile.searchPathState]; + _machOFile = [[CDMachOFile alloc] initWithData:data filename:self.fatFile.filename searchPathState:self.fatFile.searchPathState isCache:NO]; } return _machOFile; diff --git a/Source/CDFatFile.h b/Source/CDFatFile.h index 68519cc675a..95184ce314e 100644 --- a/Source/CDFatFile.h +++ b/Source/CDFatFile.h @@ -13,6 +13,7 @@ @property (nonatomic, readonly) NSArray *archNames; @property (nonatomic, readonly) bool isFat64; @property (nonatomic, readonly) bool isSwapped; +@property (readonly) BOOL isCache; - (void)addArchitecture:(CDFatArch *)fatArch; - (void)addArchitecture64:(CDFatArch64 *)fatArch; diff --git a/Source/CDFatFile.m b/Source/CDFatFile.m index 327aec354a2..da25da8edec 100644 --- a/Source/CDFatFile.m +++ b/Source/CDFatFile.m @@ -29,9 +29,9 @@ - (id)init; return self; } -- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; +- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState isCache:(BOOL)aIsCache; { - if ((self = [super initWithData:data filename:filename searchPathState:searchPathState])) { + if ((self = [super initWithData:data filename:filename searchPathState:searchPathState isCache:aIsCache])) { CDDataCursor *cursor = [[CDDataCursor alloc] initWithData:data]; struct fat_header header; diff --git a/Source/CDFile.h b/Source/CDFile.h index 15e2930e303..bdf1116fe32 100644 --- a/Source/CDFile.h +++ b/Source/CDFile.h @@ -21,9 +21,9 @@ BOOL CDArchUses64BitLibraries(CDArch arch); @interface CDFile : NSObject // Returns CDFatFile or CDMachOFile -+ (id)fileWithContentsOfFile:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; ++ (id)fileWithContentsOfFile:(NSString *)filename cache:(NSString *)cache searchPathState:(CDSearchPathState *)searchPathState isCache:(BOOL)aIsCache; -- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; +- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState isCache:(BOOL)aIsCache; @property (readonly) NSString *filename; @property (readonly) NSData *data; diff --git a/Source/CDFile.m b/Source/CDFile.m index b1e31f8712e..46aa6cec9cd 100644 --- a/Source/CDFile.m +++ b/Source/CDFile.m @@ -145,26 +145,37 @@ @implementation CDFile NSString *_filename; NSData *_data; CDSearchPathState *_searchPathState; + BOOL isCache; } // Returns CDFatFile or CDMachOFile -+ (id)fileWithContentsOfFile:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; ++ (id)fileWithContentsOfFile:(NSString *)filename cache:(NSString *)cache searchPathState:(CDSearchPathState *)searchPathState isCache:(BOOL)aIsCache; { #if MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 - NSData *data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:filename] options:NSDataReadingMappedIfSafe error:nil]; + NSData *data = nil; + + if (cache != nil) + data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:cache] options:NSDataReadingMappedIfSafe error:nil]; + else + data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:filename] options:NSDataReadingMappedIfSafe error:nil]; #else - NSData *data = [NSData dataWithContentsOfMappedFile:filename]; + NSData *data = nil; + + if (cache != nil) + data = [NSData dataWithContentsOfMappedFile:cache]; + else + data = [NSData dataWithContentsOfMappedFile:filename]; #endif - CDFatFile *fatFile = [[CDFatFile alloc] initWithData:data filename:filename searchPathState:searchPathState]; + CDFatFile *fatFile = [[CDFatFile alloc] initWithData:data filename:filename searchPathState:searchPathState isCache:aIsCache]; if (fatFile != nil) return fatFile; - CDMachOFile *machOFile = [[CDMachOFile alloc] initWithData:data filename:filename searchPathState:searchPathState]; + CDMachOFile *machOFile = [[CDMachOFile alloc] initWithData:data filename:filename searchPathState:searchPathState isCache:aIsCache]; return machOFile; } -- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; +- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState isCache:(BOOL)aIsCache; { if ((self = [super init])) { // Otherwise reading the magic number fails. @@ -175,6 +186,7 @@ - (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState: _filename = filename; _data = data; _searchPathState = searchPathState; + isCache = aIsCache; } return self; diff --git a/Source/CDLCDyldInfo.m b/Source/CDLCDyldInfo.m index 9c0cca4be26..de3bec2dcd4 100644 --- a/Source/CDLCDyldInfo.m +++ b/Source/CDLCDyldInfo.m @@ -68,7 +68,12 @@ - (id)initWithDataCursor:(CDMachOFileDataCursor *)cursor; _dyldInfoCommand.lazy_bind_size = [cursor readInt32]; _dyldInfoCommand.export_off = [cursor readInt32]; _dyldInfoCommand.export_size = [cursor readInt32]; - + + if (_dyldInfoCommand.cmd == -'S' || _dyldInfoCommand.cmdsize == -'S' || _dyldInfoCommand.rebase_off == -'S' || _dyldInfoCommand.rebase_size == -'S' || _dyldInfoCommand.bind_off == -'S' || _dyldInfoCommand.bind_size == -'S' || _dyldInfoCommand.weak_bind_off == -'S' || _dyldInfoCommand.weak_bind_size == -'S' || _dyldInfoCommand.lazy_bind_off == -'S' || _dyldInfoCommand.lazy_bind_size == -'S' || _dyldInfoCommand.export_off == -'S' || _dyldInfoCommand.export_size == -'S') { + NSLog(@"Warning: Meet Swift object at %s",__cmd); + return nil; + } + #if 0 NSLog(@" cmdsize: %08x", _dyldInfoCommand.cmdsize); NSLog(@" rebase_off: %08x", _dyldInfoCommand.rebase_off); diff --git a/Source/CDMachOFile.h b/Source/CDMachOFile.h index b64aa0ab046..239829abe20 100644 --- a/Source/CDMachOFile.h +++ b/Source/CDMachOFile.h @@ -88,6 +88,10 @@ typedef enum : NSUInteger { - (id) initWithMachOData:(const struct mach_header *)data size:(size_t)length; +- (BOOL) _loadCacheInfo; +- (NSUInteger) _cacheAddressForImage:(NSString *)fileName; +- (NSUInteger) _cacheOffsetForAddress:(NSUInteger)address; + @property (nonatomic, readonly) BOOL hasObjectiveC1Data; @property (nonatomic, readonly) BOOL hasObjectiveC2Data; @property (nonatomic, readonly) Class processorClass; diff --git a/Source/CDMachOFile.m b/Source/CDMachOFile.m index 9cd169e590a..d19f7b7c031 100644 --- a/Source/CDMachOFile.m +++ b/Source/CDMachOFile.m @@ -30,6 +30,35 @@ #import "CDLCSourceVersion.h" #import "CDLCBuildVersion.h" +struct dyld_cache_header +{ + char magic[16]; // e.g. "dyld_v0 ppc" + uint32_t mappingOffset; // file offset to first dyld_cache_mapping_info + uint32_t mappingCount; // number of dyld_cache_mapping_info entries + uint32_t imagesOffset; // file offset to first dyld_cache_image_info + uint32_t imagesCount; // number of dyld_cache_image_info entries + uint64_t dyldBaseAddress; // base address of dyld when cache was built + uint64_t codeSignatureOffset; // file offset in of code signature blob + uint64_t codeSignatureSize; // size of code signature blob (zero means to end of file) +}; + +struct dyld_cache_mapping_info { + uint64_t address; + uint64_t size; + uint64_t fileOffset; + uint32_t maxProt; + uint32_t initProt; +}; + +struct dyld_cache_image_info +{ + uint64_t address; + uint64_t modTime; + uint64_t inode; + uint32_t pathFileOffset; + uint32_t pad; +}; + static NSString *CDMachOFileMagicNumberDescription(uint32_t magic) { switch (magic) { @@ -71,8 +100,13 @@ @implementation CDMachOFile uint32_t _sizeofcmds; uint32_t _flags; uint32_t _reserved; - + + struct dyld_cache_header cacheHeader; + struct dyld_cache_mapping_info *cacheMappingInfo; + struct dyld_cache_image_info *cacheImageInfo; + BOOL _uses64BitABI; + BOOL isCache; } - (id)init; @@ -92,6 +126,7 @@ - (id) initWithMachOData:(const struct mach_header *)data size:(size_t)length _byteOrder = CDByteOrder_LittleEndian; + isCache = NO; CDDataCursor *cursor = [[CDDataCursor alloc] initWithData:[NSData dataWithBytes:data length:length]]; _magic = [cursor readBigInt32]; if (_magic == MH_MAGIC || _magic == MH_MAGIC_64) { @@ -135,12 +170,35 @@ - (id) initWithMachOData:(const struct mach_header *)data size:(size_t)length return self; } -- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState; +- (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState:(CDSearchPathState *)searchPathState isCache:(BOOL)aIsCache; { - if ((self = [super initWithData:data filename:filename searchPathState:searchPathState])) { + NSUInteger magicOffset = 0; + + isCache = aIsCache; + if ((self = [super initWithData:data filename:filename searchPathState:searchPathState isCache:aIsCache])) { _byteOrder = CDByteOrder_LittleEndian; + if(aIsCache) { + if(![self _loadCacheInfo]) + return nil; + } + + if(aIsCache) { + NSUInteger address = [self _cacheAddressForImage:filename]; + if(address == 0) + { + NSLog(@"Could not find %@ in cache!", filename); + return nil; + } + + magicOffset = [self _cacheOffsetForAddress:address]; + } else { + magicOffset = magicOffset; + } + CDDataCursor *cursor = [[CDDataCursor alloc] initWithData:data]; + [cursor setOffset:magicOffset]; + _magic = [cursor readBigInt32]; if (_magic == MH_MAGIC || _magic == MH_MAGIC_64) { _byteOrder = CDByteOrder_BigEndian; @@ -177,6 +235,8 @@ - (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState: NSAssert(_uses64BitABI == CDArchUses64BitABI((CDArch){ .cputype = _cputype, .cpusubtype = _cpusubtype }), @"Header magic should match cpu arch", nil); NSUInteger headerOffset = _uses64BitABI ? sizeof(struct mach_header_64) : sizeof(struct mach_header); + if(aIsCache) + headerOffset += magicOffset; CDMachOFileDataCursor *fileCursor = [[CDMachOFileDataCursor alloc] initWithFile:self offset:headerOffset]; [self _readLoadCommands:fileCursor count:_ncmds]; } @@ -184,6 +244,69 @@ - (id)initWithData:(NSData *)data filename:(NSString *)filename searchPathState: return self; } +- (BOOL) _loadCacheInfo +{ + CDDataCursor *cursor = [[CDDataCursor alloc] initWithData:[self data]]; + [cursor readBytesOfLength:sizeof(cacheHeader.magic) intoBuffer:cacheHeader.magic]; + if(memcmp(cacheHeader.magic, "dyld_v1 armv7", sizeof("dyld_v1 armv7")) != 0) + return NO; + + cacheHeader.mappingOffset = [cursor readLittleInt32]; + cacheHeader.mappingCount = [cursor readLittleInt32]; + cacheHeader.imagesOffset = [cursor readLittleInt32]; + cacheHeader.imagesCount = [cursor readLittleInt32]; + cacheHeader.dyldBaseAddress = [cursor readLittleInt64]; + cacheHeader.codeSignatureOffset = [cursor readLittleInt64]; + cacheHeader.codeSignatureSize = [cursor readLittleInt64]; + + CDDataCursor *mappingCursor = [[CDDataCursor alloc] initWithData:[self data]]; + [mappingCursor setOffset:cacheHeader.mappingOffset]; + cacheMappingInfo = (struct dyld_cache_mapping_info*) malloc(sizeof(struct dyld_cache_mapping_info) * cacheHeader.mappingCount); + + for(int i = 0; i < cacheHeader.mappingCount; ++i) { + cacheMappingInfo[i].address = [mappingCursor readLittleInt64]; + cacheMappingInfo[i].size = [mappingCursor readLittleInt64]; + cacheMappingInfo[i].fileOffset = [mappingCursor readLittleInt64]; + cacheMappingInfo[i].maxProt = [mappingCursor readLittleInt32]; + cacheMappingInfo[i].initProt = [mappingCursor readLittleInt32]; + } + + CDDataCursor *imageCursor = [[CDDataCursor alloc] initWithData:[self data]]; + [imageCursor setOffset:cacheHeader.imagesOffset]; + cacheImageInfo = (struct dyld_cache_image_info*) malloc(sizeof(struct dyld_cache_image_info) * cacheHeader.imagesCount); + + for(int i = 0; i < cacheHeader.imagesCount; ++i) { + cacheImageInfo[i].address = [imageCursor readLittleInt64]; + cacheImageInfo[i].modTime = [imageCursor readLittleInt64]; + cacheImageInfo[i].inode = [imageCursor readLittleInt64]; + cacheImageInfo[i].pathFileOffset = [imageCursor readLittleInt32]; + cacheImageInfo[i].pad = [imageCursor readLittleInt32]; + } + + return YES; +} + +- (NSUInteger) _cacheAddressForImage:(NSString *)fileName +{ + for(int i = 0; i < cacheHeader.imagesCount; ++i) { + if(strcmp(((char*)[[self data] bytes]) + cacheImageInfo[i].pathFileOffset, [fileName UTF8String]) == 0) { + return cacheImageInfo[i].address; + } + } + + return 0; +} + +- (NSUInteger) _cacheOffsetForAddress:(NSUInteger)address +{ + for(int i = 0; i < cacheHeader.mappingCount; ++i) { + if(cacheMappingInfo[i].address <= address && address < (cacheMappingInfo[i].address + cacheMappingInfo[i].size)) + return cacheMappingInfo[i].fileOffset + (address - cacheMappingInfo[i].address); + } + + return 0; +} + - (void)_readLoadCommands:(CDMachOFileDataCursor *)cursor count:(uint32_t)count; { NSMutableArray *loadCommands = [[NSMutableArray alloc] init]; @@ -392,27 +515,38 @@ - (NSString *)stringAtAddress:(NSUInteger)address; if (address == 0) return nil; - CDLCSegment *segment = [self segmentContainingAddress:address]; - if (segment == nil) { - /*NSLog(@"Error: Cannot find offset for address 0x%08lx in stringAtAddress:", address); - exit(5);*/ - return nil; - } + NSUInteger offset; - if ([segment isProtected]) { - NSData *d2 = [segment decryptedData]; - NSUInteger d2Offset = [segment segmentOffsetForAddress:address]; - if (d2Offset == 0) - return nil; + if(isCache) { + // dylibs in the dyld shared cache sometimes reference things not technically "mapped in" by the mach-o, so it's counterproductive to try to map an address to a specific segment/section. + offset = [self _cacheOffsetForAddress:address]; + } else { + CDLCSegment *segment = [self segmentContainingAddress:address]; + if (segment == nil) { + return @"Swift"; + } + + if ([segment isProtected]) { + NSData *d2 = [segment decryptedData]; + NSUInteger d2Offset = [segment segmentOffsetForAddress:address]; + if (d2Offset == 0) + return nil; - ptr = (uint8_t *)[d2 bytes] + d2Offset; - return [[NSString alloc] initWithBytes:ptr length:strlen(ptr) encoding:NSASCIIStringEncoding]; + ptr = [d2 bytes] + d2Offset; + return [[NSString alloc] initWithBytes:ptr length:strlen(ptr) encoding:NSASCIIStringEncoding]; + } + + offset = [self dataOffsetForAddress:address]; } - NSUInteger offset = [self dataOffsetForAddress:address]; if (offset == 0) return nil; + if (offset == -'S') { + NSLog(@"Warning: Meet Swift object at %s",__cmd); + return @"Swift"; + } + ptr = (uint8_t *)[self.data bytes] + offset; return [[NSString alloc] initWithBytes:ptr length:strlen(ptr) encoding:NSASCIIStringEncoding]; @@ -423,11 +557,15 @@ - (NSUInteger)dataOffsetForAddress:(NSUInteger)address; if (address == 0) return 0; + // dylibs in the dyld shared cache sometimes reference things not technically "mapped in" by the mach-o, so it's counterproductive to try to map an address to a specific segment/section. + if (isCache) + return [self _cacheOffsetForAddress:address]; + CDLCSegment *segment = [self segmentContainingAddress:address]; if (segment == nil) { - /*NSLog(@"Error: Cannot find offset for address 0x%08lx in dataOffsetForAddress:", address); - exit(5);*/ - return 0; + NSLog(@"Error: Cannot find offset for address 0x%08lx in dataOffsetForAddress: %@", address, [NSThread callStackSymbols]); + NSLog(@"Warning: Maybe meet a Swift object at %s",__cmd); + // exit(5); } // if ([segment isProtected]) { @@ -673,4 +811,13 @@ - (NSString *)architectureNameDescription; return self.archName; } +- (void) dealloc +{ + if(cacheImageInfo) + free(cacheImageInfo); + + if(cacheMappingInfo) + free(cacheMappingInfo); +} + @end diff --git a/Source/CDObjectiveC2Processor.m b/Source/CDObjectiveC2Processor.m index 80ef2bd4a80..3c01da44a04 100644 --- a/Source/CDObjectiveC2Processor.m +++ b/Source/CDObjectiveC2Processor.m @@ -74,6 +74,12 @@ - (CDOCProtocol *)protocolAtAddress:(uint64_t)address; [self.protocolUniquer setProtocol:protocol withAddress:address]; CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; + + if ([cursor offset] == -'S') { + NSLog(@"Warning: Meet Swift object at %s",__cmd); + return nil; + } + if ([cursor offset] == 0) return nil; @@ -327,26 +333,30 @@ - (NSArray *)loadPropertiesAtAddress:(uint64_t)address; CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:address]; if ([cursor offset] == 0) return nil; - + //NSLog(@"property list data offset: %lu", [cursor offset]); listHeader.entsize = [cursor readInt32]; listHeader.count = [cursor readInt32]; //NSParameterAssert(listHeader.entsize == 2 * [self.machOFile ptrSize]); - for (uint32_t index = 0; index < listHeader.count; index++) { - struct cd_objc2_property objc2Property; - - objc2Property.name = [cursor readPtr]; - objc2Property.attributes = [cursor readPtr]; - NSString *name = [self.machOFile stringAtAddress:objc2Property.name]; - NSString *attributes = [self.machOFile stringAtAddress:objc2Property.attributes]; - - CDOCProperty *property = [[CDOCProperty alloc] initWithName:name attributes:attributes]; - [properties addObject:property]; + if (listHeader.entsize == 2 * [self.machOFile ptrSize]) { + for (uint32_t index = 0; index < listHeader.count; index++) { + struct cd_objc2_property objc2Property; + + objc2Property.name = [cursor readPtr]; + objc2Property.attributes = [cursor readPtr]; + NSString *name = [self.machOFile stringAtAddress:objc2Property.name]; + NSString *attributes = [self.machOFile stringAtAddress:objc2Property.attributes]; + + CDOCProperty *property = [[CDOCProperty alloc] initWithName:name attributes:attributes]; + [properties addObject:property]; + } + } else { + return nil; } } - + return properties; } diff --git a/class-dump.m b/class-dump.m index 9e46b80f12b..06273bd9b09 100644 --- a/class-dump.m +++ b/class-dump.m @@ -39,6 +39,7 @@ void print_usage(void) " -s sort classes and categories by name\n" " -S sort methods by name\n" " -t suppress header in output, for testing\n" + " --cache use dyld shared cache\n" " --list-arches list the arches in the file, then exit\n" " --sdk-ios specify iOS SDK version (will look for /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk\n" " or /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk)\n" @@ -58,6 +59,8 @@ void print_usage(void) #define CD_OPT_SDK_ROOT 6 #define CD_OPT_HIDE 7 +NSString *cacheName = nil; + int main(int argc, char *argv[]) { @autoreleasepool { @@ -91,6 +94,7 @@ int main(int argc, char *argv[]) { "sdk-ios", required_argument, NULL, CD_OPT_SDK_IOS }, { "sdk-mac", required_argument, NULL, CD_OPT_SDK_MAC }, { "sdk-root", required_argument, NULL, CD_OPT_SDK_ROOT }, + { "cache", required_argument, NULL, 'c' }, { "hide", required_argument, NULL, CD_OPT_HIDE }, { NULL, 0, NULL, 0 }, }; @@ -102,7 +106,7 @@ int main(int argc, char *argv[]) CDClassDump *classDump = [[CDClassDump alloc] init]; - while ( (ch = getopt_long(argc, argv, "aAC:f:HIo:rRsSt", longopts, NULL)) != -1) { + while ( (ch = getopt_long(argc, argv, "aAC:f:HIo:rRsStc:", longopts, NULL)) != -1) { switch (ch) { case CD_OPT_ARCH: { NSString *name = [NSString stringWithUTF8String:optarg]; @@ -194,7 +198,12 @@ int main(int argc, char *argv[]) // Last one wins now. break; } - + + case 'c': { + cacheName = [NSString stringWithUTF8String:optarg]; + break; + } + case 'f': { searchString = [NSString stringWithUTF8String:optarg]; break; @@ -254,7 +263,8 @@ int main(int argc, char *argv[]) } else { CDSearchPathState *searchPathState = [[CDSearchPathState alloc] init]; searchPathState.executablePath = executablePath; - id macho = [CDFile fileWithContentsOfFile:executablePath searchPathState:searchPathState]; + id macho = [CDFile fileWithContentsOfFile:executablePath cache:nil searchPathState:searchPathState isCache:NO]; + if (macho == nil) { printf("none\n"); } else { @@ -272,10 +282,11 @@ int main(int argc, char *argv[]) } classDump.searchPathState.executablePath = [executablePath stringByDeletingLastPathComponent]; - CDFile *file = [CDFile fileWithContentsOfFile:executablePath searchPathState:classDump.searchPathState]; + CDFile *file = [CDFile fileWithContentsOfFile:executablePath cache:nil searchPathState:classDump.searchPathState isCache:NO]; + if (file == nil) { NSFileManager *defaultManager = [NSFileManager defaultManager]; - + if ([defaultManager fileExistsAtPath:executablePath]) { if ([defaultManager isReadableFileAtPath:executablePath]) { fprintf(stderr, "class-dump: Input file (%s) is neither a Mach-O file nor a fat archive.\n", [executablePath UTF8String]); @@ -333,4 +344,6 @@ int main(int argc, char *argv[]) } exit(0); // avoid costly autorelease pool drain, we’re exiting anyway } + + return 0; } diff --git a/class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/UserInterfaceState.xcuserstate b/class-dump.xcodeproj/project.xcworkspace/xcuserdata/andyvand.xcuserdatad/UserInterfaceState.xcuserstate index ca534f9db1e5aa02261e86b44fd307120983b5e7..bc7cbdd8c7feba364a40af7b53f7221182b1aac1 100644 GIT binary patch literal 67404 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 diff --git a/class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist b/class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist index 4320481686d..60cec4fe88a 100644 --- a/class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/class-dump.xcodeproj/xcuserdata/andyvand.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ MachObjC.xcscheme_^#shared#^_ orderHint - 2 + 3 all.xcscheme_^#shared#^_ @@ -17,17 +17,17 @@ class-dump.xcscheme_^#shared#^_ orderHint - 3 + 4 deprotect.xcscheme_^#shared#^_ orderHint - 4 + 1 formatType.xcscheme_^#shared#^_ orderHint - 1 + 2 SuppressBuildableAutocreation diff --git a/default.profraw b/default.profraw index f66b003b6a489f65d37ce0499c139b7d419d31ca..55b6a8152b0022b05e8e76f61719854b3f9326c9 100644 GIT binary patch delta 18631 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 delta 14505 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