aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-06-02 22:08:07 +0000
committerDouglas Gregor <dgregor@apple.com>2009-06-02 22:08:07 +0000
commit2cc390e62014a9587fe423efdd68cfa45543d804 (patch)
treeb9c51c6b5926d4a4300ac9810546bef555f233e8
parent877db3852e29c5b5a2dc25b3fe4a3b78619aa904 (diff)
More PCH documentation
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72743 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--docs/PCHInternals.html245
-rw-r--r--docs/PCHLayout.graffle1495
-rw-r--r--docs/PCHLayout.pngbin0 -> 37899 bytes
3 files changed, 1738 insertions, 2 deletions
diff --git a/docs/PCHInternals.html b/docs/PCHInternals.html
index d90c446e9f..ef1dd37b55 100644
--- a/docs/PCHInternals.html
+++ b/docs/PCHInternals.html
@@ -63,9 +63,250 @@ with the <b><tt>-include-pch</tt></b> option:</p>
PCH file generation serializes the build when all compilations
require the PCH file to be up-to-date.</li>
</ul>
+
+<p>Clang's precompiled headers are designed with a compact on-disk
+representation, which minimizes both PCH creation time and the time
+required to initially load the PCH file. The PCH file itself contains
+a serialized representation of Clang's abstract syntax trees and
+supporting data structures, stored using the same compressed bitstream
+as <a href="http://llvm.org/docs/BitCodeFormat.html">LLVM's bitcode
+file format</a>.</p>
+
+<p>Clang's precompiled headers are loaded "lazily" from disk. When a
+PCH file is initially loaded, Clang reads only a small amount of data
+from the PCH file to establish where certain important data structures
+are stored. The amount of data read in this initial load is
+independent of the size of the PCH file, such that a larger PCH file
+does not lead to longer PCH load times. The actual header data in the
+PCH file--macros, functions, variables, types, etc.--is loaded only
+when it is referenced from the user's code, at which point only that
+entity (and those entities it depends on) are deserialized from the
+PCH file. With this approach, the cost of using a precompiled header
+for a translation unit is proportional to the amount of code actually
+used from the header, rather than being proportional to the size of
+the header itself.</p> </body>
+
+<h2>Precompiled Header Contents</h2>
+
+<img src="PCHLayout.png" align="right" alt="Precompiled header layout">
+
+<p>Clang's precompiled headers are organized into several different
+blocks, each of which contains the serialized representation of a part
+of Clang's internal representation. Each of the blocks corresponds to
+either a block or a record within <a
+ href="http://llvm.org/docs/BitCodeFormat.html">LLVM's bitstream
+format</a>. The contents of each of these logical blocks are described
+below.</p>
+
+<h3 name="metadata">Metadata Block</h3>
+
+<p>The metadata block contains several records that provide
+information about how the precompiled header was built. This metadata
+is primarily used to validate the use of a precompiled header. For
+example, a precompiled header built for x86 (32-bit) cannot be used
+when compiling for x86-64 (64-bit). The metadata block contains
+information about:</p>
+
+<dl>
+ <dt>Language options</dt>
+ <dd>Describes the particular language dialect used to compile the
+PCH file, including major options (e.g., Objective-C support) and more
+minor options (e.g., support for "//" comments). The contents of this
+record correspond to the <code>LangOptions</code> class.</dd>
+
+ <dt>Target architecture</dt>
+ <dd>The target triple that describes the architecture, platform, and
+ABI for which the PCH file was generated, e.g.,
+<code>i386-apple-darwin9</code>.</dd>
-<p>More to be written...</p>
+ <dt>PCH version</dt>
+ <dd>The major and minor version numbers of the precompiled header
+format. Changes in the minor version number should not affect backward
+compatibility, while changes in the major version number imply that a
+newer compiler cannot read an older precompiled header (and
+vice-versa).</dd>
+
+ <dt>Original file name</dt>
+ <dd>The full path of the header that was used to generate the
+precompiled header.</dd> </dl>
+
+ <dt>Predefines buffer</dt>
+ <dd>Although not explicitly stored as part of the metadata, the
+predefines buffer is used in the validation of the precompiled header.
+The predefines buffer itself contains code generated by the compiler
+to initialize the preprocessor state according to the current target,
+platform, and command-line options. For example, the predefines buffer
+will contain "<code>#define __STDC__ 1</code>" when we are compiling C
+without Microsoft extensions. The predefines buffer itself is stored
+within the <a href="#sourcemgr">source manager block</a>, but its
+contents are verified along with the rest of the metadata.</dd> </dl>
+
+<h3 name="sourcemgr">Source Manager Block</h3>
+
+<p>The source manager block contains the serialized representation of
+Clang's <a
+ href="InternalsManual.html#SourceLocation">SourceManager</a> class,
+which handles the mapping from source locations (as represented in
+Clang's abstract syntax tree) into actual column/line positions within
+a source file or macro instantiation. The precompiled header's
+representation of the source manager also includes information about
+all of the headers that were (transitively) included when building the
+precompiled header.</p>
+
+<p>The bulk of the source manager block is dedicated to information
+about the various files, buffers, and macro instantiations into which
+a source location can refer. Each of these is referenced by a numeric
+"file ID", which is a unique number (allocated starting at 1) stored
+in the source location. Clang serializes the information for each kind
+of file ID, along with an index that maps file IDs to the position
+within the PCH file where the information about that file ID is
+stored. The data associated with a file ID is loaded only when
+required by the front end, e.g., to emit a diagnostic that includes a
+macro instantiation history inside the header itself.</p>
+
+<p>The source manager block also contains information about all of the
+headers that were included when building the precompiled header. This
+includes information about the controlling macro for the header (e.g.,
+when the preprocessor identified that the contents of the header
+dependent on a macro like <code>LLVM_CLANG_SOURCEMANAGER_H</code>)
+along with a cached version of the results of the <code>stat()</code>
+system calls performed when building the precompiled header. The
+latter is particularly useful in reducing system time when searching
+for include files.</p>
+
+<h3 name="preprocessor">Preprocessor Block</h3>
+
+<p>The preprocessor block contains the serialized representation of
+the preprocessor. Specifically, it contains all of the macros that
+have been defined by the end of the header used to build the
+precompiled header, along with the token sequences that comprise each
+macro. The macro definitions are only read from the PCH file when the
+name of the macro first occurs in the program. This lazy loading of
+macro definitions is trigged by lookups into the <a
+ href="#idtable">identifier table</a>.</p>
+
+<h3 name="types">Types Block</h3>
+
+<p>The types block contains the serialized representation of all of
+the types referenced in the translation unit. Each Clang type node
+(<code>PointerType</code>, <code>FunctionProtoType</code>, etc.) has a
+corresponding record type in the PCH file. When types are deserialized
+from the precompiled header, the data within the record is used to
+reconstruct the appropriate type node using the AST context.</p>
+
+<p>Each type has a unique type ID, which is an integer that uniquely
+identifies that type. Type ID 0 represents the NULL type, type IDs
+less than <code>NUM_PREDEF_TYPE_IDS</code> represent predefined types
+(<code>void</code>, <code>float</code>, etc.), while other
+"user-defined" type IDs are assigned consecutively from
+<code>NUM_PREDEF_TYPE_IDS</code> upward as the types are encountered.
+The PCH file has an associated mapping from the user-defined types
+block to the location within the types block where the serialized
+representation of that type resides, enabling lazy deserialization of
+types. When a type is referenced from within the PCH file, that
+reference is encoded using the type ID shifted left by 3 bits. The
+lower three bits are used to represent the <code>const</code>,
+<code>volatile</code>, and <code>restrict</code> qualifiers, as in
+Clang's <a
+ href="http://clang.llvm.org/docs/InternalsManual.html#Type">QualType</a>
+class.</p>
+
+<h3 name="decls">Declarations Block</h3>
+
+<p>The declarations block contains the serialized representation of
+all of the declarations referenced in the translation unit. Each Clang
+declaration node (<code>VarDecl</code>, <code>FunctionDecl</code>,
+etc.) has a corresponding record type in the PCH file. When
+declarations are deserialized from the precompiled header, the data
+within the record is used to build and populate a new instance of the
+corresponding <code>Decl</code> node. As with types, each declaration
+node has a numeric ID that is used to refer to that declaration within
+the PCH file. In addition, a lookup table provides a mapping from that
+numeric ID to the offset within the precompiled header where that
+declaration is described.</p>
+
+<p>Declarations in Clang's abstract syntax trees are stored
+hierarchically. At the top of the hierarchy is the translation unit
+(<code>TranslationUnitDecl</code>), which contains all of the
+declarations in the translation unit. These declarations---such as
+functions or struct types---may also contain other declarations inside
+them, and so on. Within Clang, each declaration is stored within a <a
+href="http://clang.llvm.org/docs/InternalsManual.html#DeclContext">declaration
+context</a>, as represented by the <code>DeclContext</code> class.
+Declaration contexts provide the mechanism to perform name lookup
+within a given declaration (e.g., find the member named <code>x</code>
+in a structure) and iterate over the declarations stored within a
+context (e.g., iterate over all of the fields of a structure for
+structure layout).</p>
+
+<p>In Clang's precompiled header format, deserializing a declaration
+that is a <code>DeclContext</code> is a separate operation from
+deserializing all of the declarations stored within that declaration
+context. Therefore, Clang will deserialize the translation unit
+declaration without deserializing the declarations within that
+translation unit. When required, the declarations stored within a
+declaration context will be serialized. There are two representations
+of the declarations within a declaration context, which correspond to
+the name-lookup and iteration behavior described above:</p>
+
+<ul>
+ <li>When the front end performs name lookup to find a name
+ <code>x</code> within a given declaration context (for example,
+ during semantic analysis of the expression <code>p-&gt;x</code>,
+ where <code>p</code>'s type is defined in the precompiled header),
+ Clang deserializes a hash table mapping from the names within that
+ declaration context to the declaration IDs that represent each
+ visible declaration with that name. The entire hash table is
+ deserialized at this point (into the <code>llvm::DenseMap</code>
+ stored within each <code>DeclContext</code> object), but the actual
+ declarations are not yet deserialized. In a second step, those
+ declarations with the name <code>x</code> will be deserialized and
+ will be used as the result of name lookup.</li>
+
+ <li>When the front end performs iteration over all of the
+ declarations within a declaration context, all of those declarations
+ are immediately de-serialized. For large declaration contexts (e.g.,
+ the translation unit), this operation is expensive; however, large
+ declaration contexts are not traversed in normal compilation, since
+ such a traversal is unnecessary. However, it is common for the code
+ generator and semantic analysis to traverse declaration contexts for
+ structs, classes, unions, and enumerations, although those contexts
+ contain relatively few declarations in the common case.</li>
+</ul>
+
+<h3 name="idtable">Identifier Table Block</h3>
+
+<p>The identifier table block contains an on-disk hash table that maps
+each identifier mentioned within the precompiled header to the
+serialized representation of the identifier's information (e.g, the
+<code>IdentifierInfo</code> structure). The serialized representation
+contains:</p>
+
+<ul>
+ <li>The actual identifier string.</li>
+ <li>Flags that describe whether this identifier is the name of a
+ built-in, a poisoned identifier, an extension token, or a
+ macro.</li>
+ <li>If the identifier names a macro, the offset of the macro
+ definition within the <a href="#preprocessor">preprocessor
+ block</a>.</li>
+ <li>If the identifier names one or more declarations visible from
+ translation unit scope, the <a href="#decls">declaration IDs</a> of these
+ declarations.</li>
+</ul>
+
+<p>When a precompiled header is loaded, the precompiled header
+mechanism introduces itself into the identifier table as an external
+lookup source. Thus, when the user program refers to an identifier
+that has not yet been seen, Clang will perform a lookup into the
+on-disk hash table ... FINISH THIS!
+
+<p>A separate table provides a mapping from the numeric representation
+of identifiers used in the PCH file to the location within the on-disk
+hash table where that identifier is stored. This mapping is used when
+deserializing the name of a declaration, the identifier of a token, or
+any other construct in the PCH file that refers to a name.</p>
+
</div>
-</body>
</html>
diff --git a/docs/PCHLayout.graffle b/docs/PCHLayout.graffle
new file mode 100644
index 0000000000..bd92b381ac
--- /dev/null
+++ b/docs/PCHLayout.graffle
@@ -0,0 +1,1495 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>137.11.0.108132</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2009-06-02 11:19:43 -0700</string>
+ <key>Creator</key>
+ <string>Douglas Gregor</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1 0/72 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 338}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>13</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.175793</string>
+ <key>g</key>
+ <string>0.402929</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Method Pool}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{32, 58}, {110, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>12</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Precompiled Header}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 190}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>11</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.796208</string>
+ <key>r</key>
+ <string>0.324589</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Types}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 227}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>10</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.382716</string>
+ <key>r</key>
+ <string>0.524072</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Declarations}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 301}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>9</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.54645</string>
+ <key>g</key>
+ <string>0.242877</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Selector Table}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 264}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>8</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.99938</string>
+ <key>g</key>
+ <string>0.457913</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Identifier Table}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 153}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>7</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.669993</string>
+ <key>g</key>
+ <string>1</string>
+ <key>r</key>
+ <string>0.254644</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Preprocessor}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 116}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>6</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.258332</string>
+ <key>g</key>
+ <string>1</string>
+ <key>r</key>
+ <string>0.593784</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Source Manager}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{35, 79}, {104, 30}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>5</integer>
+ <key>Layer</key>
+ <integer>0</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.270873</string>
+ <key>g</key>
+ <string>1</string>
+ <key>r</key>
+ <string>0.979351</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1019
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Metadata}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{21, 47}, {132, 337}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>Layer</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>2</integer>
+ <key>GradientAngle</key>
+ <real>90</real>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ </dict>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Sub-blocks</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>PCH Block</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2009-06-02 11:33:35 -0700</string>
+ <key>Modifier</key>
+ <string>Douglas Gregor</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>QuickLookPreview</key>
+ <data>
+ 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
+ xcryXYOE70kNEkobxshDE4ypYRSoiytISv3yGZm4zKPE7Ywp+IglQYJWgwTChjH4nUX7
+ mChyz8RFU/Cm0djBxsKYYY4xxtFQMIZNZwzFl4KkF+0p2TuF0grZUZVbJo9nCC4avHX6
+ 5TPu21THQ6ZDTlXfKWwJGV+6jt4pVAFzTKRsFyuFrh91Y2NCdsnMMciehgIyG7t8IK5B
+ wo+Fr10+Szwn6ruc9/gg1lBejRunB4nffX8eGiNabux1eRgluoXNvU0b8TPK+aftZbPm
+ c6VqTqXO+GwX9tPSUmCBaVQtVsBWSKvfPFX6rfLilG9geF9Wfu3U7pHc+Amvv8a632rU
+ ApatUJXChqpQ5X1pE+GgiuWEkxS6ftSNjZWqZo75zdFQUhWNURXiG1SNiz1TKK2QHVVC
+ jst4hVBhsScMHldYivqOQbdRNekzJaFVqkLYQGY/eWgTRe5XWNIrbNPISXBjoeowxyDD
+ JnmmsOmQKX4TVWuaX6Aq6oQQA94Op1R9PaliIYQ+k+q2LFr2Obclni+Ewui/o+Qf98GW
+ tPxoiQALXr8Mt8b1Tx/CeB+2pYAMp4Zi/fG4wEtixMfj2HTEzgi0Ycb4amPP5b9ZnI0v
+ PSMUx9gx+2svFAQHa+CwjxMeK/hmrJdEXipcJkUApJWGeI3y4wOqhoVfJ5F2RZGP7iKN
+ pyNOWiJvLddz41RQDa1EHoUNDamCejZRZCyn9YM8HV2WBl+wrRsbS+QNcwYNaSjLCjSd
+ horp1RcK/1egQ4a0hQxVsJVkuQT45Tu3dI8PBLnl00oKPFHIfFLRHHQcQZaLwCYKZCyn
+ kOUDAXIRNuPBWDc2VshmzgoZhnIPNAYZ4hp5b7xQ8Dh9gdC4JNo847I6I7Tjd8b+WdHy
+ /yfrGPwedDTqfhg/DeHhwq3vkJ//D8Opeh8KZW5kc3RyZWFtCmVuZG9iago1IDAgb2Jq
+ CjIzNDUKZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAzIDAgUiAv
+ UmVzb3VyY2VzIDYgMCBSIC9Db250ZW50cyA0IDAgUiAvTWVkaWFCb3ggWzAgMCA1NzYg
+ NzMzXQo+PgplbmRvYmoKNiAwIG9iago8PCAvUHJvY1NldCBbIC9QREYgL1RleHQgL0lt
+ YWdlQiAvSW1hZ2VDIC9JbWFnZUkgXSAvQ29sb3JTcGFjZSA8PCAvQ3MyIDEzIDAgUgov
+ Q3MxIDcgMCBSID4+IC9Gb250IDw8IC9GMS4wIDE0IDAgUiA+PiAvWE9iamVjdCA8PCAv
+ SW0xIDggMCBSIC9JbTIgMTEgMCBSCj4+IC9TaGFkaW5nIDw8IC9TaDEgMTAgMCBSID4+
+ ID4+CmVuZG9iagoxMCAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5
+ cGUgMiAvQ29vcmRzIFsgNjYuNSAtMTY5IDY2LjQ5OTk3IDE2OSBdIC9Eb21haW4KWyAw
+ IDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMTUgMCBSID4+CmVu
+ ZG9iago4IDAgb2JqCjw8IC9MZW5ndGggOSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5
+ cGUgL0ltYWdlIC9XaWR0aCAzMDggL0hlaWdodCA3MTggL0ludGVycG9sYXRlCnRydWUg
+ L0NvbG9yU3BhY2UgMTYgMCBSIC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDE3IDAg
+ UiAvQml0c1BlckNvbXBvbmVudAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVh
+ bQp4Ae3QMQEAAADCoPVPbQsviEBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAw