diff options
Diffstat (limited to 'docs')
-rw-r--r-- | docs/html/google/gcm/ccs.jd | 152 | ||||
-rw-r--r-- | docs/html/images/gcm/CCS-ack.png | bin | 55599 -> 54832 bytes | |||
-rw-r--r-- | docs/image_sources/gcm/CCS-ack.graffle | 1580 |
3 files changed, 1677 insertions, 55 deletions
diff --git a/docs/html/google/gcm/ccs.jd b/docs/html/google/gcm/ccs.jd index d2177ca..03addfd 100644 --- a/docs/html/google/gcm/ccs.jd +++ b/docs/html/google/gcm/ccs.jd @@ -8,7 +8,7 @@ page.title=GCM Cloud Connection Server (XMPP) <h2>In this document</h2> <ol class="toc"> - <li><a href="#usage">How to Use CCS</a> + <li><a href="#connecting">Establishing a Connection</a> <ol class="toc"> <li><a href="#auth">Authentication</a></li> </ol> @@ -46,19 +46,20 @@ target="_android">CCS and User Notifications Signup Form</a></li> <p class="note"><strong>Note:</strong> To try out this feature, sign up using <a href="https://services.google.com/fb/forms/gcm/">this form</a>.</p> -<p>The GCM Cloud Connection Server (CCS) is a connection server based on XMPP. -CCS allows 3rd-party app servers (which you're -responsible for implementing) to communicate -with Android devices by establishing a persistent TCP connection with Google -servers using the XMPP protocol. This communication is asynchronous and bidirectional.</p> +<p>The GCM Cloud Connection Server (CCS) is an XMPP endpoint that provides a +persistent, asynchronous, bidirectional connection to Google servers. The +connection can be used to send and receive messages between your server and +your users' GCM-connected devices.</p> + <p>You can continue to use the HTTP request mechanism to send messages to GCM servers, side-by-side with CCS which uses XMPP. Some of the benefits of CCS include:</p> + <ul> <li>The asynchronous nature of XMPP allows you to send more messages with fewer resources.</li> - <li>Communication is bidirectional—not only can the server send messages -to the device, but the device can send messages back to the server.</li> -<li>You can send messages back using the same connection used for receiving, + <li>Communication is bidirectional—not only can your server send messages +to the device, but the device can send messages back to your server.</li> + <li>The device can send messages back using the same connection used for receiving, thereby improving battery life.</li> </ul> @@ -73,22 +74,34 @@ APIs. For examples, see <a href="server.html#params">Implementing GCM Server</a> for a list of all the message parameters and which connection server(s) supports them.</p> +<h2 id="connecting">Establishing a Connection</h2> -<h2 id="usage">How to Use CCS</h2> +<p>CCS just uses XMPP as an authenticated transport layer, so you can use most +XMPP libraries to manage the connection. For an example, see <a href="#smack"> +Java sample using the Smack library</a>.</p> -<p>GCM Cloud Connection Server (CCS) is an XMPP endpoint, running on -{@code http://gcm.googleapis.com} port 5235.</p> +<p>The CCS XMPP endpoint runs at {@code gcm.googleapis.com:5235}. When testing +functionality (with non-production users), you should instead connect to +{@code gcm-staging.googleapis.com:5236} (note the different port). Testing on +staging (a smaller environment where the latest CCS builds run) is beneficial +both for isolating real users from test code, as well as for early detection of +unexpected behavior changes.</p> -<p>CCS requires a Transport Layer Security (TLS) connection. That means the XMPP -client must initiate a TLS connection. -For example in Java, you would call {@code setSocketFactory(SSLSocketFactory)}.</p> +<p>The connection has two important requirements:</p> -<p>CCS requires a SASL PLAIN authentication mechanism using -{@code <your_GCM_Sender_Id>@gcm.googleapis.com} (GCM sender ID) and the -API key as the password, where the sender ID and API key are the same as described -in <a href="gs.html">Getting Started</a>.</p> +<ul> + <li>You must initiate a Transport Layer Security (TLS) connection. Note that + CCS doesn't currently support the <a href="http://xmpp.org/rfcs/rfc3920.html" + class="external-link" target="_android">STARTTLS extension</a>.</li> + <li>CCS requires a SASL PLAIN authentication mechanism using + {@code <your_GCM_Sender_Id>@gcm.googleapis.com} (GCM sender ID) + and the API key as the password, where the sender ID and API key are the same + as described in <a href="gs.html">Getting Started</a>.</li> +</ul> -<p> You can use most XMPP libraries to interact with CCS.</p> +<p>If at any point the connection fails, you should immediately reconnect. +There is no need to back off after a disconnect that happens after +authentication.</p> <h3 id="auth">Authentication</h3> @@ -100,11 +113,11 @@ in <a href="gs.html">Getting Started</a>.</p> </pre> <h4>Server</h4> <pre><str:features xmlns:str="http://etherx.jabber.org/streams"> - <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"> - <mechanism>X-OAUTH2</mechanism> - <mechanism>X-GOOGLE-TOKEN</mechanism> - <mechanism>PLAIN</mechanism> - </mechanisms> + <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"> + <mechanism>X-OAUTH2</mechanism> + <mechanism>X-GOOGLE-TOKEN</mechanism> + <mechanism>PLAIN</mechanism> + </mechanisms> </str:features> </pre> @@ -118,16 +131,18 @@ mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth> <pre><success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/></pre> <h2 id="format">Message Format</h2> -<p>CCS uses normal XMPP <code><message></code> stanzas. The body of the message must be: -</p> +<p>Once the XMPP connection is established, CCS and your server use normal XMPP +<code><message></code> stanzas to send JSON-encoded messages back and +forth. The body of the <code><message></code> must be:</p> <pre> <gcm xmlns:google:mobile:data> <em>JSON payload</em> </gcm> </pre> -<p>The JSON payload for server-to-device is similar to what the GCM http endpoint -uses, with these exceptions:</p> +<p>The JSON payload for regular GCM messages is similar to +<a href="http.html#request">what the GCM http endpoint uses</a>, with these +exceptions:</p> <ul> <li>There is no support for multiple recipients.</li> <li>{@code to} is used instead of {@code registration_ids}.</li> @@ -136,14 +151,13 @@ identifies the message in an XMPP connection. The ACK or NACK from CCS uses the {@code message_id} to identify a message sent from 3rd-party app servers to CCS. Therefore, it's important that this {@code message_id} not only be unique, but always present.</li> +</ul> -<li>For ACK/NACK messages that are special control messages, you also need to -include a {@code message_type} field in the JSON message. The value can be either -'ack' or 'nack'. For example: +<p>In addition to regular GCM messages, control messages are sent, indicated by +the {@code message_type} field in the JSON object. The value can be either +'ack' or 'nack', or 'control' (see formats below). Any GCM message with an +unknown {@code message_type} can be ignored by your server.</p> -<pre>message_type = ('ack');</pre> - </li> -</ul> <p>For each device message your app server receives from CCS, it needs to send an ACK message. It never needs to send a NACK message. If you don't send an ACK for a message, @@ -251,7 +265,9 @@ message is "nack". A NACK message contains:</p> </message></pre> -<p>The following table lists some of the more common NACK error codes.</p> +<p>The following table lists NACK error codes. Unless otherwise +indicated, a NACKed message should not be retried. Unexpected NACK error codes +should be treated the same as {@code INTERNAL_SERVER_ERROR}.</p> <p class="table-caption" id="table1"> <strong>Table 1.</strong> NACK error codes.</p> @@ -262,8 +278,17 @@ message is "nack". A NACK message contains:</p> <th>Description</th> </tr> <tr> +<td>{@code BAD_ACK}</td> +<td>The ACK message is improperly formed.</td> +</tr> +<tr> <td>{@code BAD_REGISTRATION}</td> -<td>The device has a registration ID, but it's invalid.</td> +<td>The device has a registration ID, but it's invalid or expired.</td> +</tr> +<tr> +<td>{@code CONNECTION_DRAINING}</td> +<td>The message couldn't be processed because the connection is draining. The +message should be immediately retried over another connection.</td> </tr> <tr> <td>{@code DEVICE_UNREGISTERED}</td> @@ -274,25 +299,20 @@ message is "nack". A NACK message contains:</p> <td>The server encountered an error while trying to process the request.</td> </tr> <tr> -<td>{@code SERVICE_UNAVAILABLE}</td> -<td>The CCS connection server is temporarily unavailable, try again later -(using exponential backoff, etc.).</td> +<td>{@code INVALID_JSON}</td> +<td>The JSON message payload was not valid.</td> </tr> <tr> -<td>{@code BAD_ACK}</td> -<td>The ACK message is improperly formed.</td> -</tr> -<tr> -<td>{@code AUTHENTICATION_FAILED}</td> -<td>This is a 401 error indicating that there was an error authenticating the sender account.</td> -</tr> -<tr> -<td>{@code INVALID_TTL}</td> -<td>There was an error in the supplied "time to live" value.</td> +<td>{@code QUOTA_EXCEEDED}</td> +<td>The rate of messages to a particular registration ID (in other words, to a +sender/device pair) is too high. If you want to retry the message, try using a slower +rate.</td> </tr> <tr> -<td>{@code JSON_TYPE_ERROR}</td> -<td>There was an error in the supplied JSON data type.</td> +<td>{@code SERVICE_UNAVAILABLE}</td> +<td>CCS is not currently able to process the message. The +message should be retried over the same connection using exponential backoff +with an initial delay of 1 second.</td> </tr> </table> @@ -319,6 +339,28 @@ A stanza error contains:</p> </message> </pre> +<h4 id="control">Control messages</h4> + +<p>Periodically, CCS needs to close down a connection to perform load balancing. Before it +closes the connection, CCS sends a {@code CONNECTION_DRAINING} message to indicate that the connection is being drained +and will be closed soon. "Draining" refers to shutting off the flow of messages coming into a +connection, but allowing whatever is already in the pipeline to continue. When you receive +a {@code CONNECTION_DRAINING} message, you should immediately begin sending messages to another CCS +connection, opening a new connection if necessary. You should, however, keep the original +connection open and continue receiving messages that may come over the connection (and +ACKing them)—CCS will handle initiating a connection close when it is ready.</p> + +<p>The {@code CONNECTION_DRAINING} message looks like this:</p> +<pre><message> + <data:gcm xmlns:data="google:mobile:data"> + { + "message_type":"control" + "control_type":"CONNECTION_DRAINING" + } + </data:gcm> +</message></pre> + +<p>{@code CONNECTION_DRAINING} is currently the only {@code control_type} supported.</p> <h2 id="upstream">Upstream Messages</h2> @@ -381,7 +423,7 @@ response to the above message:</p> <p>Every message sent to CCS receives either an ACK or a NACK response. Messages that haven't received one of these responses are considered pending. If the pending -message count reaches 1000, the 3rd-party app server should stop sending new messages +message count reaches 100, the 3rd-party app server should stop sending new messages and wait for CCS to acknowledge some of the existing pending messages as illustrated in figure 1:</p> @@ -395,7 +437,7 @@ figure 1:</p> if there are too many unacknowledged messages. Therefore, the 3rd-party app server should "ACK" upstream messages, received from the client application via CCS, as soon as possible to maintain a constant flow of incoming messages. The aforementioned pending message limit doesn't -apply to these ACKs. Even if the pending message count reaches 1000, the 3rd-party app server +apply to these ACKs. Even if the pending message count reaches 100, the 3rd-party app server should continue sending ACKs for messages received from CCS to avoid blocking delivery of new upstream messages.</p> @@ -795,7 +837,7 @@ USERNAME = "Your GCM Sender Id" PASSWORD = "API Key" REGISTRATION_ID = "Registration Id of the target device" -unacked_messages_quota = 1000 +unacked_messages_quota = 100 send_queue = [] # Return a random alphanumerical id diff --git a/docs/html/images/gcm/CCS-ack.png b/docs/html/images/gcm/CCS-ack.png Binary files differindex bce2ab2..4633157 100644 --- a/docs/html/images/gcm/CCS-ack.png +++ b/docs/html/images/gcm/CCS-ack.png diff --git a/docs/image_sources/gcm/CCS-ack.graffle b/docs/image_sources/gcm/CCS-ack.graffle new file mode 100644 index 0000000..addd456 --- /dev/null +++ b/docs/image_sources/gcm/CCS-ack.graffle @@ -0,0 +1,1580 @@ +<?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>139.18.0.187838</string> + </array> + <key>AutoAdjust</key> + <true/> + <key>BackgroundGraphic</key> + <dict> + <key>Bounds</key> + <string>{{0, 0}, {576.00002479553223, 733}}</string> + <key>Class</key> + <string>SolidGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>12</real> + </dict> + <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>BaseZoom</key> + <integer>0</integer> + <key>CanvasOrigin</key> + <string>{0, 0}</string> + <key>ColumnAlign</key> + <integer>1</integer> + <key>ColumnSpacing</key> + <real>36</real> + <key>CreationDate</key> + <string>2013-08-08 01:54:22 +0000</string> + <key>Creator</key> + <string>Katie McCormick</string> + <key>DisplayScale</key> + <string>1 0/72 in = 1.0000 in</string> + <key>GraphDocumentVersion</key> + <integer>8</integer> + <key>GraphicsList</key> + <array> + <dict> + <key>Bounds</key> + <string>{{89, 329}, {169, 44}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>250</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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 Now app server can send\ +message no. 101}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{102, 266}, {114, 44}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>249</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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 App server waits\ +for ack 1}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{153, 154}, {98, 44}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>244</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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 Average\ +response time}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>226</integer> + <key>Position</key> + <real>0.375</real> + </dict> + <key>ID</key> + <integer>242</integer> + <key>Points</key> + <array> + <string>{263.00000095367432, 314.5}</string> + <string>{261, 99}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.112257</string> + <key>g</key> + <string>0.107007</string> + <key>r</key> + <string>0.934433</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>227</integer> + <key>Position</key> + <real>0.34722220897674561</real> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>227</integer> + <key>Position</key> + <real>0.3541666567325592</real> + </dict> + <key>ID</key> + <integer>241</integer> + <key>Points</key> + <array> + <string>{261, 99}</string> + <string>{262.50000071525574, 314.5}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.112257</string> + <key>g</key> + <string>0.107007</string> + <key>r</key> + <string>0.934433</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>226</integer> + <key>Position</key> + <real>0.375</real> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>227</integer> + </dict> + <key>ID</key> + <integer>240</integer> + <key>Points</key> + <array> + <string>{257.5, 336.5}</string> + <string>{288, 314.5}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.112257</string> + <key>g</key> + <string>0.107007</string> + <key>r</key> + <string>0.934433</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>239</integer> + <key>Points</key> + <array> + <string>{231, 288.50000116229057}</string> + <string>{231, 251.25}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.112257</string> + <key>g</key> + <string>0.107007</string> + <key>r</key> + <string>0.934433</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>238</integer> + <key>Position</key> + <real>0.56800001859664917</real> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>238</integer> + <key>Points</key> + <array> + <string>{231, 253}</string> + <string>{231, 315.5}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.112257</string> + <key>g</key> + <string>0.107007</string> + <key>r</key> + <string>0.934433</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{476, 33}, {49, 32}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>18</real> + </dict> + <key>ID</key> + <integer>230</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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs36 \cf0 CCS}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{243, 35}, {101, 32}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>18</real> + </dict> + <key>ID</key> + <integer>229</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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs36 \cf0 App Server}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>228</integer> + <key>Points</key> + <array> + <string>{288, 252}</string> + <string>{216, 252}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>227</integer> + <key>Points</key> + <array> + <string>{288, 314.5}</string> + <string>{216, 314.5}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>226</integer> + <key>Points</key> + <array> + <string>{288, 99}</string> + <string>{216, 99}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{393.69128000000001, 348.37441999999999}, {57, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>223</integer> + <key>Rotation</key> + <real>23</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 no. 101}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{290.12054000000001, 420.17102}, {60, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>ID</key> + <integer>222</integer> + <key>Rotation</key> + <real>341</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 ack 100}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>220</integer> + <key>Points</key> + <array> + <string>{504, 351}</string> + <string>{288, 463}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{430.51697000000001, 279.19488999999999}, {44, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>ID</key> + <integer>219</integer> + <key>Rotation</key> + <real>341</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 ack.. }</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{390.63733000000002, 258.42700000000002}, {44, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>ID</key> + <integer>218</integer> + <key>Rotation</key> + <real>341</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 ack 2}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{290.74178999999998, 239.21059}, {57, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>217</integer> + <key>Rotation</key> + <real>23</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 no. 100}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{342.63623000000001, 185.82861}, {38, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>216</integer> + <key>Rotation</key> + <real>18</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 no...}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{361.60431, 234}, {44, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>ID</key> + <integer>209</integer> + <key>Rotation</key> + <real>341</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 ack 1}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{351.16005999999999, 153.43960999999999}, {42, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>172</integer> + <key>Rotation</key> + <real>18</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 no. 2}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{363, 117}, {42, 27}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>171</integer> + <key>Rotation</key> + <real>18</real> + <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>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs28 \cf0 no. 1}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>169</integer> + <key>Points</key> + <array> + <string>{504, 200.62189000000001}</string> + <string>{288, 312.62189000000001}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>168</integer> + <key>Points</key> + <array> + <string>{504, 241.00763000000001}</string> + <string>{288, 353.00763000000001}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>167</integer> + <key>Points</key> + <array> + <string>{504, 279}</string> + <string>{288, 391}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>165</integer> + <key>Points</key> + <array> + <string>{289, 391}</string> + <string>{505, 492}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>164</integer> + <key>Points</key> + <array> + <string>{288, 353}</string> + <string>{504, 454}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>163</integer> + <key>Points</key> + <array> + <string>{288, 313}</string> + <string>{504, 414}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>162</integer> + <key>Points</key> + <array> + <string>{288, 180}</string> + <string>{504, 281}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>161</integer> + <key>Points</key> + <array> + <string>{288, 252}</string> + <string>{504, 353}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>160</integer> + <key>Points</key> + <array> + <string>{288, 139.5}</string> + <string>{504, 240.5}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>158</integer> + <key>Position</key> + <real>0.29398149251937866</real> + </dict> + <key>ID</key> + <integer>159</integer> + <key>Points</key> + <array> + <string>{288, 98.000000596046448}</string> + <string>{504, 199.00000476837158}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.934433</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.122713</string> + </dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>157</integer> + <key>Position</key> + <real>0.060185186564922333</real> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>158</integer> + <key>Points</key> + <array> + <string>{504, 72}</string> + <string>{504, 504}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>157</integer> + <key>Points</key> + <array> + <string>{288, 72}</string> + <string>{288, 504}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + </array> + <key>GridInfo</key> + <dict> + <key>ShowsGrid</key> + <string>YES</string> + </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>Layer 1</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>2014-01-22 22:42:38 +0000</string> + <key>Modifier</key> + <string>Katie McCormick</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>NSHorizonalPagination</key> + <array> + <string>int</string> + <string>0</string> + </array> + <key>NSLeftMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + <key>NSPaperSize</key> + <array> + <string>size</string> + <string>{612.00002479553223, 792}</string> + </array> + <key>NSPrintReverseOrientation</key> + <array> + <string>int</string> + <string>0</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>ReadOnly</key> + <string>NO</string> + <key>RowAlign</key> + <integer>1</integer> + <key>RowSpacing</key> + <real>36</real> + <key>SheetTitle</key> + <string>Canvas 1</string> + <key>SmartAlignmentGuidesActive</key> + <string>YES</string> + <key>SmartDistanceGuidesActive</key> + <string>YES</string> + <key>UniqueID</key> + <integer>1</integer> + <key>UseEntirePage</key> + <false/> + <key>VPages</key> + <integer>1</integer> + <key>WindowInfo</key> + <dict> + <key>CurrentSheet</key> + <integer>0</integer> + <key>ExpandedCanvases</key> + <array> + <dict> + <key>name</key> + <string>Canvas 1</string> + </dict> + </array> + <key>Frame</key> + <string>{{170, 139}, {1218, 882}}</string> + <key>ListView</key> + <true/> + <key>OutlineWidth</key> + <integer>142</integer> + <key>RightSidebar</key> + <false/> + <key>ShowRuler</key> + <true/> + <key>Sidebar</key> + <true/> + <key>SidebarWidth</key> + <integer>120</integer> + <key>VisibleRegion</key> + <string>{{40.5, 0}, {534.5, 364}}</string> + <key>Zoom</key> + <real>2</real> + <key>ZoomValues</key> + <array> + <array> + <string>Canvas 1</string> + <real>2</real> + <real>1</real> + </array> + </array> + </dict> +</dict> +</plist> |