[clang] [llvm] [InstallAPI] Add --extra* and --exclude* cli options for header input (PR #86522)

Cyndy Ishida via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 25 08:56:43 PDT 2024


https://github.com/cyndyishida created https://github.com/llvm/llvm-project/pull/86522

InstallAPI takes a json list of headers that is typically generated from a build system like Xcode based on a project's attributes. Sometimes, maintainers may want to alter this for tapi input. Using e.g. `--extra-public-headers`, users can manipulate what headers will be used for TBD file generation.

>From a2c27fc38b2aa41d5d3874ede654d9faa30298b6 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Mon, 25 Mar 2024 11:48:27 -0400
Subject: [PATCH] [InstallAPI] Add --extra* and --exclude* cli options for
 header input

InstallAPI takes a json list of headers that is typically generated from a build system like Xcode based on a project's attributes. Sometimes, maintainers may want to alter this for tapi input. Using e.g. `--extra-public-headers`, users can manipulate what headers will be used for TBD file generation.
---
 .../clang/Basic/DiagnosticInstallAPIKinds.td  |    3 +
 clang/include/clang/InstallAPI/HeaderFile.h   |   54 +-
 clang/include/clang/InstallAPI/MachO.h        |    1 +
 clang/lib/InstallAPI/Frontend.cpp             |    2 +
 clang/lib/InstallAPI/HeaderFile.cpp           |   51 +
 .../Inputs/Simple/Extra/SimpleExtraAPI1.h     |    1 +
 .../Inputs/Simple/Extra/SimpleExtraAPI2.h     |    1 +
 .../Simple/Simple.framework/Headers/Basic.h   |  103 +
 .../Simple.framework/Headers/External.h       |   19 +
 .../Simple/Simple.framework/Headers/Simple.h  |   45 +
 .../Simple.framework/Headers/SimpleAPI.h      |    1 +
 .../PrivateHeaders/SimplePrivate.h            |    5 +
 .../PrivateHeaders/SimplePrivateSPI.h         |    2 +
 .../test/InstallAPI/Inputs/Simple/Simple.yaml | 3196 +++++++++++++++++
 .../Inputs/Simple/SimpleInternalAPI.h         |    3 +
 .../Inputs/Simple/SimpleInternalAPI2.h        |    7 +
 .../Inputs/Simple/SimpleInternalSPI.h         |    5 +
 .../InstallAPI/extra-exclude-headers.test     |  207 ++
 .../tools/clang-installapi/InstallAPIOpts.td  |   32 +
 clang/tools/clang-installapi/Options.cpp      |  121 +
 clang/tools/clang-installapi/Options.h        |   21 +
 llvm/include/llvm/TextAPI/Utils.h             |    6 +
 llvm/lib/TextAPI/Utils.cpp                    |   46 +
 23 files changed, 3930 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.yaml
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h
 create mode 100644 clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h
 create mode 100644 clang/test/InstallAPI/extra-exclude-headers.test

diff --git a/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td b/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td
index a4c6e630ac5fd8..27df731fa28627 100644
--- a/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td
+++ b/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td
@@ -15,6 +15,9 @@ let CategoryName = "Command line" in {
 def err_cannot_write_file : Error<"cannot write file '%0': %1">;
 def err_no_install_name : Error<"no install name specified: add -install_name <path>">;
 def err_no_output_file: Error<"no output file specified">;
+def err_no_such_header_file : Error<"no such %select{public|private|project}1 header file: '%0'">;
+def warn_no_such_excluded_header_file : Warning<"no such excluded %select{public|private}0 header file: '%1'">, InGroup<InstallAPIViolation>;
+def warn_glob_did_not_match: Warning<"glob '%0' did not match any header file">, InGroup<InstallAPIViolation>;
 } // end of command line category.
 
 let CategoryName = "Verification" in {
diff --git a/clang/include/clang/InstallAPI/HeaderFile.h b/clang/include/clang/InstallAPI/HeaderFile.h
index 70e83bbb3e76f6..235b4da3add840 100644
--- a/clang/include/clang/InstallAPI/HeaderFile.h
+++ b/clang/include/clang/InstallAPI/HeaderFile.h
@@ -13,7 +13,9 @@
 #ifndef LLVM_CLANG_INSTALLAPI_HEADERFILE_H
 #define LLVM_CLANG_INSTALLAPI_HEADERFILE_H
 
+#include "clang/Basic/FileManager.h"
 #include "clang/Basic/LangStandard.h"
+#include "clang/InstallAPI/MachO.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/Regex.h"
@@ -56,6 +58,10 @@ class HeaderFile {
   std::string IncludeName;
   /// Supported language mode for header.
   std::optional<clang::Language> Language;
+  /// Exclude header file from processing.
+  bool Excluded{false};
+  /// Add header file to processing.
+  bool Extra{false};
 
 public:
   HeaderFile() = delete;
@@ -71,17 +77,48 @@ class HeaderFile {
   StringRef getIncludeName() const { return IncludeName; }
   StringRef getPath() const { return FullPath; }
 
+  void setExtra(bool V = true) { Extra = V; }
+  void setExcluded(bool V = true) { Excluded = V; }
+  bool isExtra() const { return Extra; }
+  bool isExcluded() const { return Excluded; }
+
   bool useIncludeName() const {
     return Type != HeaderType::Project && !IncludeName.empty();
   }
 
   bool operator==(const HeaderFile &Other) const {
-    return std::tie(Type, FullPath, IncludeName, Language) ==
+    return std::tie(Type, FullPath, IncludeName, Language, Excluded, Extra) ==
            std::tie(Other.Type, Other.FullPath, Other.IncludeName,
-                    Other.Language);
+                    Other.Language, Other.Excluded, Other.Extra);
   }
 };
 
+/// Glob that represents a pattern of header files to retreive.
+class HeaderGlob {
+private:
+  std::string GlobString;
+  llvm::Regex Rule;
+  HeaderType Type;
+  bool FoundMatch{false};
+
+public:
+  HeaderGlob(StringRef GlobString, llvm::Regex &&, HeaderType Type);
+
+  /// Create a header glob from string for the header access level.
+  static llvm::Expected<std::unique_ptr<HeaderGlob>>
+  create(StringRef GlobString, HeaderType Type);
+
+  /// Query if provided header matches glob.
+  bool match(const HeaderFile &Header);
+
+  /// Query if a header was matched in the glob, used primarily for error
+  /// reporting.
+  bool didMatch() { return FoundMatch; }
+
+  /// Provide back input glob string.
+  StringRef str() { return GlobString; }
+};
+
 /// Assemble expected way header will be included by clients.
 /// As in what maps inside the brackets of `#include <IncludeName.h>`
 /// For example,
@@ -93,6 +130,19 @@ class HeaderFile {
 std::optional<std::string> createIncludeHeaderName(const StringRef FullPath);
 using HeaderSeq = std::vector<HeaderFile>;
 
+/// Determine if Path is a header file.
+/// It does not touch the file system.
+///
+/// \param  Path File path to file.
+bool isHeaderFile(StringRef Path);
+
+/// Given input directory, collect all header files.
+///
+/// \param FM FileManager for finding input files.
+/// \param Directory Path to directory file.
+llvm::Expected<PathSeq> enumerateFiles(clang::FileManager &FM,
+                                       StringRef Directory);
+
 } // namespace clang::installapi
 
 #endif // LLVM_CLANG_INSTALLAPI_HEADERFILE_H
diff --git a/clang/include/clang/InstallAPI/MachO.h b/clang/include/clang/InstallAPI/MachO.h
index f0dea8bbd24ccd..4961c596fd68ae 100644
--- a/clang/include/clang/InstallAPI/MachO.h
+++ b/clang/include/clang/InstallAPI/MachO.h
@@ -40,6 +40,7 @@ using SymbolSet = llvm::MachO::SymbolSet;
 using SimpleSymbol = llvm::MachO::SimpleSymbol;
 using FileType = llvm::MachO::FileType;
 using PackedVersion = llvm::MachO::PackedVersion;
+using PathSeq = llvm::MachO::PathSeq;
 using Target = llvm::MachO::Target;
 using TargetList = llvm::MachO::TargetList;
 
diff --git a/clang/lib/InstallAPI/Frontend.cpp b/clang/lib/InstallAPI/Frontend.cpp
index 12cd5fcbc22bf7..e07ccb14e0b80a 100644
--- a/clang/lib/InstallAPI/Frontend.cpp
+++ b/clang/lib/InstallAPI/Frontend.cpp
@@ -138,6 +138,8 @@ std::unique_ptr<MemoryBuffer> createInputBuffer(InstallAPIContext &Ctx) {
   SmallString<4096> Contents;
   raw_svector_ostream OS(Contents);
   for (const HeaderFile &H : Ctx.InputHeaders) {
+    if (H.isExcluded())
+      continue;
     if (H.getType() != Ctx.Type)
       continue;
     if (Ctx.LangMode == Language::C || Ctx.LangMode == Language::CXX)
diff --git a/clang/lib/InstallAPI/HeaderFile.cpp b/clang/lib/InstallAPI/HeaderFile.cpp
index c2d8372741ee07..0b7041ec8147eb 100644
--- a/clang/lib/InstallAPI/HeaderFile.cpp
+++ b/clang/lib/InstallAPI/HeaderFile.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/InstallAPI/HeaderFile.h"
+#include "llvm/TextAPI/Utils.h"
 
 using namespace llvm;
 namespace clang::installapi {
@@ -34,4 +35,54 @@ std::optional<std::string> createIncludeHeaderName(const StringRef FullPath) {
   return Matches[1].drop_front(Matches[1].rfind('/') + 1).str() + "/" +
          Matches[3].str();
 }
+
+bool isHeaderFile(StringRef Path) {
+  return StringSwitch<bool>(sys::path::extension(Path))
+      .Cases(".h", ".H", ".hh", ".hpp", ".hxx", true)
+      .Default(false);
+}
+
+llvm::Expected<PathSeq> enumerateFiles(FileManager &FM, StringRef Directory) {
+  PathSeq Files;
+  std::error_code EC;
+  auto &FS = FM.getVirtualFileSystem();
+  for (llvm::vfs::recursive_directory_iterator i(FS, Directory, EC), ie;
+       i != ie; i.increment(EC)) {
+    if (EC)
+      return errorCodeToError(EC);
+
+    // Skip files that do not exist. This usually happens for broken symlinks.
+    if (FS.status(i->path()) == std::errc::no_such_file_or_directory)
+      continue;
+
+    StringRef Path = i->path();
+    if (isHeaderFile(Path))
+      Files.emplace_back(Path);
+  }
+
+  return Files;
+}
+
+HeaderGlob::HeaderGlob(StringRef GlobString, Regex &&Rule, HeaderType Type)
+    : GlobString(GlobString), Rule(std::move(Rule)), Type(Type) {}
+
+bool HeaderGlob::match(const HeaderFile &Header) {
+  if (Header.getType() != Type)
+    return false;
+
+  bool Match = Rule.match(Header.getPath());
+  if (Match)
+    FoundMatch = true;
+  return Match;
+}
+
+Expected<std::unique_ptr<HeaderGlob>> HeaderGlob::create(StringRef GlobString,
+                                                         HeaderType Type) {
+  auto Rule = MachO::createRegexFromGlob(GlobString);
+  if (!Rule)
+    return Rule.takeError();
+
+  return std::make_unique<HeaderGlob>(GlobString, std::move(*Rule), Type);
+}
+
 } // namespace clang::installapi
diff --git a/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h
new file mode 100644
index 00000000000000..83a5b9507de307
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h
@@ -0,0 +1 @@
+extern int extraGlobalAPI1;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h
new file mode 100644
index 00000000000000..34fe3364bba84e
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h
@@ -0,0 +1 @@
+extern int extraGlobalAPI2;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h
new file mode 100644
index 00000000000000..08412bb2de2838
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h
@@ -0,0 +1,103 @@
+#import <Foundation/Foundation.h>
+
+// Basic class with no super class
+ at interface Basic1
+ at end
+
+ at interface Basic2 : NSObject
+ at end
+
+ at interface Basic3 : NSObject
+ at property BOOL property1;
+ at property(readonly) BOOL property2;
+ at property(getter=isProperty3) BOOL property3;
+ at property BOOL dynamicProp;
+ at end
+
+ at interface Basic4 : NSObject {
+ at public
+  BOOL ivar1;
+ at protected
+  BOOL ivar2;
+ at package
+  BOOL ivar3;
+ at private
+  BOOL ivar4;
+}
+ at end
+
+__attribute__((visibility("hidden"))) @interface Basic4_1 : NSObject {
+ at public
+  BOOL ivar1;
+ at protected
+  BOOL ivar2;
+ at package
+  BOOL ivar3;
+ at private
+  BOOL ivar4;
+}
+ at end
+
+ at interface Basic4_2 : NSObject {
+ at private
+  BOOL ivar4;
+ at package
+  BOOL ivar3;
+ at protected
+  BOOL ivar2;
+ at public
+  BOOL ivar1;
+}
+ at end
+
+ at interface Basic5 : NSObject
++ (void)aClassMethod;
+- (void)anInstanceMethod;
+ at end
+
+ at interface Basic6 : NSObject
+ at end
+
+ at interface Basic6 () {
+ at public
+  BOOL ivar1;
+}
+ at property BOOL property1;
+- (void)anInstanceMethodFromAnExtension;
+ at end
+
+ at interface Basic6 (Foo)
+ at property BOOL property2;
+- (void)anInstanceMethodFromACategory;
+ at end
+
+__attribute__((visibility("hidden")))
+ at interface Basic7 : NSObject
+ at end
+
+ at interface Basic7 ()
+- (void) anInstanceMethodFromAnHiddenExtension;
+ at end
+
+ at interface Basic8 : NSObject
++ (void)useSameName;
+ at end
+
+// Classes and protocols can have the same name. For now they would only clash
+// in the selector map if the protocl starts with '_'.
+ at protocol _A
+- (void)aMethod;
+ at end
+
+ at interface A : NSObject
+- (void)aMethod NS_AVAILABLE(10_11, 9_0);
+- (void)bMethod NS_UNAVAILABLE;
+ at end
+
+ at interface Basic9 : NSObject
+ at property(readonly) BOOL aProperty NS_AVAILABLE(10_10, 8_0);
+ at end
+
+ at interface Basic9 (deprecated)
+ at property(readwrite) BOOL aProperty NS_DEPRECATED_MAC(10_8, 10_10);
+ at end
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h
new file mode 100644
index 00000000000000..5dc3c92f34c24d
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h
@@ -0,0 +1,19 @@
+#import <Foundation/Foundation.h>
+
+// Sub-class an external defined ObjC Class.
+ at interface ExternalManagedObject : NSManagedObject
+- (void)foo;
+ at end
+
+// Add category to external defined ObjC Class.
+ at interface NSManagedObject (Simple)
+- (int)supportsSimple;
+ at end
+
+// CoreData Accessors are dynamically generated and have no implementation.
+ at interface ExternalManagedObject (CoreDataGeneratedAccessors)
+- (void)addChildObject:(ExternalManagedObject *)value;
+- (void)removeChildObject:(ExternalManagedObject *)value;
+- (void)addChild:(NSSet *)values;
+- (void)removeChild:(NSSet *)values;
+ at end
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h
new file mode 100644
index 00000000000000..12c77098a8d9a7
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h
@@ -0,0 +1,45 @@
+#import <Foundation/Foundation.h>
+
+// Useless forward declaration. This is used for testing.
+ at class FooBar;
+ at protocol FooProtocol;
+
+ at protocol ForwardProcotol;
+
+// Test public global.
+extern int publicGlobalVariable;
+
+// Test weak public global.
+extern int weakPublicGlobalVariable __attribute__((weak));
+
+// Test public ObjC class
+ at interface Simple : NSObject
+ at end
+
+__attribute__((objc_exception))
+ at interface Base : NSObject
+ at end
+
+ at interface SubClass : Base
+ at end
+
+ at protocol BaseProtocol
+- (void) baseMethod;
+ at end
+
+NS_AVAILABLE(10_11, 9_0)
+ at protocol FooProtocol <BaseProtocol>
+- (void) protocolMethod;
+ at end
+
+ at protocol BarProtocol
+- (void) barMethod;
+ at end
+
+ at interface FooClass <FooProtocol, BarProtocol>
+ at end
+
+// Create an empty category conforms to a forward declared protocol.
+// <rdar://problem/35605892>
+ at interface FooClass (Test) <ForwardProcotol>
+ at end
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h
new file mode 100644
index 00000000000000..d953fac966daf3
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h
@@ -0,0 +1 @@
+extern int otherFrameworkAPI;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h
new file mode 100644
index 00000000000000..5a28cda3928e3d
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h
@@ -0,0 +1,5 @@
+// Test private global variable.
+extern int privateGlobalVariable;
+
+// Test weak private global.
+extern int weakPrivateGlobalVariable __attribute__((weak));
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h
new file mode 100644
index 00000000000000..c9aca30fa82fa8
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h
@@ -0,0 +1,2 @@
+// Test private global variable.
+extern int otherFrameworkSPI;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.yaml b/clang/test/InstallAPI/Inputs/Simple/Simple.yaml
new file mode 100644
index 00000000000000..998e51f1a67dcc
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.yaml
@@ -0,0 +1,3196 @@
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACF
+  cputype:         0x1000007
+  cpusubtype:      0x3
+  filetype:        0x6
+  ncmds:           15
+  sizeofcmds:      1952
+  flags:           0x118085
+  reserved:        0x0
+LoadCommands:
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         472
+    segname:         __TEXT
+    vmaddr:          0
+    vmsize:          12288
+    fileoff:         0
+    filesize:        12288
+    maxprot:         5
+    initprot:        5
+    nsects:          5
+    flags:           0
+    Sections:
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x1BC0
+        size:            180
+        offset:          0x1BC0
+        align:           0
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x80000400
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         554889E50FBE47085DC3554889E58857085DC3554889E50FBE47095DC3554889E50FBE470A5DC3554889E588570A5DC3554889E55DC3554889E55DC3554889E55DC3554889E50FBE47095DC3554889E58857095DC3554889E5B8010000005DC3554889E55DC3554889E55DC3554889E55DC3554889E55DC3554889E5B0015DC3554889E55DC3554889E55DC3554889E55DC3554889E50FBE47085DC3554889E55DC3554889E55DC3554889E55DC3554889E55DC3
+      - sectname:        __cstring
+        segname:         __TEXT
+        addr:            0x1C74
+        size:            296
+        offset:          0x1C74
+        align:           0
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x2
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         53696D706C65004261736500537562436C6173730053696D706C65496E7465726E616C4150490053696D706C65496E7465726E616C53504900426173696331004261736963320042617369633300426173696334004261736963345F31004261736963345F32004261736963350042617369633600466F6F004261736963370045787465726E616C4D616E616765644F626A6563740048696464656E436C61737300426173696338004100426173696339006465707265636174656400466F6F436C61737300466F6F50726F746F636F6C004261736550726F746F636F6C0042617250726F746F636F6C0050726976617465005072697661746550726F746F636F6C0063313640303A380076323040303A3863313600630076313640303A380042313640303A3800
+      - sectname:        __objc_methname
+        segname:         __TEXT
+        addr:            0x1D9C
+        size:            450
+        offset:          0x1D9C
+        align:           0
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x2
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         70726F7065727479310073657450726F7065727479313A0070726F70657274793200697350726F7065727479330073657450726F7065727479333A0070726F7065727479330054632C5670726F7065727479310054632C522C5670726F7065727479320054632C47697350726F7065727479332C5670726F7065727479330064796E616D696350726F700054632C440069766172310069766172320069766172330069766172340061436C6173734D6574686F6400616E496E7374616E63654D6574686F6400616E496E7374616E63654D6574686F6446726F6D416E457874656E73696F6E0073657450726F7065727479323A00616E496E7374616E63654D6574686F6446726F6D4143617465676F727900546300616E496E7374616E63654D6574686F6446726F6D416E48696464656E457874656E73696F6E00666F6F00737570706F72747353696D706C650075736553616D654E616D6500614D6574686F64006150726F7065727479005F6150726F70657274790054632C522C565F6150726F706572747900626173654D6574686F640070726F746F636F6C4D6574686F64006261724D6574686F64007072697661746550726F636F746F6C4D6574686F6400
+      - sectname:        __unwind_info
+        segname:         __TEXT
+        addr:            0x1F60
+        size:            4152
+        offset:          0x1F60
+        align:           2
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x0
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         010000001C000000010000002000000000000000200000000200000000000001C01B00003800000038000000741C00000000000038000000030000000C0001001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+      - sectname:        __eh_frame
+        segname:         __TEXT
+        addr:            0x2F98
+        size:            24
+        offset:          0x2F98
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x6000000B
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         1400000000000000017A520001781001100C070890010000
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         792
+    segname:         __DATA
+    vmaddr:          12288
+    vmsize:          8192
+    fileoff:         12288
+    filesize:        8192
+    maxprot:         3
+    initprot:        3
+    nsects:          9
+    flags:           0
+    Sections:
+      - sectname:        __objc_const
+        segname:         __DATA
+        addr:            0x3000
+        size:            4952
+        offset:          0x3000
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x0
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         010000002800000028000000000000000000000000000000741C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000741C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000028000000280000000000000000000000000000007B1C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000008000000080000000000000000000000000000007B1C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000007B1C000000000000D043000000000000010000002800000028000000000000000000000000000000801C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000800000008000000000000000000000000000000801C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000801C0000000000002044000000000000010000002800000028000000000000000000000000000000891C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000800000008000000000000000000000000000000891C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000891C00000000000070440000000000000100000028000000280000000000000000000000000000009B1C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000008000000080000000000000000000000000000009B1C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000009B1C000000000000C044000000000000030000002800000028000000000000000000000000000000AD1C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000AD1C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000B41C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000B41C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000BB1C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000050000009C1D000000000000771D000000000000C01B000000000000A61D0000000000007F1D000000000000CA1B000000000000B41D000000000000771D000000000000D31B000000000000BE1D000000000000771D000000000000DD1B000000000000CA1D0000000000007F1D000000000000E71B000000000000200000000300000098490000000000009C1D0000000000008A1D0000000000000000000001000000A049000000000000B41D0000000000008A1D0000000000000000000001000000A849000000000000D81D0000000000008A1D000000000000000000000100000010000000040000009C1D000000000000E21D000000000000B41D000000000000F01D000000000000D81D000000000000001E0000000000001B1E000000000000271E00000000000000000000080000000B000000000000000000000000000000BB1C00000000000098340000000000000000000000000000183500000000000000000000000000008035000000000000010000002800000028000000000000000000000000000000C21C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000B0490000000000002C1E0000000000008A1D0000000000000000000001000000B849000000000000321E0000000000008A1D0000000000000000000001000000C049000000000000381E0000000000008A1D0000000000000000000001000000C8490000000000003E1E0000000000008A1D000000000000000000000100000000000000080000000C000000000000000000000000000000C21C00000000000000000000000000000000000000000000583600000000000000000000000000000000000000000000110000002800000028000000000000000000000000000000C91C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000D0490000000000002C1E0000000000008A1D0000000000000000000001000000D849000000000000321E0000000000008A1D0000000000000000000001000000E049000000000000381E0000000000008A1D0000000000000000000001000000E8490000000000003E1E0000000000008A1D000000000000000000000100000010000000080000000C000000000000000000000000000000C91C00000000000000000000000000000000000000000000703700000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000D21C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000F0490000000000003E1E0000000000008A1D0000000000000000000001000000F849000000000000381E0000000000008A1D0000000000000000000001000000004A000000000000321E0000000000008A1D0000000000000000000001000000084A0000000000002C1E0000000000008A1D000000000000000000000100000000000000080000000C000000000000000000000000000000D21C000000000000000000000000000000000000000000008838000000000000000000000000000000000000000000001800000001000000441E0000000000008C1D000000000000F01B000000000000010000002800000028000000000000000000000000000000DB1C000000000000583900000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000511E0000000000008C1D000000000000F61B000000000000000000000800000008000000000000000000000000000000DB1C000000000000C0390000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000E21C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000003000000621E0000000000008C1D000000000000FC1B0000000000009C1D000000000000771D000000000000021C000000000000A61D0000000000007F1D0000000000000C1C0000000000002000000002000000104A0000000000002C1E0000000000008A1D0000000000000000000001000000184A0000000000009C1D0000000000008A1D000000000000000000000100000010000000010000009C1D000000000000E21D00000000000000000000080000000A000000000000000000000000000000E21C000000000000703A0000000000000000000000000000C03A0000000000000000000000000000083B0000000000001800000003000000B41D000000000000771D000000000000151C000000000000821E0000000000007F1D000000000000201C000000000000901E0000000000008C1D000000000000261C0000000000001000000001000000B41D000000000000AE1E000000000000E91C0000000000004047000000000000683B00000000000000000000000000000000000000000000B83B00000000000000000000000000004000000000000000110000002800000028000000000000000000000000000000ED1C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000B11E0000000000008C1D0000000000002C1C000000000000100000000800000008000000000000000000000000000000ED1C000000000000583C0000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000F41C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000D71E0000000000008C1D000000000000321C000000000000000000000800000008000000000000000000000000000000F41C000000000000083D00000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000DB1E000000000000941D000000000000381C000000000000741C0000000000000000000000000000703D000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000028000000280000000000000000000000000000000A1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008000000080000000000000000000000000000000A1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000EA1E0000000000008C1D000000000000401C000000000000010000002800000028000000000000000000000000000000161D000000000000603E00000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000EA1E0000000000008C1D000000000000461C000000000000000000000800000008000000000000000000000000000000161D000000000000C83E00000000000000000000000000000000000000000000000000000000000000000000000000000100000028000000280000000000000000000000000000001D1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000F61E0000000000008C1D0000000000004C1C0000000000000000000008000000080000000000000000000000000000001D1D000000000000783F00000000000000000000000000000000000000000000000000000000000000000000000000000100000028000000280000000000000000000000000000001F1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000FE1E000000000000771D000000000000521C0000000000002000000001000000204A000000000000081F0000000000008A1D00000000000000000000010000001000000001000000FE1E000000000000131F0000000000000000000008000000090000000000000000000000000000001F1D000000000000284000000000000000000000000000004840000000000000000000000000000070400000000000001000000001000000FE1E000000000000AE1E000000000000261D0000000000002049000000000000000000000000000000000000000000000000000000000000D040000000000000000000000000000040000000000000001800000001000000241F0000000000008C1D00000000000000000000000000008C1D0000000000000100000000000000284A000000000000000000000000000018000000010000002F1F0000000000008C1D00000000000000000000000000008C1D00000000000018000000010000003E1F0000000000008C1D00000000000000000000000000008C1D0000000000000200000000000000884A000000000000E84A0000000000000000000000000000030000002800000028000000000000000000000000000000311D0000000000000000000000000000B8410000000000000000000000000000000000000000000000000000000000001800000003000000241F0000000000008C1D0000000000005C1C0000000000002F1F0000000000008C1D000000000000621C0000000000003E1F0000000000008C1D000000000000681C000000000000020000000000000000000000000000000000000000000000311D0000000000002042000000000000B8410000000000000000000000000000000000000000000000000000000000001800000001000000481F0000000000008C1D0000000000006E1C0000000000001800000001000000481F0000000000008C1D00000000000000000000000000008C1D0000000000000100000000000000484B00000000000000000000000000005F1D0000000000004849000000000000B84200000000000000000000000000000043000000000000000000000000000000000000000000004000000000000000
+      - sectname:        __objc_data
+        segname:         __DATA
+        addr:            0x4358
+        size:            1600
+        offset:          0x4358
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x0
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         000000000000000000000000000000000000000000000000000000000000000000300000000000005843000000000000000000000000000000000000000000000000000000000000483000000000000000000000000000000000000000000000000000000000000000000000000000009030000000000000A843000000000000000000000000000000000000000000000000000000000000D8300000000000000000000000000000A843000000000000000000000000000000000000000000003831000000000000F843000000000000D0430000000000000000000000000000000000000000000080310000000000000000000000000000000000000000000000000000000000000000000000000000E03100000000000048440000000000000000000000000000000000000000000000000000000000002832000000000000000000000000000000000000000000000000000000000000000000000000000088320000000000009844000000000000000000000000000000000000000000000000000000000000D032000000000000104500000000000000000000000000000000000000000000000000000000000078330000000000001045000000000000E8440000000000000000000000000000000000000000000030330000000000000000000000000000000000000000000000000000000000000000000000000000C03300000000000038450000000000000000000000000000000000000000000000000000000000000834000000000000000000000000000000000000000000000000000000000000000000000000000050340000000000008845000000000000000000000000000000000000000000000000000000000000C83500000000000000000000000000000000000000000000000000000000000000000000000000001036000000000000D845000000000000000000000000000000000000000000000000000000000000E036000000000000000000000000000000000000000000000000000000000000000000000000000028370000000000002846000000000000000000000000000000000000000000000000000000000000F837000000000000000000000000000000000000000000000000000000000000000000000000000040380000000000007846000000000000000000000000000000000000000000000000000000000000103900000000000000000000000000000000000000000000000000000000000000000000000000007839000000000000C846000000000000000000000000000000000000000000000000000000000000E0390000000000000000000000000000000000000000000000000000000000000000000000000000283A0000000000001847000000000000000000000000000000000000000000000000000000000000203B0000000000000000000000000000000000000000000000000000000000000000000000000000103C0000000000006847000000000000000000000000000000000000000000000000000000000000783C0000000000000000000000000000000000000000000000000000000000000000000000000000C03C000000000000B847000000000000000000000000000000000000000000000000000000000000283D0000000000000000000000000000000000000000000000000000000000000000000000000000D03D0000000000000848000000000000000000000000000000000000000000000000000000000000183E0000000000000000000000000000000000000000000000000000000000000000000000000000803E0000000000005848000000000000000000000000000000000000000000000000000000000000E83E0000000000000000000000000000000000000000000000000000000000000000000000000000303F000000000000A848000000000000000000000000000000000000000000000000000000000000983F0000000000000000000000000000000000000000000000000000000000000000000000000000E03F000000000000F8480000000000000000000000000000000000000000000000000000000000008840000000000000704900000000000000000000000000000000000000000000000000000000000070420000000000007049000000000000484900000000000000000000000000000000000000000000D841000000000000
+      - sectname:        __objc_ivar
+        segname:         __DATA
+        addr:            0x4998
+        size:            144
+        offset:          0x4998
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x0
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         080000000000000009000000000000000A00000000000000080000000000000009000000000000000A000000000000000B00000000000000080000000000000009000000000000000A000000000000000B00000000000000080000000000000009000000000000000A000000000000000B00000000000000080000000000000009000000000000000800000000000000
+      - sectname:        __data
+        segname:         __DATA
+        addr:            0x4A28
+        size:            392
+        offset:          0x4A28
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x0
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         0000000000000000461D000000000000000000000000000028410000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000048410000000000000000000000000000000000000000000000000000000000003A1D00000000000050410000000000006841000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000008841000000000000000000000000000000000000000000000000000000000000531D0000000000000000000000000000904100000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000B041000000000000000000000000000000000000000000000000000000000000671D0000000000000000000000000000D84200000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000F842000000000000000000000000000000000000000000000000000000000000
+      - sectname:        __objc_protolist
+        segname:         __DATA
+        addr:            0x4BB0
+        size:            32
+        offset:          0x4BB0
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x1000000B
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         284A000000000000884A000000000000E84A000000000000484B000000000000
+      - sectname:        __objc_classlist
+        segname:         __DATA
+        addr:            0x4BD0
+        size:            160
+        offset:          0x4BD0
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x10000000
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         8043000000000000D04300000000000020440000000000007044000000000000C044000000000000E8440000000000006045000000000000B04500000000000000460000000000005046000000000000A046000000000000F04600000000000040470000000000009047000000000000E04700000000000030480000000000008048000000000000D04800000000000020490000000000004849000000000000
+      - sectname:        __objc_catlist
+        segname:         __DATA
+        addr:            0x4C70
+        size:            32
+        offset:          0x4C70
+        align:           3
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x10000000
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         D03B000000000000903D000000000000E8400000000000001843000000000000
+      - sectname:        __objc_imageinfo
+        segname:         __DATA
+        addr:            0x4C90
+        size:            8
+        offset:          0x4C90
+        align:           0
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x0
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         '0000000040000000'
+      - sectname:        __common
+        segname:         __DATA
+        addr:            0x4C98
+        size:            16
+        offset:          0x0
+        align:           2
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x1
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         __LINKEDIT
+    vmaddr:          20480
+    vmsize:          10272
+    fileoff:         20480
+    filesize:        10272
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_DYLD_INFO_ONLY
+    cmdsize:         48
+    rebase_off:      20480
+    rebase_size:     320
+    bind_off:        20800
+    bind_size:       480
+    weak_bind_off:   0
+    weak_bind_size:  0
+    lazy_bind_off:   0
+    lazy_bind_size:  0
+    export_off:      21280
+    export_size:     896
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          22208
+    nsyms:           187
+    stroff:          25200
+    strsize:         5552
+  - cmd:             LC_DYSYMTAB
+    cmdsize:         80
+    ilocalsym:       0
+    nlocalsym:       131
+    iextdefsym:      131
+    nextdefsym:      49
+    iundefsym:       180
+    nundefsym:       7
+    tocoff:          0
+    ntoc:            0
+    modtaboff:       0
+    nmodtab:         0
+    extrefsymoff:    0
+    nextrefsyms:     0
+    indirectsymoff:  0
+    nindirectsyms:   0
+    extreloff:       0
+    nextrel:         0
+    locreloff:       0
+    nlocrel:         0
+  - cmd:             LC_ID_DYLIB
+    cmdsize:         88
+    dylib:
+      name:            24
+      timestamp:       0
+      current_version: 66051
+      compatibility_version: 65536
+    Content:         '/System/Library/Frameworks/Simple.framework/Versions/A/Simple'
+    ZeroPadBytes:    3
+  - cmd:             LC_UUID
+    cmdsize:         24
+    uuid:            4C4C441D-5555-3144-A104-DD1AF4EF8FE7
+  - cmd:             LC_VERSION_MIN_MACOSX
+    cmdsize:         16
+    version:         658432
+    sdk:             983040
+  - cmd:             LC_LOAD_DYLIB
+    cmdsize:         96
+    dylib:
+      name:            24
+      timestamp:       0
+      current_version: 197722368
+      compatibility_version: 19660800
+    Content:         '/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation'
+    ZeroPadBytes:    3
+  - cmd:             LC_LOAD_DYLIB
+    cmdsize:         56
+    dylib:
+      name:            24
+      timestamp:       0
+      current_version: 14942208
+      compatibility_version: 65536
+    Content:         '/usr/lib/libobjc.A.dylib'
+    ZeroPadBytes:    8
+  - cmd:             LC_LOAD_DYLIB
+    cmdsize:         96
+    dylib:
+      name:            24
+      timestamp:       0
+      current_version: 91750400
+      compatibility_version: 65536
+    Content:         '/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData'
+    ZeroPadBytes:    7
+  - cmd:             LC_LOAD_DYLIB
+    cmdsize:         56
+    dylib:
+      name:            24
+      timestamp:       0
+      current_version: 88539136
+      compatibility_version: 65536
+    Content:         '/usr/lib/libSystem.B.dylib'
+    ZeroPadBytes:    6
+  - cmd:             LC_FUNCTION_STARTS
+    cmdsize:         16
+    dataoff:         22176
+    datasize:        32
+  - cmd:             LC_DATA_IN_CODE
+    cmdsize:         16
+    dataoff:         22208
+    datasize:        0
+LinkEditData:
+  RebaseOpcodes:
+    - Opcode:          REBASE_OPCODE_SET_TYPE_IMM
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
+      Imm:             1
+      ExtraData:       [ 0x18 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x3, 0x40 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x40 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x40 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x40 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x4, 0x40 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             15
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             8
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x10 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x10 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x10 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             5
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             7
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             9
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             9
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             5
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x28 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             7
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             5
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x40 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             5
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             7
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             7
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x30 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x18 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x8 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x8 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             9
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x38 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             1
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x20 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             2
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x98 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x18 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
+      Imm:             3
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             5
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x18 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x18 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+      Imm:             0
+      ExtraData:       [ 0x2, 0x8 ]
+    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+      Imm:             4
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+      Imm:             0
+      ExtraData:       [ 0x18 ]
+    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES
+      Imm:             0
+      ExtraData:       [ 0x1C ]
+    - Opcode:          REBASE_OPCODE_DONE
+      Imm:             0
+  BindOpcodes:
+    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+      Imm:             0
+      Symbol:          _objc_ehtype_vtable
+    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
+      Imm:             1
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+      Imm:             2
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
+      Imm:             1
+      ULEBExtraData:   [ 0x120 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_ADDEND_SLEB
+      Imm:             0
+      SLEBExtraData:   [ 16 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xA0 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xA0 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xA0 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+      Imm:             0
+      Symbol:          '_OBJC_CLASS_$_NSManagedObject'
+    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
+      Imm:             1
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+      Imm:             3
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xA78 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_ADDEND_SLEB
+      Imm:             0
+      SLEBExtraData:   [ 0 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xA48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+      Imm:             0
+      Symbol:          '_OBJC_METACLASS_$_NSObject'
+    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
+      Imm:             1
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+      Imm:             2
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xFFFFFFFFFFFFFB68 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x90 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x40 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+      Imm:             0
+      Symbol:          __objc_empty_cache
+    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
+      Imm:             1
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xFFFFFFFFFFFFFA60 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x20 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+      Imm:             0
+      Symbol:          '_OBJC_CLASS_$_NSObject'
+    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
+      Imm:             1
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xFFFFFFFFFFFFFA00 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x98 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x98 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x98 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0x48 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+      Imm:             0
+      Symbol:          '_OBJC_METACLASS_$_NSManagedObject'
+    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
+      Imm:             1
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+      Imm:             3
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
+      Imm:             0
+      ULEBExtraData:   [ 0xFFFFFFFFFFFFFE90 ]
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DO_BIND
+      Imm:             0
+      Symbol:          ''
+    - Opcode:          BIND_OPCODE_DONE
+      Imm:             0
+      Symbol:          ''
+  ExportTrie:
+    TerminalSize:    0
+    NodeOffset:      0
+    Name:            ''
+    Flags:           0x0
+    Address:         0x0
+    Other:           0x0
+    ImportName:      ''
+    Children:
+      - TerminalSize:    0
+        NodeOffset:      5
+        Name:            _
+        Flags:           0x0
+        Address:         0x0
+        Other:           0x0
+        ImportName:      ''
+        Children:
+          - TerminalSize:    0
+            NodeOffset:      41
+            Name:            p
+            Flags:           0x0
+            Address:         0x0
+            Other:           0x0
+            ImportName:      ''
+            Children:
+              - TerminalSize:    4
+                NodeOffset:      86
+                Name:            rivateGlobalVariable
+                Flags:           0x0
+                Address:         0x4CA0
+                Other:           0x0
+                ImportName:      ''
+              - TerminalSize:    4
+                NodeOffset:      92
+                Name:            ublicGlobalVariable
+                Flags:           0x0
+                Address:         0x4CA4
+                Other:           0x0
+                ImportName:      ''
+          - TerminalSize:    0
+            NodeOffset:      98
+            Name:            extraGlobalAPI
+            Flags:           0x0
+            Address:         0x0
+            Other:           0x0
+            ImportName:      ''
+            Children:
+              - TerminalSize:    4
+                NodeOffset:      106
+                Name:            '1'
+                Flags:           0x0
+                Address:         0x4C98
+                Other:           0x0
+                ImportName:      ''
+              - TerminalSize:    4
+                NodeOffset:      112
+                Name:            '2'
+                Flags:           0x0
+                Address:         0x4C9C
+                Other:           0x0
+                ImportName:      ''
+          - TerminalSize:    0
+            NodeOffset:      118
+            Name:            weakP
+            Flags:           0x0
+            Address:         0x0
+            Other:           0x0
+            ImportName:      ''
+            Children:
+              - TerminalSize:    4
+                NodeOffset:      165
+                Name:            rivateGlobalVariable
+                Flags:           0x4
+                Address:         0x4BAC
+                Other:           0x0
+                ImportName:      ''
+              - TerminalSize:    4
+                NodeOffset:      171
+                Name:            ublicGlobalVariable
+                Flags:           0x4
+                Address:         0x4BA8
+                Other:           0x0
+                ImportName:      ''
+          - TerminalSize:    0
+            NodeOffset:      177
+            Name:            OBJC_
+            Flags:           0x0
+            Address:         0x0
+            Other:           0x0
+            ImportName:      ''
+            Children:
+              - TerminalSize:    0
+                NodeOffset:      232
+                Name:            'IVAR_$_Basic'
+                Flags:           0x0
+                Address:         0x0
+                Other:           0x0
+                ImportName:      ''
+                Children:
+                  - TerminalSize:    4
+                    NodeOffset:      248
+                    Name:            6.ivar1
+                    Flags:           0x0
+                    Address:         0x4A10
+                    Other:           0x0
+                    ImportName:      ''
+                  - TerminalSize:    0
+                    NodeOffset:      254
+                    Name:            '4'
+                    Flags:           0x0
+                    Address:         0x0
+                    Other:           0x0
+                    ImportName:      ''
+                    Children:
+                      - TerminalSize:    0
+                        NodeOffset:      274
+                        Name:            .ivar
+                        Flags:           0x0
+                        Address:         0x0
+                        Other:           0x0
+                        ImportName:      ''
+                        Children:
+                          - TerminalSize:    4
+                            NodeOffset:      284
+                            Name:            '2'
+                            Flags:           0x0
+                            Address:         0x49B8
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      290
+                            Name:            '1'
+                            Flags:           0x0
+                            Address:         0x49B0
+                            Other:           0x0
+                            ImportName:      ''
+                      - TerminalSize:    0
+                        NodeOffset:      296
+                        Name:            _2.ivar
+                        Flags:           0x0
+                        Address:         0x0
+                        Other:           0x0
+                        ImportName:      ''
+                        Children:
+                          - TerminalSize:    4
+                            NodeOffset:      306
+                            Name:            '1'
+                            Flags:           0x0
+                            Address:         0x4A08
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      312
+                            Name:            '2'
+                            Flags:           0x0
+                            Address:         0x4A00
+                            Other:           0x0
+                            ImportName:      ''
+              - TerminalSize:    0
+                NodeOffset:      318
+                Name:            'METACLASS_$_'
+                Flags:           0x0
+                Address:         0x0
+                Other:           0x0
+                ImportName:      ''
+                Children:
+                  - TerminalSize:    4
+                    NodeOffset:      369
+                    Name:            FooClass
+                    Flags:           0x0
+                    Address:         0x4970
+                    Other:           0x0
+                    ImportName:      ''
+                  - TerminalSize:    4
+                    NodeOffset:      375
+                    Name:            ExternalManagedObject
+                    Flags:           0x0
+                    Address:         0x47B8
+                    Other:           0x0
+                    ImportName:      ''
+                  - TerminalSize:    0
+                    NodeOffset:      381
+                    Name:            S
+                    Flags:           0x0
+                    Address:         0x0
+                    Other:           0x0
+                    ImportName:      ''
+                    Children:
+                      - TerminalSize:    4
+                        NodeOffset:      401
+                        Name:            imple
+                        Flags:           0x0
+                        Address:         0x4358
+                        Other:           0x0
+                        ImportName:      ''
+                        Children:
+                          - TerminalSize:    0
+                            NodeOffset:      418
+                            Name:            Internal
+                            Flags:           0x0
+                            Address:         0x0
+                            Other:           0x0
+                            ImportName:      ''
+                            Children:
+                              - TerminalSize:    4
+                                NodeOffset:      432
+                                Name:            SPI
+                                Flags:           0x0
+                                Address:         0x4498
+                                Other:           0x0
+                                ImportName:      ''
+                              - TerminalSize:    4
+                                NodeOffset:      438
+                                Name:            API
+                                Flags:           0x0
+                                Address:         0x4448
+                                Other:           0x0
+                                ImportName:      ''
+                      - TerminalSize:    4
+                        NodeOffset:      444
+                        Name:            ubClass
+                        Flags:           0x0
+                        Address:         0x43F8
+                        Other:           0x0
+                        ImportName:      ''
+                  - TerminalSize:    0
+                    NodeOffset:      450
+                    Name:            Bas
+                    Flags:           0x0
+                    Address:         0x0
+                    Other:           0x0
+                    ImportName:      ''
+                    Children:
+                      - TerminalSize:    4
+                        NodeOffset:      461
+                        Name:            e
+                        Flags:           0x0
+                        Address:         0x43A8
+                        Other:           0x0
+                        ImportName:      ''
+                      - TerminalSize:    0
+                        NodeOffset:      467
+                        Name:            ic
+                        Flags:           0x0
+                        Address:         0x0
+                        Other:           0x0
+                        ImportName:      ''
+                        Children:
+                          - TerminalSize:    4
+                            NodeOffset:      501
+                            Name:            '2'
+                            Flags:           0x0
+                            Address:         0x4538
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      507
+                            Name:            '3'
+                            Flags:           0x0
+                            Address:         0x4588
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      513
+                            Name:            '5'
+                            Flags:           0x0
+                            Address:         0x46C8
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      519
+                            Name:            '4'
+                            Flags:           0x0
+                            Address:         0x45D8
+                            Other:           0x0
+                            ImportName:      ''
+                            Children:
+                              - TerminalSize:    4
+                                NodeOffset:      530
+                                Name:            _2
+                                Flags:           0x0
+                                Address:         0x4678
+                                Other:           0x0
+                                ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      536
+                            Name:            '9'
+                            Flags:           0x0
+                            Address:         0x48F8
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      542
+                            Name:            '8'
+                            Flags:           0x0
+                            Address:         0x4858
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      548
+                            Name:            '6'
+                            Flags:           0x0
+                            Address:         0x4718
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      554
+                            Name:            '1'
+                            Flags:           0x0
+                            Address:         0x4510
+                            Other:           0x0
+                            ImportName:      ''
+                  - TerminalSize:    4
+                    NodeOffset:      560
+                    Name:            A
+                    Flags:           0x0
+                    Address:         0x48A8
+                    Other:           0x0
+                    ImportName:      ''
+              - TerminalSize:    0
+                NodeOffset:      566
+                Name:            'EHTYPE_$_'
+                Flags:           0x0
+                Address:         0x0
+                Other:           0x0
+                ImportName:      ''
+                Children:
+                  - TerminalSize:    3
+                    NodeOffset:      579
+                    Name:            Base
+                    Flags:           0x0
+                    Address:         0x3120
+                    Other:           0x0
+                    ImportName:      ''
+                  - TerminalSize:    0
+                    NodeOffset:      584
+                    Name:            S
+                    Flags:           0x0
+                    Address:         0x0
+                    Other:           0x0
+                    ImportName:      ''
+                    Children:
+                      - TerminalSize:    3
+                        NodeOffset:      612
+                        Name:            ubClass
+                        Flags:           0x0
+                        Address:         0x31C8
+                        Other:           0x0
+                        ImportName:      ''
+                      - TerminalSize:    0
+                        NodeOffset:      617
+                        Name:            impleInternal
+                        Flags:           0x0
+                        Address:         0x0
+                        Other:           0x0
+                        ImportName:      ''
+                        Children:
+                          - TerminalSize:    3
+                            NodeOffset:      631
+                            Name:            SPI
+                            Flags:           0x0
+                            Address:         0x3318
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    3
+                            NodeOffset:      636
+                            Name:            API
+                            Flags:           0x0
+                            Address:         0x3270
+                            Other:           0x0
+                            ImportName:      ''
+              - TerminalSize:    0
+                NodeOffset:      641
+                Name:            'CLASS_$_'
+                Flags:           0x0
+                Address:         0x0
+                Other:           0x0
+                ImportName:      ''
+                Children:
+                  - TerminalSize:    4
+                    NodeOffset:      692
+                    Name:            A
+                    Flags:           0x0
+                    Address:         0x48D0
+                    Other:           0x0
+                    ImportName:      ''
+                  - TerminalSize:    4
+                    NodeOffset:      698
+                    Name:            ExternalManagedObject
+                    Flags:           0x0
+                    Address:         0x47E0
+                    Other:           0x0
+                    ImportName:      ''
+                  - TerminalSize:    4
+                    NodeOffset:      704
+                    Name:            FooClass
+                    Flags:           0x0
+                    Address:         0x4948
+                    Other:           0x0
+                    ImportName:      ''
+                  - TerminalSize:    0
+                    NodeOffset:      710
+                    Name:            S
+                    Flags:           0x0
+                    Address:         0x0
+                    Other:           0x0
+                    ImportName:      ''
+                    Children:
+                      - TerminalSize:    4
+                        NodeOffset:      730
+                        Name:            ubClass
+                        Flags:           0x0
+                        Address:         0x4420
+                        Other:           0x0
+                        ImportName:      ''
+                      - TerminalSize:    4
+                        NodeOffset:      736
+                        Name:            imple
+                        Flags:           0x0
+                        Address:         0x4380
+                        Other:           0x0
+                        ImportName:      ''
+                        Children:
+                          - TerminalSize:    0
+                            NodeOffset:      753
+                            Name:            Internal
+                            Flags:           0x0
+                            Address:         0x0
+                            Other:           0x0
+                            ImportName:      ''
+                            Children:
+                              - TerminalSize:    4
+                                NodeOffset:      767
+                                Name:            API
+                                Flags:           0x0
+                                Address:         0x4470
+                                Other:           0x0
+                                ImportName:      ''
+                              - TerminalSize:    4
+                                NodeOffset:      773
+                                Name:            SPI
+                                Flags:           0x0
+                                Address:         0x44C0
+                                Other:           0x0
+                                ImportName:      ''
+                  - TerminalSize:    0
+                    NodeOffset:      779
+                    Name:            Bas
+                    Flags:           0x0
+                    Address:         0x0
+                    Other:           0x0
+                    ImportName:      ''
+                    Children:
+                      - TerminalSize:    4
+                        NodeOffset:      790
+                        Name:            e
+                        Flags:           0x0
+                        Address:         0x43D0
+                        Other:           0x0
+                        ImportName:      ''
+                      - TerminalSize:    0
+                        NodeOffset:      796
+                        Name:            ic
+                        Flags:           0x0
+                        Address:         0x0
+                        Other:           0x0
+                        ImportName:      ''
+                        Children:
+                          - TerminalSize:    4
+                            NodeOffset:      830
+                            Name:            '1'
+                            Flags:           0x0
+                            Address:         0x44E8
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      836
+                            Name:            '3'
+                            Flags:           0x0
+                            Address:         0x45B0
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      842
+                            Name:            '4'
+                            Flags:           0x0
+                            Address:         0x4600
+                            Other:           0x0
+                            ImportName:      ''
+                            Children:
+                              - TerminalSize:    4
+                                NodeOffset:      853
+                                Name:            _2
+                                Flags:           0x0
+                                Address:         0x46A0
+                                Other:           0x0
+                                ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      859
+                            Name:            '2'
+                            Flags:           0x0
+                            Address:         0x4560
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      865
+                            Name:            '8'
+                            Flags:           0x0
+                            Address:         0x4880
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      871
+                            Name:            '9'
+                            Flags:           0x0
+                            Address:         0x4920
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      877
+                            Name:            '6'
+                            Flags:           0x0
+                            Address:         0x4740
+                            Other:           0x0
+                            ImportName:      ''
+                          - TerminalSize:    4
+                            NodeOffset:      883
+                            Name:            '5'
+                            Flags:           0x0
+                            Address:         0x46F0
+                            Other:           0x0
+                            ImportName:      ''
+  NameList:
+    - n_strx:          2
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7104
+    - n_strx:          22
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7114
+    - n_strx:          46
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7123
+    - n_strx:          66
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7133
+    - n_strx:          88
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7143
+    - n_strx:          112
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7152
+    - n_strx:          135
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7158
+    - n_strx:          162
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7164
+    - n_strx:          204
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7170
+    - n_strx:          224
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7180
+    - n_strx:          248
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7189
+    - n_strx:          273
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7200
+    - n_strx:          302
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7206
+    - n_strx:          347
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7212
+    - n_strx:          395
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7218
+    - n_strx:          424
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7224
+    - n_strx:          466
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7232
+    - n_strx:          488
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7238
+    - n_strx:          510
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7244
+    - n_strx:          523
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7250
+    - n_strx:          543
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7260
+    - n_strx:          566
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7266
+    - n_strx:          593
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7272
+    - n_strx:          615
+      n_type:          0xE
+      n_sect:          1
+      n_desc:          0
+      n_value:         7278
+    - n_strx:          658
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12288
+    - n_strx:          687
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12360
+    - n_strx:          712
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12432
+    - n_strx:          739
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12504
+    - n_strx:          762
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12600
+    - n_strx:          793
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12672
+    - n_strx:          820
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12768
+    - n_strx:          860
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12840
+    - n_strx:          896
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         12936
+    - n_strx:          936
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13008
+    - n_strx:          972
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13176
+    - n_strx:          997
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13104
+    - n_strx:          1026
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13248
+    - n_strx:          1055
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13320
+    - n_strx:          1080
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13392
+    - n_strx:          1109
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13464
+    - n_strx:          1142
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13592
+    - n_strx:          1177
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13696
+    - n_strx:          1203
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13768
+    - n_strx:          1228
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13840
+    - n_strx:          1257
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         13912
+    - n_strx:          1292
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14048
+    - n_strx:          1317
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14120
+    - n_strx:          1348
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14192
+    - n_strx:          1385
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14328
+    - n_strx:          1412
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14400
+    - n_strx:          1443
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14472
+    - n_strx:          1480
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14608
+    - n_strx:          1507
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14680
+    - n_strx:          1537
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14712
+    - n_strx:          1566
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14784
+    - n_strx:          1599
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14816
+    - n_strx:          1624
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14888
+    - n_strx:          1653
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         14960
+    - n_strx:          1686
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15040
+    - n_strx:          1721
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15112
+    - n_strx:          1747
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15136
+    - n_strx:          1772
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15208
+    - n_strx:          1820
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15288
+    - n_strx:          1852
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15312
+    - n_strx:          1883
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15376
+    - n_strx:          1912
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15448
+    - n_strx:          1945
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15480
+    - n_strx:          1970
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15552
+    - n_strx:          2014
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15624
+    - n_strx:          2062
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15656
+    - n_strx:          2102
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15728
+    - n_strx:          2162
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15760
+    - n_strx:          2205
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15824
+    - n_strx:          2239
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15896
+    - n_strx:          2269
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         15968
+    - n_strx:          2299
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16000
+    - n_strx:          2328
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16072
+    - n_strx:          2361
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16104
+    - n_strx:          2386
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16176
+    - n_strx:          2410
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16248
+    - n_strx:          2438
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16280
+    - n_strx:          2458
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16352
+    - n_strx:          2487
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16424
+    - n_strx:          2520
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16456
+    - n_strx:          2555
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16496
+    - n_strx:          2581
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16520
+    - n_strx:          2606
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16592
+    - n_strx:          2645
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16616
+    - n_strx:          2683
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         17008
+    - n_strx:          2710
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16856
+    - n_strx:          2741
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16680
+    - n_strx:          2789
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16712
+    - n_strx:          2833
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16720
+    - n_strx:          2868
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16744
+    - n_strx:          2915
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16776
+    - n_strx:          2958
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16784
+    - n_strx:          3005
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16816
+    - n_strx:          3048
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16824
+    - n_strx:          3082
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         16928
+    - n_strx:          3117
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         17080
+    - n_strx:          3171
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         17112
+    - n_strx:          3222
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         17144
+    - n_strx:          3269
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         17152
+    - n_strx:          3316
+      n_type:          0xE
+      n_sect:          6
+      n_desc:          0
+      n_value:         17176
+    - n_strx:          4000
+      n_type:          0x1E
+      n_sect:          7
+      n_desc:          0
+      n_value:         17960
+    - n_strx:          4027
+      n_type:          0x1E
+      n_sect:          7
+      n_desc:          0
+      n_value:         18000
+    - n_strx:          4192
+      n_type:          0x1E
+      n_sect:          7
+      n_desc:          0
+      n_value:         18280
+    - n_strx:          4217
+      n_type:          0x1E
+      n_sect:          7
+      n_desc:          0
+      n_value:         18320
+    - n_strx:          4314
+      n_type:          0x1E
+      n_sect:          7
+      n_desc:          0
+      n_value:         18440
+    - n_strx:          4344
+      n_type:          0x1E
+      n_sect:          7
+      n_desc:          0
+      n_value:         18480
+    - n_strx:          4548
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18840
+    - n_strx:          4578
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18848
+    - n_strx:          4608
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18856
+    - n_strx:          4690
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18880
+    - n_strx:          4716
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18888
+    - n_strx:          4742
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18896
+    - n_strx:          4770
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18904
+    - n_strx:          4798
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18912
+    - n_strx:          4826
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18920
+    - n_strx:          4854
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18928
+    - n_strx:          4882
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18936
+    - n_strx:          4992
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18968
+    - n_strx:          5022
+      n_type:          0x1E
+      n_sect:          8
+      n_desc:          0
+      n_value:         18976
+    - n_strx:          5053
+      n_type:          0x1E
+      n_sect:          9
+      n_desc:          0
+      n_value:         18984
+    - n_strx:          5084
+      n_type:          0x1E
+      n_sect:          9
+      n_desc:          0
+      n_value:         19080
+    - n_strx:          5114
+      n_type:          0x1E
+      n_sect:          9
+      n_desc:          0
+      n_value:         19176
+    - n_strx:          5144
+      n_type:          0x1E
+      n_sect:          9
+      n_desc:          0
+      n_value:         19272
+    - n_strx:          5231
+      n_type:          0x1E
+      n_sect:          10
+      n_desc:          0
+      n_value:         19376
+    - n_strx:          5268
+      n_type:          0x1E
+      n_sect:          10
+      n_desc:          0
+      n_value:         19384
+    - n_strx:          5304
+      n_type:          0x1E
+      n_sect:          10
+      n_desc:          0
+      n_value:         19392
+    - n_strx:          5340
+      n_type:          0x1E
+      n_sect:          10
+      n_desc:          0
+      n_value:         19400
+    - n_strx:          3353
+      n_type:          0xF
+      n_sect:          14
+      n_desc:          0
+      n_value:         19608
+    - n_strx:          3370
+      n_type:          0xF
+      n_sect:          14
+      n_desc:          0
+      n_value:         19612
+    - n_strx:          3387
+      n_type:          0xF
+      n_sect:          14
+      n_desc:          0
+      n_value:         19616
+    - n_strx:          3410
+      n_type:          0xF
+      n_sect:          14
+      n_desc:          0
+      n_value:         19620
+    - n_strx:          3432
+      n_type:          0xF
+      n_sect:          6
+      n_desc:          0
+      n_value:         12576
+    - n_strx:          3452
+      n_type:          0xF
+      n_sect:          6
+      n_desc:          0
+      n_value:         12744
+    - n_strx:          3476
+      n_type:          0xF
+      n_sect:          6
+      n_desc:          0
+      n_value:         12912
+    - n_strx:          3509
+      n_type:          0xF
+      n_sect:          6
+      n_desc:          0
+      n_value:         13080
+    - n_strx:          3542
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17240
+    - n_strx:          3567
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17280
+    - n_strx:          3588
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17320
+    - n_strx:          3611
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17360
+    - n_strx:          3630
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17400
+    - n_strx:          3657
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17440
+    - n_strx:          3680
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17480
+    - n_strx:          3716
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17520
+    - n_strx:          3748
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17560
+    - n_strx:          3784
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17600
+    - n_strx:          3816
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17640
+    - n_strx:          3837
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17680
+    - n_strx:          3862
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17720
+    - n_strx:          3887
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17760
+    - n_strx:          3908
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17800
+    - n_strx:          3933
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17840
+    - n_strx:          3954
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17880
+    - n_strx:          3979
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         17920
+    - n_strx:          4050
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18040
+    - n_strx:          4077
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18080
+    - n_strx:          4100
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18120
+    - n_strx:          4125
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18160
+    - n_strx:          4146
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18200
+    - n_strx:          4171
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18240
+    - n_strx:          4238
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18360
+    - n_strx:          4278
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18400
+    - n_strx:          4370
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18520
+    - n_strx:          4395
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18560
+    - n_strx:          4416
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18600
+    - n_strx:          4436
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18640
+    - n_strx:          4452
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18680
+    - n_strx:          4477
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18720
+    - n_strx:          4498
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18760
+    - n_strx:          4521
+      n_type:          0xF
+      n_sect:          7
+      n_desc:          0
+      n_value:         18800
+    - n_strx:          4638
+      n_type:          0xF
+      n_sect:          8
+      n_desc:          0
+      n_value:         18864
+    - n_strx:          4664
+      n_type:          0xF
+      n_sect:          8
+      n_desc:          0
+      n_value:         18872
+    - n_strx:          4910
+      n_type:          0xF
+      n_sect:          8
+      n_desc:          0
+      n_value:         18944
+    - n_strx:          4938
+      n_type:          0xF
+      n_sect:          8
+      n_desc:          0
+      n_value:         18952
+    - n_strx:          4966
+      n_type:          0xF
+      n_sect:          8
+      n_desc:          0
+      n_value:         18960
+    - n_strx:          5178
+      n_type:          0xF
+      n_sect:          9
+      n_desc:          128
+      n_value:         19368
+    - n_strx:          5204
+      n_type:          0xF
+      n_sect:          9
+      n_desc:          128
+      n_value:         19372
+    - n_strx:          5380
+      n_type:          0x1
+      n_sect:          0
+      n_desc:          768
+      n_value:         0
+    - n_strx:          5410
+      n_type:          0x1
+      n_sect:          0
+      n_desc:          512
+      n_value:         0
+    - n_strx:          5433
+      n_type:          0x1
+      n_sect:          0
+      n_desc:          768
+      n_value:         0
+    - n_strx:          5467
+      n_type:          0x1
+      n_sect:          0
+      n_desc:          512
+      n_value:         0
+    - n_strx:          5494
+      n_type:          0x1
+      n_sect:          0
+      n_desc:          512
+      n_value:         0
+    - n_strx:          5513
+      n_type:          0x1
+      n_sect:          0
+      n_desc:          512
+      n_value:         0
+    - n_strx:          5533
+      n_type:          0x1
+      n_sect:          0
+      n_desc:          1024
+      n_value:         0
+  StringTable:
+    - ' '
+    - '-[Basic3 property1]'
+    - '-[Basic3 setProperty1:]'
+    - '-[Basic3 property2]'
+    - '-[Basic3 isProperty3]'
+    - '-[Basic3 setProperty3:]'
+    - '+[Basic5 aClassMethod]'
+    - '-[Basic5 anInstanceMethod]'
+    - '-[Basic6 anInstanceMethodFromAnExtension]'
+    - '-[Basic6 property1]'
+    - '-[Basic6 setProperty1:]'
+    - '-[Basic6(Foo) property2]'
+    - '-[Basic6(Foo) setProperty2:]'
+    - '-[Basic6(Foo) anInstanceMethodFromACategory]'
+    - '-[Basic7 anInstanceMethodFromAnHiddenExtension]'
+    - '-[ExternalManagedObject foo]'
+    - '-[NSManagedObject(Simple) supportsSimple]'
+    - '+[Basic8 useSameName]'
+    - '-[Basic8 useSameName]'
+    - '-[A aMethod]'
+    - '-[Basic9 aProperty]'
+    - '-[FooClass baseMethod]'
+    - '-[FooClass protocolMethod]'
+    - '-[FooClass barMethod]'
+    - '-[FooClass(Private) privateProcotolMethod]'
+    - '__OBJC_METACLASS_RO_$_Simple'
+    - '__OBJC_CLASS_RO_$_Simple'
+    - '__OBJC_METACLASS_RO_$_Base'
+    - '__OBJC_CLASS_RO_$_Base'
+    - '__OBJC_METACLASS_RO_$_SubClass'
+    - '__OBJC_CLASS_RO_$_SubClass'
+    - '__OBJC_METACLASS_RO_$_SimpleInternalAPI'
+    - '__OBJC_CLASS_RO_$_SimpleInternalAPI'
+    - '__OBJC_METACLASS_RO_$_SimpleInternalSPI'
+    - '__OBJC_CLASS_RO_$_SimpleInternalSPI'
+    - '__OBJC_CLASS_RO_$_Basic1'
+    - '__OBJC_METACLASS_RO_$_Basic1'
+    - '__OBJC_METACLASS_RO_$_Basic2'
+    - '__OBJC_CLASS_RO_$_Basic2'
+    - '__OBJC_METACLASS_RO_$_Basic3'
+    - '__OBJC_$_INSTANCE_METHODS_Basic3'
+    - '__OBJC_$_INSTANCE_VARIABLES_Basic3'
+    - '__OBJC_$_PROP_LIST_Basic3'
+    - '__OBJC_CLASS_RO_$_Basic3'
+    - '__OBJC_METACLASS_RO_$_Basic4'
+    - '__OBJC_$_INSTANCE_VARIABLES_Basic4'
+    - '__OBJC_CLASS_RO_$_Basic4'
+    - '__OBJC_METACLASS_RO_$_Basic4_1'
+    - '__OBJC_$_INSTANCE_VARIABLES_Basic4_1'
+    - '__OBJC_CLASS_RO_$_Basic4_1'
+    - '__OBJC_METACLASS_RO_$_Basic4_2'
+    - '__OBJC_$_INSTANCE_VARIABLES_Basic4_2'
+    - '__OBJC_CLASS_RO_$_Basic4_2'
+    - '__OBJC_$_CLASS_METHODS_Basic5'
+    - '__OBJC_METACLASS_RO_$_Basic5'
+    - '__OBJC_$_INSTANCE_METHODS_Basic5'
+    - '__OBJC_CLASS_RO_$_Basic5'
+    - '__OBJC_METACLASS_RO_$_Basic6'
+    - '__OBJC_$_INSTANCE_METHODS_Basic6'
+    - '__OBJC_$_INSTANCE_VARIABLES_Basic6'
+    - '__OBJC_$_PROP_LIST_Basic6'
+    - '__OBJC_CLASS_RO_$_Basic6'
+    - '__OBJC_$_CATEGORY_INSTANCE_METHODS_Basic6_$_Foo'
+    - '__OBJC_$_PROP_LIST_Basic6_$_Foo'
+    - '__OBJC_$_CATEGORY_Basic6_$_Foo'
+    - '__OBJC_METACLASS_RO_$_Basic7'
+    - '__OBJC_$_INSTANCE_METHODS_Basic7'
+    - '__OBJC_CLASS_RO_$_Basic7'
+    - '__OBJC_METACLASS_RO_$_ExternalManagedObject'
+    - '__OBJC_$_INSTANCE_METHODS_ExternalManagedObject'
+    - '__OBJC_CLASS_RO_$_ExternalManagedObject'
+    - '__OBJC_$_CATEGORY_INSTANCE_METHODS_NSManagedObject_$_Simple'
+    - '__OBJC_$_CATEGORY_NSManagedObject_$_Simple'
+    - '__OBJC_METACLASS_RO_$_HiddenClass'
+    - '__OBJC_CLASS_RO_$_HiddenClass'
+    - '__OBJC_$_CLASS_METHODS_Basic8'
+    - '__OBJC_METACLASS_RO_$_Basic8'
+    - '__OBJC_$_INSTANCE_METHODS_Basic8'
+    - '__OBJC_CLASS_RO_$_Basic8'
+    - '__OBJC_METACLASS_RO_$_A'
+    - '__OBJC_$_INSTANCE_METHODS_A'
+    - '__OBJC_CLASS_RO_$_A'
+    - '__OBJC_METACLASS_RO_$_Basic9'
+    - '__OBJC_$_INSTANCE_METHODS_Basic9'
+    - '__OBJC_$_INSTANCE_VARIABLES_Basic9'
+    - '__OBJC_$_PROP_LIST_Basic9'
+    - '__OBJC_CLASS_RO_$_Basic9'
+    - '__OBJC_$_PROP_LIST_Basic9_$_deprecated'
+    - '__OBJC_$_CATEGORY_Basic9_$_deprecated'
+    - '__OBJC_CLASS_RO_$_FooClass'
+    - '__OBJC_METACLASS_RO_$_FooClass'
+    - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_BaseProtocol'
+    - '__OBJC_$_PROTOCOL_METHOD_TYPES_BaseProtocol'
+    - '__OBJC_$_PROTOCOL_REFS_FooProtocol'
+    - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_FooProtocol'
+    - '__OBJC_$_PROTOCOL_METHOD_TYPES_FooProtocol'
+    - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_BarProtocol'
+    - '__OBJC_$_PROTOCOL_METHOD_TYPES_BarProtocol'
+    - '__OBJC_CLASS_PROTOCOLS_$_FooClass'
+    - '__OBJC_$_INSTANCE_METHODS_FooClass'
+    - '__OBJC_$_CATEGORY_INSTANCE_METHODS_FooClass_$_Private'
+    - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_PrivateProtocol'
+    - '__OBJC_$_PROTOCOL_METHOD_TYPES_PrivateProtocol'
+    - '__OBJC_CATEGORY_PROTOCOLS_$_FooClass_$_Private'
+    - '__OBJC_$_CATEGORY_FooClass_$_Private'
+    - _extraGlobalAPI1
+    - _extraGlobalAPI2
+    - _privateGlobalVariable
+    - _publicGlobalVariable
+    - '_OBJC_EHTYPE_$_Base'
+    - '_OBJC_EHTYPE_$_SubClass'
+    - '_OBJC_EHTYPE_$_SimpleInternalAPI'
+    - '_OBJC_EHTYPE_$_SimpleInternalSPI'
+    - '_OBJC_METACLASS_$_Simple'
+    - '_OBJC_CLASS_$_Simple'
+    - '_OBJC_METACLASS_$_Base'
+    - '_OBJC_CLASS_$_Base'
+    - '_OBJC_METACLASS_$_SubClass'
+    - '_OBJC_CLASS_$_SubClass'
+    - '_OBJC_METACLASS_$_SimpleInternalAPI'
+    - '_OBJC_CLASS_$_SimpleInternalAPI'
+    - '_OBJC_METACLASS_$_SimpleInternalSPI'
+    - '_OBJC_CLASS_$_SimpleInternalSPI'
+    - '_OBJC_CLASS_$_Basic1'
+    - '_OBJC_METACLASS_$_Basic1'
+    - '_OBJC_METACLASS_$_Basic2'
+    - '_OBJC_CLASS_$_Basic2'
+    - '_OBJC_METACLASS_$_Basic3'
+    - '_OBJC_CLASS_$_Basic3'
+    - '_OBJC_METACLASS_$_Basic4'
+    - '_OBJC_CLASS_$_Basic4'
+    - '_OBJC_METACLASS_$_Basic4_1'
+    - '_OBJC_CLASS_$_Basic4_1'
+    - '_OBJC_METACLASS_$_Basic4_2'
+    - '_OBJC_CLASS_$_Basic4_2'
+    - '_OBJC_METACLASS_$_Basic5'
+    - '_OBJC_CLASS_$_Basic5'
+    - '_OBJC_METACLASS_$_Basic6'
+    - '_OBJC_CLASS_$_Basic6'
+    - '_OBJC_METACLASS_$_Basic7'
+    - '_OBJC_CLASS_$_Basic7'
+    - '_OBJC_METACLASS_$_ExternalManagedObject'
+    - '_OBJC_CLASS_$_ExternalManagedObject'
+    - '_OBJC_METACLASS_$_HiddenClass'
+    - '_OBJC_CLASS_$_HiddenClass'
+    - '_OBJC_METACLASS_$_Basic8'
+    - '_OBJC_CLASS_$_Basic8'
+    - '_OBJC_METACLASS_$_A'
+    - '_OBJC_CLASS_$_A'
+    - '_OBJC_METACLASS_$_Basic9'
+    - '_OBJC_CLASS_$_Basic9'
+    - '_OBJC_CLASS_$_FooClass'
+    - '_OBJC_METACLASS_$_FooClass'
+    - '_OBJC_IVAR_$_Basic3.property1'
+    - '_OBJC_IVAR_$_Basic3.property2'
+    - '_OBJC_IVAR_$_Basic3.property3'
+    - '_OBJC_IVAR_$_Basic4.ivar1'
+    - '_OBJC_IVAR_$_Basic4.ivar2'
+    - '_OBJC_IVAR_$_Basic4.ivar3'
+    - '_OBJC_IVAR_$_Basic4.ivar4'
+    - '_OBJC_IVAR_$_Basic4_1.ivar1'
+    - '_OBJC_IVAR_$_Basic4_1.ivar2'
+    - '_OBJC_IVAR_$_Basic4_1.ivar3'
+    - '_OBJC_IVAR_$_Basic4_1.ivar4'
+    - '_OBJC_IVAR_$_Basic4_2.ivar4'
+    - '_OBJC_IVAR_$_Basic4_2.ivar3'
+    - '_OBJC_IVAR_$_Basic4_2.ivar2'
+    - '_OBJC_IVAR_$_Basic4_2.ivar1'
+    - '_OBJC_IVAR_$_Basic6.ivar1'
+    - '_OBJC_IVAR_$_Basic6.property1'
+    - '_OBJC_IVAR_$_Basic9._aProperty'
+    - '__OBJC_PROTOCOL_$_BaseProtocol'
+    - '__OBJC_PROTOCOL_$_FooProtocol'
+    - '__OBJC_PROTOCOL_$_BarProtocol'
+    - '__OBJC_PROTOCOL_$_PrivateProtocol'
+    - _weakPublicGlobalVariable
+    - _weakPrivateGlobalVariable
+    - '__OBJC_LABEL_PROTOCOL_$_BaseProtocol'
+    - '__OBJC_LABEL_PROTOCOL_$_FooProtocol'
+    - '__OBJC_LABEL_PROTOCOL_$_BarProtocol'
+    - '__OBJC_LABEL_PROTOCOL_$_PrivateProtocol'
+    - '_OBJC_CLASS_$_NSManagedObject'
+    - '_OBJC_CLASS_$_NSObject'
+    - '_OBJC_METACLASS_$_NSManagedObject'
+    - '_OBJC_METACLASS_$_NSObject'
+    - __objc_empty_cache
+    - _objc_ehtype_vtable
+    - dyld_stub_binder
+    - ''
+    - ''
+  FunctionStarts:  [ 0x1BC0, 0x1BCA, 0x1BD3, 0x1BDD, 0x1BE7, 0x1BF0, 0x1BF6, 
+                     0x1BFC, 0x1C02, 0x1C0C, 0x1C15, 0x1C20, 0x1C26, 0x1C2C, 
+                     0x1C32, 0x1C38, 0x1C40, 0x1C46, 0x1C4C, 0x1C52, 0x1C5C, 
+                     0x1C62, 0x1C68, 0x1C6E ]
+...
diff --git a/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h
new file mode 100644
index 00000000000000..5dd416a0619cfb
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h
@@ -0,0 +1,3 @@
+#ifndef HAVE_SEEN_PROJECT_HEADER_FIRST
+#error "Project header was not included in the correct order!"
+#endif
diff --git a/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h
new file mode 100644
index 00000000000000..9bbae52d721538
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h
@@ -0,0 +1,7 @@
+#import <Foundation/Foundation.h>
+
+__attribute__((objc_exception))
+ at interface SimpleInternalAPI : NSObject
+ at end
+
+#define HAVE_SEEN_PROJECT_HEADER_FIRST 1
diff --git a/clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h
new file mode 100644
index 00000000000000..a816c01abeb0d2
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+
+__attribute__((objc_exception))
+ at interface SimpleInternalSPI : NSObject
+ at end
diff --git a/clang/test/InstallAPI/extra-exclude-headers.test b/clang/test/InstallAPI/extra-exclude-headers.test
new file mode 100644
index 00000000000000..663ca1a5d5000d
--- /dev/null
+++ b/clang/test/InstallAPI/extra-exclude-headers.test
@@ -0,0 +1,207 @@
+; RUN: rm -rf %t 
+; RUN: split-file %s %t
+; RUN: mkdir -p %t/System/Library/Frameworks 
+; RUN: cp -r %S/Inputs/Simple/Simple.framework %t/System/Library/Frameworks/
+; RUN: sed -e "s|DSTROOT|%/t|g" %t/inputs.json.in > %t/inputs.json
+; RUN: yaml2obj %S/Inputs/Simple/Simple.yaml -o %t/Simple 
+
+// Add exclude options.
+; RUN: clang-installapi -target x86_64-apple-macosx10.12 \
+; RUN: -install_name /System/Library/Frameworks/Simple.framework/Versions/A/Simple \
+; RUN: -current_version 1.2.3 -compatibility_version 1 \
+; RUN: -F%t/System/Library/Frameworks \
+; RUN: %t/inputs.json -o %t/Simple.tbd \
+; RUN: --verify-against=%t/Simple --verify-mode=ErrorsAndWarnings \
+; RUN: --exclude-public-header=**/SimpleAPI.h \
+; RUN: --exclude-private-header=**/SimplePrivateSPI.h 2>&1 | FileCheck -check-prefix=WARNINGS %s
+; RUN: llvm-readtapi -compare %t/Simple.tbd %t/expected-excluded.tbd
+
+// Add extra options.
+; RUN: clang-installapi -target x86_64-apple-macosx10.12 \
+; RUN: -install_name /System/Library/Frameworks/Simple.framework/Versions/A/Simple \
+; RUN: -current_version 1.2.3 -compatibility_version 1 \
+; RUN: -F%t/System/Library/Frameworks \
+; RUN: %t/inputs.json -o %t/Simple.tbd \
+; RUN: --verify-against=%t/Simple --verify-mode=Pedantic \
+; RUN: --extra-project-header=%S/Inputs/Simple/SimpleInternalAPI2.h \
+; RUN: --extra-project-header=%S/Inputs/Simple/SimpleInternalAPI.h \
+; RUN: --extra-public-header=%S/Inputs/Simple/Extra \
+; RUN: --extra-private-header=%S/Inputs/Simple/SimpleInternalSPI.h \
+; RUN: --exclude-public-header=**/SimpleAPI.h \
+; RUN: --exclude-private-header=**/SimplePrivateSPI.h 2>&1 | FileCheck -check-prefix=PEDANTIC -allow-empty %s
+; RUN: llvm-readtapi -compare %t/Simple.tbd %t/expected-extra.tbd
+
+// Check fatal missing file input.
+; RUN: not clang-installapi -target x86_64-apple-macosx10.12 \
+; RUN: -install_name /System/Library/Frameworks/Simple.framework/Versions/A/Simple \
+; RUN: -current_version 1.2.3 -compatibility_version 1 \
+; RUN: -F%t/System/Library/Frameworks \
+; RUN: %t/inputs.json -o %t/Simple.tbd \
+; RUN: --extra-public-header=%S/Inputs/Simple/NoSuchFile.h 2>&1 | FileCheck -allow-empty -check-prefix=NOPUBLIC %s
+
+; WARNINGS: warning: no declaration was found for exported symbol '_extraGlobalAPI1' in dynamic library
+; WARNINGS: warning: no declaration was found for exported symbol '_extraGlobalAPI2' in dynamic library
+; WARNINGS: warning: no declaration was found for exported symbol '(ObjC Class) SimpleInternalSPI' in dynamic library
+; WARNINGS: warning: no declaration was found for exported symbol '(ObjC Class) SimpleInternalAPI' in dynamic library
+
+; PEDANTIC-NOT: error
+; PEDANTIC: warning: cannot find protocol definition for 'ForwardProcotol'
+
+; NOPUBLIC: error: no such public header file:
+
+;--- expected-excluded.tbd
+{
+  "main_library": {
+    "current_versions": [
+      {
+        "version": "1.2.3"
+      }
+    ],
+    "exported_symbols": [
+      {
+        "data": {
+          "global": [
+            "_publicGlobalVariable",
+            "_privateGlobalVariable"
+          ],
+          "objc_class": [
+            "ExternalManagedObject", "Basic6",
+            "Basic1", "Base", "Basic3",
+            "FooClass", "Simple",
+            "Basic4_2", "Basic5",
+            "Basic9","Basic8",
+            "Basic2", "Basic4", "A", "SubClass"
+          ],
+          "objc_eh_type": [
+            "SubClass", "Base"
+          ],
+          "objc_ivar": [
+            "Basic4.ivar2", "Basic4_2.ivar1", "Basic6.ivar1",
+            "Basic4.ivar1", "Basic4_2.ivar2"
+          ],
+          "weak": [
+            "_weakPrivateGlobalVariable", "_weakPublicGlobalVariable"
+          ]
+        }
+      }
+    ],
+    "flags": [
+      {
+        "attributes": ["not_app_extension_safe"]
+      }
+    ],
+    "install_names": [
+      {
+        "name": "/System/Library/Frameworks/Simple.framework/Versions/A/Simple"
+      }
+    ],
+    "target_info": [
+      {"min_deployment": "10.12", "target": "x86_64-macos"}
+    ]
+  },
+  "tapi_tbd_version": 5
+}
+
+;--- expected-extra.tbd
+{
+  "main_library": {
+    "current_versions": [
+      { "version": "1.2.3" }
+    ],
+    "exported_symbols": [
+      {
+        "data": {
+          "global": [
+            "_publicGlobalVariable", "_extraGlobalAPI2",
+            "_extraGlobalAPI1", "_privateGlobalVariable"
+          ],
+          "objc_class": [
+            "SubClass", "SimpleInternalSPI",
+            "Basic6", "Basic1", "Base",
+            "Basic3", "Simple", "Basic4_2",
+            "Basic5", "FooClass", "Basic9",
+            "Basic8", "Basic2", "Basic4",
+            "A", "SimpleInternalAPI",
+            "ExternalManagedObject"
+          ],
+          "objc_eh_type": [
+            "SubClass", "SimpleInternalAPI",
+            "Base", "SimpleInternalSPI"
+          ],
+          "objc_ivar": [
+            "Basic4.ivar2", "Basic4_2.ivar1",
+            "Basic6.ivar1", "Basic4.ivar1",
+            "Basic4_2.ivar2"
+          ],
+          "weak": [
+            "_weakPrivateGlobalVariable", "_weakPublicGlobalVariable"
+          ]
+        }
+      }
+    ],
+    "flags": [
+      {
+        "attributes": [ "not_app_extension_safe"]
+      }
+    ],
+    "install_names": [
+      { "name": "/System/Library/Frameworks/Simple.framework/Versions/A/Simple" }
+    ],
+    "target_info": [
+      { "min_deployment": "10.12", "target": "x86_64-macos" }
+    ]
+  },
+  "tapi_tbd_version": 5
+}
+
+;--- inputs.json.in
+{
+  "headers": [ 
+  {
+    "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/Basic.h",
+    "type" : "public"
+  }, 
+  {
+    "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/External.h",
+    "type" : "public"
+  }, 
+  {
+    "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/Simple.h",
+    "type" : "public"
+  }, 
+  {
+    "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/SimpleAPI.h",
+    "type" : "public"
+  }, 
+  {
+    "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/PrivateHeaders/SimplePrivate.h",
+    "type" : "private"
+  }, 
+  {
+    "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/PrivateHeaders/SimplePrivateSPI.h",
+    "type" : "private"
+  }
+  ],
+  "version": "3"
+}
+
+;--- System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
+ at interface NSObject 
+ at end
+
+typedef unsigned char BOOL; 
+#ifndef NS_AVAILABLE
+#define NS_AVAILABLE(x,y) __attribute__((availability(macosx,introduced=x)))
+#endif 
+#ifndef NS_UNAVAILABLE
+#define NS_UNAVAILABLE  __attribute__((unavailable))
+#endif 
+#ifndef NS_DEPRECATED_MAC
+#define NS_DEPRECATED_MAC(x,y) __attribute__((availability(macosx,introduced=x,deprecated=y,message="" )));
+#endif 
+
+ at interface NSManagedObject
+ at end 
+
+ at interface NSSet 
+ at end 
diff --git a/clang/tools/clang-installapi/InstallAPIOpts.td b/clang/tools/clang-installapi/InstallAPIOpts.td
index 87f4c3327e8409..ab9e1fe7f2f949 100644
--- a/clang/tools/clang-installapi/InstallAPIOpts.td
+++ b/clang/tools/clang-installapi/InstallAPIOpts.td
@@ -29,3 +29,35 @@ def verify_mode_EQ : Joined<["--"], "verify-mode=">,
   HelpText<"Specify the severity and extend of the validation. Valid modes are ErrorsOnly, ErrorsAndWarnings, and Pedantic.">;
 def demangle : Flag<["--", "-"], "demangle">,
   HelpText<"Demangle symbols when printing warnings and errors">;
+
+// Additional input options.
+def extra_project_header : Separate<["-"], "extra-project-header">,
+  MetaVarName<"<path>">,
+  HelpText<"Add additional project header location for parsing">;
+def extra_project_header_EQ : Joined<["--"], "extra-project-header=">,
+  Alias<extra_project_header>;
+def exclude_project_header : Separate<["-"], "exclude-project-header">,
+  MetaVarName<"<glob>">,
+  HelpText<"Exclude project header from parsing">;
+def exclude_project_header_EQ : Joined<["--"], "exclude-project-header=">,
+  Alias<exclude_project_header>;
+def extra_public_header : Separate<["-"], "extra-public-header">,
+  MetaVarName<"<path>">,
+  HelpText<"Add additional public header location for parsing">;
+def extra_public_header_EQ : Joined<["--"], "extra-public-header=">,
+  Alias<extra_public_header>;
+def extra_private_header : Separate<["-"], "extra-private-header">,
+  MetaVarName<"<path>">,
+  HelpText<"Add additional private header location for parsing">;
+def extra_private_header_EQ : Joined<["--"], "extra-private-header=">,
+  Alias<extra_private_header>;
+def exclude_public_header : Separate<["-"], "exclude-public-header">,
+  MetaVarName<"<glob>">,
+  HelpText<"Exclude public header from parsing">;
+def exclude_public_header_EQ : Joined<["--"], "exclude-public-header=">,
+  Alias<exclude_public_header>;
+def exclude_private_header : Separate<["-"], "exclude-private-header">,
+  MetaVarName<"<glob>">,
+  HelpText<"Exclude private header from parsing">;
+def exclude_private_header_EQ : Joined<["--"], "exclude-private-header=">,
+  Alias<exclude_private_header>;
diff --git a/clang/tools/clang-installapi/Options.cpp b/clang/tools/clang-installapi/Options.cpp
index b8696bb7896d86..1b38a264ad1fe0 100644
--- a/clang/tools/clang-installapi/Options.cpp
+++ b/clang/tools/clang-installapi/Options.cpp
@@ -10,6 +10,7 @@
 #include "clang/Driver/Driver.h"
 #include "clang/Frontend/FrontendDiagnostic.h"
 #include "clang/InstallAPI/FileList.h"
+#include "clang/InstallAPI/HeaderFile.h"
 #include "clang/InstallAPI/InstallAPIDiagnostic.h"
 #include "llvm/Support/Program.h"
 #include "llvm/TargetParser/Host.h"
@@ -181,6 +182,26 @@ bool Options::processFrontendOptions(InputArgList &Args) {
   return true;
 }
 
+bool Options::addFilePaths(InputArgList &Args, PathSeq &Headers,
+                           OptSpecifier ID) {
+  for (const StringRef Path : Args.getAllArgValues(ID)) {
+    if ((bool)FM->getDirectory(Path, /*CacheFailure=*/false)) {
+      auto InputHeadersOrErr = enumerateFiles(*FM, Path);
+      if (!InputHeadersOrErr) {
+        Diags->Report(diag::err_cannot_open_file)
+            << Path << toString(InputHeadersOrErr.takeError());
+        return false;
+      }
+      // Sort headers to ensure deterministic behavior.
+      sort(*InputHeadersOrErr);
+      for (std::string &H : *InputHeadersOrErr)
+        Headers.emplace_back(std::move(H));
+    } else
+      Headers.emplace_back(Path);
+  }
+  return true;
+}
+
 std::vector<const char *>
 Options::processAndFilterOutInstallAPIOptions(ArrayRef<const char *> Args) {
   std::unique_ptr<llvm::opt::OptTable> Table;
@@ -220,6 +241,35 @@ Options::processAndFilterOutInstallAPIOptions(ArrayRef<const char *> Args) {
   if (const Arg *A = ParsedArgs.getLastArg(OPT_verify_against))
     DriverOpts.DylibToVerify = A->getValue();
 
+  // Handle exclude & extra header directories or files.
+  auto handleAdditionalInputArgs = [&](PathSeq &Headers,
+                                       clang::installapi::ID OptID) {
+    if (ParsedArgs.hasArgNoClaim(OptID))
+      Headers.clear();
+    return addFilePaths(ParsedArgs, Headers, OptID);
+  };
+
+  if (!handleAdditionalInputArgs(DriverOpts.ExtraPublicHeaders,
+                                 OPT_extra_public_header))
+    return {};
+
+  if (!handleAdditionalInputArgs(DriverOpts.ExtraPrivateHeaders,
+                                 OPT_extra_private_header))
+    return {};
+  if (!handleAdditionalInputArgs(DriverOpts.ExtraProjectHeaders,
+                                 OPT_extra_project_header))
+    return {};
+
+  if (!handleAdditionalInputArgs(DriverOpts.ExcludePublicHeaders,
+                                 OPT_exclude_public_header))
+    return {};
+  if (!handleAdditionalInputArgs(DriverOpts.ExcludePrivateHeaders,
+                                 OPT_exclude_private_header))
+    return {};
+  if (!handleAdditionalInputArgs(DriverOpts.ExcludeProjectHeaders,
+                                 OPT_exclude_project_header))
+    return {};
+
   /// Any unclaimed arguments should be forwarded to the clang driver.
   std::vector<const char *> ClangDriverArgs(ParsedArgs.size());
   for (const Arg *A : ParsedArgs) {
@@ -302,6 +352,77 @@ InstallAPIContext Options::createContext() {
       return Ctx;
     }
   }
+  // After initial input has been processed, add any extra headers.
+  auto HandleExtraHeaders = [&](PathSeq &Headers, HeaderType Type) -> bool {
+    assert(Type != HeaderType::Unknown && "Missing header type.");
+    for (const StringRef Path : Headers) {
+      if (!FM->getOptionalFileRef(Path)) {
+        Diags->Report(diag::err_no_such_header_file)
+            << Path << (unsigned)Type - 1;
+        return false;
+      }
+      SmallString<PATH_MAX> FullPath(Path);
+      FM->makeAbsolutePath(FullPath);
+
+      auto IncludeName = createIncludeHeaderName(FullPath);
+      Ctx.InputHeaders.emplace_back(
+          FullPath, Type, IncludeName.has_value() ? *IncludeName : "");
+      Ctx.InputHeaders.back().setExtra();
+    }
+    return true;
+  };
+
+  if (!HandleExtraHeaders(DriverOpts.ExtraPublicHeaders, HeaderType::Public) ||
+      !HandleExtraHeaders(DriverOpts.ExtraPrivateHeaders,
+                          HeaderType::Private) ||
+      !HandleExtraHeaders(DriverOpts.ExtraProjectHeaders, HeaderType::Project))
+    return Ctx;
+
+  // After all headers have been added, consider excluded headers.
+  std::vector<std::unique_ptr<HeaderGlob>> ExcludedHeaderGlobs;
+  std::set<const FileEntryRef> ExcludedHeaderFiles;
+  auto ParseGlobs = [&](const PathSeq &Paths, HeaderType Type) {
+    for (const StringRef Path : Paths) {
+      auto Glob = HeaderGlob::create(Path, Type);
+      if (Glob)
+        ExcludedHeaderGlobs.emplace_back(std::move(Glob.get()));
+      else {
+        consumeError(Glob.takeError());
+        if (auto File = FM->getFileRef(Path))
+          ExcludedHeaderFiles.emplace(*File);
+        else {
+          Diags->Report(diag::err_no_such_header_file)
+              << Path << (unsigned)Type;
+          return false;
+        }
+      }
+    }
+    return true;
+  };
+
+  if (!ParseGlobs(DriverOpts.ExcludePublicHeaders, HeaderType::Public) ||
+      !ParseGlobs(DriverOpts.ExcludePrivateHeaders, HeaderType::Private) ||
+      !ParseGlobs(DriverOpts.ExcludeProjectHeaders, HeaderType::Project))
+    return Ctx;
+
+  for (HeaderFile &Header : Ctx.InputHeaders) {
+    for (auto &Glob : ExcludedHeaderGlobs)
+      if (Glob->match(Header))
+        Header.setExcluded();
+  }
+  if (!ExcludedHeaderFiles.empty()) {
+    for (HeaderFile &Header : Ctx.InputHeaders) {
+      auto FileRef = FM->getFileRef(Header.getPath());
+      if (!FileRef)
+        continue;
+      if (ExcludedHeaderFiles.count(*FileRef))
+        Header.setExcluded();
+    }
+  }
+  // Report if glob was ignored.
+  for (const auto &Glob : ExcludedHeaderGlobs)
+    if (!Glob->didMatch())
+      Diags->Report(diag::warn_glob_did_not_match) << Glob->str();
 
   // Parse binary dylib and initialize verifier.
   if (DriverOpts.DylibToVerify.empty()) {
diff --git a/clang/tools/clang-installapi/Options.h b/clang/tools/clang-installapi/Options.h
index 2beeafc86bb086..c18309f693701e 100644
--- a/clang/tools/clang-installapi/Options.h
+++ b/clang/tools/clang-installapi/Options.h
@@ -31,6 +31,24 @@ struct DriverOptions {
   /// \brief Path to input file lists (JSON).
   llvm::MachO::PathSeq FileLists;
 
+  /// \brief Paths of extra public headers.
+  PathSeq ExtraPublicHeaders;
+
+  /// \brief Paths of extra private headers.
+  PathSeq ExtraPrivateHeaders;
+
+  /// \brief Paths of extra project headers.
+  PathSeq ExtraProjectHeaders;
+
+  /// \brief List of excluded public headers.
+  PathSeq ExcludePublicHeaders;
+
+  /// \brief List of excluded private headers.
+  PathSeq ExcludePrivateHeaders;
+
+  /// \brief List of excluded project headers.
+  PathSeq ExcludeProjectHeaders;
+
   /// \brief Mappings of target triples & tapi targets to build for.
   std::map<llvm::MachO::Target, llvm::Triple> Targets;
 
@@ -103,6 +121,9 @@ class Options {
   std::vector<std::string> &getClangFrontendArgs() { return FrontendArgs; }
 
 private:
+  bool addFilePaths(llvm::opt::InputArgList &Args, PathSeq &Headers,
+                    llvm::opt::OptSpecifier ID);
+
   DiagnosticsEngine *Diags;
   FileManager *FM;
   std::vector<std::string> FrontendArgs;
diff --git a/llvm/include/llvm/TextAPI/Utils.h b/llvm/include/llvm/TextAPI/Utils.h
index 31d3c45f9e2964..353859ca4cea6f 100644
--- a/llvm/include/llvm/TextAPI/Utils.h
+++ b/llvm/include/llvm/TextAPI/Utils.h
@@ -16,6 +16,7 @@
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Path.h"
+#include "llvm/Support/Regex.h"
 
 #if !defined(PATH_MAX)
 #define PATH_MAX 1024
@@ -68,5 +69,10 @@ std::error_code make_relative(StringRef From, StringRef To,
 /// \param IsSymLink Whether path points to a symlink.
 bool isPrivateLibrary(StringRef Path, bool IsSymLink = false);
 
+/// Create a regex rule from provided glob string.
+/// \param Glob String that represents glob input.
+/// \return The equivalent regex rule.
+llvm::Expected<llvm::Regex> createRegexFromGlob(llvm::StringRef Glob);
+
 } // namespace llvm::MachO
 #endif // LLVM_TEXTAPI_UTILS_H
diff --git a/llvm/lib/TextAPI/Utils.cpp b/llvm/lib/TextAPI/Utils.cpp
index b5c3999a86ea9d..61f4df1d4a6beb 100644
--- a/llvm/lib/TextAPI/Utils.cpp
+++ b/llvm/lib/TextAPI/Utils.cpp
@@ -152,3 +152,49 @@ bool llvm::MachO::isPrivateLibrary(StringRef Path, bool IsSymLink) {
   }
   return false;
 }
+
+static StringLiteral RegexMetachars = "()^$|+.[]\\{}";
+
+Expected<Regex> llvm::MachO::createRegexFromGlob(StringRef Glob) {
+  SmallString<128> RegexString("^");
+  unsigned NumWildcards = 0;
+  for (unsigned i = 0; i < Glob.size(); ++i) {
+    char C = Glob[i];
+    switch (C) {
+    case '?':
+      RegexString += '.';
+      break;
+    case '*': {
+      const char *PrevChar = i > 0 ? Glob.data() + i - 1 : nullptr;
+      NumWildcards = 1;
+      ++i;
+      while (i < Glob.size() && Glob[i] == '*') {
+        ++NumWildcards;
+        ++i;
+      }
+      const char *NextChar = i < Glob.size() ? Glob.data() + i : nullptr;
+
+      if ((NumWildcards > 1) && (PrevChar == nullptr || *PrevChar == '/') &&
+          (NextChar == nullptr || *NextChar == '/')) {
+        RegexString += "(([^/]*(/|$))*)";
+      } else
+        RegexString += "([^/]*)";
+      break;
+    }
+    default:
+      if (RegexMetachars.find(C) != StringRef::npos)
+        RegexString.push_back('\\');
+      RegexString.push_back(C);
+    }
+  }
+  RegexString.push_back('$');
+  if (NumWildcards == 0)
+    return make_error<StringError>("not a glob", inconvertibleErrorCode());
+
+  auto Rule = Regex(RegexString);
+  std::string Error;
+  if (!Rule.isValid(Error))
+    return make_error<StringError>(Error, inconvertibleErrorCode());
+
+  return Rule;
+}



More information about the cfe-commits mailing list