From 8feaf6bce3fccaebf3bcdb29628ff8b9608ccffe Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 16 Jul 2017 11:21:02 -0700 Subject: [PATCH] spv-file-format: Improve description of structure member format. --- doc/dev/spv-file-format.texi | 92 +++++++--- doc/dev/spv-structure.eps | 420 +++++++++++++++++++++++++++---------------- doc/dev/spv-structure.gv | 20 ++- doc/dev/spv-structure.pdf | Bin 16814 -> 17342 bytes 4 files changed, 349 insertions(+), 183 deletions(-) rewrite doc/dev/spv-structure.pdf (91%) diff --git a/doc/dev/spv-file-format.texi b/doc/dev/spv-file-format.texi index c325a5dd4..38059ba88 100644 --- a/doc/dev/spv-file-format.texi +++ b/doc/dev/spv-file-format.texi @@ -80,13 +80,18 @@ their exact names do not matter to readers as long as they are unique. @node SPV Structure Member Format @section Structure Member Format +A structure member lays out the high-level structure for a group of +output items such as heading, tables, and charts. Structure members +do not include the details of tables and charts but instead refer to +them by their member names. + Structure members' XML files claim conformance with a collection of XML Schemas. These schemas are distributed, under a nonfree license, with SPSS binaries. Fortunately, the schemas are not necessary to -understand the structure members. To a degree, the schemas can even +understand the structure members. The schemas can even be deceptive because they document elements and attributes that are not in the corpus and do not document elements and attributes that are -commonly found there. +commonly found in the corpus. Structure members use a different XML namespace for each schema, but these namespaces are not entirely consistent. In some SPV files, for @@ -98,7 +103,26 @@ not resolvable to obtain the schemas themselves. One may ignore all of the above in interpreting a structure member. The actual XML has a simple and straightforward form that does not -require a reader to take schemas or namespaces into account. +require a reader to take schemas or namespaces into account. A +structure member's root is @code{heading} element, which contains +@code{heading} or @code{container} elements (or a mix), forming a +tree. In turn, @code{container} holds a single @code{text} or +@code{table} element. + +@ifnottex +For a diagram illustrating the hierarchy of elements within an SPV +structure member, please refer to a PDF version of the manual. +@end ifnottex + +@iftex +The following diagram shows the hierarchy within an SPV structure +member more precisely. Oval nodes are elements and and +are plain text and CDATA within elements. Edges point from parent to +child. Unlabeled edges indicate that the child appears exactly once; +edges labeled with *, zero or more times; edges labeled with ?, zero +or one times. +@center @image{dev/spv-structure, 5in} +@end iftex The elements found in structure members are documented below. For each element, we note the possible parent elements and the element's @@ -128,19 +152,45 @@ A choice between @var{a} and @var{b}. Zero or more @var{x}. @end table -@ifnottex -For a diagram illustrating the hierarchy of elements within an SPV -structure member, please refer to a PDF version of the manual. -@end ifnottex +The following example shows the contents of a typical structure member +for a @cmd{DESCRIPTIVES} procedure. A real structure member is not +indented. This example also omits most attributes, all XML namespace +information, and the CSS from the embedded HTML: -@iftex -The following diagram shows the hierarchy of elements within an SPV -structure member. Edges point from parent to child elements. -Unlabeled edges indicate that the child appears exactly once; edges -labeled with *, zero or more times; edges labeled with ?, zero or one -times. -@center @image{dev/spv-structure, 5in} -@end iftex +@example + + + + + + + + + +
Descriptives]]> + +
+
+ + + + + 00000000001_lightNotesData.bin + +
+
+ + + + + 00000000002_lightTableData.bin + +
+
+
+
+@end example @menu * SPV Structure heading Element:: @@ -166,7 +216,9 @@ Contents: @code{pageSetup}? @code{label} (@code{container} @math{|} @code{headin The root of a structure member is a @code{heading}, which represents a section of output beginning with a title (the @code{label}) and ordinarily followed by content containers or further nested -(sub)-sections of output. +(sub)-sections of output. Unlike heading elements in HTML and other +common document formats, which precede the content that they head, +@code{heading} contains the elements that appear below the heading. The document root heading, only, may also contain a @code{pageSetup} element. @@ -250,7 +302,7 @@ often very generic, especially within a @code{container}, e.g.@: according to the output language, e.g.@: in Italian a frequency table procedure is labeled ``Frequenze''. -The corpus contains one example of an empty label, one that contains +The corpus contains a few examples of empty labels, ones that contain no text. This element has no attributes. @@ -315,7 +367,7 @@ Parent: @code{text} @* Contents: CDATA The CDATA contains an HTML document. In some cases, the document -starts with @code{} and ends with @code{} and ends with @code{}; in others the @code{html} element is implied. Generally the HTML includes a @code{head} element with a CSS stylesheet. The HTML body often begins with @code{
}. The actual content ranges from trivial to simple: @@ -440,7 +492,7 @@ This element has no attributes. @node SPV Structure @code{text} Element (Inside @code{pageParagraph}) @subsection The @code{text} Element (Inside @code{pageParagraph}) -Parent: @code{pageParagraph} +Parent: @code{pageParagraph} @* Contents: CDATA? This @code{text} element is nested inside a @code{pageParagraph}. There @@ -451,7 +503,7 @@ The element is either empty, or contains CDATA that holds almost-XHTML text: in the corpus, either an @code{html} or @code{p} element. It is @emph{almost}-XHTML because the @code{html} element designates the default namespace as -@code{http://xml.spss.com/spss/viewer/viewer-tree} instead of an XHTML +@indicateurl{http://xml.spss.com/spss/viewer/viewer-tree} instead of an XHTML namespace, and because the CDATA can contain substitution variables: @code{&[Page]} for the page number and @code{&[PageTitle]} for the page title. diff --git a/doc/dev/spv-structure.eps b/doc/dev/spv-structure.eps index af2e21e0c..247d67a26 100644 --- a/doc/dev/spv-structure.eps +++ b/doc/dev/spv-structure.eps @@ -2,7 +2,7 @@ %%Creator: graphviz version 2.38.0 (20140413.2041) %%Title: spv_structure %%Pages: 1 -%%BoundingBox: 36 36 517 487 +%%BoundingBox: 36 36 518 560 %%EndComments save %%BeginProlog @@ -179,440 +179,542 @@ def %%EndSetup setupLatin1 %%Page: 1 1 -%%PageBoundingBox: 36 36 517 487 +%%PageBoundingBox: 36 36 518 560 %%PageOrientation: Portrait 0 0 1 beginpage gsave -36 36 481 451 boxprim clip newpath +36 36 482 524 boxprim clip newpath 1 1 set_scale 0 rotate 40 40 translate % heading gsave 1 setlinewidth 0 0 0 nodecolor -253.65 425 38.19 18 ellipse_path stroke +254.05 498 38.19 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -232.15 421.3 moveto 43 (heading) alignedtext +232.55 494.3 moveto 43 (heading) alignedtext grestore % heading->heading gsave 1 setlinewidth 0 0 0 edgecolor -newpath 288.31 432.87 moveto -300.31 432.96 309.99 430.33 309.99 425 curveto -309.99 421.33 305.41 418.95 298.65 417.84 curveto +newpath 288.71 505.87 moveto +300.71 505.96 310.39 503.33 310.39 498 curveto +310.39 494.33 305.81 491.95 299.05 490.84 curveto stroke 0 0 0 edgecolor -newpath 298.53 414.33 moveto -288.31 417.13 lineto -298.04 421.31 lineto +newpath 298.93 487.33 moveto +288.71 490.13 lineto +298.44 494.31 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 298.53 414.33 moveto -288.31 417.13 lineto -298.04 421.31 lineto +newpath 298.93 487.33 moveto +288.71 490.13 lineto +298.44 494.31 lineto closepath stroke 0 0 0 edgecolor 14 /Times-Roman set_font -309.99 421.3 moveto 7 (*) alignedtext +310.39 494.3 moveto 7 (*) alignedtext grestore % pageSetup gsave 1 setlinewidth 0 0 0 nodecolor -173.65 338 47.39 18 ellipse_path stroke +171.05 411 47.39 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -145.15 334.3 moveto 57 (pageSetup) alignedtext +142.55 407.3 moveto 57 (pageSetup) alignedtext grestore % heading->pageSetup gsave 1 setlinewidth 0 0 0 edgecolor -newpath 238.6 408.01 moveto -226.61 395.27 209.63 377.24 196.04 362.8 curveto +newpath 238.82 481.41 moveto +226.23 468.51 208.15 450 193.83 435.34 curveto stroke 0 0 0 edgecolor -newpath 198.3 360.09 moveto -188.9 355.21 lineto -193.2 364.89 lineto +newpath 196.23 432.78 moveto +186.74 428.07 lineto +191.22 437.67 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 198.3 360.09 moveto -188.9 355.21 lineto -193.2 364.89 lineto +newpath 196.23 432.78 moveto +186.74 428.07 lineto +191.22 437.67 lineto closepath stroke 0 0 0 edgecolor 14 /Times-Roman set_font -218.65 377.8 moveto 7 (?) alignedtext +217.05 450.8 moveto 7 (?) alignedtext grestore % label gsave 1 setlinewidth 0 0 0 nodecolor -269.65 251 27.9 18 ellipse_path stroke +270.05 324 27.9 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -256.15 247.3 moveto 27 (label) alignedtext +256.55 320.3 moveto 27 (label) alignedtext grestore % heading->label gsave 1 setlinewidth 0 0 0 edgecolor -newpath 255.24 406.88 moveto -258.02 377 263.77 315.11 267.11 279.27 curveto +newpath 255.64 479.88 moveto +258.42 450 264.17 388.11 267.51 352.27 curveto stroke 0 0 0 edgecolor -newpath 270.62 279.33 moveto -268.06 269.05 lineto -263.65 278.68 lineto +newpath 271.02 352.33 moveto +268.46 342.05 lineto +264.05 351.68 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 270.62 279.33 moveto -268.06 269.05 lineto -263.65 278.68 lineto +newpath 271.02 352.33 moveto +268.46 342.05 lineto +264.05 351.68 lineto closepath stroke grestore % container gsave 1 setlinewidth 0 0 0 nodecolor -325.65 338 43.59 18 ellipse_path stroke +326.05 411 43.59 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -300.15 334.3 moveto 51 (container) alignedtext +300.55 407.3 moveto 51 (container) alignedtext grestore % heading->container gsave 1 setlinewidth 0 0 0 edgecolor -newpath 267.19 408.01 moveto -277.88 395.39 292.97 377.57 305.15 363.2 curveto +newpath 267.59 481.01 moveto +278.28 468.39 293.37 450.57 305.55 436.2 curveto stroke 0 0 0 edgecolor -newpath 308.13 365.1 moveto -311.92 355.21 lineto -302.78 360.57 lineto +newpath 308.53 438.1 moveto +312.32 428.21 lineto +303.18 433.57 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 308.13 365.1 moveto -311.92 355.21 lineto -302.78 360.57 lineto +newpath 308.53 438.1 moveto +312.32 428.21 lineto +303.18 433.57 lineto closepath stroke 0 0 0 edgecolor 14 /Times-Roman set_font -293.65 377.8 moveto 7 (*) alignedtext +294.05 450.8 moveto 7 (*) alignedtext grestore % pageHeader gsave 1 setlinewidth 0 0 0 nodecolor -52.65 251 52.79 18 ellipse_path stroke +171.05 324 52.79 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -20.15 247.3 moveto 65 (pageHeader) alignedtext +138.55 320.3 moveto 65 (pageHeader) alignedtext grestore % pageSetup->pageHeader gsave 1 setlinewidth 0 0 0 edgecolor -newpath 152.01 321.8 moveto -132.89 308.37 104.8 288.63 83.35 273.57 curveto +newpath 171.05 392.8 moveto +171.05 381.16 171.05 365.55 171.05 352.24 curveto stroke 0 0 0 edgecolor -newpath 85.1 270.52 moveto -74.91 267.64 lineto -81.08 276.25 lineto +newpath 174.55 352.18 moveto +171.05 342.18 lineto +167.55 352.18 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 85.1 270.52 moveto -74.91 267.64 lineto -81.08 276.25 lineto +newpath 174.55 352.18 moveto +171.05 342.18 lineto +167.55 352.18 lineto closepath stroke grestore % pageFooter gsave 1 setlinewidth 0 0 0 nodecolor -173.65 251 50.09 18 ellipse_path stroke +50.05 324 50.09 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -143.15 247.3 moveto 61 (pageFooter) alignedtext +19.55 320.3 moveto 61 (pageFooter) alignedtext grestore % pageSetup->pageFooter gsave 1 setlinewidth 0 0 0 edgecolor -newpath 173.65 319.8 moveto -173.65 308.16 173.65 292.55 173.65 279.24 curveto +newpath 149.41 394.8 moveto +130.18 381.29 101.84 361.39 80.35 346.29 curveto stroke 0 0 0 edgecolor -newpath 177.15 279.18 moveto -173.65 269.18 lineto -170.15 279.18 lineto +newpath 82.09 343.24 moveto +71.9 340.35 lineto +78.07 348.96 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 177.15 279.18 moveto -173.65 269.18 lineto -170.15 279.18 lineto +newpath 82.09 343.24 moveto +71.9 340.35 lineto +78.07 348.96 lineto closepath stroke grestore +% ptext1 +gsave +0 0 0 nodecolor +14 /Times-Roman set_font +252.55 233.3 moveto 37 () alignedtext +grestore +% label->ptext1 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 270.25 305.8 moveto +270.38 294.16 270.57 278.55 270.73 265.24 curveto +stroke +0 0 0 edgecolor +newpath 274.23 265.22 moveto +270.84 255.18 lineto +267.23 265.13 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 274.23 265.22 moveto +270.84 255.18 lineto +267.23 265.13 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +270.05 276.8 moveto 7 (?) alignedtext +grestore % container->label gsave 1 setlinewidth 0 0 0 edgecolor -newpath 314.58 320.21 moveto -306.37 307.74 295.05 290.56 285.82 276.56 curveto +newpath 314.98 393.21 moveto +306.77 380.74 295.45 363.56 286.22 349.56 curveto stroke 0 0 0 edgecolor -newpath 288.54 274.32 moveto -280.12 267.9 lineto -282.7 278.17 lineto +newpath 288.94 347.32 moveto +280.52 340.9 lineto +283.1 351.17 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 288.54 274.32 moveto -280.12 267.9 lineto -282.7 278.17 lineto +newpath 288.94 347.32 moveto +280.52 340.9 lineto +283.1 351.17 lineto closepath stroke grestore % table gsave 1 setlinewidth 0 0 0 nodecolor -397.65 251 27.9 18 ellipse_path stroke +398.05 324 27.9 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -384.15 247.3 moveto 27 (table) alignedtext +384.55 320.3 moveto 27 (table) alignedtext grestore % container->table gsave 1 setlinewidth 0 0 0 edgecolor -newpath 339.53 320.61 moveto -350.46 307.71 365.83 289.56 378.02 275.17 curveto +newpath 339.93 393.61 moveto +350.86 380.71 366.23 362.56 378.42 348.17 curveto stroke 0 0 0 edgecolor -newpath 380.98 277.09 moveto -384.77 267.2 lineto -375.64 272.56 lineto +newpath 381.38 350.09 moveto +385.17 340.2 lineto +376.04 345.56 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 380.98 277.09 moveto -384.77 267.2 lineto -375.64 272.56 lineto +newpath 381.38 350.09 moveto +385.17 340.2 lineto +376.04 345.56 lineto closepath stroke 0 0 0 edgecolor 14 /Times-Roman set_font -365.65 290.8 moveto 7 (*) alignedtext +366.05 363.8 moveto 7 (?) alignedtext grestore % text gsave 1 setlinewidth 0 0 0 nodecolor -281.65 91 27 18 ellipse_path stroke +253.05 164 27 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -271.15 87.3 moveto 21 (text) alignedtext +242.55 160.3 moveto 21 (text) alignedtext grestore % container->text gsave 1 setlinewidth 0 0 0 edgecolor -newpath 322.55 319.77 moveto -315.01 277.78 295.63 169.86 286.52 119.12 curveto +newpath 328.04 392.9 moveto +331.31 358.22 334.93 277.88 307.05 219 curveto +300.67 205.54 289.49 193.49 278.95 184.21 curveto stroke 0 0 0 edgecolor -newpath 289.95 118.43 moveto -284.74 109.21 lineto -283.06 119.67 lineto +newpath 281.03 181.38 moveto +271.1 177.67 lineto +276.55 186.76 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 289.95 118.43 moveto -284.74 109.21 lineto -283.06 119.67 lineto +newpath 281.03 181.38 moveto +271.1 177.67 lineto +276.55 186.76 lineto closepath stroke 0 0 0 edgecolor 14 /Times-Roman set_font -302.65 203.8 moveto 7 (*) alignedtext +326.05 276.8 moveto 7 (?) alignedtext grestore % tableStructure gsave 1 setlinewidth 0 0 0 nodecolor -413.65 164 59.59 18 ellipse_path stroke +414.05 237 59.59 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -375.65 160.3 moveto 76 (tableStructure) alignedtext +376.05 233.3 moveto 76 (tableStructure) alignedtext grestore % table->tableStructure gsave 1 setlinewidth 0 0 0 edgecolor -newpath 400.88 232.8 moveto -403.07 221.16 406.01 205.55 408.52 192.24 curveto +newpath 401.28 305.8 moveto +403.47 294.16 406.41 278.55 408.92 265.24 curveto stroke 0 0 0 edgecolor -newpath 412 192.65 moveto -410.41 182.18 lineto -405.12 191.36 lineto +newpath 412.4 265.65 moveto +410.81 255.18 lineto +405.52 264.36 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 412 192.65 moveto -410.41 182.18 lineto -405.12 191.36 lineto +newpath 412.4 265.65 moveto +410.81 255.18 lineto +405.52 264.36 lineto closepath stroke grestore % html gsave 1 setlinewidth 0 0 0 nodecolor -281.65 18 27.1 18 ellipse_path stroke +304.05 91 27.1 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -268.65 14.3 moveto 26 (html) alignedtext +291.05 87.3 moveto 26 (html) alignedtext grestore % text->html gsave 1 setlinewidth 0 0 0 edgecolor -newpath 281.65 72.81 moveto -281.65 64.79 281.65 55.05 281.65 46.07 curveto +newpath 264.36 147.24 moveto +270.97 138.05 279.43 126.27 286.84 115.95 curveto +stroke +0 0 0 edgecolor +newpath 289.77 117.88 moveto +292.76 107.71 lineto +284.08 113.79 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 289.77 117.88 moveto +292.76 107.71 lineto +284.08 113.79 lineto +closepath stroke +grestore +% cdata1 +gsave +0 0 0 nodecolor +14 /Times-Roman set_font +205.05 87.3 moveto 46 () alignedtext +grestore +% text->cdata1 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 247.12 146.17 moveto +244.24 137.98 240.7 127.94 237.46 118.73 curveto +stroke +0 0 0 edgecolor +newpath 240.72 117.47 moveto +234.1 109.2 lineto +234.12 119.79 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 240.72 117.47 moveto +234.1 109.2 lineto +234.12 119.79 lineto +closepath stroke +grestore +% cdata2 +gsave +0 0 0 nodecolor +14 /Times-Roman set_font +281.05 14.3 moveto 46 () alignedtext +grestore +% html->cdata2 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 304.05 72.81 moveto +304.05 64.79 304.05 55.05 304.05 46.07 curveto stroke 0 0 0 edgecolor -newpath 285.15 46.03 moveto -281.65 36.03 lineto -278.15 46.03 lineto +newpath 307.55 46.03 moveto +304.05 36.03 lineto +300.55 46.03 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 285.15 46.03 moveto -281.65 36.03 lineto -278.15 46.03 lineto +newpath 307.55 46.03 moveto +304.05 36.03 lineto +300.55 46.03 lineto closepath stroke grestore % dataPath gsave 1 setlinewidth 0 0 0 nodecolor -413.65 91 40.89 18 ellipse_path stroke +414.05 164 40.89 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -390.15 87.3 moveto 47 (dataPath) alignedtext +390.55 160.3 moveto 47 (dataPath) alignedtext grestore % tableStructure->dataPath gsave 1 setlinewidth 0 0 0 edgecolor -newpath 413.65 145.81 moveto -413.65 137.79 413.65 128.05 413.65 119.07 curveto +newpath 414.05 218.81 moveto +414.05 210.79 414.05 201.05 414.05 192.07 curveto stroke 0 0 0 edgecolor -newpath 417.15 119.03 moveto -413.65 109.03 lineto -410.15 119.03 lineto +newpath 417.55 192.03 moveto +414.05 182.03 lineto +410.55 192.03 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 417.15 119.03 moveto -413.65 109.03 lineto -410.15 119.03 lineto +newpath 417.55 192.03 moveto +414.05 182.03 lineto +410.55 192.03 lineto +closepath stroke +grestore +% ptext2 +gsave +0 0 0 nodecolor +14 /Times-Roman set_font +395.55 87.3 moveto 37 () alignedtext +grestore +% dataPath->ptext2 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 414.05 145.81 moveto +414.05 137.79 414.05 128.05 414.05 119.07 curveto +stroke +0 0 0 edgecolor +newpath 417.55 119.03 moveto +414.05 109.03 lineto +410.55 119.03 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 417.55 119.03 moveto +414.05 109.03 lineto +410.55 119.03 lineto closepath stroke grestore % pageParagraph gsave 1 setlinewidth 0 0 0 nodecolor -173.65 164 63.09 18 ellipse_path stroke +163.05 237 63.09 18 ellipse_path stroke 0 0 0 nodecolor 14 /Times-Roman set_font -133.15 160.3 moveto 81 (pageParagraph) alignedtext +122.55 233.3 moveto 81 (pageParagraph) alignedtext grestore % pageHeader->pageParagraph gsave 1 setlinewidth 0 0 0 edgecolor -newpath 74.56 234.61 moveto -93.59 221.24 121.37 201.72 142.68 186.75 curveto +newpath 169.43 305.8 moveto +168.33 294.16 166.86 278.55 165.61 265.24 curveto stroke 0 0 0 edgecolor -newpath 144.9 189.47 moveto -151.08 180.85 lineto -140.88 183.74 lineto +newpath 169.08 264.8 moveto +164.66 255.18 lineto +162.11 265.46 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 144.9 189.47 moveto -151.08 180.85 lineto -140.88 183.74 lineto +newpath 169.08 264.8 moveto +164.66 255.18 lineto +162.11 265.46 lineto closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -120.65 203.8 moveto 7 (*) alignedtext grestore % pageFooter->pageParagraph gsave 1 setlinewidth 0 0 0 edgecolor -newpath 173.65 232.8 moveto -173.65 221.16 173.65 205.55 173.65 192.24 curveto +newpath 70.77 307.41 moveto +88.39 294.16 113.89 274.98 133.62 260.13 curveto stroke 0 0 0 edgecolor -newpath 177.15 192.18 moveto -173.65 182.18 lineto -170.15 192.18 lineto +newpath 135.8 262.88 moveto +141.68 254.07 lineto +131.59 257.28 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 177.15 192.18 moveto -173.65 182.18 lineto -170.15 192.18 lineto +newpath 135.8 262.88 moveto +141.68 254.07 lineto +131.59 257.28 lineto closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -173.65 203.8 moveto 7 (*) alignedtext grestore % pageParagraph->text gsave 1 setlinewidth 0 0 0 edgecolor -newpath 197.61 147.24 moveto -214.44 136.18 236.98 121.37 254.47 109.86 curveto +newpath 183.47 219.89 moveto +196.82 209.35 214.34 195.54 228.46 184.4 curveto stroke 0 0 0 edgecolor -newpath 256.67 112.61 moveto -263.11 104.19 lineto -252.83 106.76 lineto +newpath 230.64 187.14 moveto +236.32 178.2 lineto +226.3 181.64 lineto closepath fill 1 setlinewidth solid 0 0 0 edgecolor -newpath 256.67 112.61 moveto -263.11 104.19 lineto -252.83 106.76 lineto +newpath 230.64 187.14 moveto +236.32 178.2 lineto +226.3 181.64 lineto closepath stroke grestore endpage diff --git a/doc/dev/spv-structure.gv b/doc/dev/spv-structure.gv index 7807ab48d..ac37b698b 100644 --- a/doc/dev/spv-structure.gv +++ b/doc/dev/spv-structure.gv @@ -5,21 +5,33 @@ digraph spv_structure { "heading" -> "heading" [label="*"]; "container" -> "label"; - "container" -> "table" [label="*"]; - "container" -> "text" [label="*"]; + "container" -> "table" [label="?"]; + "container" -> "text" [label="?"]; + + "label" -> ptext1 [label="?"]; + ptext1 [label="", shape=plaintext]; "text" -> "html"; + "text" -> cdata1; + cdata1 [label="", shape=plaintext]; + + "html" -> cdata2; + cdata2 [label="", shape=plaintext]; + "table" -> "tableStructure"; "tableStructure" -> "dataPath"; + "dataPath" -> ptext2; + ptext2 [label="", shape=plaintext]; + "pageSetup" -> "pageHeader"; "pageSetup" -> "pageFooter"; - "pageHeader" -> "pageParagraph" [label="*"]; + "pageHeader" -> "pageParagraph"; - "pageFooter" -> "pageParagraph" [label="*"]; + "pageFooter" -> "pageParagraph"; "pageParagraph" -> "text"; } diff --git a/doc/dev/spv-structure.pdf b/doc/dev/spv-structure.pdf dissimilarity index 91% index b54a268cb930e41e99761431ad41c3fde296d277..520d3bf511ab2dbd716869c4d6d66002d0f73997 100644 GIT binary patch delta 15812 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 delta 15316 zcwS|@LwKM;_vRg^qwd(YZQJhHcG9tvCw9lSZQHhOcWh(c|IA{(Z{Au|-PiA&Q&o#v z)LGo!p`g`)ps{j*#)RF`Fw)jNP3s~XqqBOC7n-1;(SRTb4|;6y-q7LnL>X6kM(D`me`KWyLZzHA*Gp1AfD(63E>j{+xS{+s~Q1QcnnUfu%0 z>-yw1AdvoM$IJqJzrZ$pgYV&3eDQwX9N3_<^rQ_=0y#id0@?f82%`WzQP5BjGtaGz zqsJ5fRC6oYTkg!t8hHoAMgAYg4QLL8CiYxwJ$0(rqTcqr^sRQv>>8gAsUbV*h4oaA zte!v60|=YjaYO}o8PyS<;sJNqYJueKfrra~hRGg>fU zIBFP>|7-&~q+1`(NNum9CC@1Y*WGDfo-KMs4OrG_8fGb(56hi>lCyEh$cOcbMnuM& zYpQAo8LX-WyWA%ZLjBq^oYZz(M`Td4zhESu6lOZo{Wbgg|Mf9Ud#2AJ1ZJ-??wsQu z=<@jXjfPs*xOttiXRO8Fo7>$VM^0?bDA-LHRXYHNu2jYqL_<1p`{VHrLUWU9)Tl4s zS!5+c6eaP4t*g5wc}q~vQ|Ht|!ID_zWYv-Tuj_6Z4{|MqmbRC?aExPl;FF-m5+LtM zAYO8QT?C5nUq(gzKJ8&`uN?Xx?SbiXH>!pod%H%DUo1oyo`i}AunOW;xyBfXR&5S{5 zuco^nM_l%qGBWmll1OC5Gh8M92*FSxe{1)%_9pfPW-_g;zB#&l9 zTEu^F%-YFrqXqkkJ8A5}6(~*1o*#)@!ZeASm?9xU-Z|JF+*vv!y>z)eH&c4M49t#_ zv$ih}^YWg{As7qM$LUkZq~u&7niQ|n!|v(|hXG(m z7REqhzOmUg+l4gz8v;}Z>!gQqP~dK-WN#(s<-sAg|A2pGR@XxYB$^0YqiHYuBG+9 z=Ax(*`J4VYw!XfNw^lhWv4lMo@vxZI47Hd>O=9k}8zKK{ZDD+)O&I-Nrkw*N53Zw` zB=o5Nb02{a7O}>NsRQFaqU7J~!QS`&IL4x5Q!w)yR~}6rckFFE8FZlNHhHMR zE6qj5rACm-=5qroou{2OQGB)fosWrf2s(?6>XK!xOFqhmj#IdsFthIDx=?&KSO};UY4QX*t)yOBDV?ogxy#3TA$-9E4gBqv5yL82|(T-zD zeJi=Tx$eOkjbvVl_zC#V6^)$zRx?@$C0!oQb{2)^w^*{2eT;8M&BLdQwoCQ&V8n$? zDi;J_al||mdp8my+0(sr_UXygtI|+M0a1$}S>*S&wJx)@L4;8<#1|jwP|6Hopy(qristON?yn9`5$xy*fW^1Y{Dk&2c zKh!Y(B1~EgSy^m}!KiE6>*Buz9*45scyqH}t0>o!k9a$c6yxj7&6ADK2ed}=F^!Xr zo1%n=x!==BPrzYGbwJGPV*2X)PTeqdG-WKamsssB@y-Gfsc--D2Ab&Q@iDS+_!MtE zYQg`_XCMJ1+pKmV6#Hp;HD(q4tcS5U42ofvvtW$|y85(3!!Vmc2e$9!j8ixp@+bjV zcwU@WR{T+V$9s3<-HYkfCO>ADu8LwXA?)?isv41V!$E4e$^|v?B{Pf{%%)VJudKWE z%~hz~i-Q_xBE|TtGWiR|r|~O@oZ?y~8mWuC1p5F{?VVknaDw6xH9U(8p2FcNk);$D zrJ{%Cjlw_eWV+VIC;tpwj^PV>u#Qf!n|GMy-&1?XI_z-|(b9j9NJ^hA5;bU3RCmDJ z@jF-eHeMtwie=DP`I`9Ioh;gWSBFj$FKue3waR2E(}4y2#eZ#HX-WzwGd0DOMwTU; ztzHJ8uq}Uz~neoBp|NXGhsxf4n5| zsrpiH>RMSlsvE8wJAamV@Hzb_Qbt-C9!(IOV8M`t$-Nd|Myt#lxSN|bX@QUM;iqy* za?VMm+=f?1M{^`?_wmP?p!oAp{#wThW4Rgtc$;bvN`00s9#L5jlLJCN)^Hbb$frHm zEvmRmIkbGHo9DD1<$WX2o=c)<=*2R9HCyxqL`WFigMD;JX`*DL(ZHE3=l3bxL+qj@ z^z&Y@5}VQq3)Ez9Gl&IHZWbT}y!IX-IqZ-svl+{$ch0xucjUgo3DS*!z?#~bI631u zni|^vkNjg~1ndXF>ZGFjzM@JJ5g*2)F0m>b|Wl-2fhc@*SV&1mEY+e_tyF z3V)SOCfT0Ty=q*JtGOQwM#Iq({{{cGMG!)6W|x1MgqP(7@o=&hF_$3Iw)W7zig}PG z{B7Q=oe7?usWY@W2K$f$)tgY^kBd8HYwP~Sr?LnNKsbBCg@I;mGpkHyg7!}rgMh&K zr6q-?{SEz#)7w8d__NIjpg`{Pt{xySE2WM5gihMQum88GroZ zYiX?ev^luV!9;PwIoLq~iORafRJEPF%o3UhjJ~md)iyMNr-D@B3W3CMpnox}qaH#S zm>U`Ho0&rSU4Rm*lduf$SSva-fPV^oAwjKUdU<@5?U~wvdGhpmaf0azf>1!4$EJ+z zgagFxW@dhMZE+~Qh$dEc;NK~4+L$JH47AYBj*M=Q7A#DiY-qg??~f-*R~aZ#wzieP z<`*{ouSO_POfmoCpUuEaLU{H+24&H~Wwc$PnaMuLT=P96C`Oj9q~WQ4sGGM?#9aZr znTB_RF&XJAR_d%fa2A+r(XrV85-=XV9rg4=6xMQL~i%dE!e#?1WA zu<;eC*u(_IrIEJbhiZd21pv_?r)g=aUvA1nlbfUSP=}{4#}@*ev43v`N=yON7N&YO z_7*0{+FBzToORsXD$uza287GVyS?Wxq$d zy*fg_hslrs=z;p{2#MeP(x2{)mw&pcfki1e@yIdhqr^e0W)#`}qy`4gNi#|s{Uxk5 z@U#~;*?X&0B?13;?{Xg**G-q0t%{gx#=z(3;l6P5Lg`n`H`ItN8|;yQG9OsMeYwCj zURQ7$bQ#`hY-|%p$q+3aWR{FbaJ5NjU*QW;4yqOF*YrX(8HWv*49!*lqSC^;)C47c zvZ&?oE4$IAS6tfby@N|_;OFrYe%_WQkWB^2_((EGb!FJoOaV;8C-z3Xr&ykJF^ZuQ zD0p(xXtFlx#Pr@#%mzR#DL0h_am@A%R!=B5@$Ks=PD{#$_K#~=7*=RIN>8oIH>sbU zxe_({wN+ny!;lU8e3rP@N7UCbQ_5IqP_`7h1fl`Tt22K@Ztl+GBBL6~!a$I>#HI^E zsIY7q_2QJ4qyVzKmH6vY*sCAojz8oxU!zW`UhNnO?w4bi4NJl%*xu>_<|)=Qa>g5d zGbf8BCWx#fYI3Vwbd&C5U{oEc&&!?TStOS~ji zydwsd*K#a#AK>`NoOMA5*2kSVfWW!$2ZC(m>!X=Y1^`!+EKUGweLJlX^3L-If5u3k zxHe2f6||K>;S2M)A8dJ5b9qrhR&D)Lf~)Tr{1i~8jZKm53csY}WzA!YcPZLbDUW5Q zX5sun@L+H~Hb%mmLEOKpW~4gPJ`;{d%8}Uk z*J8)Z7BKl^{&0|ABRTZ_#6q?geUOse_|L{W=Vunr>XkwQxE)u`BfYTDI^S|F4v|t4 zrqpdH56I;~UWAh|A*r^w=FpYK)?Ei^OjT!_F`T*9wzV)Ls}Jf@GmLNw>uGW;e@xIn zd8j)Nnw16nf=s8Z5Mm$Vlh&+g@FFHSh18LbUx0?jtJo!Y*Z3CSR$~5XW0rFi^Yuz6 zTXQ()8a}CJ#p^#@9k(BqILql_N4;-05XrLM8OTd@p-X=2xTkomoEv&YC;u!oDqf%7 zEg9QP4}_v!7gY|dDZt%XW7BsCC_6r#V=V2_Cc={t|Dmu9_`JyeWvtCufej*p7T~ep zh5;l@ui=Hq?=uCU`LVaa9-FYe@PhfPJlF$%MZyR^=}pZesW>+GQu&~5Iz@e!+3|%b z$OR!u0aNf&U)GPALS$Ufo5o{P1{bGPD&RdPzIVMF7D8@}2dW<_rtZTSRx*;Q`!zB{ zoBr`S?h*&%Itxf~28MrWv&Rfzp0D+0qJW|}ek8MyO!}=EqIXs4cC;smvUw(FT}Ll_ zQWo*$Vb}X$PQZew z4})-8xRWtpm78{cgPLcu`w(&d!=JPzaPhAPL# zFAG!j@FcXm<>)~IG3N%;RGnRKDw3RS3g*hs`!ZZ5Q-s1p_KbqC9_ri`nWl$sYOjSU zxs0WVZxY`oISZY8aR^%0~*N#Qed10R2TTfO<=Fai}x#Z_@^#^4ME+6slLFIhrq!% z9`cK-G0to^{*daFzs)lrHfrhfhG64ZWl&GNW6MJwJqqM%G$-bU#2vLS6Et_BYdibL zG(pAP1m0P>&rMMVIaYvYQ~3c8p%B^X+WVw9R27cn7hXd8=yxsk2{`(C#8IkhI{0Tl({%OE6VWoy1#)9W^JW4RfnKXt> zAJW`f;DV%=@hI<6gE^N5^pqR-sELAD+NB~48P(R??j0{pwOj4((B&zu=qqSh zLC@KfZ*8VmNO`4u@EkOb z_t%qG8w^?9(X3^W?9Iiy@PtDmXmS;W87()OR+9rCi1Q@LfRF)E<)u^nuGxQR{>>7L zXY9I9Qb`fVu~-l|Qj$C#o{DkdttEW4J2=cl`X};{m@->v=JQo-BL__)fnl2?GkJQubzYRXZug+%`-U8I_TLOb>n{&qO`9MrtW`_U)w9SG>}9xG z&Qt_pr#DJ8Rd&YpDTPZA5PUdZ4L`$IYG$1mq?2I9TC3-tNf!{g%q|b@pS%R{v=7Z@ zvZG>SQ9~T56eE1+W(QJhq+#T3C!=cavqwRwZ&ebMfp!5=z6nNyIiN%AvBr9PhCvWE zG+)8$Rm;=yiQjQ%atc4dvpS!aU{BW90N0bls@+c^tCL6ePn~m_Erwlv1I^CsQ9Oqa zuX30~$aUxq{?j4c_Pc0#=HUUu1fGmJTIPay9h0w;1TsAbJ*H+*x=+a5QLbxIde;qAafq-}mG`boPGtt2Q;2 z&N=C{{zS!as>Jm{116EN@2!7vKggFgisGna0Ol@yB%=2)Z})V;5R~@0o2JEw#b(%B zK}-cEOTKjKe-_Tbexd$)*D3uDh!}@>tZ0_UsV)mGaEPo|vC-^jAaEKw7=zVYjqFbx zQpn)Ow{Qjz64zt5W{F)HFu4_d>G-I?FX8R#(s*d{Pcthk zANZQunrat=nJOd4U(mQ1P5eoqf$cgR^!#QGg}`GUH#>ikh`PFAoN2C!3Zm?PPU+oP zkUY*rT_GPCMhOEWuDg*8x4>R(SfyuaFG)JuEKi;H&QL~E^N_ihqqe`BhArq)9QF)B z--x`<5}jRU0CR@D(1;(^Ek~TS>Z4&P2Oy>Gh?z(^{q66##I}S(s0UxW>hUtBFhWpnwa1tzRZp^1Z7CQ!|?tqBE$!P^Epm)y2X1YdCFv-ZD zAmJw>?gl3Sn_xOU?a55CTvJmh;P0S-Q2{|WqjRnXPuhWzx~q$rJR{9 z)&uc8DPmTSa_;GkRo0I{pe^=C{91!X#?+^>qt{Xn&u>RdoMbVUW8&U)-k1c;ixiQag%iksN@8-bqprli$=KHGHlEV6OpH{iIrJv4#{#fWyH$w zxQrwucJU51=NmpJof`V-J#k9}WLAC|$C|181H3Oq>GQ?H6%z@z5Q}fAf9B+>bS9B+ z4&O2@i1u!ovQeo4QQ~S70PVRF8oR1@b|ELY-p8b;cy`yv-skH6Owi~LGy1xD2q(%R z9u?QO7(>WSNbYNF{&i^~!$KTN!eN6Ba`ONa#s4%ph~>$GCU7j2utDZs5v3&-Yz)VRllK#l)Ud-&T z>a-l5E_59@ZM{U07gJ#B_eZN3MtpX_KE8%+r7u7FT!%E~W$Oj!otzZ2sc^Bd?VRXY ziU{dS`hCfsX-g5er2|_U-PwpuIWD|fm65P2RC6-}+`$9?Sf|)qraw%!S3{}sbU!Iv z(T;DXF9zf?PE`ywpiLx!wyD23^dw0Y%kXoEEH^cE%7RYe4(lbrqLG_3S%u%czlz~` zvQ6+`z`oF!F?k6-Mb+Vt2iVl1-jl_4He%%=N)G?QUxx4j1%68e&I1yl#@D_rrvxq}7xK8+s+& zpGAtiYV-Z z#?wN`NgRfvwln6yI=y)1WcBiv&E){c?AyepvOgnIeuklT*^$ut4V++Mf*m77$BSwL z-=Ss8IZ7+W02f(|{GCcscT6R$CKPL;1p7n>+xBoV5WSniPHoafL7F%s^8&AX`iQ~* zi957^6!ht;A-Z-UzHKihdL;x+(D)IFSxZSkB~h2eu0q--*C@6$h#c{Upo?rbu&$ep z_ggeN%s{UPx&7CTuKt zS#~=u;6&JFdDsdLao5ZI_a0eq)bODIGErC;vU78#a&5tXTU<}!R(k(dpSm9F>5*vc zK#0O@eZiXfps)FaO+;Sog1~b)V6t+&CMOt1xc;wYm#@fabwryq;v!zCe9+U+rO}h*cnH-72~g zW?>ZVaSJZja2f;hhxO??Wn@hx>y{B@OD&}a6x3BI0Towy>{u~MC#LZSqKi{P6^iq8 z%*ahM&A68e+P2<6sQ6u6EXr&NtW~;BojGi~&^CqKwUFMGEQ@AbB9gR*BJu^#(&)iH za1u!*_XwA@Zb5PuJ@Y}$F^$>BJns@`WC`mfVk!R6q-}}%pMGAzBAQ%w(}4HY#5X-$ zC25f-X_35muxMgSKMt*;{#}fSBocZ^PB>RRQRt}%bjZ*A$jfog$Z-*bcyyFh+bctq zlh^3FonB}coOKiKCajiO&UH3{n z{{r@{;kc9FX+nJC9Le5;2g-57d$~ND)|agNp6<9e`+$jFY*2~h6HBiwy!`B|X{lNL4v#-1V=ix`WA6BYvP)S=F^V9fo)*M? z@|Ev}fhcp_>R6q1FvDhQwTTn{XxDFi&8ULZl!aUB=%K)Xe3N3Qv!=4D7|HZ+wb}bf zzJW$K1hYKsIQ|_h2q#Up0lF{~0PYW0AgO94l!(9D9ZNx36?C_7h zkl@YRATv+Pnz2sjqMYrx!W_M${7N}cyW_2s9JITBv@nNEmZ}|kMpc=c<)WtT&mZ2?@R zj)@W%0bhK$+v}qQpSP-_cv5Kyl{oiYFT-449)Ui}N~FHw$^+&s`8G)=3X?%8Q|Ab# z>AXqa2(|H7wHIz6MGS*I_cnnw`aZ>wXeT**&)`InH@OzzFYV>!FG)$w?n6EUN^Z@> zU7A6@xxAf(_@f%?xC40=U?$gwj$~YGUYlkvcTU{LLe1t8I{X?^upNu;YU*Q96rlHi zAH6B{@bYw&33XI2hG<%%>QQb%_h`a@MfZ2fHuv@k(&U3&bpBe5?Zk<#$eEZ_3lj%p z30xFsN&0!n)Xcd7((C>r&my_!5~iWIiSp zOrYn6Ahp8{w$twd8~E&kL@0@;@fJ~8pGC{+3g4@DUmNB59%CLLFvj}#``PoNl{~JQ zz57=uv|g|Mv{hO05?IH62F0&t=eu>o;MZjnZiHAhsT_Y?%4fI^ogLMa#(_Md%pF1e6 zijQ$Ml%-V&3q#970bd}PAu-i0@ld%2x@3SP`_l(=i>eIra}DXN_cFr>`^f@DGe+j9 zse-=rWWqlKju8RY=9w6YamCbGfYmp535j^1s$f$hUl z>!f<$?k|d>Y`(Q|`3I5yplrecg6I{+1vHXR=b2kqsAU$}o?ixBe;zlyz(fjd6Ra5w z)cIG0p@hx*?lkzylVA4K+BzL7WjAyMO8wK_#iX_eCL?|0db)Gm*EARXWI_gglu`?_ zEsTJhw6(3*pT7tj;`pTAGZiA$VxPEvMU{KLS_3UI)ovWsikoOE+N3qVyggsefhL^Gbo&o4+}%=I zSV*N*`SseNo+^dDPXA<-@w5AWz-y&25Gw})I9s2qa%3+A(db%E|G^5g1&TfQll3Q- zXK@B&-x=qn%(YjcokL{Dh&@$9*DZ@jOx}}xLro_xW)8y|dE8^PGT3yAqEq6Ki8}|v zc?G!c@i2LNc2N7^3TwBYzjfkn&rM=)iS=hsoX*Trr-eX~(hPc5Ua1ud$G^P~Ouhm7 zX(!AaDgwL;t|uYTAlOJ;cQ$`VJ04IYwG*71Su^`OLgFl`j|W)sK0H02(vb9LTA&w& zc)~2g1?;t&@c9u=qR3DfZuwL*@CW-t`i^59VtpyAj-^!3kqC&5MWuh!aJ>%3u{Kl6 zlqFl!)sg8d`5Nl4{3HDvN>m-_6mA2g6?s+{2y5@mCKN_*CBryEUU3tFLv6i|DQKG` zK8LCp!*^+=!g#bJ_Xaw*6tJ0J(w9?jx!Xxs7;@!|GQPmr8&0?iwucgoa>he*(sene zq!<;o9SMHGS^4MI$skx$s5gsE4MfNvNi|1_gOVvDnWM)^V$s>=*O)ogHRGpfnE%66 zP&lFpzA=z^|-nj1P}Io7?{|Jr@@e;o>&Mz4fa}Att!h# zvRtG)oVm%aP%^sPWu+cEv0)R0R$I+c$GIAIPvi{X0S4_(3X6=?Vs^Tq_ew@9WjwkV z<~woRzJSs!knVDRcP8M98guNlpn{FyE5LMrx}&6Xs>zI{imwcEakGk?$T3tV1?qQc zhwSmlxNM9s2?6;eH0@+OQ;EoSM**A%M&?SyG)1!8bP^eu`iRND#>(=tsgq-ssSPg{ z#hcZ8_smig)e~jfKV%;Dp2%+iSQ)F`Hs=4 zL_a{Ct*M4b_aS~U3*%+Ct`YY&Qs?Ej85Z25Xu%MI3Ehc%IET@$Uae>uE#*2o7*CWE zw8gz9j6#-FXAWTZHDVlnbgoNsw$NVfZJcEWXmfIuWmy?VF36x>kKaP{u7cF47uB7aXYNP|YXNK_)PA_LdqE;9K`mQ$u}v;=ZXHoN z@6&|^N1rvcf;{#yGpk_+aw= z=lJ`(j{vgq*zH_4hr{{sWf|`#Ta_UOS?-G=E3SL)=)vA5B18z05VHN@XTODh^xVEe z{0CMQk;HK7n@%7Z?~~%jgVv%|!zf3=R2WHRKirN|id_sDRN}dD???&<-;tyPb4I0( zDLpvBmITHWX?pgc=Sg^vudCSCU-#JwlVrD(V1UQB6Dsu?LDQ{CqXog|%ZqB)6`@lR zt*rKv^g6nSI>Db_=rgi?r_i+B=1oSo8aHF@uEs$!f`)wr=~uz{DWrpfa`=0RA6d$5 zJcO_%U;kwyY(QK>Qq@6wVGdhksR9TyjOXD+zi=-FhLJTVsJ_tVgm8#uCGTN-r|>epkP=4GVpW)mm-#`_KyA@|cwRh9cOrY*_&PaMv_gjr-g&{rZ zi&L?#Pr1|C-LasBGdkH3OIPJRT@pU{34$AoDy26<9{ScG{?OeGwSzRcnor3EWp>DG zmgc7uv0AR6a0ULrCGB!*D+hnj)%S&0JD?`* zC(-Es1?Xga>@GN5Rl}kx;&xNYZ#rTB&&4m1GMIwstHl@?0u7ITa<4qvJ9}`La)7Ll zfAZBIGT@U(B!Mr5k@BpPDz(a$434H(l;KB(^S2tkI}$$w#g(gbLR5#j%0x)gG2aKI z@;ubOwHv2)Qcd&HRfB`3)9w1pmBNrdp^JYkMz*BsSmH-x=~#!j!dLv?Ki3gn9r7lN z80;Lr`DBF7aIR#X+{ykOa(?e6(|TI;t}#NU$L>m*WLixhzVtibBwrR1)W!I(qsLdw}ie- z4*yx-rbK%j)icsTCPt-9ns=PUB>yf-DLK_yRR@Yfm5&Ff53L0|7TdGaFaV`ry}EqX z9iU%TOZ7X3kbpVzI`jQME@PF8DA=M z5+1ACyeMW0#}pX{+w-FKL}1qi|!Anb-eAAB0aVg(Mm+CJ8YwD@J z=G?43`~?eNcuR}}$>P{tg9#(2`d2Av1TneG2d8$gv=2s>8zJTEFi=<0IgJV$1xKTF zyJyo7roatXeZQ1VV|je9gfW9DV>s8#`$#kNN=d5EykvJI!^(cV*BD%#I(>LuqI z=Vv;R?9BV&hv(C@fU+00FxC<@Pl#L?dM-;=>Dq-}<`DIlsYKyyxpMaZ!sHCCcC0`2EFctkD&{<>ktEUP0nu ziB#JWAA?TQAb=$yi}>QW`bJuXO^9u<7-XgGpT`%g=)b5-17das6cYl%*lh2zRK|jL z^mz6Tzl<)hWcI*~!@p$lrw>-zPvE53Ewtgu^I%3OgP&}Vgs800<4NN6&eCA2^YO3U z%@BzSp+X;dPoisRxiXxfRmb$m*<%~ts5KHL(T|`TN&qo|^u@-1GhjDRSSE7TPcv?w zKd=8~2?XNl~H>v6zgl> z&^L=oB1u?Bd-Ut|Gt(ruBjaN!$S+4K8DjX*4@t3+mF{{y&)q^+T(RB8%fMBe)IqQXBkbv|HK zR$uCBzZ43Qn4&U*@B({z1(~6osWlqCs0y!(EN^QEV_piWYar~DXZSL>kC-_jk|ibm zc0xM%W2q`7PiIiyl7lsb)v(7ua^z`lJ9_RQA~px1;Afs#ND(TT$=*`W)i{J12@#`Y z@LvE@?B&WXaMn3Pl`RMM2ja67Wr=l0W+DWWv*j$}-S(O>a;6?03W%7KjCTVf+Jrhx z%q=ycG;=6VSzR9>t;EQS(h@tpEkAm0{}cVD!u;xbAWWDv$cG5t3^p9=UsmlCSA-y}lK1 z`Wfk*gvxMwBkXuc#dl|3RH2G0eK+=GcpG!g_pW?RAtZ$VYoaq2ThstkTI-iDq}oa^ z9ice^n{f{dt(LiS9OW@a`eF6cOn=vq1*G*yb(x(Fa!VgG{v+K?)ysijmJ!w)4<^uk z9USwx14rnBT;8jeH?&sPVA9z`NA2uYz41xiea%o`klQ6@kNBK14mmFix#^KDz{~@;tG9RpR z>Mk)IJrXh8;)voYrixrG9bR0^F%HJh>-r?oIJYs4H2dG`S!1`a07f2PO>fkP0cF0w8D=tnSPi~YpiPTxY-7oQvfjd-v@~?7o zx^)?RWXqLbPDBd8jjCYxFAo$eL<#+(xY^U<+@Utye*( zcRpyxH9VTk_~*N_=V|XO<_Ini_OAzaCvRxeFw1+|`6Ne1E-~lqCqRG9_^|TO<^=;E zeqPZDPR$l3+7$UBzr}WrB$bsZU|5U;tWzoOaJa&% zWAuA>-$6T8zqV~o9B_{-AWLFDiQ1SaAn8vzLB^&?Iwy|VkiIMYOxlP|% z5+uliT$eOF;=oSn?$RR3wNleNhskUbd@St>jjf@4n!nJ)+uhG7r21Xsqi7k&tRY5I z3N+ns(=8}q`Xx?=1?G0pr1@3RM;Wrm!=Jur!qvDNF(?``>En1N;<>yB}fpZ`L$tPd)oLUX$&-NtTdtL+-Iw}3&f5l z{NzOvzAco7(;Huxe=|ZKZkr=G3r8oBF%b|jUQ}R>!nK+OeI#>c14N2l#s=pyw_mdvS-ET z#PFa7)}neN#E*5<8gYDd8k`6XtyN2!p{wHLGEUpjzp%SqmuoWqu@d{(;9k~t+b8ql z@roZC2GlC286i8$a1rcM(APV({vIg_$r+MYz>Dd8u4oPrKiGf#Uczb&^45*s12Idx zi)Lgc0+e^3=(%;>FqpEtB|g*_;Z0NyeZHx0A>&2yxKMiSK~#=b`g0glVst`xb5~mZ z9BCRsi=^K8QkmDwCI_EAYmp;mcELU3K4%)l0i>)uTZs{FMdX2qq%bEM`(ssqoKqR) z>7-OUP%0DXH^rTe7dvSynIS!bg09*{c7iN#{c!Ano`FWqa};%ZoWQamla<^Zh=ln4 zw{epU;g&YU4$XJx8sif_B|Rf9mO`ysnl^8mBRo|EiYNCTO#C_=11Q$C$(OQ>kEw@O zV1gej{|7w9f{R=qQB$Z(zn05;uLLlBh4Z_-R%xx5(imQ4u`GT8ZO2dfXikpPzKogZM@N{X&JDB}qHUcZ$S*bK2?^QUJ?n>pd zxQI$sI@o}@Ku$h%S3^_OZoAZASc_eAj6e{gMezaHD|Am(p|+-IZIB3sDtQ*5~zATU|M z`cTObtwUEHx%-ZpRmYXCVh@SO((O947eG-7Ss{E-{vEATb2*IoOdqfV-R@45{C;TljNV`ZOf6bLCGEQV)dF zGyg9*+Nl6~a{g<=S%Jk{nF181Uo8dUK=)A|Kvve~?7}Nl zvrG~HA32o=S%TUy4Uu)ub>gZ`eg2z;jI}!YhOOtMWZKd~-p|DR_SAQ(bOI;g_V}^F z<)_iJ!7hv%?WFI_nQhwoDwO0V{ud~jl+0e|CIYyey6B)@Zz}6B5sr+}-r>#0#y`G> zz?hW7N)kl&g6H|mrqjI$a4xjzeBU<&_jt$4@9fV7BU z(hWmJl|Pzxij{Ers&X7R0};`HZQ9+ z_51EnB4)@t)_qIqRHwa6O>gNZDlz?fy-4wf;#em%@9KP1dQFmh?(7xm>ZA2Sd021D zmW{ph1OA