From 8b732f94f461e58729871bf0ff4e657563c96354 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Fri, 16 Jun 2017 19:27:00 -0700 Subject: [PATCH] Documentation work --- doc/0_main.qbk | 2 +- doc/{1_overview.qbk => 1_intro.qbk} | 2 +- doc/2_examples.qbk | 117 ++++++++++++++-------------- doc/3_0_core.qbk | 2 +- doc/3_1_asio.qbk | 2 +- doc/3_2_streams.qbk | 2 +- doc/3_3_buffers.qbk | 2 +- doc/3_4_composed.qbk | 4 +- doc/3_5_detect_ssl.qbk | 2 +- doc/5_00_http.qbk | 2 +- doc/5_01_primer.qbk | 2 +- doc/5_02_message.qbk | 2 +- doc/5_03_streams.qbk | 2 +- doc/5_04_serializer_streams.qbk | 2 +- doc/5_05_parser_streams.qbk | 2 +- doc/5_06_serializer_buffers.qbk | 2 +- doc/5_07_parser_buffers.qbk | 2 +- doc/5_08_custom_body.qbk | 23 +++++- doc/5_09_custom_parsers.qbk | 2 +- doc/7_0_websocket.qbk | 2 +- doc/7_1_streams.qbk | 2 +- doc/7_2_connect.qbk | 2 +- doc/7_3_client.qbk | 2 +- doc/7_4_server.qbk | 2 +- doc/7_5_messages.qbk | 2 +- doc/7_6_control.qbk | 2 +- doc/7_7_notes.qbk | 2 +- doc/9_0_design.qbk | 2 +- doc/9_1_http_message.qbk | 2 +- doc/9_2_http_comparison.qbk | 2 +- doc/9_3_websocket_zaphoyd.qbk | 2 +- doc/9_4_faq.qbk | 2 +- doc/Jamfile | 1 - doc/images/body.png | Bin 4028 -> 0 bytes doc/images/body.psd | Bin 134065 -> 0 bytes 35 files changed, 111 insertions(+), 92 deletions(-) rename doc/{1_overview.qbk => 1_intro.qbk} (99%) delete mode 100644 doc/images/body.png delete mode 100644 doc/images/body.psd diff --git a/doc/0_main.qbk b/doc/0_main.qbk index d8772b20..f291cce9 100644 --- a/doc/0_main.qbk +++ b/doc/0_main.qbk @@ -87,7 +87,7 @@ [import ../test/websocket/doc_snippets.cpp] [import ../test/websocket/ssl/doc_snippets.cpp] -[include 1_overview.qbk] +[include 1_intro.qbk] [include 2_examples.qbk] [include 3_0_core.qbk] [include 5_00_http.qbk] diff --git a/doc/1_overview.qbk b/doc/1_intro.qbk similarity index 99% rename from doc/1_overview.qbk rename to doc/1_intro.qbk index 3cdf4c6c..e667f9b5 100644 --- a/doc/1_overview.qbk +++ b/doc/1_intro.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:overview Introduction] +[section Introduction] Beast is a C++ header-only library serving as a foundation for writing interoperable networking libraries by providing [*low-level HTTP/1, diff --git a/doc/2_examples.qbk b/doc/2_examples.qbk index e8df84f7..d22759a6 100644 --- a/doc/2_examples.qbk +++ b/doc/2_examples.qbk @@ -5,15 +5,9 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:example Examples] +[section Quick Start] [block''''''] -These complete programs are intended to quickly impress upon readers the -flavor of the library. Source code and build scripts for them are located -in the examples directory. - - - [section HTTP Client] Use HTTP to make a GET request to a website and print the response: @@ -24,6 +18,38 @@ File: [repo_file example/http-client/http_client.cpp] [endsect] +[section WebSocket Client] + +Establish a WebSocket connection, send a message and receive the reply: + +File: [repo_file example/websocket-client/websocket_client.cpp] + +[example_websocket_client] + +[endsect] + +[endsect] + + + +[section Examples] +[block''''''] + +These complete programs are intended to quickly impress upon readers the +flavor of the library. Source code and build scripts for them are located +in the examples directory. + + + +[section HTTP Crawl] + +This example retrieves the page at each of the most popular domains +as measured by Alexa. + +* [repo_file example/http-crawl/http_crawl.cpp] + +[endsect] + [section HTTP Client (with SSL)] @@ -37,29 +63,6 @@ over a TLS connection. Requires OpenSSL to build. -[section HTTP Crawl] - -This example retrieves the page at each of the most popular domains -as measured by Alexa. - -* [repo_file example/http-crawl/http_crawl.cpp] - -[endsect] - - - -[section WebSocket Client] - -Establish a WebSocket connection, send a message and receive the reply: - -File: [repo_file example/websocket-client/websocket_client.cpp] - -[example_websocket_client] - -[endsect] - - - [section WebSocket Client (with SSL)] Establish a WebSocket connection over an encrypted TLS connection, @@ -71,6 +74,33 @@ send a message and receive the reply. Requires OpenSSL to build. +[section Documentation Samples] + +Here are all of the example functions and classes presented +throughout the documentation, they can be included and used +in your program without modification + +* [repo_file example/doc/core_examples.hpp] + +* [repo_file example/doc/http_examples.hpp] + +[endsect] + + + +[section Composed Operations] + +This program shows how to use Beast's network foundations to build a +composable asynchronous initiation function with associated composed +operation implementation. This is a complete, runnable version of +the example described in the Core Foundations document section. + +* [repo_file example/echo-op/echo_op.cpp] + +[endsect] + + + [section Server Framework] This is a complete program and framework of classes implementing @@ -96,31 +126,4 @@ for writing their own servers. It serves both HTTP and WebSocket. -[section Composed Operations] - -This program shows how to use Beast's network foundations to build a -composable asynchronous initiation function with associated composed -operation implementation. This is a complete, runnable version of -the example described in the Core Foundations document section. - -* [repo_file example/echo-op/echo_op.cpp] - -[endsect] - - - -[section Documentation Samples] - -Here are all of the example functions and classes presented -throughout the documentation, they can be included and used -in your program without modification - -* [repo_file example/doc/core_examples.hpp] - -* [repo_file example/doc/http_examples.hpp] - -[endsect] - - - [endsect] diff --git a/doc/3_0_core.qbk b/doc/3_0_core.qbk index 035fed75..01a18d32 100644 --- a/doc/3_0_core.qbk +++ b/doc/3_0_core.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:core Using Networking] +[section Using Networking] This library makes network primitives used by the implementation publicly available so users can take advantage of them in their own libraries. diff --git a/doc/3_1_asio.qbk b/doc/3_1_asio.qbk index bd10a716..9070dac7 100644 --- a/doc/3_1_asio.qbk +++ b/doc/3_1_asio.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:asio Boost.Asio Refresher] +[section Asio Refresher] [warning Beast does not manage sockets, make outgoing connections, diff --git a/doc/3_2_streams.qbk b/doc/3_2_streams.qbk index 1c49dd30..13773125 100644 --- a/doc/3_2_streams.qbk +++ b/doc/3_2_streams.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:streams Stream Types] +[section Stream Types] A __Stream__ is a communication channel where data is transferred as an ordered sequence of octet buffers. Streams are either synchronous diff --git a/doc/3_3_buffers.qbk b/doc/3_3_buffers.qbk index bac0b568..6fdc2632 100644 --- a/doc/3_3_buffers.qbk +++ b/doc/3_3_buffers.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:buffers Buffer Types] +[section Buffer Types] __Asio__ provides the __ConstBufferSequence__ and __MutableBufferSequence__ concepts, whose models provide ranges of buffers, as well as the __streambuf__ diff --git a/doc/3_4_composed.qbk b/doc/3_4_composed.qbk index 48f9cc98..2e7e70a2 100644 --- a/doc/3_4_composed.qbk +++ b/doc/3_4_composed.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:composed Composed Operations] +[section Composed Operations] [block''''''] Asynchronous operations are started by calling a free function or member @@ -103,7 +103,7 @@ available: -[section Asynchronous Echo] +[section Echo] Here we develop an asynchronous composed operation called [*echo]. This operation will read up to the first newline on a stream, and diff --git a/doc/3_5_detect_ssl.qbk b/doc/3_5_detect_ssl.qbk index 3fe70cbd..087e973c 100644 --- a/doc/3_5_detect_ssl.qbk +++ b/doc/3_5_detect_ssl.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:detect_tls Example: Detect SSL] +[section Example: Detect SSL] In this example we will build a simple function to detect the presence of the SSL handshake given an input buffer sequence. Then we build on diff --git a/doc/5_00_http.qbk b/doc/5_00_http.qbk index 62d7b681..6a90c066 100644 --- a/doc/5_00_http.qbk +++ b/doc/5_00_http.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:http Using HTTP] +[section Using HTTP] [warning Higher level functions such as Basic diff --git a/doc/5_01_primer.qbk b/doc/5_01_primer.qbk index b42e9e7b..26501748 100644 --- a/doc/5_01_primer.qbk +++ b/doc/5_01_primer.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:primer Protocol Primer] +[section Protocol Primer] The HTTP protocol defines the [@https://tools.ietf.org/html/rfc7230#section-2.1 client and server roles]: diff --git a/doc/5_02_message.qbk b/doc/5_02_message.qbk index b457c2af..f9391bbd 100644 --- a/doc/5_02_message.qbk +++ b/doc/5_02_message.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:message Message Containers] +[section Message Containers] Beast provides a single class template __message__ which models HTTP/1 and diff --git a/doc/5_03_streams.qbk b/doc/5_03_streams.qbk index 1107a9ba..8209078b 100644 --- a/doc/5_03_streams.qbk +++ b/doc/5_03_streams.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:streams Message Stream Operations] +[section Message Stream Operations] Beast provides synchronous and asynchronous algorithms to parse and serialize HTTP/1 wire format messages on streams. These functions form diff --git a/doc/5_04_serializer_streams.qbk b/doc/5_04_serializer_streams.qbk index df0ba9eb..90c9297b 100644 --- a/doc/5_04_serializer_streams.qbk +++ b/doc/5_04_serializer_streams.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:serializer_streams Serializer Stream Operations] +[section Serializer Stream Operations] Non-trivial algorithms need to do more than send entire messages at once, such as: diff --git a/doc/5_05_parser_streams.qbk b/doc/5_05_parser_streams.qbk index e5e5d009..f3edfa3a 100644 --- a/doc/5_05_parser_streams.qbk +++ b/doc/5_05_parser_streams.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:parser_streams Parser Stream Operations] +[section Parser Stream Operations] Non-trivial algorithms need to do more than receive entire messages at once, such as: diff --git a/doc/5_06_serializer_buffers.qbk b/doc/5_06_serializer_buffers.qbk index f2250919..79587881 100644 --- a/doc/5_06_serializer_buffers.qbk +++ b/doc/5_06_serializer_buffers.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:serializer_buffers Buffer-Oriented Serializing] +[section Buffer-Oriented Serializing] [block''''''] An instance of __serializer__ can be invoked directly, without using diff --git a/doc/5_07_parser_buffers.qbk b/doc/5_07_parser_buffers.qbk index 2f966271..a3455394 100644 --- a/doc/5_07_parser_buffers.qbk +++ b/doc/5_07_parser_buffers.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:parser_buffers Buffer-Oriented Parsing] +[section Buffer-Oriented Parsing] [block''''''] A subclass of __basic_parser__ can be invoked directly, without using diff --git a/doc/5_08_custom_body.qbk b/doc/5_08_custom_body.qbk index 2872e1ef..a3bfff7b 100644 --- a/doc/5_08_custom_body.qbk +++ b/doc/5_08_custom_body.qbk @@ -5,14 +5,31 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:custom_body Custom Body Types] +[section Custom Body Types] [block''''''] User-defined types are possible for the message body, where the type meets the __Body__ requirements. This simplified class declaration shows the customization points available to user-defined body types: +``` +/// Defines a Body type +struct body +{ + /// This determines the type of the `message::body` member + using value_type = ...; -[$images/body.png [width 525px] [height 190px]] + /// An optional function, returns the body's payload size + static + std::uint64_t + size(value_type const& v); + + /// The algorithm used for extracting buffers + class reader; + + /// The algorithm used for inserting buffers + class writer; +} +``` The meaning of the nested types is as follows @@ -80,7 +97,7 @@ those bodies may be serialized or parsed. -[section File Body Type] +[section File Body] Use of the flexible __Body__ concept customization point enables authors to preserve the self-contained nature of the __message__ object while allowing diff --git a/doc/5_09_custom_parsers.qbk b/doc/5_09_custom_parsers.qbk index 4e0f2370..fbecba3e 100644 --- a/doc/5_09_custom_parsers.qbk +++ b/doc/5_09_custom_parsers.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:custom_parsers Custom Parsers] +[section Custom Parsers] While the parsers included in the library will handle a broad number of use-cases, the __basic_parser__ interface can be subclassed to implement diff --git a/doc/7_0_websocket.qbk b/doc/7_0_websocket.qbk index 85621f0c..7e2e03a5 100644 --- a/doc/7_0_websocket.qbk +++ b/doc/7_0_websocket.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:websocket Using WebSocket] +[section Using WebSocket] The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has diff --git a/doc/7_1_streams.qbk b/doc/7_1_streams.qbk index 489d8654..93e12f6e 100644 --- a/doc/7_1_streams.qbk +++ b/doc/7_1_streams.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:streams Creating Streams] +[section Creating Streams] The interface to the WebSocket implementation is a single template class [link beast.ref.beast__websocket__stream `stream`] diff --git a/doc/7_2_connect.qbk b/doc/7_2_connect.qbk index 19716b77..a7f8f233 100644 --- a/doc/7_2_connect.qbk +++ b/doc/7_2_connect.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:connect Establishing Connections] +[section Establishing Connections] Connections are established by invoking functions directly on the next layer object. For example, to make an outgoing connection using a standard TCP/IP diff --git a/doc/7_3_client.qbk b/doc/7_3_client.qbk index 0ebdf603..65a0e651 100644 --- a/doc/7_3_client.qbk +++ b/doc/7_3_client.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:client Handshaking (Clients)] +[section Handshaking (Clients)] A WebSocket session begins when a client sends the HTTP/1 [@https://tools.ietf.org/html/rfc7230#section-6.7 Upgrade] diff --git a/doc/7_4_server.qbk b/doc/7_4_server.qbk index f2d90fc3..f32b3105 100644 --- a/doc/7_4_server.qbk +++ b/doc/7_4_server.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:server Handshaking (Servers)] +[section Handshaking (Servers)] A [link beast.ref.beast__websocket__stream `stream`] diff --git a/doc/7_5_messages.qbk b/doc/7_5_messages.qbk index 88e973d3..9518d37a 100644 --- a/doc/7_5_messages.qbk +++ b/doc/7_5_messages.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:messages Send and Receive Messages] +[section Send and Receive Messages] After the WebSocket handshake is accomplished, callers may send and receive messages using the message oriented interface. This interface requires that diff --git a/doc/7_6_control.qbk b/doc/7_6_control.qbk index c94edf80..ec79be7d 100644 --- a/doc/7_6_control.qbk +++ b/doc/7_6_control.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:control Control Frames] +[section Control Frames] Control frames are small (less than 128 bytes) messages entirely contained in an individual WebSocket frame. They may be sent at any time by either diff --git a/doc/7_7_notes.qbk b/doc/7_7_notes.qbk index 83650b50..2444072c 100644 --- a/doc/7_7_notes.qbk +++ b/doc/7_7_notes.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:notes Notes] +[section Notes] Because calls to read data may return a variable amount of bytes, the interface to calls that read data require an object that meets the requirements diff --git a/doc/9_0_design.qbk b/doc/9_0_design.qbk index 7cdd66a8..8b4c0a0d 100644 --- a/doc/9_0_design.qbk +++ b/doc/9_0_design.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:design Design Choices] +[section Design Choices] The implementations were originally driven by business needs of cryptocurrency server applications (e.g. [@https://github.com/ripple/rippled rippled]), diff --git a/doc/9_1_http_message.qbk b/doc/9_1_http_message.qbk index 2fd40f3b..861cd067 100644 --- a/doc/9_1_http_message.qbk +++ b/doc/9_1_http_message.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:http_message HTTP Message Container] +[section HTTP Message Container] In this section we describe the problem of modeling HTTP messages and explain how the library arrived at its solution, with a discussion of the benefits diff --git a/doc/9_2_http_comparison.qbk b/doc/9_2_http_comparison.qbk index 203a1f84..e181fcb5 100644 --- a/doc/9_2_http_comparison.qbk +++ b/doc/9_2_http_comparison.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:http_comparison HTTP Comparison to Other Libraries] +[section HTTP Comparison to Other Libraries] There are a few C++ published libraries which implement some of the HTTP protocol. We analyze the message model chosen by those libraries and discuss diff --git a/doc/9_3_websocket_zaphoyd.qbk b/doc/9_3_websocket_zaphoyd.qbk index 5868651e..99ea62c3 100644 --- a/doc/9_3_websocket_zaphoyd.qbk +++ b/doc/9_3_websocket_zaphoyd.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:websocket_zaphoyd Comparison to Zaphoyd Studios WebSocket++] +[section Comparison to Zaphoyd Studios WebSocket++] [variablelist diff --git a/doc/9_4_faq.qbk b/doc/9_4_faq.qbk index 96e6730b..dec58392 100644 --- a/doc/9_4_faq.qbk +++ b/doc/9_4_faq.qbk @@ -5,7 +5,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ] -[section:faq FAQ] +[section FAQ] To set realistic expectations and prevent a litany of duplicate review statements, these notes address the most common questions and comments diff --git a/doc/Jamfile b/doc/Jamfile index 4f76c980..24b2cf7e 100644 --- a/doc/Jamfile +++ b/doc/Jamfile @@ -32,7 +32,6 @@ install images : [ glob $(broot)/doc/src/images/*.png ] images/beast.png - images/body.png images/message.png : $(out)/html/images diff --git a/doc/images/body.png b/doc/images/body.png deleted file mode 100644 index 91671f52afcb17f38e13898c247f726f538e97c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4028 zcmeAS@N?(olHy`uVBq!ia0y~yVB%$9VA#jO%)r3V$bKe-fq_A?#5JNMI6tkVJh3R1 z!7(L2DOJHUH!(dmC^a#qvhZZ84FdynT4qQ@NrbPDRdRl=ULr`1UPW#J0|?mIR}>^B zXQ!4ZB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT8h zBDWwnwIorYA~z?m*s8)-32d%aUa=KOSYJs2tfVB{Rte&$2;Tq&=lr5n1yem^-DCqp zLj^N4Jwp>yGc!XS1tSAPBYguSeFHOHLlY}gGbE!^lXtC?!p|xH7LKu|hYmSQ%!5OKNd)QD#9& zW`3Rm$i&2?{L&IzB_*h_6}bhzzHo!{ilG6OoS&;-kyxN_sAr&`n+x(6*u%voL8%C5 zU{zflQdy9yACy|0Us{x$8kCx*jARvli$Dqse0{C_i!#$Q^AdAh@{>z*Q}aqZU2K&q zatriQGE=NvOzP+vl9-pA3bQv8WG_Uo1zx>Y&PAz-CHX}m z`T04p6cCV+Uy@&(kzb(T9Bihb5uTZsl3!k|35p(Y*ju@z7G;*DrnnX5=PH21*D4c> z{l=~?E*5647S7Hl7Ov)ohL(oL&TeKdrsfu=#>P&rE=o|nDddEizMX=NJ}7Y@B^H=a zkc%6L2~O9bG;XJW$ULceDYi;QO7?bE8?~P@FfbSd_=LDtR#tLzbKkmkYr*{g8#iwJ z`ST|a%l|iT-W@)Cc*&9_N%8+LUHsqI*Z2AJ=l@_J+*_={z`!6-666;Q7C;aT50qmi z85p>yc)B=-RNQ(qx3lVz6_4BAW7#(E|8EPQ^manPj7#^*yiTo;R5-ZhemnnhZjZov zfeuM7eMTk|1qWsn!q2(cNoLW{Z>LNuj;MxhU3YK44zKS|(L&DDL!Tdi=rw6*VCJ1z zSP?2^bEm+!Ir1T!%kqO0Wgf7xWHd3owj!hw9HLx z3o6>#ig(|Pk580+*milRVvA|k+nEfyvL5bUFSQ&j);hh9+U5J{M~0j3lslZOcDKHD zJn!)*-E+?Fa{A?w$maWHa)ewFkNKR6dk)!McDg;eI%=tohG8N~?2-Y8uI21X z^wGY4A$p5t_mj4W;5kM24rsf)44YIfq3sjtne*FsliLDCm7cWO(h)j;{-|wFj86Qt zdE+vRnbLdG_qQ)>xc20Zg<0}~7waP)u$P@ZRPk-cY279tW6`}E>h^AFlde1ZT;!#2 z{<{fZe%diNO5dyPyzyoJ4EANY>l)7+)K8W^^t|e8jm`nyA9c)k8s3{9;N5cdhn_qGt46jRi7qU>`w#JY*F9I&?zY|6 z^2bz?-TaT5xybCbPiMF0z4Y6#^hwMM7Tb)|IfApMilu%RTJ>U!*_SC^n;oZwNG7}{B^w5xNo%9CO&mJ=bf?F@!sVF%*_w=gNkN_X8Y|6ojxmU ztv!>J-?O$oQyzOb&W*ppDb340v7mZMz&%63(8~n}Pe%ASDoM>zv&?9n_^2dr!)c>8 z`!6OOXP(=(>E(lKdloidkl;+d!EcnWAarKt6$bMhXIHsj`@Ng@x;ID7ebm^P=`knr z;jvjwd{d6;e43KoH6c}}!nt|+?}z)OMOHgZR1On!716c$r+>jksj2Pr&c?RRt(OmQ zcWzkTm^Qs;{<0}Y#ie{Zx-T4>$Cj*BYPbBOSJu2V)e~I7FN0Sy=G{n}c>0q1q_TCI zR=kaUI`_X{I?}i8XV$$1hi+6X$Ye@?pt0~_&ThVf!)Apu^1lao-Q-ueeX(qwU+e7K z7t?yU(`;fYKQQqA;Mv@%?6*yk)4V4Biuv!W3mEU`!=mT#`vPY1FATf|hwqqmu$dg- zoz9zffx-ODTqO|cv4Ame#_#iPsuvi{eT*G=3l66?a+)9DonhX~bh5nesl;_aERnC4c{K%R2 zLxVTh~o!8>kyebd3rad}t@>}kyXW`L zcTWx6xmI#0{Xd~uv*5>{b-~A3#pG|>^7hyL7YErtXZ75}^V;snPhD)w`=+Y?^>={1{&2Lz0Z`ixz@I z`!%$!zm@->Ym%zB;6YJ};p}U_Z2um9 zhG$XPf`{_&UD@uH{dk}*{(X_($$C!Smlt!jcRYNZp>ge&{;w&D$38ay%bl9FgOO2c zU-CV0DZ^miz_tUN_TUAO0A^W)p{hdBdRcEn9Ny<;*+t>lVdH-1(5#fF_P=L4TDwbo@*=pKO&YrS>G4H@ECiH3tBdQTK5`(z{ta3uA zdKi-zaI2y1{sXr7d%Mp(oR(Q=pS8c|ZC2QYf-LhXwV7?R6Xo~0t*X>>J;2MaeK5^) z`R1~dlRQIO7vM3>)RH!07v+n8m*Lcc#ONsqfDgOY<(1pC}M;_OVYk*Sbpyx7D@& zs-!utj5g^x#TR;gmJ8d0hbGxwlipt~J6SKSsnjbRxXSoW`C%C`GpPW@4?CapF8%WF zoA_Y|iBVs3!KG>EjqBYeCTuJ#c`6R`Y6Wfoyywu7t}MCbh0NmZZ%(^e zzji$*Ral#Qk;(kw&erqCt0qSO-EVH<@mJrJ%U$b2!+FhjZ_=CCYT9ls^^cng}Dcnc0cUAp3vq+UeRo>9f{o^zozbDekPdE4GJ%t-X9h?SB$c~GHDuql7N*J1hh*G(0+MTGxI7eh mv(0YFeN)+vynJNO$i^_w`2Dxg#IvC8ID@CFpUXO@geCx|ui$?G diff --git a/doc/images/body.psd b/doc/images/body.psd deleted file mode 100644 index 420565d17b2df839ccb302740f58b6cb7ae88e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134065 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