From 322885a8700a209812bf5a94205260c9bef6ac1f Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Wed, 15 Dec 1999 19:25:10 +0000 Subject: initial version --- INSTALL | 132 ++ LANGUAGE.HOWTO | 49 + Makefile | 178 ++ Makefile.config | 12 + Makefile.windows | 57 + README | 10 + doc/Doxyfile | 30 + doc/Makefile | 22 + doc/Makefile.latex | 14 + doc/autolink.doc | 125 ++ doc/commands.doc | 1075 ++++++++++ doc/config.doc | 553 +++++ doc/doxygen.sty | 58 + doc/doxygen_logo.eps | 3976 +++++++++++++++++++++++++++++++++++ doc/doxygen_logo.gif | Bin 0 -> 29863 bytes doc/doxygen_logo_low.gif | Bin 0 -> 3952 bytes doc/doxygen_manual.tex | 42 + doc/doxygen_usage.doc | 47 + doc/doxysearch_usage.doc | 169 ++ doc/doxytag_usage.doc | 116 + doc/features.doc | 79 + doc/history.doc | 140 ++ doc/htmlcmds.doc | 111 + doc/index.doc | 163 ++ doc/install.doc | 99 + doc/installdox_usage.doc | 61 + doc/starting.doc | 411 ++++ doc/trouble.doc | 67 + examples/Makefile | 94 + examples/Makefile.windows | 93 + examples/afterdoc.cfg | 6 + examples/afterdoc.h | 18 + examples/author.cfg | 6 + examples/author.cpp | 14 + examples/autolink.cfg | 6 + examples/autolink.cpp | 99 + examples/class.cfg | 6 + examples/class.h | 11 + examples/define.cfg | 7 + examples/define.h | 11 + examples/enum.cfg | 6 + examples/enum.h | 17 + examples/example.cfg | 7 + examples/example.cpp | 19 + examples/example.tag | 2 + examples/example_test.cpp | 5 + examples/file.cfg | 6 + examples/file.h | 10 + examples/func.cfg | 6 + examples/func.h | 21 + examples/include.cfg | 7 + examples/include.cpp | 22 + examples/jdstyle.cfg | 6 + examples/jdstyle.cpp | 66 + examples/overload.cfg | 6 + examples/overload.cpp | 25 + examples/page.cfg | 6 + examples/page.doc | 12 + examples/par.cfg | 6 + examples/par.cpp | 9 + examples/qtstyle.cfg | 6 + examples/qtstyle.cpp | 65 + examples/relates.cfg | 6 + examples/relates.cpp | 24 + examples/resdefine.cfg | 6 + examples/resdefine.cpp | 21 + examples/restypedef.cfg | 6 + examples/restypedef.cpp | 25 + examples/structcmd.cfg | 6 + examples/structcmd.h | 57 + examples/tag.cfg | 8 + examples/tag.cpp | 9 + examples/templ.cfg | 6 + examples/templ.cpp | 37 + make.bat | 4 + src/Makefile | 44 + src/classdef.cpp | 900 ++++++++ src/classdef.h | 169 ++ src/classlist.cpp | 37 + src/classlist.h | 37 + src/code.h | 28 + src/code.l | 747 +++++++ src/config.h | 80 + src/config.l | 1112 ++++++++++ src/constexp.h | 30 + src/constexp.l | 110 + src/constexp.y | 275 +++ src/cppvalue.cpp | 85 + src/cppvalue.h | 59 + src/debug.cpp | 62 + src/debug.h | 39 + src/declinfo.h | 32 + src/declinfo.l | 292 +++ src/defargs.h | 27 + src/defargs.l | 298 +++ src/define.cpp | 43 + src/define.h | 88 + src/definition.cpp | 44 + src/definition.h | 64 + src/diagram.cpp | 1236 +++++++++++ src/diagram.h | 128 ++ src/doxygen.cpp | 3763 +++++++++++++++++++++++++++++++++ src/doxygen.h | 134 ++ src/doxygen.pro | 38 + src/doxygen.t | 76 + src/doxysearch.cpp | 1022 +++++++++ src/doxysearch.pro | 18 + src/doxytag.l | 634 ++++++ src/doxytag.pro | 24 + src/doxytag.t | 49 + src/entry.cpp | 242 +++ src/entry.h | 153 ++ src/example.h | 45 + src/filedef.cpp | 291 +++ src/filedef.h | 158 ++ src/filename.cpp | 133 ++ src/filename.h | 63 + src/formula.cpp | 286 +++ src/formula.h | 57 + src/gifenc.cpp | 293 +++ src/gifenc.h | 85 + src/groupdef.cpp | 158 ++ src/groupdef.h | 64 + src/htmlgen.cpp | 512 +++++ src/htmlgen.h | 174 ++ src/image.cpp | 443 ++++ src/image.h | 50 + src/index.cpp | 975 +++++++++ src/index.h | 65 + src/instdox.cpp | 164 ++ src/instdox.h | 22 + src/language.cpp | 61 + src/language.h | 25 + src/latexgen.cpp | 876 ++++++++ src/latexgen.h | 178 ++ src/logos.cpp | 519 +++++ src/logos.h | 23 + src/mangen.cpp | 341 +++ src/mangen.h | 171 ++ src/memberdef.cpp | 180 ++ src/memberdef.h | 186 ++ src/memberlist.cpp | 148 ++ src/memberlist.h | 56 + src/membername.cpp | 96 + src/membername.h | 111 + src/message.cpp | 49 + src/message.h | 24 + src/namespacedef.cpp | 220 ++ src/namespacedef.h | 70 + src/outputgen.cpp | 77 + src/outputgen.h | 182 ++ src/outputlist.cpp | 239 +++ src/outputlist.h | 298 +++ src/pre.h | 41 + src/pre.l | 1636 ++++++++++++++ src/scanner.h | 34 + src/scanner.l | 3386 +++++++++++++++++++++++++++++ src/searchindex.cpp | 124 ++ src/searchindex.h | 71 + src/suffixtree.cpp | 355 ++++ src/suffixtree.h | 93 + src/tag.h | 22 + src/tag.l | 243 +++ src/translator.h | 280 +++ src/translator_cz.h | 278 +++ src/translator_fr.h | 270 +++ src/translator_it.h | 266 +++ src/translator_nl.h | 266 +++ src/translator_se.h | 250 +++ src/unistd.h | 7 + src/util.cpp | 2174 +++++++++++++++++++ src/util.h | 82 + src/version.h | 22 + tmake/CHANGES | 39 + tmake/LICENSE | 9 + tmake/README | 7 + tmake/bin/progen | 249 +++ tmake/bin/progen.bat | 266 +++ tmake/bin/tmake | 1099 ++++++++++ tmake/bin/tmake.bat | 1093 ++++++++++ tmake/doc/m-linux-gcc.html | 85 + tmake/doc/m-win32-msvc.html | 89 + tmake/doc/tmake.html | 638 ++++++ tmake/doc/tmake_ref.html | 508 +++++ tmake/example/hello.cpp | 102 + tmake/example/hello.h | 34 + tmake/example/hello.pro | 3 + tmake/example/main.cpp | 38 + tmake/example/wc.t | 6 + tmake/lib/aix-g++/app.t | 2 + tmake/lib/aix-g++/lib.t | 2 + tmake/lib/aix-g++/subdirs.t | 2 + tmake/lib/aix-g++/tmake.conf | 57 + tmake/lib/aix-xlc/app.t | 2 + tmake/lib/aix-xlc/lib.t | 2 + tmake/lib/aix-xlc/subdirs.t | 2 + tmake/lib/aix-xlc/tmake.conf | 63 + tmake/lib/dgux-g++/app.t | 2 + tmake/lib/dgux-g++/lib.t | 2 + tmake/lib/dgux-g++/subdirs.t | 2 + tmake/lib/dgux-g++/tmake.conf | 58 + tmake/lib/freebsd-g++/app.t | 2 + tmake/lib/freebsd-g++/lib.t | 2 + tmake/lib/freebsd-g++/subdirs.t | 2 + tmake/lib/freebsd-g++/tmake.conf | 59 + tmake/lib/gnu-g++/app.t | 2 + tmake/lib/gnu-g++/lib.t | 2 + tmake/lib/gnu-g++/subdirs.t | 2 + tmake/lib/gnu-g++/tmake.conf | 57 + tmake/lib/hpux-acc/app.t | 2 + tmake/lib/hpux-acc/lib.t | 2 + tmake/lib/hpux-acc/subdirs.t | 2 + tmake/lib/hpux-acc/tmake.conf | 59 + tmake/lib/hpux-cc/app.t | 2 + tmake/lib/hpux-cc/lib.t | 2 + tmake/lib/hpux-cc/subdirs.t | 2 + tmake/lib/hpux-cc/tmake.conf | 58 + tmake/lib/hpux-g++/app.t | 2 + tmake/lib/hpux-g++/lib.t | 2 + tmake/lib/hpux-g++/subdirs.t | 2 + tmake/lib/hpux-g++/tmake.conf | 59 + tmake/lib/irix-64/app.t | 2 + tmake/lib/irix-64/lib.t | 2 + tmake/lib/irix-64/subdirs.t | 2 + tmake/lib/irix-64/tmake.conf | 59 + tmake/lib/irix-dcc/app.t | 2 + tmake/lib/irix-dcc/lib.t | 2 + tmake/lib/irix-dcc/subdirs.t | 2 + tmake/lib/irix-dcc/tmake.conf | 59 + tmake/lib/irix-g++/app.t | 2 + tmake/lib/irix-g++/lib.t | 2 + tmake/lib/irix-g++/subdirs.t | 2 + tmake/lib/irix-g++/tmake.conf | 59 + tmake/lib/irix-n32/app.t | 2 + tmake/lib/irix-n32/lib.t | 2 + tmake/lib/irix-n32/subdirs.t | 2 + tmake/lib/irix-n32/tmake.conf | 59 + tmake/lib/linux-g++/app.t | 2 + tmake/lib/linux-g++/lib.t | 2 + tmake/lib/linux-g++/subdirs.t | 2 + tmake/lib/linux-g++/tmake.conf | 57 + tmake/lib/netbsd-g++/app.t | 2 + tmake/lib/netbsd-g++/lib.t | 2 + tmake/lib/netbsd-g++/subdirs.t | 2 + tmake/lib/netbsd-g++/tmake.conf | 60 + tmake/lib/openbsd-g++/app.t | 2 + tmake/lib/openbsd-g++/lib.t | 2 + tmake/lib/openbsd-g++/subdirs.t | 2 + tmake/lib/openbsd-g++/tmake.conf | 60 + tmake/lib/osf1-cxx/app.t | 2 + tmake/lib/osf1-cxx/lib.t | 2 + tmake/lib/osf1-cxx/subdirs.t | 2 + tmake/lib/osf1-cxx/tmake.conf | 57 + tmake/lib/osf1-g++/app.t | 2 + tmake/lib/osf1-g++/lib.t | 2 + tmake/lib/osf1-g++/subdirs.t | 2 + tmake/lib/osf1-g++/tmake.conf | 57 + tmake/lib/qnx-g++/app.t | 2 + tmake/lib/qnx-g++/lib.t | 2 + tmake/lib/qnx-g++/subdirs.t | 2 + tmake/lib/qnx-g++/tmake.conf | 57 + tmake/lib/sco-g++/app.t | 2 + tmake/lib/sco-g++/lib.t | 2 + tmake/lib/sco-g++/subdirs.t | 2 + tmake/lib/sco-g++/tmake.conf | 57 + tmake/lib/solaris-cc/app.t | 2 + tmake/lib/solaris-cc/lib.t | 2 + tmake/lib/solaris-cc/subdirs.t | 2 + tmake/lib/solaris-cc/tmake.conf | 60 + tmake/lib/solaris-g++/app.t | 2 + tmake/lib/solaris-g++/lib.t | 2 + tmake/lib/solaris-g++/subdirs.t | 2 + tmake/lib/solaris-g++/tmake.conf | 57 + tmake/lib/sunos-g++/app.t | 2 + tmake/lib/sunos-g++/lib.t | 2 + tmake/lib/sunos-g++/subdirs.t | 2 + tmake/lib/sunos-g++/tmake.conf | 57 + tmake/lib/ultrix-g++/app.t | 2 + tmake/lib/ultrix-g++/lib.t | 2 + tmake/lib/ultrix-g++/subdirs.t | 2 + tmake/lib/ultrix-g++/tmake.conf | 57 + tmake/lib/unix/app.t | 6 + tmake/lib/unix/generic.t | 268 +++ tmake/lib/unix/lib.t | 6 + tmake/lib/unix/subdirs.t | 36 + tmake/lib/unixware-g++/app.t | 2 + tmake/lib/unixware-g++/lib.t | 2 + tmake/lib/unixware-g++/subdirs.t | 2 + tmake/lib/unixware-g++/tmake.conf | 57 + tmake/lib/win32-borland/app.t | 6 + tmake/lib/win32-borland/generic.t | 229 ++ tmake/lib/win32-borland/lib.t | 6 + tmake/lib/win32-borland/subdirs.t | 33 + tmake/lib/win32-borland/tmake.conf | 56 + tmake/lib/win32-g++/app.t | 6 + tmake/lib/win32-g++/generic.t | 226 ++ tmake/lib/win32-g++/lib.t | 6 + tmake/lib/win32-g++/subdirs.t | 2 + tmake/lib/win32-g++/tmake.conf | 56 + tmake/lib/win32-msvc/app.t | 6 + tmake/lib/win32-msvc/generic.t | 221 ++ tmake/lib/win32-msvc/lib.t | 6 + tmake/lib/win32-msvc/subdirs.t | 2 + tmake/lib/win32-msvc/tmake.conf | 64 + tmake/lib/win32-msvc/vcapp.t | 226 ++ tmake/lib/win32-msvc/vclib.t | 178 ++ tmake/lib/win32-symantec/app.t | 6 + tmake/lib/win32-symantec/generic.t | 212 ++ tmake/lib/win32-symantec/lib.t | 6 + tmake/lib/win32-symantec/subdirs.t | 2 + tmake/lib/win32-symantec/tmake.conf | 56 + tmake/lib/win32-visage/app.t | 6 + tmake/lib/win32-visage/generic.t | 208 ++ tmake/lib/win32-visage/lib.t | 6 + tmake/lib/win32-visage/subdirs.t | 2 + tmake/lib/win32-visage/tmake.conf | 56 + tmake/lib/win32-watcom/app.t | 6 + tmake/lib/win32-watcom/generic.t | 202 ++ tmake/lib/win32-watcom/lib.t | 6 + tmake/lib/win32-watcom/subdirs.t | 2 + tmake/lib/win32-watcom/tmake.conf | 54 + tmake/lib/win32/subdirs.t | 35 + 322 files changed, 47322 insertions(+) create mode 100644 INSTALL create mode 100644 LANGUAGE.HOWTO create mode 100644 Makefile create mode 100644 Makefile.config create mode 100644 Makefile.windows create mode 100644 README create mode 100644 doc/Doxyfile create mode 100644 doc/Makefile create mode 100644 doc/Makefile.latex create mode 100644 doc/autolink.doc create mode 100644 doc/commands.doc create mode 100644 doc/config.doc create mode 100644 doc/doxygen.sty create mode 100644 doc/doxygen_logo.eps create mode 100644 doc/doxygen_logo.gif create mode 100644 doc/doxygen_logo_low.gif create mode 100644 doc/doxygen_manual.tex create mode 100644 doc/doxygen_usage.doc create mode 100644 doc/doxysearch_usage.doc create mode 100644 doc/doxytag_usage.doc create mode 100644 doc/features.doc create mode 100644 doc/history.doc create mode 100644 doc/htmlcmds.doc create mode 100644 doc/index.doc create mode 100644 doc/install.doc create mode 100644 doc/installdox_usage.doc create mode 100644 doc/starting.doc create mode 100644 doc/trouble.doc create mode 100644 examples/Makefile create mode 100644 examples/Makefile.windows create mode 100644 examples/afterdoc.cfg create mode 100644 examples/afterdoc.h create mode 100644 examples/author.cfg create mode 100644 examples/author.cpp create mode 100644 examples/autolink.cfg create mode 100644 examples/autolink.cpp create mode 100644 examples/class.cfg create mode 100644 examples/class.h create mode 100644 examples/define.cfg create mode 100644 examples/define.h create mode 100644 examples/enum.cfg create mode 100644 examples/enum.h create mode 100644 examples/example.cfg create mode 100644 examples/example.cpp create mode 100644 examples/example.tag create mode 100644 examples/example_test.cpp create mode 100644 examples/file.cfg create mode 100644 examples/file.h create mode 100644 examples/func.cfg create mode 100644 examples/func.h create mode 100644 examples/include.cfg create mode 100644 examples/include.cpp create mode 100644 examples/jdstyle.cfg create mode 100644 examples/jdstyle.cpp create mode 100644 examples/overload.cfg create mode 100644 examples/overload.cpp create mode 100644 examples/page.cfg create mode 100644 examples/page.doc create mode 100644 examples/par.cfg create mode 100644 examples/par.cpp create mode 100644 examples/qtstyle.cfg create mode 100644 examples/qtstyle.cpp create mode 100644 examples/relates.cfg create mode 100644 examples/relates.cpp create mode 100644 examples/resdefine.cfg create mode 100644 examples/resdefine.cpp create mode 100644 examples/restypedef.cfg create mode 100644 examples/restypedef.cpp create mode 100644 examples/structcmd.cfg create mode 100644 examples/structcmd.h create mode 100644 examples/tag.cfg create mode 100644 examples/tag.cpp create mode 100644 examples/templ.cfg create mode 100644 examples/templ.cpp create mode 100644 make.bat create mode 100644 src/Makefile create mode 100644 src/classdef.cpp create mode 100644 src/classdef.h create mode 100644 src/classlist.cpp create mode 100644 src/classlist.h create mode 100644 src/code.h create mode 100644 src/code.l create mode 100644 src/config.h create mode 100644 src/config.l create mode 100644 src/constexp.h create mode 100644 src/constexp.l create mode 100644 src/constexp.y create mode 100644 src/cppvalue.cpp create mode 100644 src/cppvalue.h create mode 100644 src/debug.cpp create mode 100644 src/debug.h create mode 100644 src/declinfo.h create mode 100644 src/declinfo.l create mode 100644 src/defargs.h create mode 100644 src/defargs.l create mode 100644 src/define.cpp create mode 100644 src/define.h create mode 100644 src/definition.cpp create mode 100644 src/definition.h create mode 100644 src/diagram.cpp create mode 100644 src/diagram.h create mode 100644 src/doxygen.cpp create mode 100644 src/doxygen.h create mode 100644 src/doxygen.pro create mode 100644 src/doxygen.t create mode 100644 src/doxysearch.cpp create mode 100644 src/doxysearch.pro create mode 100644 src/doxytag.l create mode 100644 src/doxytag.pro create mode 100644 src/doxytag.t create mode 100644 src/entry.cpp create mode 100644 src/entry.h create mode 100644 src/example.h create mode 100644 src/filedef.cpp create mode 100644 src/filedef.h create mode 100644 src/filename.cpp create mode 100644 src/filename.h create mode 100644 src/formula.cpp create mode 100644 src/formula.h create mode 100644 src/gifenc.cpp create mode 100644 src/gifenc.h create mode 100644 src/groupdef.cpp create mode 100644 src/groupdef.h create mode 100644 src/htmlgen.cpp create mode 100644 src/htmlgen.h create mode 100644 src/image.cpp create mode 100644 src/image.h create mode 100644 src/index.cpp create mode 100644 src/index.h create mode 100644 src/instdox.cpp create mode 100644 src/instdox.h create mode 100644 src/language.cpp create mode 100644 src/language.h create mode 100644 src/latexgen.cpp create mode 100644 src/latexgen.h create mode 100644 src/logos.cpp create mode 100644 src/logos.h create mode 100644 src/mangen.cpp create mode 100644 src/mangen.h create mode 100644 src/memberdef.cpp create mode 100644 src/memberdef.h create mode 100644 src/memberlist.cpp create mode 100644 src/memberlist.h create mode 100644 src/membername.cpp create mode 100644 src/membername.h create mode 100644 src/message.cpp create mode 100644 src/message.h create mode 100644 src/namespacedef.cpp create mode 100644 src/namespacedef.h create mode 100644 src/outputgen.cpp create mode 100644 src/outputgen.h create mode 100644 src/outputlist.cpp create mode 100644 src/outputlist.h create mode 100644 src/pre.h create mode 100644 src/pre.l create mode 100644 src/scanner.h create mode 100644 src/scanner.l create mode 100644 src/searchindex.cpp create mode 100644 src/searchindex.h create mode 100644 src/suffixtree.cpp create mode 100644 src/suffixtree.h create mode 100644 src/tag.h create mode 100644 src/tag.l create mode 100644 src/translator.h create mode 100644 src/translator_cz.h create mode 100644 src/translator_fr.h create mode 100644 src/translator_it.h create mode 100644 src/translator_nl.h create mode 100644 src/translator_se.h create mode 100644 src/unistd.h create mode 100644 src/util.cpp create mode 100644 src/util.h create mode 100644 src/version.h create mode 100644 tmake/CHANGES create mode 100644 tmake/LICENSE create mode 100644 tmake/README create mode 100755 tmake/bin/progen create mode 100644 tmake/bin/progen.bat create mode 100755 tmake/bin/tmake create mode 100644 tmake/bin/tmake.bat create mode 100644 tmake/doc/m-linux-gcc.html create mode 100644 tmake/doc/m-win32-msvc.html create mode 100644 tmake/doc/tmake.html create mode 100644 tmake/doc/tmake_ref.html create mode 100644 tmake/example/hello.cpp create mode 100644 tmake/example/hello.h create mode 100644 tmake/example/hello.pro create mode 100644 tmake/example/main.cpp create mode 100644 tmake/example/wc.t create mode 100755 tmake/lib/aix-g++/app.t create mode 100755 tmake/lib/aix-g++/lib.t create mode 100755 tmake/lib/aix-g++/subdirs.t create mode 100755 tmake/lib/aix-g++/tmake.conf create mode 100755 tmake/lib/aix-xlc/app.t create mode 100755 tmake/lib/aix-xlc/lib.t create mode 100755 tmake/lib/aix-xlc/subdirs.t create mode 100755 tmake/lib/aix-xlc/tmake.conf create mode 100755 tmake/lib/dgux-g++/app.t create mode 100755 tmake/lib/dgux-g++/lib.t create mode 100755 tmake/lib/dgux-g++/subdirs.t create mode 100755 tmake/lib/dgux-g++/tmake.conf create mode 100755 tmake/lib/freebsd-g++/app.t create mode 100755 tmake/lib/freebsd-g++/lib.t create mode 100755 tmake/lib/freebsd-g++/subdirs.t create mode 100755 tmake/lib/freebsd-g++/tmake.conf create mode 100755 tmake/lib/gnu-g++/app.t create mode 100755 tmake/lib/gnu-g++/lib.t create mode 100755 tmake/lib/gnu-g++/subdirs.t create mode 100755 tmake/lib/gnu-g++/tmake.conf create mode 100755 tmake/lib/hpux-acc/app.t create mode 100755 tmake/lib/hpux-acc/lib.t create mode 100755 tmake/lib/hpux-acc/subdirs.t create mode 100755 tmake/lib/hpux-acc/tmake.conf create mode 100755 tmake/lib/hpux-cc/app.t create mode 100755 tmake/lib/hpux-cc/lib.t create mode 100755 tmake/lib/hpux-cc/subdirs.t create mode 100755 tmake/lib/hpux-cc/tmake.conf create mode 100755 tmake/lib/hpux-g++/app.t create mode 100755 tmake/lib/hpux-g++/lib.t create mode 100755 tmake/lib/hpux-g++/subdirs.t create mode 100755 tmake/lib/hpux-g++/tmake.conf create mode 100755 tmake/lib/irix-64/app.t create mode 100755 tmake/lib/irix-64/lib.t create mode 100755 tmake/lib/irix-64/subdirs.t create mode 100755 tmake/lib/irix-64/tmake.conf create mode 100755 tmake/lib/irix-dcc/app.t create mode 100755 tmake/lib/irix-dcc/lib.t create mode 100755 tmake/lib/irix-dcc/subdirs.t create mode 100755 tmake/lib/irix-dcc/tmake.conf create mode 100755 tmake/lib/irix-g++/app.t create mode 100755 tmake/lib/irix-g++/lib.t create mode 100755 tmake/lib/irix-g++/subdirs.t create mode 100755 tmake/lib/irix-g++/tmake.conf create mode 100755 tmake/lib/irix-n32/app.t create mode 100755 tmake/lib/irix-n32/lib.t create mode 100755 tmake/lib/irix-n32/subdirs.t create mode 100755 tmake/lib/irix-n32/tmake.conf create mode 100755 tmake/lib/linux-g++/app.t create mode 100755 tmake/lib/linux-g++/lib.t create mode 100755 tmake/lib/linux-g++/subdirs.t create mode 100755 tmake/lib/linux-g++/tmake.conf create mode 100755 tmake/lib/netbsd-g++/app.t create mode 100755 tmake/lib/netbsd-g++/lib.t create mode 100755 tmake/lib/netbsd-g++/subdirs.t create mode 100755 tmake/lib/netbsd-g++/tmake.conf create mode 100755 tmake/lib/openbsd-g++/app.t create mode 100755 tmake/lib/openbsd-g++/lib.t create mode 100755 tmake/lib/openbsd-g++/subdirs.t create mode 100755 tmake/lib/openbsd-g++/tmake.conf create mode 100755 tmake/lib/osf1-cxx/app.t create mode 100755 tmake/lib/osf1-cxx/lib.t create mode 100755 tmake/lib/osf1-cxx/subdirs.t create mode 100755 tmake/lib/osf1-cxx/tmake.conf create mode 100755 tmake/lib/osf1-g++/app.t create mode 100755 tmake/lib/osf1-g++/lib.t create mode 100755 tmake/lib/osf1-g++/subdirs.t create mode 100755 tmake/lib/osf1-g++/tmake.conf create mode 100755 tmake/lib/qnx-g++/app.t create mode 100755 tmake/lib/qnx-g++/lib.t create mode 100755 tmake/lib/qnx-g++/subdirs.t create mode 100755 tmake/lib/qnx-g++/tmake.conf create mode 100755 tmake/lib/sco-g++/app.t create mode 100755 tmake/lib/sco-g++/lib.t create mode 100755 tmake/lib/sco-g++/subdirs.t create mode 100755 tmake/lib/sco-g++/tmake.conf create mode 100755 tmake/lib/solaris-cc/app.t create mode 100755 tmake/lib/solaris-cc/lib.t create mode 100755 tmake/lib/solaris-cc/subdirs.t create mode 100755 tmake/lib/solaris-cc/tmake.conf create mode 100755 tmake/lib/solaris-g++/app.t create mode 100755 tmake/lib/solaris-g++/lib.t create mode 100755 tmake/lib/solaris-g++/subdirs.t create mode 100755 tmake/lib/solaris-g++/tmake.conf create mode 100755 tmake/lib/sunos-g++/app.t create mode 100755 tmake/lib/sunos-g++/lib.t create mode 100755 tmake/lib/sunos-g++/subdirs.t create mode 100755 tmake/lib/sunos-g++/tmake.conf create mode 100755 tmake/lib/ultrix-g++/app.t create mode 100755 tmake/lib/ultrix-g++/lib.t create mode 100755 tmake/lib/ultrix-g++/subdirs.t create mode 100755 tmake/lib/ultrix-g++/tmake.conf create mode 100755 tmake/lib/unix/app.t create mode 100755 tmake/lib/unix/generic.t create mode 100755 tmake/lib/unix/lib.t create mode 100755 tmake/lib/unix/subdirs.t create mode 100755 tmake/lib/unixware-g++/app.t create mode 100755 tmake/lib/unixware-g++/lib.t create mode 100755 tmake/lib/unixware-g++/subdirs.t create mode 100755 tmake/lib/unixware-g++/tmake.conf create mode 100755 tmake/lib/win32-borland/app.t create mode 100755 tmake/lib/win32-borland/generic.t create mode 100755 tmake/lib/win32-borland/lib.t create mode 100755 tmake/lib/win32-borland/subdirs.t create mode 100755 tmake/lib/win32-borland/tmake.conf create mode 100755 tmake/lib/win32-g++/app.t create mode 100755 tmake/lib/win32-g++/generic.t create mode 100755 tmake/lib/win32-g++/lib.t create mode 100755 tmake/lib/win32-g++/subdirs.t create mode 100755 tmake/lib/win32-g++/tmake.conf create mode 100755 tmake/lib/win32-msvc/app.t create mode 100755 tmake/lib/win32-msvc/generic.t create mode 100755 tmake/lib/win32-msvc/lib.t create mode 100755 tmake/lib/win32-msvc/subdirs.t create mode 100755 tmake/lib/win32-msvc/tmake.conf create mode 100755 tmake/lib/win32-msvc/vcapp.t create mode 100755 tmake/lib/win32-msvc/vclib.t create mode 100755 tmake/lib/win32-symantec/app.t create mode 100755 tmake/lib/win32-symantec/generic.t create mode 100755 tmake/lib/win32-symantec/lib.t create mode 100755 tmake/lib/win32-symantec/subdirs.t create mode 100755 tmake/lib/win32-symantec/tmake.conf create mode 100755 tmake/lib/win32-visage/app.t create mode 100755 tmake/lib/win32-visage/generic.t create mode 100755 tmake/lib/win32-visage/lib.t create mode 100755 tmake/lib/win32-visage/subdirs.t create mode 100755 tmake/lib/win32-visage/tmake.conf create mode 100755 tmake/lib/win32-watcom/app.t create mode 100755 tmake/lib/win32-watcom/generic.t create mode 100755 tmake/lib/win32-watcom/lib.t create mode 100755 tmake/lib/win32-watcom/subdirs.t create mode 100755 tmake/lib/win32-watcom/tmake.conf create mode 100755 tmake/lib/win32/subdirs.t diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..22f0481 --- /dev/null +++ b/INSTALL @@ -0,0 +1,132 @@ +DOXYGEN Version 0.49-990425 + +INSTALLATION INSTRUCTIONS FOR UNIX: +----------------------------------- + +1. Unpack the archive, unless you already have: + + gunzip doxygen-0.49-990425.src.tar.gz # uncompress the archive + tar xf doxygen-0.49-990425.src.tar # unpack it + +2. Make sure Qt is installed properly (check the environment variable $QTDIR) + + Note: on some systems (like FreeBSD) it is possible that qt is not + installed in one single directory. In this case I suggest to create a + local qt directory to which the QTDIR variable should point. Then + create two links in that directory like this: + ln -s include + ln -s lib + +3. Look at the first two entries of Makefile.config and modify them if needed. + Note: Doxygen requires GNU make to build. On some systems this is + known as gmake. If you have such a system, you must edit Makefile.config + and replace make by gmake in rest of this document. + +4. Compile the program. + + Type: + + make + + You'll see a list of all supported platforms/compiler combinations. + + To build for the Linux platform with g++ as the compiler for example, type: + + make linux-g++ + + The program should compile without problems and three binaries (doxygen, + doxytag, and doxysearch) should be available in the bin directory of the + distribution. + +5. Generate the user manual. + + type: + + make docs + + to let doxygen generate the HTML and LaTeX documentation. + (you will need the stream editor `sed' for this) + + type: + + make ps + + to generate a postscript version of the manual. + (you will need latex and dvips for this) + + The html directory of the distribution will now contain the html + documentation (just point a HTML browser to the file index.html in the + html directory). + + The postscript manual doxygen_manual.ps will be located in the latex + directory of the distribution. Just send it to a postscript printer to + print it or use ghostview to view it. + +INSTALLATION INSTRUCTIONS FOR WINDOWS: +-------------------------------------- + +Currently, only Microsoft Visual C++ version 5.0 is supported. For other +platforms you may need to edit the Makefiles a bit. Let me know what you +had to change if you got Doxygen working with another windows compiler. + +You will need to install the windows/dos versions of following tools: +- Perl 5.0+ +- flex (you can use the DJGPP version) +- bison (you can use the DJGPP version, but you need to copy + lib\bison.sim to c:\djgpp\lib\bison.simple and + lib\bison.hai to c:\djgpp\lib\bison.hairy. + The paths seem to be hardcoded in the executable) +- Qt (Hint: only the tools section is required, so you can use the free + X-windows version as well!) +- Microsoft Visual C++ version 5.0, use the vcvars32.bat to set the environment + variables. + +Make sure all tools are accessible from the command-line. + +Open a dos box, goto the doxygen root dir and type: + +make.bat + +This should build the executables doxygen.exe, doxytag.exe, and doxysearch.exe +(The compiler should not produce any warnings or errors). + +To build the examples type: + +nmake -f Makefile.windows examples + +----------------------------------------------------------------------------- +KNOWN CONFIGURATION PROBLEMS + +LATEX RELATED PROBLEMS: + +- the LaTeX translation of HTML tables doesn't seem to work for all + compilers. It is known to work for teTeX (versions 0.4 and 0.9) +- the file a4wide.sty is not available for all distributions. If + your distribution does not have it please select another paper type + in the config file (see PAPER_TYPE) +- the file fancyheader.sty is known as fancyhdr.sty on some systems. + Please change that in src/latexgen.cpp + +HP-UX PROBLEMS: +- If you are compiling for HP-UX with aCC and you get this error: + /opt/aCC/lbin/ld: Unsatisfied symbols: + alloca (code) + then you should edit ce_parse.cpp and replace + extern "C" { + void *alloca (unsigned int); + }; + with + #include + This seems to be a problem with bison, but I don't know how to fix it. +----------------------------------------------------------------------------- + +That's it! + +Please report any problems to dimitri@stack.nl + +The latest version of doxygen can be obtained at + http://www.stack.nl/~dimitri/doxygen + +Enjoy, + +Dimitri van Heesch (25 April 1999) diff --git a/LANGUAGE.HOWTO b/LANGUAGE.HOWTO new file mode 100644 index 0000000..21cc9c2 --- /dev/null +++ b/LANGUAGE.HOWTO @@ -0,0 +1,49 @@ +This short howto explains how to add support for a new language to Doxygen: + +Just follow these steps: + +1) Tell me for which language you want to add support. If no one else + is already working on support for that language, you will be + assigned as the maintainer for the language. I'll create a + list on Doxygen's homepage, so everyone knows who is doing what. +2) Create a copy of translator_nl.h and name it + translator_.h + I'll use xx in the rest of this document. +3) Edit language.cpp: + - Add a #include + - in setTranslator() add + + else if (L_EQUAL("your_language_name")) + { + theTranslator = new TranslatorYourlanguage; + } + + after the if { ... } +4) Edit doxygen.pro and add translator_xx.h to the HEADERS line in the + file doxygen.pro. +5) Edit translator_xx.h: + - Rename TRANSLATOR_NL_H to TRANSLATOR_XX_H twice. + - Rename TranslatorDutch to TranslatorYourlanguage + - In the member latexBabelPackage() change "dutch" into the name of the + latex package that adds support for your language. + - Edit all the strings that are returned by the members that start + with tr. + Look at the corresponding member in translator.h for the english text + that is returned and translate that into your language. + Try to match punctuation and capitals! + To enter special characters (with accents) you can: + a) Enter them directly if your keyboard supports that and you are + using a Latin-1 font. + Doxygen will translate the characters to proper Latex and + leave the Html and man output for what it is. + b) Use html codes like ä for an a with an umlaut. + See the HTML specification for the codes. +6) Recompile everything (do this from the root of the distribution, + because the Makefile.dox* have to be regenerated!) +7) Now you can use OUTPUT_LANGUAGE = your_language_name + in the config file to generate output in your language. +8) Send translator_xx.h or a diff -u of the changes to me so I can add it + to doxygen. + +Good luck, and let me know if there are problems. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..037c87a --- /dev/null +++ b/Makefile @@ -0,0 +1,178 @@ +# this Makefile need GNU make + +include Makefile.config + +variables: Makefile + @echo + @echo "Select one of the following targets:" + @echo + @echo "aix-g++ aix-xlc " + @echo "dgux-g++ freebsd-g++ " + @echo "gnu-g++ hpux-acc " + @echo "hpux-cc hpux-g++ " + @echo "irix-64 irix-dcc " + @echo "irix-g++ irix-n32 " + @echo "linux-g++ netbsd-g++ " + @echo "openbsd-g++ osf1-cxx " + @echo "osf1-g++ qnx-g++ " + @echo "sco-g++ solaris-cc " + @echo "solaris-g++ sunos-g++ " + @echo "ultrix-g++ unixware-g++ " + @echo + @echo "Make any of them to build Doxygen." + @echo "Make will now abort with an error." + @exit 1 + +aix-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/aix-g++ \ + $(MAKE) + +aix-xlc: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/aix-xlc \ + $(MAKE) + +dgux-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/dgux-g++ \ + $(MAKE) + +freebsd-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/freebsd-g++ \ + $(MAKE) + +hpux-acc: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/hpux-acc \ + $(MAKE) + +hpux-cc: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/hpux-cc \ + $(MAKE) + +hpux-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/hpux-g++ \ + $(MAKE) + +irix-64: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/irix-64 \ + $(MAKE) + +irix-dcc: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/irix-dcc \ + $(MAKE) + +irix-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/irix-g++ \ + $(MAKE) + +irix-n32: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/irix-n32 \ + $(MAKE) + +linux-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/linux-g++ \ + $(MAKE) + +netbsd-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/netbsd-g++ \ + $(MAKE) + +openbsd-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/openbsd-g++ \ + $(MAKE) + +osf1-cxx: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/osf1-cxx \ + $(MAKE) + +osf1-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/osf1-g++ \ + $(MAKE) + +qnx-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/qnx-g++ \ + $(MAKE) + +sco-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/sco-g++ \ + $(MAKE) + +solaris-cc: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/solaris-cc \ + $(MAKE) + +solaris-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/solaris-g++ \ + $(MAKE) + +sunos-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/sunos-g++ \ + $(MAKE) + +ultrix-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/ultrix-g++ \ + $(MAKE) + +unixware-g++: src/version.cpp + cd src; \ + TMAKEPATH=../tmake/lib/unixware-g++ \ + $(MAKE) + + +clean: FORCE + cd examples ; $(MAKE) clean + cd doc ; $(MAKE) clean + -rm -f src/scanner.cpp \ + src/code.cpp \ + src/config.cpp \ + src/pre.cpp \ + src/tag.cpp \ + src/ce_lex.cpp \ + src/ce_parse.cpp \ + src/ce_parse.h \ + src/doxytag.cpp \ + src/declinfo.cpp \ + src/defargs.cpp \ + src/Makefile.doxygen \ + src/Makefile.doxytag \ + src/Makefile.doxysearch \ + src/version.cpp + -rm -f bin/doxy* + -rm -f objects/*.o + +docs: FORCE + cd examples ; $(MAKE) + cd doc ; $(MAKE) + +ps: docs + cd latex ; $(MAKE) + +archive: clean + $(TAR) zcvf backup/dx`date +%y%m%d`.tgz tmake doc examples bin objects \ + src Makefile Makefile.windows INSTALL make.bat Makefile.config \ + LANGUAGE.HOWTO + +src/version.cpp: FORCE + echo "char versionString[]=\"$(VERSION)\";" > src/version.cpp + +FORCE: diff --git a/Makefile.config b/Makefile.config new file mode 100644 index 0000000..0492810 --- /dev/null +++ b/Makefile.config @@ -0,0 +1,12 @@ +# name (and path if needed) of the make tool to use +# note that make must really be GNU make, not BSD or some other make +MAKE = make + +# name (and path if needed) of the perl interpreter +# note that it must be version 5 or higher (check with perl -v) +PERL = perl + +# The values below should probably be left unmodified +TAR = tar # name of the GNU tar tool +TMAKE = ../tmake/bin/tmake +VERSION = 0.49-990425 diff --git a/Makefile.windows b/Makefile.windows new file mode 100644 index 0000000..a662b2e --- /dev/null +++ b/Makefile.windows @@ -0,0 +1,57 @@ +# Makefile for Microsoft Visual C++ + +include Makefile.config + +MAKE = nmake /NOLOGO +TMAKE = ..\tmake\bin\tmake + +all: + @echo " + @echo " Select one of the following targets: " + @echo " " + @echo " win32-msvc " + @echo " " + @echo " Make any of them to build Doxygen. " + @echo " Make will now abort with an error. " + @exit 1 + +win32-msvc: src\version.cpp + cd src + $(MAKE) tmake TMAKE=$(TMAKE) PERL=$(PERL) + $(MAKE) MAKE=$(MAKE) + +clean: FORCE + cd examples + $(MAKE) -f Makefile.windows clean + cd .. + -del src\scanner.cpp + -del src\code.cpp + -del src\config.cpp + -del src\pre.cpp + -del src\tag.cpp + -del src\constexp.lex.cpp + -del src\constexp.parse.cpp + -del src\constexp.parse.h + -del src\doxytag.cpp + -del src\declinfo.cpp + -del src\defargs.cpp + -del src\Makefile.doxygen + -del src\Makefile.doxytag + -del src\Makefile.doxysearch + -del src\version.cpp + -del bin\doxy*.* + -del objects\*.obj + +examples: FORCE + cd examples + $(MAKE) -f Makefile.windows + cd .. + +docs: examples + @echo Docs cannot be made using windows yet. + @echo Get them from the binary distribution... + +src\version.cpp: + echo char versionString[]="$(VERSION)"; >src\version.cpp + +FORCE: diff --git a/README b/README new file mode 100644 index 0000000..7ebbeb7 --- /dev/null +++ b/README @@ -0,0 +1,10 @@ +DOXYGEN Version 0.49-990425 + +Please read INSTALL for compilation instructions. + +The latest version of doxygen can be obtained at + http://www.stack.nl/~dimitri/doxygen + +Enjoy, + +Dimitri van Heesch (25 April 1999) diff --git a/doc/Doxyfile b/doc/Doxyfile new file mode 100644 index 0000000..79cbb31 --- /dev/null +++ b/doc/Doxyfile @@ -0,0 +1,30 @@ +PROJECT_NAME = +OUTPUT_DIRECTORY = .. +HTML_HEADER = +HTML_FOOTER = +QUIET = NO +WARNINGS = YES +DISABLE_INDEX = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +GENERATE_LATEX = YES +GENERATE_HTML = YES +ENABLE_PREPROCESSING = NO +INPUT = index.doc install.doc starting.doc trouble.doc \ + history.doc features.doc \ + doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \ + installdox_usage.doc autolink.doc \ + config.doc commands.doc htmlcmds.doc +FILE_PATTERNS = *.cpp *.h *.doc +EXAMPLE_PATH = ../examples +RECURSIVE = NO +TAGFILES = +ALLEXTERNALS = NO +PERL_PATH = /usr/local/bin/perl +SEARCHENGINE = NO +CGI_NAME = search.cgi +CGI_URL = +DOC_URL = +DOC_ABSPATH = +BIN_ABSPATH = /usr/local/bin/ +EXT_DOC_PATHS = diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..953517a --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,22 @@ +include ../Makefile.config + +DOXYDIR=../bin +DOXYGEN_DOCDIR=.. + +all: FORCE + DOXYGEN_DOCDIR=$(DOXYGEN_DOCDIR); \ + export DOXYGEN_DOCDIR; \ + VERSION=$(VERSION) ; \ + export VERSION; \ + $(DOXYDIR)/doxygen + @rm -f ../latex/refman.tex + @cp doxygen_logo*.gif ../html + @cp Makefile.latex ../latex/Makefile + @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >../latex/doxygen_manual.tex + @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >../latex/doxygen.sty + @cp doxygen_logo.eps ../latex + +clean: + rm -rf ../html ../latex + +FORCE: diff --git a/doc/Makefile.latex b/doc/Makefile.latex new file mode 100644 index 0000000..7ab03a3 --- /dev/null +++ b/doc/Makefile.latex @@ -0,0 +1,14 @@ +all: doxygen_manual.ps + +doxygen_manual.ps: doxygen_manual.dvi + dvips -o doxygen_manual.ps doxygen_manual.dvi + +doxygen_manual.dvi: doxygen_manual.tex doxygen.sty + echo "Running latex..." + latex doxygen_manual.tex + echo "Running makeindex..." + makeindex doxygen_manual.idx + echo "Rerunning latex...." + latex doxygen_manual.tex +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log diff --git a/doc/autolink.doc b/doc/autolink.doc new file mode 100644 index 0000000..b0f0fa4 --- /dev/null +++ b/doc/autolink.doc @@ -0,0 +1,125 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page autolink Automatic link generation + + Most documentation systems have special `see also' sections where links + to other pieces of documentation can be inserted. + Although doxygen also has a command to start such a section (See section + \ref cmdsa), it does allow you to put these kind of links anywhere in the + documentation. + For \f$\mbox{\LaTeX}\f$ documentation a reference to the page number + is written instead of a link. Furthermore, the index at the end of the + document can be used to quickly find the documentation of a member, class, + namespace or file. + For man pages no reference information is generated. + + The next sections show how to generate links to the various documented + entities in a source file. + + \subsection linkclass Links to classes. + + All words in the documentation that correspond to a documented class + will automatically be replaced by a link to the page containing the + documentation of the class. If you want to prevent that a word + that corresponds to a documented class is replaced by a link you + should put a \% in front of the word. + + \subsection linkfile Links to files. + + All words that contain a dot (.) that is not the last character + in the word are considered to be file names. + If the word is indeed the name of a documented input file, a link will + automatically be created to the documentation of that file. + + \subsection linkfunc Links to functions. + + Links to functions are created if one of the following patterns is + encountered: +
    +
  1. \"("\")" +
  2. \"()" +
  3. "::"\ +
  4. (\"::")n\"("\")" +
  5. (\"::")n\"()" +
  6. (\"::")n\ +
+ where n>0. + + \par Notice 1: + The patterns above should not contain spaces, tabs or newlines. + \par Notice 2: + For JavaDoc compatibility a \c # may be used instead of a \c :: in + the patterns above. + + For non overloaded members the argument list may be omitted. + + If a function is overloaded and no matching argument list is specified + (i.e. pattern 2 or 5 is used), a link will be created to the + documentation of one of the overloaded members. + + For member functions the class scope (as used in patterns 4 to 6) may + be omitted, if: +
    +
  1. The pattern points to a documented member that belongs to the same class + as the documentation block that contains the pattern. +
  2. The class that corresponds to the documentation blocks that contains + the pattern has a base class that contains a documented member + that matches the pattern. +
+ + \subsection linkother Links to variables, typedefs, enum types, enum values and defines. + + All of these entities can be linked to in the same way as described in the + previous section. For sake of clarity it is advised to only use + patterns 3 and 6 in this case. + + \par Example: + \verbinclude autolink.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + + \subsection resolving Resolving of defines and typedefs. + + Macro definitions of the form: +\verbatim +#define TypeName ClassName +\endverbatim + will be resolved inside documentation blocks. + + \par Example: + \verbinclude resdefine.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + + Typedefs that involve classes, structs and unions, like +\verbatim +typedef struct StructName TypeName +\endverbatim + create an alias for StructName, so links will be generated to StructName, + when either StructName itself or TypeName is encountered. + + \par Example: + \verbinclude restypedef.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +*/ diff --git a/doc/commands.doc b/doc/commands.doc new file mode 100644 index 0000000..c288be7 --- /dev/null +++ b/doc/commands.doc @@ -0,0 +1,1075 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page commands + +\section commands Special Commands + +All commands in the documentation start with a backslash (\\) or an +at-sign (\@). +Some commands have one or more arguments. +Each argument has a certain range: +
    +
  • If braces are used the argument is a single word. +
  • If (round) braces are used the argument extends until the end of the line + on which the command was found. +
  • If {curly} braces are used the argument extends until the next paragraph. + Paragraphs are delimited by a blank line or by a section indicator. +
+If [square] brackets are used the argument is optional. + +Here is an alphabetically sorted list of all commands with references to their +documentation: +\htmlonly + +
    +\endhtmlonly +\latexonly +\begin{multicols}{3} +\begin{CompactList} +\endlatexonly +
  • \refitem cmda \a +
  • \refitem cmdaddindex \addindex +
  • \refitem cmdarg \arg +
  • \refitem cmdauthor \author +
  • \refitem cmdb \b +
  • \refitem cmdbrief \brief +
  • \refitem cmdbug \bug +
  • \refitem cmdc \c +
  • \refitem cmdclass \class +
  • \refitem cmdcode \code +
  • \refitem cmddate \date +
  • \refitem cmddef \def +
  • \refitem cmddefgroup \defgroup +
  • \refitem cmddontinclude \dontinclude +
  • \refitem cmde \e +
  • \refitem cmdendcode \endcode +
  • \refitem cmdendhtmlonly \endhtmlonly +
  • \refitem cmdendlatexonly \endlatexonly +
  • \refitem cmdendlink \endlink +
  • \refitem cmdendverbatim \endverbatim +
  • \refitem cmdenum \enum +
  • \refitem cmdexample \example +
  • \refitem cmdexception \exception +
  • \refitem cmdfdollar \f$ +
  • \refitem cmdfbropen \f[ +
  • \refitem cmdfbrclose \f] +
  • \refitem cmdfile \file +
  • \refitem cmdfn \fn +
  • \refitem cmdhtmlonly \htmlonly +
  • \refitem cmdinclude \include +
  • \refitem cmdingroup \ingroup +
  • \refitem cmdinternal \internal +
  • \refitem cmdlatexonly \latexonly +
  • \refitem cmdline \line +
  • \refitem cmdlink \link +
  • \refitem cmdnamespace \namespace +
  • \refitem cmdoverload \overload +
  • \refitem cmdpage \page +
  • \refitem cmdpar \par +
  • \refitem cmdparam \param +
  • \refitem cmdref \ref +
  • \refitem cmdrelates \relates +
  • \refitem cmdreturn \return +
  • \refitem cmdsa \sa +
  • \refitem cmdsection \section +
  • \refitem cmdskip \skip +
  • \refitem cmdskipline \skipline +
  • \refitem cmdstruct \struct +
  • \refitem cmdsubsection \subsection +
  • \refitem cmdtypedef \typedef +
  • \refitem cmdunion \union +
  • \refitem cmduntil \until +
  • \refitem cmdvar \var +
  • \refitem cmdverbatim \verbatim +
  • \refitem cmdverbinclude \verbinclude +
  • \refitem cmdversion \version +
  • \refitem cmdwarning \warning +
  • \refitem cmddollar \$ +
  • \refitem cmdat \@ +
  • \refitem cmdbackslash \\ +
  • \refitem cmdamp \& +
  • \refitem cmdlt \\< +
  • \refitem cmdgt \\> +
  • \refitem cmdhash \# +\htmlonly +
+
+\endhtmlonly +\latexonly +\end{CompactList} +\end{multicols} +\endlatexonly + +The following subsections provide a list of all commands that are recognized by +Doxygen. Unrecognized commands are treated as normal text. + +

\htmlonly
--- \endhtmlonly + Structural indicators + \htmlonly ---
\endhtmlonly

+ +\subsection cmdclass \class [] [] + + \addindex \class + Indicates that a comment block contains documentation for a + class with name \. Optionally a header file and a header name + can be specified. If the header-file is specified, a link to a verbatim copy + of the header will be included in the HTML documentation. + The \ argument can be used to overwrite the + name of the link that is used in the class documentation to something other + than \. This can be useful if the include name is not located + on the default include path (like \). + + \par Example: + \verbinclude class.h + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +
+\subsection cmdcode \code + + \addindex \\code + Starts a block of code. A code block is treated differently + from ordinary text. It is interpreted as C/C++ code. The names of the + classes and members that are documented are automatically replaced by + links to the documentation. + + \sa section \ref cmdendcode, section \ref cmdverbatim + +
+\subsection cmddef \def + + \addindex \def + Indicates that a comment block contains documentation for a + \c #define macro. + + \par Example: + \verbinclude define.h + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +
+\subsection cmddefgroup \defgroup (group title) + + \addindex \defgroup + Indicates that a comment block contains documentation for a + group of classes, files or namespaces. This can be used to + categorize classes, files or namespaces, and document those + categories. + \sa section \ref cmdingroup + +
+\subsection cmdendcode \endcode + + \addindex \endcode + Ends a block of code. + \sa section \ref cmdcode + +
+\subsection cmdenum \enum + + \addindex \enum + Indicates that a comment block contains documentation for an + enumeration, with name \. If the enum is a member of a class and + the documentation block is located outside the class definition, + the scope of the class should be specified as well. + If a comment block is located directly in front of an enum declaration, + the \\enum comment may be omitted. + + \par Notice: + The type of an anonymous enum cannot be documented, but the values + of an anonymous enum can. + + \par Example: + \verbinclude enum.h + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +
+\subsection cmdexample \example + + \addindex \example + Indicates that a comment block contains documentation for a source code + example. The name of the source file is \. The text of + this file will be included in the documentation, just after the + documentation contained in the comment block. All examples are placed + in a list. The source code is scanned for documented members and classes. + If any are found, the names are cross-referenced with the documentation. + + If more that one source file is needed for the example, + the \\include command can be used. + + \par Example: + \verbinclude example.cpp + Where the example file \c example_test.cpp looks as follows: + \verbinclude example_test.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + + \sa section \ref cmdinclude. + +
+\subsection cmdfile \file [] + + \addindex \file + Indicates that a comment block contains documentation for a source or + header file with name \. The file name may include (part of) the + path if the file-name alone is not unique. If the file name is omitted + (i.e. the line after \\file is left blank) then the documentation block that + contains the \\file command will belong to the file it is located in. + + \par Important: + The documentation of global functions, variables, typedefs, and enums will + only be included in the output if the file they are in is documented as well. + + \par Example: + \verbinclude file.h + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +
+\subsection cmdfn \fn (function declaration) + + \addindex \fn + Indicates that a comment block contains documentation for a function + (either global or as a member of a class). This command is needed if a + comment block is \e not located before the function declaration + or definition. A full function declaration should be specified after the + \fn command. The argument ends at the end of the line. + + \par Example: + \verbinclude func.h + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + + \sa section \ref cmdvar and \ref cmdtypedef + +
+\subsection cmdingroup \ingroup + + \addindex \ingroup + If the \\ingroup command is placed in a comment block of a + class, file or namespace, then it will be added to the group. + + \sa section \ref cmddefgroup + +
+\subsection cmdinternal \internal + + \addindex \internal + This command writes the message `For internal use only' to the output. + All text after a \c \internal command is ignored. + +
+\subsection cmdnamespace \namespace + + \addindex \namespace + Indicates that a comment block contains documentation for a + namespace with name \. + +
+\subsection cmdoverload \overload [(function declaration)] + + \addindex \overload + This command can be used to generate the following + standard text for an overloaded member function: + + `This is an overloaded member function, provided for convenience. + It differs from the above function only in what argument(s) it accepts.' + + If the documentation for the overloaded member function is not located + in front of the function declaration or definition, the optional + argument should be used to specify the correct function. + + Any other documentation that is inside the documentation block will + by appended after the generated message. + + \par Notice 1: + You are responsible that there is indeed an + earlier documented member that is overloaded by this one. + \par Notice 2: + The \\overload command does not work inside a one-line comment. + \par Example: + \verbinclude examples/overload.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +
+\subsection cmdpage \page (title) + + \addindex \page + Indicates that a comment block contains a piece of documentation that is + not directly related to one specific class, file or member. + The HTML generator creates a page containing the documentation. The + \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly generator + starts a new section in the chapter `Page documentation'. + + \par Example: + \verbinclude page.doc + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + + \sa section \ref cmdsection, section \ref cmdsubsection, and + section \ref cmdref + +
+\subsection cmdrelates \relates + + \addindex \relates + This command can be used in the documentation of a non-member function + \. It puts the function inside the `related function' section + of the class documentation. This command is useful for documenting + non-friend functions that are nevertheless strongly coupled to a certain + class. It prevents the need of having to document a file, but + only works for functions. + + \par Example: + \verbinclude relates.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +
+\subsection cmdstruct \struct [] [] + + \addindex \struct + Indicates that a comment block contains documentation for a + struct with name \. The arguments are equal to the \\class + command. + + \sa section \ref cmdclass. + +
+\subsection cmdtypedef \typedef (typedef declaration) + + \addindex \typedef + Indicates that a comment block contains documentation for a typedef, + typedef (either global or as a member of a class). + This command is equivalent to \\var and \\fn. + + \sa section \ref cmdfn and \ref cmdvar + +
+\subsection cmdunion \union [] [] + + \addindex \union + Indicates that a comment block contains documentation for a + union with name \. The arguments are equal to the \\class + command. + + \sa section \ref cmdclass. + +
+\subsection cmdvar \var (variable declaration) + + \addindex \var + Indicates that a comment block contains documentation for a variable, + enum value (either global or as a member of a class). + This command is equivalent to \\typedef and \\fn. + + \sa section \ref cmdfn and \cmdtypedef + +
+ +

\htmlonly
--- \endhtmlonly + Section indicators + \htmlonly ---
\endhtmlonly

+ +\subsection cmdauthor \author { list of authors } + + \addindex \author + Starts a paragraph where one or more author names may be entered. + The paragraph will be indented. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\author commands will be joined into a single paragraph + and separated by commas. Alternatively, one \\author command may mention + several authors. The \\author command ends when a blank line or some other + sectioning command is encountered. + + \par Example: + \verbinclude author.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + + \sa Section \ref cmdjdauthor. + +
+\subsection cmdbrief \brief {brief description} + + \addindex \brief + Starts a paragraph that serves as a brief description. For classes and files + the brief description will be used in lists and at the start of the + documentation page. For class and file members, the brief description + will be placed at the declaration of the member and prepended to the + detailed description. A brief description may span several lines (although + it is advised to keep it brief!). A brief description ends when a + blank line or another sectioning command is encountered. If multiple + \\brief commands are present they will be joined. See section + \ref cmdauthor for an example. + + \sa Section \ref cmdjdshort + +
+\subsection cmdbug \bug { bug description } + + \addindex \bug + Starts a paragraph where one or more bugs may be reported. + The paragraph will be indented. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\bug commands will be joined into a single paragraph. + Each bug description will start on a new line. + Alternatively, one \\bug command may mention + several bugs. The \\bug command ends when a blank line or some other + sectioning command is encountered. See section \ref cmdauthor for an + example. + +
+\subsection cmddate \date { date description } + + \addindex \date + Starts a paragraph where one or more dates may be entered. + The paragraph will be indented. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\date commands will be joined into a single paragraph. + Each date description will start on a new line. + Alternatively, one \\date command may mention + several dates. The \\date command ends when a blank line or some other + sectioning command is encountered. See section \ref cmdauthor for an + example. + + \sa Section \ref cmdjddate. + +
+\subsection cmdpar \par (paragraph title) { paragraph } + + \addindex \par + Starts a paragraph with a user defined heading. The heading is + specified using the paragraph title argument and extends until the end of the + line. The paragraph will be indented. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + The \\par command ends when a blank line or some other + sectioning command is encountered. + + \par Example: + \verbinclude par.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +
+\subsection cmdparam \param { parameter description } + + \addindex \param + Starts a parameter description for a function parameter with name + \. Followed by a description of the parameter. + The existence of the parameter is not checked. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\param commands will be joined into a single paragraph. + Each parameter description will start on a new line. + The \\param description ends when a blank line or some other + sectioning command is encountered. See section \ref cmdfn for an + example. + + \sa Section \ref cmdjdparam. + +
+\subsection cmdexception \exception { exception description } + + \addindex \exception + Starts an exception description for an exception object with name + \. Followed by a description of the exception. + The existence of the exception object is not checked. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\exception commands will be joined into a single paragraph. + Each parameter description will start on a new line. + The \\exception description ends when a blank line or some other + sectioning command is encountered. See section \ref cmdfn for an + example. + + \sa Section \ref cmdjdexception. + +
+\subsection cmdreturn \return { description of the return value } + + \addindex \return + Starts a return value description for a function. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\return commands will be joined into a single paragraph. + The \\return description ends when a blank line or some other + sectioning command is encountered. See section \ref cmdfn for an + example. + + \sa Section \ref cmdjdreturn. + +
+\subsection cmdsa \sa { references } + + \addindex \sa + Starts a paragraph where one or more cross-references to classes, + functions, methods, variables, files or URL may be specified. + The separators \c :: and \c # may be used to separate a class from the + name of its members. One of several overloaded methods or constructors + may be selected by including a parenthesized list of argument types after + the method. + + \sa section \ref autolink for information on how to create links to objects + and section \ref cmdjdsee for the JavaDoc version of this command. + +
+\subsection cmdversion \version { version number } + + \addindex \version + Starts a paragraph where one or more version strings may be entered. + The paragraph will be indented. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\version commands will be joined into a single paragraph. + Each version description will start on a new line. + Alternatively, one \\version command may mention + several dates. The \\version command ends when a blank line or some other + sectioning command is encountered. See section \ref cmdauthor for an + example. + + \sa Section \ref cmdjdversion. + +
+\subsection cmdwarning \warning { warning message } + + \addindex \warning + Starts a paragraph where one or more warning messages may be entered. + The paragraph will be indented. + The text of the paragraph has no special internal structure. All visual + enhancement commands may be used inside the paragraph. + Multiple adjacent \\warning commands will be joined into a single paragraph. + Each warning description will start on a new line. + Alternatively, one \\warning command may mention + several warnings. The \\warning command ends when a blank line or some other + sectioning command is encountered. See section \ref cmdauthor for an + example. + +

\htmlonly
--- \endhtmlonly + Commands to create links + \htmlonly ---
\endhtmlonly

+ +\subsection cmdaddindex \addindex + + \addindex \addindex + This command adds \ to the \htmlonly LaTeX\endhtmlonly + \latexonly\LaTeX\ \endlatexonly index. + +\subsection cmdendlink \endlink + + \addindex \endlink + This command ends a link that is started with the \\link command. + + \sa section \ref cmdlink. + +
+\subsection cmdlink \link + + \addindex \link + The links that are automatically generated by Doxygen always have the + name of the object they point to as link-text. + + The \\link command can be used to create a link to an object (a file, + class, or member) with a user specified link-text. + The link command should end with an \\endlink command. All text between + the \\link and \\endlink commands serves as text for a link to + the \ specified as the first argument of \\link. + + See section \ref autolink for more information on automatically + generated links and valid link-objects. + + \b Notice: + Keep in mind that links are only meaningful in HTML text; + in \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly + text, the link text is just written to the output. + +
+\subsection cmdref \ref + + \addindex \ref + Creates a reference to a named section, subsection, or page. + For HTML documentation the reference command will generate a link to + the section, the title of the section will be used as the link text. + For \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly documentation the reference command will generate a section + number. + + See section \ref cmdpage for an example of the \\ref command. + +
+\subsection cmdsection \section (section title) + + \addindex \section + Creates a section with name \. The title of the + section should be specified as the second argument of the \\section + command. + + See section \ref cmdpage for an example of the \\cmdsection command. +
+\subsection cmdsubsection \subsection (subsection title) + + \addindex \subsection + Creates a subsection with name \. The title of the + subsection should be specified as the second argument of the \\subsection + command. + + See section \ref cmdpage for an example of the \\cmdsubsection command. +
+ +

\htmlonly
--- \endhtmlonly + Commands for displaying examples + \htmlonly ---
\endhtmlonly

+ +\subsection cmddontinclude \dontinclude + + \addindex \dontinclude + This command can be used to parse a source file without actually + including it. Any class and member declarations inside the code + are `remembered' during the parsing of the comment block that contained + the \\dontinclude command. + + For line by line description of source files, one or more lines + of the example can be displayed using the \\line, \\skip, \\skipline, and + \\until commands. An internal pointer is used for these commands. The + \\dontinclude command sets the pointer to the first line of the example. + + \par Example: + \verbinclude include.cpp + Where the example file \c example_test.cpp looks as follows: + \verbinclude example_test.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + + \sa sections \ref cmdline, \ref cmdskip, \ref cmdskipline, and \ref cmduntil. + +
+\subsection cmdinclude \include + + \addindex \include + This command can be used to include a source file as a block of code. + The command takes the name of an include file as an argument. + Include files or directories can be specified using the + \c INCLUDE_PATH tag of Doxygen's configuration file. + + Using the \\include command is equivalent to inserting the file into + the documentation block and surrounding it + with \\code and \\endcode commands. + + The main purpose of the \\include command is to avoid code + duplication in case of example blocks that consist of multiple + source and header files. + + For line by line description of source files, one or more lines + of the example can be displayed using the \\line, \\skip, \\skipline, and + \\until commands. An internal pointer is used for these command. The + \\include command sets the pointer to the first line of the example. + + \sa section \ref cmdexample and \ref cmddontinclude. + +
+\subsection cmdline \line ( pattern ) + + \addindex \line + This command searches line by line through the example that was last + included using \\include or \\dontinclude until it finds a non-blank + line. If that line contains the specified pattern, it is written + to the output. + + The internal pointer that is used to keep track of the current line in + the example, is set to the start of the line following the non-blank + line that was found (or to the end of the example if no such line could + be found). + + See section \ref cmddontinclude for an example. + +
+\subsection cmdskip \skip ( pattern ) + + \addindex \skip + This command searches line by line through the example that was last + included using \\include or \\dontinclude until it finds a line that contains + the specified pattern. + + The internal pointer that is used to keep track of the current line in + the example, is set to the start of the line that contains the specified + pattern (or to the end of the example if the pattern could not be found). + + See section \ref cmddontinclude for an example. + +
+\subsection cmdskipline \skipline ( pattern ) + + \addindex \skipline + This command searches line by line through the example that was last + included using \\include or \\dontinclude until it finds a line that contains + the specified pattern. It then writes the line to the output. + + The internal pointer that is used to keep track of the current line in + the example, is set to the start of the line following the line that is + written (or to the end of the example if the pattern could not be found). + + \par Notice: + The command: + \verbatim\skipline pattern\endverbatim + is equivalent to: +\verbatim +\skip pattern +\line pattern\endverbatim + + See section \ref cmddontinclude for an example. + +
+\subsection cmduntil \until ( pattern ) + + \addindex \until + This command writes all lines of the example that was last + included using \\include or \\dontinclude to the output, until it finds + a line containing the specified pattern. The line containing the pattern + will be written as well. + + The internal pointer that is used to keep track of the current line in + the example, is set to the start of the line following last written + line (or to the end of the example if the pattern could not be found). + + See section \ref cmddontinclude for an example. + +
+\subsection cmdverbinclude \verbinclude + + \addindex \verbinclude + This command includes the file \ verbatim in the documentation. + The command is equivalent to pasting the file in the documentation and + placing \\verbatim and \\endverbatim commands around it. + +
+

\htmlonly
--- \endhtmlonly + Commands for visual enhancements + \htmlonly ---
\endhtmlonly

+ +\subsection cmda \a + + \addindex \a + Displays the argument \ using a special font. + Use this command to refer to member arguments in the running text. + + \par Example: + \verbatim + ... the \a x and \y coordinates are used to ... + \endverbatim + This will result in the following text:

+ ... the \a x and \a y coordinates are used to ... + +
+\subsection cmdarg \arg { item-description } + + \addindex \arg + This command has one argument that continues until the first + blank line or until another \\arg is encountered. + The command can be used to generate a simple, not nested list of + arguments. + Each argument should start with a \\arg command. + + \par Example: + Typing: + \verbatim + \arg \c AlignLeft left alignment. + \arg \c AlignCenter center alignment. + \arg \c AlignRight right alignment + + No other types of alignment are supported. + \endverbatim + will result in the following text:

+
    +
  • \c AlignLeft left alignment. +
  • \c AlignCenter center alignment. +
  • \c AlignRight right alignment +

+ No other types of alignment are supported. + + \par Notice: + For nested lists, HTML commands should be used. + +
+\subsection cmdb \b + + \addindex \b + Displays the argument \ using a bold font. + Equivalent to \word\. + +
+\subsection cmdc \c + + \addindex \c + Displays the argument \ using a typewriter font. + Use this to refer to a word of code. + Equivalent to \word\. + + \par Example: + Typing: + \verbatim + ... This function returns \c void and not \c int ... + \endverbatim + will result in the following text:

+ ... This function returns \c void and not \c int ... + +
+\subsection cmde \e + + \addindex \e + Displays the argument \ in italics. + Use this command to emphasize words. + + \par Example: + Typing: + \verbatim + ... this is a \e really good example ... + \endverbatim + will result in the following text:

+ ... this is a \e really good example ... + +
+\subsection cmdendhtmlonly \endhtmlonly + + \addindex \endhtmlonly + Ends a block of text that was started with a \\htmlonly command. + + \sa section \ref cmdhtmlonly. + +
+\subsection cmdendlatexonly \endlatexonly + + \addindex \endlatexonly + Ends a block of text that was started with a \\latexonly command. + + \sa section \ref cmdlatexonly. + +
+\subsection cmdendverbatim \endverbatim + + \addindex \endverbatim + Ends a block of text that was started with a \\verbatim command. + + \sa section \ref cmdverbatim. + +
+\subsection cmdfdollar \f$ + + \addindex \\f$ + + Marks the start and end of an in-text formula. + \sa section \ref formulas for an example. + +
+\subsection cmdfbropen \f[ + + \addindex \\f[ + + Marks the start of a long formula that is displayed + centered on a separate line. + \sa section \ref cmdfbrclose and section \ref formulas. + +
+\subsection cmdfbrclose \f] + + \addindex \\f] + + Marks the end of a long formula that is displayed + centered on a separate line. + \sa section \ref cmdfbropen and section \ref formulas. + +
+\subsection cmdhtmlonly \htmlonly + + \addindex \htmlonly + Starts a block of text that will be verbatim included in the + generated HTML documentation only. The block ends with a + endhtmlonly command. + + This command can be used to include HTML code that is too complex + for Doxygen (i.e. images, applets, java-scripts, and HTML tags that + require attributes). You can use the \\latexonly and \\endlatexonly + pair to provide a proper \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly alternative. + + \b Notice: + environment variables (like \$(HOME) ) are resolved inside a + HTML-only block. + + \sa section \ref cmdhtmlonly and section \ref cmdlatexonly. + +
+\subsection cmdlatexonly \latexonly + + \addindex \latexonly + Starts a block of text that will be verbatim included in the + generated \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly documentation only. The block ends with a + endlatexonly command. + + This command can be used to include \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly code that is too complex + for Doxygen (i.e. images, formulas, special characters). You can use the + \\htmlonly and \\endhtmlonly pair to provide a proper HTML alternative. + + \b Notice: + environment variables (like \$(HOME) ) are resolved inside a + \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\endlatexonly-only block. + + \sa section \ref cmdlatexonly and section \ref cmdhtmlonly. + +
+\subsection cmdverbatim \verbatim + + \addindex \verbatim + Starts a block of text that will be verbatim included in both the + HTML and the \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly documentation. The block should end with a + \\endverbatim block. All commands are disabled in a verbatim block. + + \warning Make sure you include a \\endverbatim command for each + \\verbatim command or the parser will get confused! + +
+\subsection cmdbackslash \\ + + \addindex \\ + This command writes a backslash character (\\) to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. + The backslash has to be escaped in some cases because Doxygen uses it to + detect commands. + +
+\subsection cmdat \@ + + \addindex \@ + This command writes an at-sign (@) to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. + The at-sign has to be escaped in some cases because Doxygen uses it to + detect JavaDoc commands. + +
+\subsection cmdamp \& + + \addindex \& + This command writes the \& character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This + character has to be escaped because it has a special meaning in HTML. + +
+\subsection cmddollar \$ + + \addindex \$ + This command writes the \$ character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This + character has to be escaped in some cases, because it is used to expand + environment variables. + +
+\subsection cmdhash \# + + \addindex \# + This command writes the \# character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This + character has to be escaped in some cases, because it is used to refer + to documented entities. + +
+\subsection cmdlt \\< + + \addindex \\< + This command writes the \< character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This + character has to be escaped because it has a special meaning in HTML. + +
+\subsection cmdgt \\> + + \addindex \\> + This command writes the \> character to the HTML and \htmlonly LaTeX\endhtmlonly\latexonly\LaTeX\ \endlatexonly output. This + character has to be escaped because it has a special meaning in HTML. + +
+ +

\htmlonly
--- \endhtmlonly + Commands included for JavaDoc compatibility + \htmlonly ---
\endhtmlonly

+ +The following command JavaDoc command are support. + +\subsection cmdjdauthor @author { list of authors } + \addindex @author + Equivalent to \\author (see section \ref cmdauthor). +\subsection cmdjddate @date { date description } + \addindex @date + Equivalent to \\date (see section \ref cmddate). +\subsection cmdjdparam @param { parameter-description } + \addindex @param + Equivalent to \\param (see section \ref cmdparam). +\subsection cmdjdexception @exception { exception-description } + \addindex @exception + Equivalent to \\exception (see section \ref cmdexception). +\subsection cmdjdreturn @return { description of the return value } + \addindex @return + Equivalent to \\return (see section \ref cmdreturn). +\subsection cmdjdsee @see { references } + \addindex @see + Equivalent to \\sa (see section \ref cmdsa). +\subsection cmdjdshort @short { brief description } + \addindex @short + Equivalent to \\brief (see section \ref cmdbrief). +\subsection cmdjdversion @version { version number } + \addindex @version + Equivalent to \\version (see section \ref cmdversion). + +

\htmlonly
--- \endhtmlonly + Commands included for Qt compatibility + \htmlonly ---
\endhtmlonly

+ +The following commands are supported to remain compatible to the Qt class +browser generator. Do \e not use these commands in your own documentation. +
    +
  • \\annotatedclasslist +
  • \\classhierarchy +
  • \\define +
  • \\functionindex +
  • \\header +
  • \\headerfilelist +
  • \\ingroup +
  • \\inherit +
  • \\l +
  • \\postheader +
+ +*/ diff --git a/doc/config.doc b/doc/config.doc new file mode 100644 index 0000000..0412634 --- /dev/null +++ b/doc/config.doc @@ -0,0 +1,553 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page config + +\section config Configuration + +\subsection config_format Format + +A configuration file is a free-form ASCII text file with a structure that +is similar to that of a Makefile. It is parsed by a +recursive-descent parser that is built into \c doxygen. +The file may contain tabs and newlines for formatting purposes. +The statements in the file are case-sensitive. +Comments may be placed anywhere within the file (except within quotes). +Comments begin with the \c # character and end at the end of the +line. + +The file essentially consists of a list of assignment statements. +Each statement consists of a \c TAG_NAME written in capitals, +followed by the \c = character and one or more values. +Values are sequences of non-blanks. If the value should contain one or more +blanks it must be surrounded by quotes ("..."). +Multiple lines can be concatenated by inserting a backslash (\\) +as the last character of a line. +Environment variables can expanded using the pattern \$(ENV_VARIABLE_NAME). + +The configuration options can be divided into several categories. +Below is a list of tags that are recognized for each category. + +\subsection config_general General options +
+ +
\c PROJECT_NAME
+ \addindex PROJECT_NAME + The \c PROJECT_NAME tag is a single word (or a sequence of words + surrounded by double-quotes) that should identify the project for which the + documentation is generated. This name is used in the title of most + generated pages and in a few other places. + +
\c PROJECT_NUMBER
+ \addindex PROJECT_NUMBER + The \c PROJECT_NUMBER tag can be used to enter a project or revision number. + This could be handy for archiving the generated documentation or + if some version control system is used. + +
\c OUTPUT_DIRECTORY
+ \addindex OUTPUT_DIRECTORY + The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) + path into which the generated HTML and Latex documentation will be written. + If a relative path is entered, it will be relative to the location + where doxygen was started. If left blank the current directory will be used. + +
\c QUIET
+ \addindex QUIET + The \c QUIET tag can be used to turn on/off the messages that are generated + to standard output by doxygen. Possible values are \c YES and \c NO, + where \c YES implies that the messages are off. + If left blank \c NO is used. + +
\c WARNINGS
+ \addindex WARNINGS + The \c WARNINGS tag can be used to turn on/off the warning messages that are + generated to standard error by doxygen. Possible values are \c YES and \c NO, + where \c YES implies that the warnings are on. If left blank \c NO is used. + + \b Tip: Turn warnings on while writing the documentation. + +
\c DISABLE_INDEX
+ \addindex DISABLE_INDEX + If you want full control over the layout of the generated HTML pages it + might be necessary to disable the index and replace it with your own. + The DISABLE_INDEX tag can be used to turn on/off the condensed index at + top of each page. A value of NO (the default) enables the index and the + value YES disables it. + +
\c EXTRACT_ALL
+ \addindex EXTRACT_ALL + If the \c EXTRACT_ALL tag is set to \c YES all classes and functions will be + included in the documentation, even if no documentation was available. + + \b Notice: This will also disable the warnings about undocumented members + that are normally produced when \c WARNINGS is set to \c YES + +
\c EXTRACT_PRIVATE
+ \addindex EXTRACT_PRIVATE + If the \c EXTRACT_PRIVATE tag is set to \c YES all + documentation for private members will be extracted as well. + +
\c HIDE_UNDOC_MEMBERS
+ \addindex HIDE_UNDOC_MEMBERS + If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, Doxygen will hide all + undocumented members inside documented classes or files. + If set to \c NO (the default) these members will be included in the + various overviews, but no documentation section is generated. + +
\c HIDE_UNDOC_CLASSES
+ \addindex HIDE_UNDOC_CLASSES + If the \c HIDE_UNDOC_CLASSESS tag is set to \c YES, Doxygen will hide all + undocumented classes. + If set to \c NO (the default) these classes will be included in the + various overviews. + +
\c BRIEF_MEMBER_DESC
+ \addindex BRIEF_MEMBER_DESC + If the \c BRIEF_MEMBER_DESC tag is set to \c YES (the default) Doxygen will + include brief member descriptions after the members that are listed in + the file and class documentation (similar to JavaDoc). + Set to NO to disable this. + +
\c INTERNAL_DOCS
+ \addindex INTERNAL_DOCS + The \c INTERNAL_DOCS tag determines if documentation + that is typed after a \\internal command is included. If the tag is set + to \c NO (the default) then the documentation will be excluded. + Set it to \c YES to include the internal documentation. + +
\c REPEAT_BRIEF
+ \addindex REPEAT_BRIEF + If the \c REPEAT_BRIEF tag is set to \c YES (the default) Doxygen will + prepend the brief description of a member or function before the detailed + description + + \par Notice: + If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the + brief descriptions will be completely suppressed. + +
\c FULL_PATH_NAMES
+ \addindex FULL_PATH_NAMES + If the \c FULL_PATH_NAMES tag is set to \c YES Doxygen will prepend the full + path before files name in the file list and in the header files. If set + to NO the shortest path that makes the file name unique will be used + +
\c STRIP_FROM_PATH
+ \addindex STRIP_FROM_PATH + If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag + can be used to strip a user defined part of the path. Stripping is + only done if the specified string matches the left-hand part of the + path. + +
\c CLASS_DIAGRAMS
+ \addindex CLASS_DIAGRAMS + If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) Doxygen will + generate a class diagram (in Html and LaTeX) for classes with base or + super classes. Setting the tag to \c NO turns the diagrams off. + +
\c CASE_SENSE_NAMES
+ \addindex CASE_SENSE_NAMES + If the \c CASE_SENSE_NAMES tag is set to \c NO (the default) then Doxygen + will only generate file names in lower case letters. If set to + \c YES upper case letters are also allowed. This is useful if you have + classes or files whose names only differ in case and if your file system + supports case sensitive file names. + +
\c VERBATIM_HEADERS
+ \addindex VERBATIM_HEADERS + If the VERBATIM_HEADERS tag is set the YES (the default) then Doxygen\n"; + will generate a verbatim copy of the header file for each class for\n"; + which an include is specified. Set to NO to disable this.\n"; + \sa Section \ref cmdclass. + +
+ +\subsection config_input Input related options +
+ +
\c INPUT
+ \addindex INPUT + The \c INPUT tag is used to specify the files and/or directories that contain + documented source files. You may enter file names like + \c myfile.cpp or directories like \c /usr/src/myproject. + Separate the files or directories with spaces.
+ + \b Notice: This tag (and only this tag) is \e required. + +
\c FILE_PATTERNS
+ \addindex FILE_PATTERNS + If the value of the \c INPUT tag contains directories, you can use the + \c FILE_PATTERNS tag to specify one or more wildcard patterns + (like \c *.cpp and \c *.h ) to filter out the source-files + in the directories. If left blank all files are included + (i.e. wildcard *). + +
\c RECURSIVE
+ \addindex RECURSIVE + The \c RECURSIVE tag can be used to specify whether or not subdirectories + should be searched for input files as well. Possible values are \c YES + and \c NO. If left blank \c NO is used. + +
\c EXCLUDE
+ \addindex EXCLUDE + The \c EXCLUDE tag can be used to specify files and/or directories that should + excluded from the \c INPUT source files. This way you can easily exclude a + subdirectory from a directory tree whose root is specified with the \c INPUT tag. + +
\c EXCLUDE_PATTERNS
+ \addindex EXCLUDE_PATTERNS + If the value of the INPUT tag contains directories, you can use the + \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude + certain files from those directories. + + +
\c EXAMPLE_PATH
+ \addindex EXAMPLE_PATH + The \c EXAMPLE_PATH tag can be used to specify one or more files or + directories that contain example code fragments that are included (see + the \\include command in section \ref cmdinclude). + +
\c INCLUDE_PATH
+ \addindex INCLUDE_PATH + The INCLUDE_PATH tag can be used to specify one or more directories that + contain include files that are not input files but should be processed by + the preprocessor. + +
\c INPUT_FILTER
+ \addindex INPUT_FILTER + The \c INPUT_FILTER tag can be used to specify a program that doxygen should + invoke to filter for each input file. Doxygen will invoke the filter program + by executing (via popen()) the command: +\verbatim +\endverbatim + + where \ + is the value of the \c INPUT_FILTER tag, and \ is the name of an + input file. Doxygen will then use the output that the filter program writes + to standard output. + +
+ +\subsection html_output HTML related options +
+ +
\c GENERATE_HTML
+ \addindex GENERATE_HTML + If the \c GENERATE_HTML tag is set to \c YES (the default) Doxygen will + generate HTML output + +
\c HTML_OUTPUT
+ \addindex HTML_OUTPUT + The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put. + If a relative path is entered the value of \c OUTPUT_DIRECTORY will be + put in front of it. If left blank `html' will be used as the default path. + +
\c HTML_HEADER
+ \addindex HTML_HEADER + The \c HTML_HEADER tag can be used to specify a user defined HTML + header file for each generated HTML page. To get valid HTML the header file + should contain at least a \c and a \c tag. Example: +\verbatim + + + My title + + +\endverbatim + If the tag is left blank doxygen will generate a + standard header. + +
\c HTML_FOOTER
+ \addindex HTML_FOOTER + The \c HTML_FOOTER tag can be used to specify a user defined HTML footer for + each generated HTML page. To get valid HTML the header file should contain + at least a \c and a \c tag. Example: +\verbatim + + +\endverbatim + If the tag is left blank doxygen will generate a standard footer. + +
+ +\subsection latex_output LaTeX related options +
+ +
\c GENERATE_LATEX
+ \addindex GENERATE_LATEX + If the \c GENERATE_LATEX tag is set to \c YES (the default) Doxygen will + generate Latex output. + +
\c LATEX_OUTPUT
+ \addindex LATEX_OUTPUT + The \c LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. + If a relative path is entered the value of \c OUTPUT_DIRECTORY will be + put in front of it. If left blank `latex' will be used as the default path. + +
\c COMPACT_LATEX
+ \addindex COMPACT_LATEX + If the \c COMPACT_LATEX tag is set to \c YES Doxygen generates more compact + LaTeX documents. This may be useful for small projects and may help to + save some trees in general. + +
\c PAPER_TYPE
+ \addindex PAPER_TYPE + The PAPER_TYPE tag can be used to set the paper type that is used + by the printer. Possible values are: +
    +
  • a4 (210 x 297 mm). +
  • a4wide (same as a4, but including the a4wide package). +
  • letter (8.5 x 11 inches). +
  • legal (8.5 x 14 inches). +
  • executive (7.25 x 10.5 inches) +
+ If left blank a4wide will be used. + +
\c EXTRA_PACKAGES
+ \addindex EXTRA_PACKAGES + The EXTRA_PACKAGES tag can be used to specify one or more LaTeX + package names that should be included in the LaTeX output. + To get the times font for instance you can specify +\verbatim +EXTRA_PACKAGES = times +\endverbatim + If left blank no extra packages will be included. +
+ +\subsection man_output Man page related options +
+ +
\c GENERATE_MAN
+ \addindex GENERATE_MAN + If the \c GENERATE_MAN tag is set to \c YES (the default) Doxygen will + generate man pages for classes and files. + +
\c MAN_OUTPUT
+ \addindex MAN_OUTPUT + The \c MAN_OUTPUT tag is used to specify where the man pages will be put. + If a relative path is entered the value of \c OUTPUT_DIRECTORY will be + put in front of it. If left blank `man' will be used as the default path. + A directory man3 will be created inside the directory specified by + \c MAN_OUTPUT. + +
+ +\subsection config_prepro Preprocessor related options +
+ +
\c ENABLE_PREPROCESSING
+ \addindex ENABLE_PREPROCESSING + If the \c ENABLE_PREPROCESSING tag is set to \c YES (the default) Doxygen will + evaluate all C-preprocessor directives found in the sources and include + files. + +
\c MACRO_EXPANSION
+ \addindex MACRO_EXPANSION + If the \c MACRO_EXPANSION tag is set to \c YES Doxygen will expand all macro + names in the source code. If set to \c NO (the default) only conditional + compilation will be performed. + +
\c SEARCH_INCLUDES
+ \addindex SEARCH_INCLUDES + If the \c SEARCH_INCLUDES tag is set to \c YES (the default) the includes files + in the \c INCLUDE_PATH (see below) will be search if a \#include is found. + +
\c INCLUDE_PATH
+ \addindex INCLUDE_PATH + The \c INCLUDE_PATH tag can be used to specify one or more directories that + contain include files that are not input files but should be processed by + the preprocessor. + +
\c PREDEFINED
+ \addindex PREDEFINED + The \c PREDEFINED tag can be used to specify one or more macro names that + are defined before the preprocessor is started (similar to the -D option of + gcc). The argument of the tag is a list of macros of the form: + name or name=definition (no spaces). + If the definition and the = are omitted =1 is assumed. + +
\c EXPAND_ONLY_PREDEF
+ \addindex EXPAND_ONLY_PREDEF + If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES + then the macro expansion is limited to the macros specified with the + \c PREDEFINED tag. + +
+ +\subsection config_extref External reference options +
+ +
\c TAGFILES
+ \addindex TAGFILES + The \c TAGFILES tag can be used to specify one or more tagfiles. + See section \ref doxytag_usage for more information about the usage of + tag files. + + \par Notice: + Each tag file most have a unique name and if a tag file is not located + in the directory in which doxygen is run, you must also specify the + path to the tagfile here. + +
\c GENERATE_TAGFILE
+ \addindex GENERATE_TAGFILE + When a file name is specified after \c GENERATE_TAGFILE, doxygen will create + a tag file that is based on the input files it reads. + See section \ref doxytag_usage for more information about the usage of + tag files. + +
\c ALLEXTERNALS
+ \addindex ALLEXTERNALS + if the \c ALLEXTERNALS tag is set to \c YES all external class will be listed + in the class index. If set to \c NO only the inherited external classes + will be listed. + +
\c PERL_PATH
+ \addindex PERL_PATH + The \c PERL_PATH should be the absolute path and name of the perl script + interpreter (i.e. the result of `which perl'). + +
+\subsection config_search Search engine options +
+ +
\c SEARCHENGINE
+ \addindex SEARCHENGINE + The \c SEARCHENGINE tag specifies whether or not a + search should be used. Possible values are \c YES and \c NO. + If set to \c NO or left blank, the values of all other tags in this section + will be ignored. + +
\c CGI_NAME
+ \addindex CGI_NAME + The \c CGI_NAME tag should be the name of the CGI script that + starts the search engine (doxysearch) with the correct parameters. + A script with this name will be generated by doxygen. + +
\c CGI_URL
+ \addindex CGI_URL + The \c CGI_URL tag should be the absolute URL to the directory where the + cgi binaries are located. See the documentation of your http daemon for + details. + +
\c DOC_URL
+ \addindex DOC_URL + The \c DOC_URL tag should be the absolute URL to the directory where the + documentation is located. If left blank the absolute path to the + documentation, with file:// prepended to it, will be used. + This is correct for local viewing only. + +
\c DOC_ABSPATH
+ \addindex DOC_ABSPATH + The \c DOC_ABSPATH tag should be the absolute path to the directory where the + documentation is located. If left blank the directory on the local machine + will be used. + +
\c BIN_ABSPATH
+ \addindex BIN_ABSPATH + The \c BIN_ABSPATH tag must point to the directory where the doxysearch binary + is installed. + +
\c EXT_DOC_PATHS
+ \addindex EXT_DOC_PATHS + The \c EXT_DOC_PATHS tag can be used to specify one or more paths to + documentation generated for other projects. This allows doxysearch to search + the documentation for these projects as well. All paths must be absolute. + +
+

Examples

+ +Suppose you have a simple project consisting of two files: a source file +\c example.cc and a header file \c example.h. +Then a minimal configuration file is as simple as: +\verbatim +INPUT = example.cc example.h +\endverbatim + +Assuming the example makes use of Qt classes and perl is located +in /usr/bin, a more realistic configuration file would be: +\verbatim +PROJECT_NAME = Example +INPUT = example.cc example.h +WARNINGS = YES +TAGFILES = qt.tag +PERL_PATH = /usr/bin/perl +SEARCHENGINE = NO +\endverbatim + +To generate the documentation for the +QdbtTabular package +I have used the following configuration file: +\verbatim +PROJECT_NAME = QdbtTabular +OUTPUT_DIRECTORY = html +WARNINGS = YES +INPUT = examples/examples.doc src +FILE_PATTERNS = *.cc *.h +INCLUDE_PATH = examples +TAGFILES = qt.tag +PERL_PATH = /usr/local/bin/perl +SEARCHENGINE = YES +CGI_NAME = search.cgi +CGI_URL = http://www.stack.nl/~dimitri/cgi-bin +DOC_URL = http://www.stack.nl/~dimitri/qdbttabular +DOC_ABSPATH = /home/dimitri/.html/qdbttabular +BIN_ABSPATH = /home/dimitri/bin +\endverbatim + +To regenerate the Qt documentation from the sources, you could use the +following config file: +\verbatim +PROJECT_NAME = Qt +OUTPUT_DIRECTORY = qt_docs +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = $(QTDIR)/ +PREDEFINED = USE_TEMPLATECLASS Q_EXPORT= \ + QArrayT=QArray \ + QListT=QList \ + QDictT=QDict \ + QQueueT=QQueue \ + QVectorT=QVector \ + QPtrDictT=QPtrDict \ + QIntDictT=QIntDict \ + QStackT=QStack \ + QDictIteratorT=QDictIterator \ + QListIteratorT=QListIterator \ + QCacheT=QCache \ + QCacheIteratorT=QCacheIterator \ + QIntCacheT=QIntCache \ + QIntCacheIteratorT=QIntCacheIterator \ + QIntDictIteratorT=QIntDictIterator \ + QPtrDictIteratorT=QPtrDictIterator +INPUT = $(QTDIR)/doc \ + $(QTDIR)/src/widgets \ + $(QTDIR)/src/kernel \ + $(QTDIR)/src/dialogs \ + $(QTDIR)/src/tools +FILE_PATTERNS = *.cpp *.h q*.doc +INCLUDE_PATH = $(QTDIR)/include +RECURSIVE = YES +\endverbatim + +Here Doxygen's preprocessor is used to substitute some +macro names that are normally substituted by the C preprocessor, +but without doing full macro expansion. + +*/ + diff --git a/doc/doxygen.sty b/doc/doxygen.sty new file mode 100644 index 0000000..33835f0 --- /dev/null +++ b/doc/doxygen.sty @@ -0,0 +1,58 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} +\RequirePackage{calc} +\RequirePackage{array} +\pagestyle{fancyplain} +\addtolength{\headwidth}{\marginparsep} +\addtolength{\headwidth}{\marginparwidth} +\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} +\lhead[\fancyplain{}{\bfseries\thepage}] + {\fancyplain{}{\bfseries\rightmark}} +\rhead[\fancyplain{}{\bfseries\leftmark}] + {\fancyplain{}{\bfseries\thepage}} +\rfoot[\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-1998}]{} +\lfoot[]{\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-1998}} +\cfoot{} +\newenvironment{CompactList} +{\begin{list}{}{ + \setlength{\leftmargin}{0.5cm} + \setlength{\itemsep}{0pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \renewcommand{\makelabel}{}}} +{\end{list}} +\newenvironment{CompactItemize} +{ + \begin{itemize} + \setlength{\itemsep}{-4pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \setlength{\partopsep}{0pt} +} +{\end{itemize}} +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} +\newlength{\tmplength} +\newenvironment{TabularC}[1] +{ +\setlength{\tmplength} + {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} + \par\begin{tabular*}{\linewidth} + {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} +} +{\end{tabular*}\par} +\newcommand{\entrylabel}[1]{ + {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}} +\newenvironment{Desc} +{\begin{list}{} + { + \settowidth{\labelwidth}{40pt} + \setlength{\leftmargin}{\labelwidth} + \setlength{\parsep}{0pt} + \setlength{\itemsep}{-4pt} + \renewcommand{\makelabel}{\entrylabel} + } +} +{\end{list}} +\setlength{\parindent}{0cm} +\setlength{\parskip}{0.2cm} +\sloppy diff --git a/doc/doxygen_logo.eps b/doc/doxygen_logo.eps new file mode 100644 index 0000000..90c6c92 --- /dev/null +++ b/doc/doxygen_logo.eps @@ -0,0 +1,3976 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (doxygen_logo.eps) +%%CreationDate: (Thu Aug 13 14:21:32 1998) +%%BoundingBox: 0 0 633 196 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 0 +%%EndComments + +%%BeginDefaults +%%PageOrientation: Portrait +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/buffer 512 string def +/byte 1 string def +/color_packet 3 string def +/pixels 768 string def + +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-RunlengthEncodedCompression or 1-NoCompression. + % hex color packets. + % + gsave + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /NewCenturySchlbk-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 633 196 +userdict begin +%%BeginData: +DisplayImage +0 0 +634 197 +18 +634 197 +0 +0 +ffffffffffffffffffffffffffffffffffffffffffffff4bfcfebc03fcfe9a00dcca9400 +fcf4c600ffffffffffffffffffffff68fcfebc00ffffff00fcfebc0bfcfe9a02fcdc8700 +e9d9b900ffffffffffffffffffffff60fcfebc0efcfe9a00fcfebc00fcfe9a01fcfebc00 +fcfe9a02fcfe8001fcdc8700e8cbab00fcf4c600ffffffffffffffffffffff5dfcfebc0f +fcfe9a00fcfebc01fcfe9a03fcfe8000fcf49700fcfe8000fcfe9a00fcfebc00fcf49700 +fcecc400ffffffffffffffffffffff5bfcfebc07fcfe9a00fcfebc04fcfe9a00fcfebc01 +fcfe9a00fcfebc00fcfe9a02fcfe8000fcfe9a00fcfe8000fcfe9a01fcfebc01fcfe9a00 +fcf47100ffffffffffffffffffffff5afcfe9a00fcfebc00fcfe9a00fcfebc02fcfe9a00 +fcfebc03fcfe9a00fcfebc00fcfe9a00fcfebc01fcfe9a00fcfebc00fcfe9a00fcfebc00 +fcfe9a00fcfe8000fcfe9a00fcfe8001fcfe9a01fcfebc00fcfe9a01fcfe8000ffffffff +ffffffffffffff5afcfebc03fcfe9a00fcfebc02fcfe9a00fcfebc03fcfe9a00fcfebc00 +fcfe9a00fcfebc00fcfe9a04fcfe8000fcfe9a00fcfe8001fcfebc01fcfe9a01fcfe8000 +fcfebc00ffffffffffffffffffffff59fcfe9a00fcfebc00fcfe9a00fcfebc03fcfe9a00 +fcfebc01fcfe9a00fcfebc00fcfe9a00fcfebc01fcfe9a01fcfebc00fcfe9a00fcfebc00 +fcfe9a00fcfe8000fcfe9a00fcfe8002fcfe9a00fcfebc01fcfe8001ffffffffffffffff +ffffff5afcfebc01fcfe9a00fcfebc02fcfe9a00fcfebc01fcfe9a00fcfebc01fcfe9a00 +fcfebc00fcfe9a00fcfebc00fcfe9a04fcfe8001fcfe9a00fcfe8000fcfe9a01fcfebc00 +fcfe9a00fcfe8001fcfebc00ffffffffffffffffffffff59fcfebc00fcfe9a00fcfebc01 +fcfe9a00fcfebc06fcfe9a00fcfebc00fcfe9a01fcfebc00fcfe9a00fcfebc00fcfe9a01 +fcfe8001fcfe9a00fcfe8001fcfe9a02fcfe8001ffffffffffffffffffffff5afcfe9a00 +fcfebc00fcfe9a00fcfebc01fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00 +fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a05fcfe8000fcfe9a00fcfe8000fcfe9a00 +fcfe8000fcfebc01fcfe9a00fcfe8001fcfebc00ffffffffffffffffffffff59fcfe9a00 +fcfebc02fcfe9a00fcfebc02fcfe9a00fcfebc02fcfe9a00fcfebc00fcfe9a02fcfebc00 +fcfe9a02fcfe8001fcfe9a00fcfe8001fcfe9a02fcfe8001fcfebc00ffffffffffffffff +ffffff57f4f6f900ffffff00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00 +fcfe9a00fcfebc01fcfe9a01fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a04 +fcfe8001fcfe9a00fcfe8000fcfe9a01fcfebc00fcfe9a00fcfe8001ffffffffffffffff +ffffff58f4f6f900fcfebc03fcfe9a00fcfebc01fcfe9a00fcfebc00fcfe9a00fcfebc01 +fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a05fcfe8002fcfe9a00fcfe8000fcfe9a02 +fcfe8001fcfebc00ffffffffffffffffffffff56ecf3f501ffffff00fcfe9a01fcfebc01 +fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00 +fcfebc00fcfe9a01fcfebc00fcfe9a02fcfe8002fcfe9a00fcfe8001fcfebc00fcfe9a01 +fcfe8001fcfebc00ffffffffffffffffffffff55f4f6f900ecf3f500e8ecef00fcf4c600 +fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00 +fcfebc00fcfe9a00fcfebc01fcfe9a00fcfebc00fcfe9a05fcfe8001fcfe9a00fcfe8001 +fcfe9a01fcfe8001fcfe9a00fcfebc00ffffffffffffffffffffff55f4f6f900e8ecef00 +e0e4e700fcf4c600fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00 +fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a04 +fcfe8002fcfe9a00fcfe8001fcfe9a01fcfe8002fcfebc00ffffffffffffffffffffff55 +f4f6f900e8ecef01fcf4c600fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00 +fcfe9a01fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc01fcfe9a06fcfe8001fcfe9a00 +fcfe8001fcfe9a00fcfe8000fcfe9a00fcfe8001fcfebc00ffffffffffffffffffffff55 +ecf3f500e8ecef00e0e4e700fcf4c600fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00 +fcfe9a00fcfebc00fcfe9a01fcfebc00fcfe9a00fcfebc00fcfe9a01fcfebc00fcfe9a04 +fcfe8002fcfe9a00fcfe8001fcfe9a01fcfe8002fcfebc00ffffffffffffffffffffff55 +f4f6f900e8ecef01fcf4c600fcfe9a03fcfebc00fcfe9a02fcfebc00fcfe9a00fcfebc00 +fcfe9a00fcfebc01fcfe9a01fcfebc00fcfe9a03fcfe8000fcfe9a00fcfe8002fcfe9a00 +fcfe8003fcfebc00ffffffffffffffffffffff55f4f6f900e8ecef01fcf4c600fcfebc00 +fcfe9a00fcfebc00fcfe9a01fcfebc00fcfe9a00fcfebc00fcfe9a01fcfebc00fcfe9a00 +fcfebc00fcfe9a00fcfebc00fcfe9a05fcfe8000fcfe9a00fcfe8004fcfe9a00fcfe8001 +fcfebc00ffffffffffffffffffffff55f4f6f901e0e4e700fcf4c600fcfe9a00fcfebc00 +fcfe9a00fcfebc00fcfe9a03fcfebc00fcfe9a01fcfebc00fcfe9a00fcfebc00fcfe9a00 +fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a00fcfe8001fcfe9a00fcfe8001 +fcfe9a00fcfe8003fcfebc00ffffffffffffffffffffff55f4f6f900ecf3f500e0e4e700 +f4f6f900fcfe9a0afcfebc00fcfe9a00fcfebc00fcfe9a08fcfe8007fcfebc00ffffffff +ffffffffffffff55f4f6f900ecf3f500e8ecef00fcf4c600fcfe9a0dfcfebc00fcfe9a00 +fcfebc00fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe8000fcfe9a01fcfe8006fcfebc00 +ffffffffffffffffffffff55f4f6f900ecf3f500e8ecef00fcf4c600fcfe9a0bfcfebc00 +fcfe9a00fcfebc00fcfe9a00fcfebc00fcfe9a01fcfebc00fcfe9a00fcfe8000fcfe9a00 +fcfe8000fcfe9a00fcfe8004fcf47100fcfebc00ffffffffffffffffffffff56e8ecef01 +fcf4c600fcfe9a04fcfe8000fcfe9a01fcfe8000fcfe9a04fcfebc00fcfe9a01fcfebc00 +fcfe9a05fcfe8002fcf47100fcfe8002fcfebc00ffffffffffffffffffffff55f4f6f900 +ecf3f500e8ecef00fcecc400fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a01fcfe8000 +fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a04fcfebc00fcfe9a01fcfebc00fcfe9a00 +fcfe8008fcf47100fcfebc00ffffffffffffffffffffff56e8ecef01fcf4c600fcfe8000 +fcfe9a00fcfe8000fcfe9a00fcfe8001fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a00 +fcfe8000fcfe9a08fcfe8000fcfe9a00fcfe8001fcfe9a00fcfe8000fcf47100fcfe8002 +fcfebc00ffffffffffffffffffffff55f4f6f901e8ecef00f7ece700fcfe8000fcfe9a00 +fcfe8000fcfe9a00fcfe8000fcfe9a00fcfe8002fcfe9a00fcfe8000fcfe9a06fcfebc00 +fcfe9a02fcfe8008fcfebc00ffffffffffffffffffffff55f4f6f900e8ecef01fcf4c600 +fcfe8001fcfe9a00fcfe8003fcfe9a00fcfe8001fcfe9a00fcfe8000fcfe9a08fcfe8009 +fcfebc00ffffffffffffffffffffff55f4f6f901e0e4e700fcf4c600fcfe9a00fcfe8001 +fcfe9a00fcfe8000fcfe9a00fcfe8002fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a07 +fcfe8002fcfe9a00fcfe8005fcfebc00ffffffffffffffffffffff55f4f6f900ecf3f500 +e8ecef00fcf4c600fcfe9a00fcfe8000fcfe9a00fcfe8004fcfe9a00fcfe8002fcfe9a08 +fcfe8009fcfebc00ffffffffffffffffffffff55f4f6f900ecf3f500e8ecef00fcecc400 +fcfe8000fcfe9a00fcfe8001fcfe9a00fcfe8000fcfe9a00fcfe8001fcfe9a01fcfe8000 +fcfe9a00fcfe8000fcfe9a06fcfe8004fcf47101fcfe8002fcfebc00ffffffffffffffff +ffffff56e8ecef01fcf4c600fcfe8002fcfe9a00fcfe8003fcfe9a00fcfe8001fcfe9a02 +fcfe8000fcfe9a05fcfe8003fcf47102fcfe8002fcfebc00ffffffffffffffffffffff55 +f4f6f901e0e4e700fcf4c600fcfe9a00fcfe8003fcfe9a00fcfe8000fcfe9a00fcfe8000 +fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a02fcfe8000fcfe9a02fcfe8002fcf47100 +fcfe8000fcf47101fcfe8002fcf47100fcfebc00ffffffffffffffffffffff55f4f6f900 +e8ecef01fcf4c600fcfe8005fcfe9a00fcfe8001fcfe9a00fcfe8000fcfe9a00fcfe8000 +fcfe9a00fcfe8000fcfe9a02fcfe8000fcfe9a00fcfe8003fcf47103fcfe8002fcfebc00 +ffffffffffffffffffffff55f4f6f901e8ecef00fcecc400fcfe8007fcfe9a00fcfe8001 +fcfe9a04fcfe8000fcfe9a02fcfe8001fcf47105fcfe8001fcf47100fcfebc00ffffffff +ffffffffffffff56e8ecef01fcecc400fcfe8005fcfe9a00fcfe8002fcfe9a00fcfe8001 +fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a00fcfe8002fcf47100fcfe8000fcf47103 +fcfe8000fcf47101fcfe8000fcfebc00ffffffffffffffffffffff55f4f6f900ecf3f500 +e8ecef00fcecc400fcfe8007fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a00fcfe8000 +fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a01fcfe8001fcf47101fce66a00fcf47102 +fcfe8000fcf47101fcfebc00ffffffffffffffffffffff55f4f6f900e8ecef01fcecc400 +fcfe8008fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a00fcfe8004 +fcf47102fce66a00fcf47101fcfe8000fcf47102fcfebc00ffffffffffffffffffffff55 +f4f6f901e8ecef00fcecc400fcfe8005fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a00 +fcfe8000fcfe9a00fcfe8002fcfe9a00fcfe8000fcfe9a00fcfe8001fcf47102fce66a01 +fcf47101fcfe8000fcf47100fcec7600fcfebc00ffffffffffffffffffffff55f4f6f900 +ecf3f500e8ecef00fcecc400fcfe8007fcfe9a00fcfe8000fcfe9a00fcfe8002fcfe9a00 +fcfe8005fcf47101fce66a02fcf47103fce66a00fcfebc00ffffffffffffffffffffff55 +f4f6f900ecf3f500e8ecef00fcecc400fcfe8005fcfe9a01fcfe8000fcfe9a00fcfe8005 +fcfe9a00fcfe8000fcfe9a00fcfe8001fcf47101fce66a02fcf47104fcfebc00ffffffff +ffffffffffffff56e8ecef01fcecc400fcfe8004fcfe9a00fcfe8001fcfe9a00fcfe8001 +fcfe9a00fcfe8008fcec7600fcf47100fce66a03fcf47102fce66a00fcfebc00ffffffff +ffffffffffffff55f4f6f900ecf3f500e8ecef00fcecc400fcfe8006fcfe9a00fcfe8000 +fcfe9a00fcfe8008fcfe9a00fcfe8000fcf47100fce66a03fcf47103fcec7600fcfebc00 +ffffffffffffffffffffff55f4f6f900e8ecef01fcecc400fcfe8004fcfe9a00fcfe8000 +fcfe9a00fcfe800cfcf47100fce66a04fcf47102fcec7600fcfebc00ffffffffffffffff +ffffff55f4f6f900ecf3f500e8ecef00fcecc400fcfe8005fcfe9a00fcfe800dfcf47100 +fce66a04fcf47100fcec7601fcf47100fcf4c600ffffffffffffffffffffff55f4f6f900 +e8ecef01fcecc400fcfe8004fcfe9a00fcfe8002fcfe9a00fcfe8007fcfe9a00fcfe8001 +fcf47100fce66a01fcdc6600fce66a01fcf47102fcec7600fcfebc00ffffffffffffffff +ffffff55f4f6f900ecf3f500e0e4e700fcecc400fcfe8005fcfe9a00fcfe8000fcfe9a00 +fcfe800bfcec7600fce66a04fcf47100fcec7600fcf47101fcf4c600ffffffffffffffff +ffffff55f4f6f900ecf3f500e8ecef00fcecc400fcfe8004fcfe9a00fcfe8000fcfe9a00 +fcfe800cfcf47100fce66a04fcf47100fcec7600fcf47100fcec7600fcfebc00ffffffff +ffffffffffffff55f4f6f900ecf3f500e0e4e700fcecc400fcfe8006fcfe9a00fcfe800c +fce66a02fcdc6600fce66a01fcec7601fcf47101fcf4c600ffffffffffffffffffffff55 +f4f6f900ecf3f500e8ecef00fcecc400fcfe8007fcfe9a00fcfe8000fcfe9a00fcfe8009 +fcec7600fce66a04fcf47100fcec7600fcf47100fce66a00fcfebc00ffffffffffffffff +ffffff55f4f6f900ecf3f500e0e4e700fcecc400fcfe8005fcfe9a00fcfe800dfce66a00 +fcec7600fce66a02fcec7602fcf47100fce66a00fcfebc00ffffffffffffffffffffff55 +f4f6f900e8ecef01fcecc400fcfe8007fcfe9a00fcfe8000fcfe9a00fcfe8000fcfe9a00 +fcfe8007fce66a01fcdc6600fce66a00fcec7600fce66a00fcec7602fce66a00fcf4c600 +ffffffffffffffffffffff55f4f6f901e0e4e700fcecc400fcfe8009fcfe9a00fcfe8002 +fcfe9a00fcfe8001fcfe9a00fcfe8002fce66a00fcec7600fce66a02fcec7600fce66a00 +fcec7600fcf47100fce66a00fcf49700ffffffffffffffffffffff55f4f6f900e8ecef01 +fcecc400fcfe8007fcfe9a00fcfe8001fcfe9a00fcfe8000fcfe9a00fcfe8006fce66a01 +fcdc6600fce66a00fcec7601fce66a00fcec7600fce66a00fcdc6600fcf4c600ffffffff +ffffffffffffff55f4f6f900ecf3f500e0e4e700fcecc400fcfe8008fcfe9a00fcfe8001 +fcfe9a00fcfe8001fcfe9a00fcfe8000fcfe9a00fcfe8002fce66a08fcdc6600fcf49700 +ffffffffffffffffffffff55f4f6f901e0e4e700fcecc400fcfe8006fcfe9a00fcfe8001 +fcfe9a00fcfe8001fcfe9a00fcfe8000fcfe9a00fcfe8003fcf47100fce66a00fcdc6601 +fce66a05fcdc6600fcf4c600ffffffffffffffffffffff55f4f6f900ecf3f500e0e4e700 +fcecc400fcfe8008fcfe9a00fcfe8001fcfe9a00fcfe8002fcfe9a00fcfe8003fcdc6602 +fce66a02fcdc6600fce66a01fcdc6600fcf49700ffffffffffffffffffffff55ecf3f500 +f4f6f900e0e4e700fcecc400fcfe8009fcfe9a00fcfe8002fcfe9a00fcfe8005fcdc6604 +fce66a00fcdc6601fce66a00fcdc6600fcf4c600ffffffffffffffffffffff55f4f6f900 +ecf3f500e0e4e700fcecc400fcf47100fcfe800afcfe9a00fcfe8006fcf47100fce66a00 +fcd46101fcdc6604fce66a00fcdc6600fcf49700ffffffffffffffffffffff55f4f6f900 +e8ecef01fbe4c100fcfe8000fcf47100fcfe8007fcfe9a00fcfe8008fcf47100fcd46103 +fcdc6601fcd46100fcdc6602fcf4c600ffffffffffffffffffffff55f4f6f900ecf3f500 +e0e4e700fbe4c100fcf47100fcfe8012fcf47100fcd46101fccc5d00fcd46104fcdc6600 +fcd46100fcf4c600ffffffffffffffffffffff55f4f6f900e8ecef01fcecc400fcf47103 +fcfe800ffcf47100fcd46100fccc5d03fcd46100fccc5d00fcd46101fcdc6600fcf4c600 +ffffffffffffffffffffff55f4f6f900ecf3f500e8ecef00fbe4c100fcf47105fcfe8000 +fcf47100fcfe8007fcf47100fcfe8000fcf47101fcec7600fcd46100fccc5d06fcd46101 +fceb9900ffffffffffffffffffffff55f4f6f900ecf3f500e0e4e700fcecc400fce66a01 +fcf47109fcfe8002fcf47104fce66a00fccc5d00fcc45900fccc5d00fcc45901fccc5d00 +fcc45900fccc5d01fcd46100fcf4c600ffffffffffffffffffffff55f4f6f900ecf3f500 +e8ecef00fbe4c100fce66a01fcf47100fcec7600fcf4710dfcec7600fcf47100fce66a00 +fcc45901fcbc5400fcc45900fcbc5400fcc45903fccc5d00fcf4c600ffffffffffffffff +ffffff55f4f6f901e0e4e700fbe4c100fce66a03fcec7607fcf47101fcec7600fcf47100 +fcec7600fcf47100fce66a00fcec7600fcdc6600fcbc5400fcc45902fcbc5400fcc45900 +fcbc5401fcc45900fccc5d00fcecc400ffffffffffffffffffffff55f4f6f900e8ecef01 +fbe4c100fce66a08fcec7600fce66a00fcec7605fce66a00fcec7600fce66a00fcdc6600 +fcbc5400fcc45900fcbc5402fcc45900fcbc5402fccc5d00fceb9900ffffffffffffffff +ffffff54f4f6f900ecf3f500e8ecef00e0e4e700fadcaf00fcdc6601fce66a0afcec7600 +fce66a05fcd46100fcbc5400fcc45900fcbc5401fcb45000fcbc5403fcc45900fcecc400 +ffffff2ffcfebc00ffffffffffffffffffffff0bfcfebc00fcf4c600fcf49700fceb9900 +fcec7600fceb9902fcf49700fcf4c603ffffff00fcf4c600ffffff07f4f6f900ecf3f501 +e0e4e701fadcaf00fcdc6608fce66a08fcdc6600fce66a00fcd46100fcbc5403fcb45000 +fcbc5400fcb45002fcbc5400fceb9900ffffff29fcfe9a00fcf49700fce66a07fcec7601 +fceb9900fcf49700fcf4c601ffffff3dfcfebc00ffffff49fcfebc01ffffffffffffff73 +fcf4c600fcdc8700fcd46103fcdc6601fcd46101fcdc6600fcd46100fcdc6602fce66a00 +fcdc6600fcd46100fccc5d00fcc45900fcbc5401fcc45900fcbc6c00fccd8300fcd48800 +fadcaf00fbe4c100f7ece700e8ecef00e0e4e700d9dcde00fadcaf00fcdc6603fcd46100 +fcdc6600fcd46100fcdc6606fce66a00fcdc6604fccc5d00fcb45001fcbc5400fcb45000 +fcac4c00fcbc5400fcb45000fcac4c01fcb45000fcecc400ffffff25fcfebc00fcec7600 +fce66a0ffcdc6601fcd46100fcc45900fcbc5400fcc45900fadcaf00fcf4c600ffffff35 +fcf49700fce66a00fcd46100fcb45000fcbc5400fcd48800fcf4c600ffffff1ffcfe9a00 +fcf47100fcec7600fcf49700ffffff1dfcfebc00fcfe9a00fcf47100fcec7602fcf4c600 +ffffff2cfcf4c600fccc5d00fce66a00fcec7600fcfe9a00ffffff39fcfebc04ffffff4d +fcf4c600fcecc400fadcaf01fce3a100fceb9900fcec7601fce66a00fcec7601fce66a03 +fcec7600fcf49700fcfe9a00ffffff3cf4f6f900ecf3f505f4f6f900ecf3f500f4f6f900 +ffffff00f4f6f901f7ece700fcecc401fbe4c100fadcaf01fce3a101fceb9901fcec7601 +fce66a00fcec7602fcf49700fcfebc00ffffff42fceb9900fcd46100fcc45900fccc5d03 +fcd46104fcdc6600fcd46101fcdc6604fce66a00fcdc6602fccc5d00fcbc5400fcb45000 +fcac4c01fca44800fcac4c00fca44800fcb45000fcbc6c00e8cbab00facca600fcd46105 +fcdc6600fcd46100fcdc6600fcd46100fcdc6609fccc5d00fcb45003fcac4c00fcb45001 +fcac4c01fcb45000fce3a100ffffff22fcfebc00fce66a02fcdc6600fce66a00fcdc6602 +fce66a01fcdc6600fce66a00fcdc6601fce66a00fcdc6601fce66a00fcdc6606fccc5d00 +fcbc5400fcac4c01fcc45900fadcaf00ffffff30fcf47100fce66a03fcc45900fcac4c01 +fcbc5400ffffff1ffcec7602fcf47100fce66a00fce3a100ffffff18fcfe9a00fcec7600 +fce66a06fcdc6600ffffff2cfcc45900fcd46100fcdc6603fce66a00fcf47100fcfebc00 +ffffff2ffcfebc01fcf47100fcec7607fcf47101fcec7600fcf47101fcf49700fcfe9a00 +fcfebc02ffffff3cf4f6f901fbe4c100fadcaf00fac58900fcbc5400fcac4c00fcb45000 +fcc45900fcdc6600fcec7601fce66a00fcec7601fce66a01fcec7600fce66a04fcec7601 +fcf47102fcfebc01ffffff2ffcecc402fbe4c100fceb9901fce3a100fceb9901fcec7601 +fcecc400e8ecef00e0e4e700e9d9b900fad4b000fac58900fcbc6c00fcb45000fcac4c00 +fcb45000fcac4c01fcb45000fcc45900fcd46100fce66a01fcec7600fce66a0bfcf49700 +fcfebc00ffffff3bfcecc400fccc5d00fcc45903fcbc5400fcc45900fccc5d00fcc45900 +fccc5d02fcd46103fcdc6600fcd46100fcdc6602fcd46100fcdc6601fcd46100fcdc6600 +fcd46101fcc45900fcb45000fcac4c00fca44802fc9c4200fca44801fcb45000fccc5d00 +fcd46100fccc5d00fcd46104fcdc6600fcd4610afcc45900fcac4c00fcb45001fcac4c02 +fca44802fcac4c00fbe4c100ffffff1ffcfebc00fce66a00fcdc6602fcd46100fcdc6613 +fcd46102fcdc6600fcd46101fcc45900fcac4c00fca44800fcac4c00fcbc5400fadcaf00 +ffffff2bfcec7600fce66a06fcb45000fcac4c01fcc45900ffffff1dfcec7600fce66a00 +fcec7600fce66a01fcec7601fce66a00fceb9900ffffff12fcfebc00fcf49700fce66a03 +fcdc6600fce66a00fcdc6600fce66a00fcdc6600fce66a01fcdc6600fcf4c600ffffff2a +fbe4c100fcc45900fcdc6606fce66a01fcec7600fcfe9a00ffffff27fcecc400fce3a100 +fceb9900fcec7600fcf47102fcec7603fce66a01fcec7603fce66a00fcec7608fcf47100 +fcec7602fcf47100fcf49701fcfe9a00fcfebc04ffffff00fcfebc00ffffff01fcfebc00 +ffffff00fcfebc00ffffff00fcfebc03fcfe9a00ffffff1df4f6f900ecf3f500e8ecef00 +fadcaf00fac58900fcb45000fcac4c01fcb45000fcc45900fcdc6600fce66a00fcec7600 +fce66a0efcec7606fcf49700fcfebc00ffffff16f4f6f900ffffff00f4f6f901ecf3f504 +f4f6f901f7ece700fcecc400fbe4c101fce3a101fcdc8701fcd46101fcdc6600fce66a01 +fcec7601fce66a00fcec7602fce66a01fcec7600fcd48800fbb47200fcb45000fcac4c01 +fcb45000fcac4c00fcb45000fcac4c01fcc45900fcd46100fce66a07fcdc6605fce66a00 +fcdc6600fce66a00fcdc6600fce66a00fcdc6600fcec7600fcf4c600ffffff37fce3a100 +fcc45900fcbc5400fcc45900fcbc5403fcc45900fcbc5400fcc45901fccc5d02fcd46107 +fcdc6600fcd46106fccc5d01fcbc5400fca44803fc9c4201fcac4c00fccc5d05fcd46101 +fccc5d00fcd46101fccc5d00fcd46107fcc45900fcac4c05fca44801fc9c4200fca44800 +fce3a100ffffff1dfcf49700fcdc6601fcd46108fcdc6606fcd46101fcdc6600fcd46100 +fcdc6601fcd46105fccc5d00fcd46101fccc5d00fcd46100fcc45900fcac4c00fc9c4200 +fca44800fcac4c00fcbc6c00fcf4c600ffffff25fcfebc00fcec7600fcdc6603fce66a00 +fcdc6600fce66a00fcdc6600fce66a00fccc5d00fcac4c00fca44800fcb45000fce3a100 +ffffff1bfcec7600fce66a05fcec7600fce66a01fcdc6600fceb9900ffffff0cfcfebc00 +fcf49700fcec7600fce66a04fcdc6606fcd46100fcdc6601fcd46100ffffff2afcbc6c00 +fccc5d00fcdc6600fcd46100fcdc6601fcd46100fcdc6603fce66a00fcdc6600fce66a01 +fcec7600fcfebc00ffffff1ff4f6f900fadcaf00fcd48800fcd46100fcec7607fce66a08 +fcec7600fce66a0efcec7600fce66a00fcec7606fce66a01fcec7602fce66a00fcec7602 +fce66a00fcf49700ffffff19f4f6f901ecf3f500e8ecef00e9d9b900fac58900fcb45000 +fca44800fcac4c01fcbc5400fcd46100fce66a00fcec7601fce66a07fcdc6600fce66a00 +fcdc6604fce66a02fcec7602fce66a03fcdc8700fcec7600fcf49700ffffff10f4f6f901 +ecf3f502e8ecef00e9d9b900f9dcd100e8cbab00fac58901fcbc8800fbb47200fcb45000 +fcac4c00fca44800fcbc5400fce66a09fcdc8700fcec7600fce66a07fcbc5400fcac4c06 +fcb45000fcdc6600fce66a02fcdc6604fcd46100fcdc6603fcd46100fcdc6601fcd46100 +fcdc6606fce66a00fcecc400ffffff33fcdc8700fcbc5406fcc45900fcbc5402fcc45902 +fccc5d00fcc45900fccc5d01fcd46108fccc5d04fcc45900fccc5d00fcc45901fcac4c00 +fc9c4201fca44800fc9c4200fca44800fcc45901fccc5d07fcc45900fccc5d08fcc45900 +fcac4c03fc9c4200fcac4c00fc9c4203fbe4c100ffffff1bfceb9900fcd46101fccc5d00 +fcd46100fccc5d01fcd46100fccc5d02fcd46100fccc5d00fcd46110fccc5d08fcd46100 +fcbc5400fcac4c00fc9c4200fca44801fcb45000fadcaf00ffffff21fcfebc00fcdc8700 +fcdc6600fcd46100fcdc6606fce66a00fcdc6601fcbc5400fca44801fcb45000ffffff1a +fceb9900fcdc6602fce66a00fcdc6600fce66a02fcec7600fce66a00fcec7600fcdc8700 +fcd46100fce3a100ffffff07fcf49700fce66a07fcdc6601fcd46100fcdc6600fcd46102 +fccc5d00fcd46104fcf4c600ffffff23f4f6f904fadcaf00fcbc5400fcd46100fcdc6600 +fcd46103fcdc6609fce66a00fcec7600fcfe9a00ffffff1afadcaf00fac58900fcc45900 +fcdc6600fce66a00fcec7600fce66a01fcec7600fce66a0efcdc6601fce66a00fcdc6601 +fce66a00fcdc6600fce66a00fcdc6600fce66a00fcdc6600fce66a00fcdc6600fce66a00 +fcdc6601fce66a03fcec7600fce66a09fcec7600fce66a00fcec7600fcfebc00ffffff17 +ecf3f502e0e4e700facca600fbb47200fca44800fcac4c00fca44800fcac4c00fcbc5400 +fcdc6600fce66a0bfcdc6609fce66a00fcec7600fce66a03fcdc6600fce66a01fcdc6600 +fce66a01fcec7600ffffff0cf4f6f900ecf3f501e8ecef01e0e4e701fac58900fcac4c00 +fca44800fc9c4200fca44802fcac4c00fca44802fcbc5400fcdc6602fce66a00fcdc6600 +fce66a00fcdc6600fce66a00fcdc6600fce66a03fcdc8700fce66a00fcdc8700fce66a00 +fcdc6600fce66a01fcbc5400fcac4c00fca44800fcac4c02fca44800fccc5d00fcdc6600 +fce66a00fcdc6604fcd46100fcdc6600fcd46100fcdc6600fcd46107fcdc6602fcd46101 +fcdc6600fcd46101fcdc6601fcf4c600ffffff2ffcdc8700fcbc540efcc45903fccc5d03 +fcd46100fccc5d05fcc45905fcbc5400fcc45900fcbc5400fcb45000fc9c4202fca44800 +fcc4590dfccc5d00fcc45900fccc5d01fcc45900fccc5d00fcbc5400fca44802fc9c4201 +fca44800fc9c4203fce3a100ffffff19fceb9900fcd46100fccc5d06fcc45900fccc5d00 +fcc45900fccc5d00fcc45900fccc5d03fcd46101fccc5d00fcd46102fccc5d00fcd46102 +fccc5d05fcc45900fccc5d03fcc45900fccc5d00fcc45902fcb45000fc9c4201fc944100 +fca44800fcac4c00fadcaf00ffffff1dfcf4c600fcd46100fccc5d00fcd46105fcdc6606 +fcd46100fcac4c00fc9c4200fca44800fcbc6c00ffffff17f4f6f900fcecc400fcd46102 +fcdc6600fcd46100fcdc6603fce66a00fcdc6600fce66a02fcdc6600fcd46100fbe4c100 +ffffff05fcdc6602fcdc8700fcdc6601fcd46108fccc5d00fcd46100fccc5d04fcd46100 +ffffff21f4f6f900ecf3f501e8ecef03fcbc6c00fcc45900fcd46106fcdc6603fcd46100 +fcdc6606fce66a01ffffff15f7ece700fad4b000fcb45000fcc45900fcdc6600fce66a08 +fcdc6600fce66a00fcdc6600fce66a01fcdc6614fcd46100fcdc6604fce66a00fcdc6600 +fce66a01fcdc6600fce66a00fcdc6600fce66a07ffffff15f4f6f900ecf3f501e8ecef00 +e0e4e700fac58900fca44802fc9c4200fca44800fcbc5400fcd46100fce66a00fcdc6600 +fce66a00fcdc6601fce66a00fcdc6600fce66a00fcdc6605fce66a00fcdc6600fce66a00 +fcdc6606fce66a01fcdc8700fce66a01fcdc6603fce66a00fcdc6601fce66a00fcdc6600 +fceb9900ffffff09ecf3f501e8ecef00e0e4e700d9dcde03efbc8e00fca44800fc9c4203 +fca44801fc9c4202fcbc5400fcdc660cfce66a02fcdc6600fcdc8700fce66a00fcdc6600 +fcbc5400fca44801fcac4c00fc9c4200fcb45000fcd46100fce66a01fcdc6601fcd4610a +fccc5d01fcd4610afccc5d00fcd46101fce3a100ffffff2cfce3a100fcc45900fcbc5404 +fcb45006fcbc5402fcc45900fcbc5401fcc45904fccc5d00fcc45900fccc5d01fcc45906 +fcbc5403fcb45000fcbc5401fcb45000fc9c4200fc944100fc9c4200fcbc5402fcc45900 +fcbc5400fcc45900fcbc5408fcc45904fcb45000fca44800fc9c4200fca44800fc9c4202 +fc944100f38b3600fc944100fc9c4200fadcaf00ffffff17fcf4c600fccd8300fccc5d02 +fcc45907fcbc5400fcc45900fcbc5400fcc45902fccc5d00fcc45901fccc5d00fcc45900 +fccc5d07fcc4590ffcac4c00fc9c4200fc944101fc9c4200fca44800fbe4c100ffffff19 +fcecc400fcd46100fcc45900fccc5d05fcd46103fcdc8700fcd46100fcdc6600fcd46100 +fcdc6601fcc45900fc9c4201fca44800fbe4c100ffffff14f4f6f900e8ecef00f7ece700 +fccd8300fcd46100fccc5d00fcd46104fcdc6603fcd46100fcdc6600fcd46100fcdc6601 +fcd46100fcc45900fadcaf00ffffff03fcdc8700fcd46100fcdc6600fcd46105fccc5d00 +fcd46100fccc5d04fcc45900fccc5d04fcbc5400ffffff20f4f6f900e8ecef01e0e4e703 +e6ccc900fcac4c00fccc5d01fcd46100fccc5d00fcd46102fcdc6600fcd46108fcdc6600 +fcd46100fcdc6601fcf4c600ffffff13f7ece700fac58900fcac4c00fcbc5400fcdc6600 +fce66a00fcdc6605fcd46100fcdc6600fcd46100fcdc6600fcd46100fcdc6601fcd46100 +fcdc6600fcd46100fcdc6600fcd46100fcdc6602fcd46100fcdc6600fcd46100fcdc6600 +fcd46104fcdc6600fcd46109fcdc6603fcdc8700fcdc6600fce66a00fcdc8700fce66a00 +fcdc6600fcdc8700fcdc6601fce66a00fcdc8700fcec7600ffffff13f4f6f900ecf3f501 +e8ecef00e6dcdc00fcbc8800fca44800fc9c4203fcac4c00fcd46100fcdc6602fce66a00 +fcdc6607fce66a00fcdc6608fcd46100fcdc6604fce66a00fcdc660cfcf4c600ffffff06 +ecf3f501e0e4e701d9dcde01d2d4d602efbc8e00fc9c4209fcac4c00fccc5d00fcd4610a +fcdc6600fcd46100fcdc6601fce66a00fcdc6601fce66a00fcb45000fca44801fc9c4200 +fcbc5400fcdc6602fcd46100fcdc6600fcd46104fccc5d00fcd46100fccc5d00fcd46100 +fccc5d07fcd46102fccc5d08fcd46100ffffff29fcf4c600fcbc6c00fcbc5404fcb45001 +fcbc5400fcb45006fcbc5400fcb45000fcbc5405fcc45900fcbc5401fcc45900fcbc5400 +fcc45900fcbc5400fcc45900fcbc5404fcb45007fcac4c00fc9c4201fcbc5402fcb45000 +fcbc5400fcb45000fcbc5400fcb45003fcbc5407fcc45900fcb45000fc9c4201fca44800 +fc9c4202f38b3602fc9c4200fad4b000ffffff16fcd46100fcc45905fcbc5400fcc45900 +fcbc5406fcc45900fcbc5400fcc45900fcbc5400fcc45900fcbc5400fcc4590cfcbc5406 +fcc45900fcbc5406fcb45000fc9c4200f38b3601fc944100fc9c4200fbb47200ffffff16 +fcecc400fcd46100fcc45906fccc5d03fccd8300fccc5d00fcd46101fccd8300fcd46103 +fcac4c00fc9c4201fcac4c00ffffff13ecf3f500e8ecef01fccd8300fcc45900fccc5d04 +fcd46105fcdc6600fcd46100fcdc6600fcd48800fcd46102fccc5d00fcbc6c00fadcaf00 +ffffff01fcecc400fcd46103fccc5d07fcc45909fccd8300ffffff1ef4f6f900e8ecef00 +e0e4e700d9dcde02d2d4d600d9dcde00ecae7c00fcbc5400fccc5d06fcd46104fccc5d00 +fcd46104fcd48800fcd46101ffffff12f4f6f900fac58900fca44800fcb45000fcd46100 +fcdc6606fcd46106fccc5d01fcd46100fccc5d00fcd46112fccc5d00fcd46101fccc5d00 +fcd46104fcdc6603fcdc8700fcdc6602fce66a00fcdc6603fcf4c600ffffff11f4f6f901 +ecf3f500e8ecef00d9dcde00efbc8e00fc9c4200fc944103fc9c4200fcbc5400fcd46102 +fcdc6601fcd46100fcd48800fcdc6600fcd46100fcdc6600fcd46101fcdc6601fcd46100 +fcdc6604fcd46100fcdc6600fcd46103fcdc6601fcdc8700fcdc6600fcdc8700fcdc6601 +fcd46100fcdc6600fcd46109fcec7600ffffff04ecf3f501e0e4e701d9dcde00d2d4d600 +cbcccd02c4c5c500e4ae7c00fc944104fc9c4201fc944102fcac4c00fccc5d04fcd46109 +fcdc6600fcd46100fcdc6602fcb45000fc9c4201fcc45900fcdc6602fcd46100fcdc6600 +fcd46101fccc5d0afcc45900fccc5d00fcc45900fccc5d03fcc45900fccc5d04fcc45900 +fccc5d00fcc45900fccc5d00fcc45900fcd48800ffffff27fccd8300fcb4500afcac4c00 +fcb45000fcac4c00fcb45002fcac4c00fcb4500bfcbc5404fcb45002fcac4c00fcb45000 +fcac4c06fcb45000fc9c4200fcb45004fcac4c00fcb45006fcbc5400fcb45000fcbc5404 +fcb45000fc9c4203fc944100fc9c4200f38b3602fc8c3d00fadcaf00ffffff14fce3a100 +fcbc5401fcc45901fcbc5406fcb45000fcbc5400fcb45002fcbc5400fcb45003fcbc5400 +fcb45000fcbc5404fcc45900fcbc5401fcc45903fcbc5409fcb45000fcbc5400fcb45003 +fcbc5401fcac4c00fc944100f38b3600fb843a00fc944101fccd8300ffffff12fcecc400 +fcc45905fcbc5400fcc45900fcbc5400fcc45905fccc5d00fcc45901fccc5d00fcc45901 +fccc5d01fcc45900fc9c4200fc944101fcbc8800ffffff10f4f6f900e8ecef01e0e4e700 +fcd48800fcc45903fccc5d00fcc45900fccc5d03fcd46102fcd48800fcd46104fccc5d00 +fcd46100fccc5d00fcc45900fcac6600facca600f7ece700fcd48800fcd46100fccd8300 +fccc5d02fcc45900fccc5d00fcc45904fcbc5400fcc45901fcbc5401fcc45900fcbc5402 +fcb45000ffffff1df4f6f900e8ecef00e0e4e700d9dcde00d2d4d601cbcccd01d7c4bd00 +fca44800fcc45901fccc5d11fcd46100fceb9900ffffff10f4f6f900f8d4c900fca44800 +fc9d4c00fcc45900fcd46101fcdc6600fcd46100fcd48800fcdc6600fcd46106fccc5d0c +fcd46100fccc5d00fcd46100fccc5d00fcd46100fccc5d0cfcd46100fccc5d00fcd46105 +fcdc6601fcdc8700fcd46104fcdc6600fcfebc00ffffff10ecf3f500e8ecef01e0e4e700 +e8cbab00f19e5c00f38b3600fc944102f38b3600fcac4c00fcc45900fcd46100fccc5d00 +fcd46101fccd8300fcd4610afcd48800fcd46100fcdc6600fcd48800fcd4610afcdc6600 +fcd46108fccc5d00fcd46102fccc5d01fcd46100ffffff02f4f6f900ecf3f500e8ecef00 +d9dcde01d2d4d600c4c5c501bbbcbd00c4c5c500bbbcbd00d8a47800fc944101f38b3600 +fc944100f38b3600fc944102f38b3601fc9c4200fcc45903fccc5d00fcc45901fccc5d00 +fcc45900fccc5d02fccd8300fcd46106fcac4c00fc9c4200fccc5d00fcd46104fccc5d04 +fcc45900fccc5d00fcc45919fcdc8700ffffff24fcf4c600fcbc6c00fcac4c09fca44800 +fcac4c01fca44800fcac4c01fca44800fcac4c0cfcb45000fcac4c00fcb45000fcac4c00 +fcb45001fcac4c00fcb45000fcac4c02fca44800fcac4c00fca44802fcac4c00fca44800 +fcac4c0dfcb45003fcbc6c00fcbc5402fcac4c00fc944105f38b3602fc944100fcd48800 +ffffff13fccd8300fcb45002fcbc5401fcb45000fcbc5400fcb45006fcac4c00fcb45000 +fcac4c02fcb45000fcac4c01fcb45004fcbc5400fcb45000fcbc5409fcb4500efcbc5400 +fcb45000fc944100f38b3600fb843a00f38b3600fc944100fca46d00ffffff11fbe4c100 +fcbc540afcbc6c00fcc45907fcbc6c00fcc45902fcb45000fc8c3d00f38b3600fc944100 +fbe4c100ffffff0ef4f6f900ecf3f500e0e4e701e9d5d700fcbc5402fcc45905fccc5d04 +fcd46100fccc5d00fccd8300fcd46100fccc5d00fccd8300fccc5d02fcbc5400fc8c3d00 +fc9c4200e6dcdc00fcd48800fccc5d03fcc45906fcbc5400fcc45900fcbc5407fcb45000 +fcd48800ffffff1bf4f6f900e8ecef00e0e4e700d9dcde00d2d4d600d8cccb00c4c5c500 +cbcccd00c4c5c500e4ae7c00fcac4c00fccc5d00fcc45901fccc5d00fcc45902fccc5d00 +fcc45901fccc5d00fcc45901fccc5d00fcc45900fccc5d01fccd8300fccc5d01fccd8300 +ffffff0ef4f6f901e8ecef00efbc8e00fc944100fca44800fcc45900fccc5d01fcd46100 +fccc5d01fcd46100fccc5d00fcd46100fccd8300fcd46100fccd8300fccc5d00fcd46100 +fccc5d02fcc45907fccc5d00fcc45900fccc5d00fcc45900fccc5d00fcc45901fccc5d00 +fcc45900fccc5d00fcc45900fccc5d00fcc45907fccc5d00fcc45900fccc5d02fccd8300 +fcd46102fccd8300fcd46100fccc5d00fcd46100fccc5d00fcd46100fccd8300fcd46101 +ffffff0fecf3f501e8ecef00e0e4e700d9dcde00e4ae7c00fc944101fc9c4200f38b3601 +fc944100fcb45000fccc5d09fccd8300fccc5d00fccd8300fccc5d01fccd8300fccc5d01 +fcd46105fccd8300fccc5d03fcd46102fcd48800fcd46101fccd8300fccc5d07fcc45901 +fccc5d00fcc45900fccc5d00fcc45900fccd8300fcf4c600ffffff00ecf3f500e8ecef00 +d9dcde01cbcccd00c4c5c500bbbcbd02b4b4b401d8a47800f38b3606fc8c3d00f38b3600 +fb843a00fc9c4200fcc45900fcbc5400fcc45900fcbc5401fcc45900fcbc6c00fcc45901 +fcbc6c00fcc45900fccc5d00fcc45901fccc5d00fccd8300fccc5d00fcd46100fccd8300 +fcd46100fcac4c00fcc45900fccc5d03fcc45900fccc5d00fcc4590afcbc5400fcc45900 +fcbc5406fcc45900fcbc5400fcc45900fcbc5400fcc45900fcbc5401fcc45900fcbc5405 +fcf4c600ffffff22fbe4c100fcac4c01fca44801fcac4c01fca44800fcac4c00fca44808 +fc9c4200fca44802fc9c4200fca44800fc9c4202fca44800fc9c4200fca44802fcac4c00 +fca44800fcac4c02fca44800fcac4c00fca44800fcac4c00fca44802fc9c4201fca44800 +fc9c4201fca44803fcac4c00fca44807fcac4c04fcac6600fcb45004fca44800fc944100 +fc8c3d01fc944100f38b3600fb843a04fad4b000ffffff12fcbc6c00fcac4c00fcb45005 +fcac4c01fcb45000fcac4c04fca44800fcac4c00fca44800fcac4c01fca44800fcac4c01 +fca44800fcac4c06fcb45003fcbc5400fcb4500afcac4c04fcb45004fcbc5400fc9c4200 +fb843a02fc8c3d00fc9c4200fcecc400ffffff10fccd8300fcb45009fcbc5403fcbc6c00 +fcbc5400fcc45900fcbc6c00fcbc5400fcc45900fcbc6c00fcc45901fcbc5400fca44800 +f38b3601fc9c4200ffffff0ee8ecef01d9dcde00e9d5d700fcbc6c00fcb45000fcbc5408 +fcc45902fccc5d00fac58900fccc5d02fcc45900fccc5d00fcc45900fccc5d00fcbc5400 +fc944101e8cbab00d9dcde00e6dcdc00fac58900fcc45905fcbc5400fcc45900fcbc5405 +fcb45000fcbc5400fcb45004fcac4c00ffffff1be8ecef01d9dcde00d2d4d600cbcccd00 +c4c5c502c6bcba00fc9c4200fcbc5400fcc4590afccc5d00fcc45900fccc5d00fcc45901 +fccc5d00fcc45902fcdc8700ffffff0df4f6f900ecf3f500f9e4e100f19e5c00fc8c3d00 +fc944100fcbc5400fcc45901fcbc6c00fcc45902fccc5d00fcc45900fccc5d05fcc45906 +fcbc5400fcc45908fcbc5400fcc45900fcbc5400fcc45900fcbc5400fcc45900fcbc5400 +fcc45901fcbc5400fcc45900fcbc5400fcc45900fcbc5400fcc45903fccc5d02fccd8300 +fccc5d05fcc45900fccc5d01fcdc8700ffffff0df4f6f900ecf3f500e8ecef00e0e4e701 +d8cccb00fc9d4c00fc944100f38b3600fc8c3d00f38b3601fc9c4200fcbc5400fcc45900 +fccc5d00fcc45901fccc5d00fcc45900fccc5d00fcc45900fccc5d00fcc45906fccc5d00 +fcc45900fccc5d02fccd8300fccc5d00fccd8300fccc5d05fccd8300fccc5d00fccd8300 +fccc5d04fcc45901fccc5d00fcbc6c00fcc45900fcbc5400fcc45908f7ece700e8ecef00 +e0e4e700d9dcde00d2d4d600cbcccd00bbbcbd00b4b4b401abacad02cc916400f38b3601 +fb843a02f38b3600fb843a00f38b3600fb843a01fc9c4200fcb45000fcbc5400fcb45001 +fcbc5400fcb45000fcbc5403fcc45900fcbc5400fcc45901fcbc5401fcc45905fcbc5400 +fcc45900fcbc5400fcc45902fcbc5400fcc45900fcbc540bfcb45000fcbc5400fcb45000 +fcbc5402fcb45000fcbc5400fcb45000fcbc5403fcb45000fcbc5403fcb45000fcbc5400 +fccd8300ffffff21fadcaf00fca44800fc9d4c00fca44802fc9c4200fca44801fc9c4200 +fca44801fc9c4200fca44800fc9c4213fca44800fc9c4200fca44802fc9c4200fca44800 +fc9c420bfca44800fc9c4201fca44800fc9c4203fca44803fcac4c05fcac6600fcac4c01 +fca44800fc8c3d00f38b3603fb843a02ec742a00f38b3600fcd48800ffffff10f4f6f900 +fcb45000fcac4c03fcac6600fcac4c01fca46d00fcac4c00fca44801fcac4c00fca44805 +fc9c4200fca44800fc9c4200fca44801fc9c4200fca44805fcac4c00fca44800fcac4c03 +fcac6600fcb45001fcac4c01fcb45000fcac4c0dfcb45003fc9c4200fb843a02f38b3600 +fc8c3d00fbe4c100ffffff0ef4f6f900f7ece700fcbc5400fcac4c00fcb45009fcbc5400 +fcb45000fcbc5400fcb45001fcbc5401fcb45000fcbc5403fcb45000fc8c3d00f38b3600 +fb843a00fbb47200ffffff0bf4f6f900ecf3f500e8ecef00e6dcdc00d9dcde00fac58900 +fcb45003fcbc5400fcb45000fcbc5400fcb45000fcbc5403fcbc6c00fcc45900fcbc6c00 +fcc45901fcbc6c00fcc45900fac58900fcc45900fcbc6c01fc9c4200fc8c3d00ecae7c00 +d9dcde00d2d4d601fac58900fcbc5409fcb45006fcac4c01fcb45000fcac4c00fcb45000 +fadcaf00ffffff19ecf3f500e8ecef00e0e4e700d2d4d601cbcccd00c4c5c502e4ae7c00 +fca44800fcc45900fcbc5400fcc45900fcbc5400fcc45901fcbc5400fcc45906fcbc6c00 +fcc45900fac58900fcc45901fac58900fcc45900ffffff0cf4f6f900ecf3f500e8ecef00 +e6dcdc00f19e5c00f38b3600fc8c3d00fcb45000fcbc5403fcc45900fcbc6c00fcc45900 +fcbc6c00fcc4590afcbc5405fcbc6c00fcbc540cfcb45000fcbc5400fcb45001fcbc5400 +fcb45000fcbc5402fcc4590afcbc6c00fcc45902fcf4c600ffffff0cf4f6f900ecf3f500 +e8ecef00e0e4e700d9dcde00d7c4bd00fc944100f38b3603fb843a00fc944100fcc45906 +fcbc6c00fcc45900fcbc6c00fcc45900fcbc6c00fcc45900fcbc6c00fcc45900fcbc6c00 +fcbc5400fcbc6c00fcc45900fcbc6c00fcc45900fac58900fcc45900fccc5d00fcc45900 +fccc5d00fcc45900fccc5d00fcc45900fccd8300fcc45900fccc5d04fcc45901fcbc6c00 +fcc45900fcbc6c00fcc45901fcbc6c00fcc45900fcbc5405fcbc6c00fcbc5400fcc45900 +fcbc5400fcc45900f9dcd100e0e4e700d2d4d600cbcccd00bbbcbd01abacad01a4a5a402 +cc916400fc8c3d00fb7c3800fb843a05fb7c3800ec742a00fc944100fcb45001fcac4c00 +fcb45000fcac4c00fcb45003fcbc5400fcb45003fcbc5401fcb45000fcbc5402fcb45000 +fcbc5401fcb45000fcbc5402fcb45000fcbc5400fcb45001fcbc5401fcb45000fcbc5400 +fcb4501bfcf4c600ffffff1ffad4b000fc9c4200fc944100fc9c4200fc944102fc9c4201 +fc944100fc9c4200fc944100fc9c4200fc944100fc9c4200fc944100fc9c4200fc944100 +fc9c4200fc944100fc9c4200fc944105fc9c4200fc944105fc9c4200fc944100fc9c4200 +fc944100fc9c4200fc944100fc9c4200fc944100fc9c4200fc94410afc9c4200fc944100 +fc9c4201fc944100fc9c4204fca4480afc9c4200f38b3600fb7c3800fb843a00f38b3600 +fb843a01ec742a00fb843a00fb7c3800fb843a00facca600ffffff10fcac4c00fca4480a +fc9c4200fca44800fc9c4200fca44800fc9c4200fca44800fc9c4201fca44800fc9c4201 +fca44800fc9c4200fca44800fc9c4204fca44804fcac4c03fcac6600fcac4c00fcac6600 +fcac4c03fca44800fcac4c00fca44800fcac4c00fca44802fcac4c00fca44800fcac4c06 +fc944100ec742a00fb7c3800ec742a00f38b3600fb843a00fbe4c100ffffff0cf4f6f900 +e8ecef01f9dcd100fca44801fcac4c00fca44800fcac4c03fcb45001fcac4c00fcb4500c +fca44800fb843a02fbe4c100ffffff0af4f6f900e8ecef00e0e4e700d9dcde00e8cbab00 +fcac4c03fcb45000fcac4c00fcb45000fcac4c00fcb45005fcbc5402fcbc6c00fcc45900 +fcbc6c00fcbc5400fcc45900fcbc5400fc9c4200fb843a00f19e5c00d2d4d600cbcccd02 +e6ccc900fcb4500bfcac4c00fcb45000fcac4c08ffffff18f4f6f900ecf3f500e0e4e700 +d9dcde00d2d4d600cbcccd00c4c5c502c6bcba00fc955100fcb45000fcbc540afcc45900 +fcbc6c00fcc45902fcbc6c00fcc45901fcbc5400fccd8300ffffff0af4f6f900ecf3f500 +e8ecef01d9dcde00f19e5c00fb843a01fcac4c00fcb45003fbb47200fcb45001fcbc5402 +fcbc6c00fcc45900fcbc6c00fcc45901fcbc6c00fcc45900fcbc6c00fcbc5404fcb45000 +fcbc5400fcb45006fcac4c00fcb45001fcac4c00fcb45000fcac4c00fcb45002fcac4c00 +fcb45005fcbc5401fcbc6c00fcc45900fcbc6c00fcc45903fcbc5400fcbc6c00fcc45900 +fcbc5400fcc45900fcbc5401ffffff0cecf3f500e8ecef00e0e4e700d9dcde01d8bcb600 +f38b3603fb843a00f38b3600fc944100fcbc5405fcbc6c00fcbc5401fcbc6c00fcbc5402 +fcb45000fcbc5401fcb45000fcbc5402fcbc6c00fcc45901fcbc6c00fcc45901fcbc6c00 +fcc45900fcbc6c00fcc45900fcbc5400fcc45900fcbc6c00fcc45900fcbc6c00fcc45900 +fcbc6c00fcc45900fcbc6c00fcc45900fcbc6c00fcc45900fcbc6c00fcbc5403fcbc6c00 +fcb45000fcbc5408e9d9b900d2d4d600cbcccd00bbbcbd00b4b4b400abacad009c9e9c00 +a4a5a402cc916400fb7c3800fb843a00ec742a00fb7c3800ec742a01f38b3600ec742a00 +f38b3600fb7c3800fc8c3d00fcac4c06fcb45000fcac4c00fcb45000fcac4c00fcb45001 +fcac4c02fcb45000fcac6600fcac4c00fcb4500afcac4c00fcb45000fcac4c00fcb45000 +fcac4c00fcb45000fcac4c00fcb45002fcac4c00fcb45000fcac4c08fcb45000fcac4c02 +fcb45000fcac4c06facca600ffffff1efcecc400fc955100fc944107fc8c3d00fc944101 +fc8c3d00fc944100fc8c3d00fc944100f38b3600fc8c3d04fc944100f38b3600fc8c3d01 +fc944100fc8c3d00fc944110fc8c3d00fc944100fc8c3d00fc944103fc9c4200fc944101 +fc9c4200fc944102fc9c4200fc944100fc9c4201fc9d4c04fca44800fc9d4c00fca44804 +fc9c4200fb7c3801fb843a02ec742a00fb843a00ec742a00fb7c3801facca600ffffff0f +fbb47200fc9c4202fca44800fc9d4c00fca44800fc9d4c00fca44800fc9d4c00fc9c4205 +fc944100fc9c4200fc944100fc9c4200fc944100fc9c4201fc944100fc9c4201fc944100 +fc9c4206fca44814fcac4c00fca44800fcac4c00fca44800fcac4c01fca44800fcac4c00 +fca44801f38b3600ec742a00fb7c3800ec742a00fb7c3800f38b3600f4f6f900ffffff0a +ecf3f500e8ecef00e0e4e701d9dcde00fac58900fca44804fcac4c00fca44800fcac4c0b +fcac6600fcac4c01fcb45000fcac4c00fc8c3d00fb7c3801fc944100ffffff09f4f6f900 +e8ecef00e0e4e700d9dcde00e9d5d700fcb45000fca44800fcac4c00fca44800fcac4c01 +fca44800fcac4c04fcb45003fbb47200fcb45000fcbc5400fcb45000fcbc5400fcbc6c00 +fcb45000fcac4c00fb7c3800f38b3600c4c5c500cbcccd03c4c5c500fcbc8800fcac4c00 +fcb45000fcac4c02fcb45001fcac4c00fcb45000fcac4c00fcb45000fcac4c03fca44800 +fcac4c00fca44801fcac4c00fca44801fbe4c100ffffff17f4f6f900e8ecef00e0e4e700 +d9dcde00d8cccb00cbcccd00c4c5c502d8ac9f00f38b3600fcb45006fbb47200fcbc5400 +fcb45000fcbc6c00fcb45000fcbc6c00fcbc5400fcbc6c01fcbc5401fcbc6c00fcb45000 +fcbc5400fcf4c600ffffff09ecf3f501e8ecef00e0e4e700d9dcde00e8a58f00fb7c3800 +ec742a00fc9c4200fcb45000fcac4c00fcac6600fcb45000fcac4c01fcb45002fbb47200 +fcb45000fcbc5400fcb45000fcbc5400fcb45000fcbc6c00fcb45001fcbc5400fcb45005 +fcac4c00fcb45000fcac4c00fcb45000fcac4c00fcac6600fcac4c02fca44800fcac4c00 +fca44800fcac4c00fca44800fcac4c00fca44800fcac4c01fca44800fcac4c00fca44800 +fcac4c01fcb45002fcbc5403fbb47200fcbc5400fcb45000fcbc5400fcb45004fcbc6c00 +ffffff0af4f6f900ecf3f500e8ecef00e0e4e700d9dcde00d2d4d600c6bcba00f38b3602 +fb843a00ec742a00fb7c3800f38b3600fcac4c00fcbc5401fcb45004fcbc5400fcb45009 +fcac6600fcb45002fcbc5401fcbc6c01fcbc5400fcbc6c00fcbc5401fbb47200fcbc5401 +fcbc6c00fcbc5401fcb45001fcbc5400fcb4500efbb47200fcb45002fbb47200e8cbab00 +c4c5c500bbbcbd00b4b4b400abacad00a4a5a403cc916400f38b3600ec742a02fb843a00 +ec742a00fb7c3800ec742a02fc944100fcac4c02fca44800fcac4c00fca44801fcac4c00 +fca44800fcac4c01fca44801fcac4c00fca44803fcac4c00fca44802fcac4c00fca44801 +fcac4c05fca44800fcac4c00fca44800fcac4c00fca44800fcac4c00fca44801fcac4c00 +fca44800fcac4c00fca44800fcac4c00fca44800fcac4c00fca44801fcac4c00fca44801 +fcac4c00fca44800fcac4c01fca44800fcac4c00fca44802fc9c4200fca44800fc9c4200 +fcac6600ffffff1efc9d4c00fc8c3d0cf38b3601fb843a00f38b3604fb843a00f38b3600 +fb843a00f38b3602fc8c3d04fc944100fc8c3d0cfc944100fc8c3d00fc94410dfc9c4200 +fc944101fc9c4200fc944100fc9d4c01fc955100fc9d4c04fc944100ec742a03fb7c3800 +ec742a04facca600ffffff0efac58900fc944101fc9c4200fc944100fc9c4200fc944100 +fc9d4c00fc944100fc9d4c00fc9c4200fc944100fc9d4c00fc944106fc8c3d00fc944100 +fc8c3d01fc944100fc8c3d00fc944104fc9c4200fc944100fc9c4203fc9d4c01fca44800 +fc9d4c00fca46d00fca44804fc9d4c00fca44800fc9d4c00fc9c4200fca44800fc9c4200 +fca44804fc9c4200fca44806fc9c4200fb843a00ec742a02fb7c3800fc8c3d00ffffff09 +f4f6f900e8ecef00e0e4e700e6dcdc00d9dcde00d2d4d600d9dcde00fbb47200fc9c4201 +fca44812fcac4c00fca44801fb7c3800ec742a01fbb47200ffffff07f4f6f901e0e4e701 +d9dcde00fcb58e00fca4480cfcac4c00fca46d00fcac4c02fcac6600fcb45000fcac6600 +fcb45000fcac4c00fb7c3800f38b3600d8bcb600d8cccb00cbcccd00c4c5c500cbcccd00 +c4c5c500cbcccd00e8c2b000fcac4c00fcac6600fcac4c05fca44800fcac4c00fca44800 +fcac4c00fca44809fcac6600ffffff17ecf3f500e8ecef00d9dcde00d2d4d601c4c5c503 +e68d5600fca44800fcac4c02fcac6600fcac4c00fcac6600fcac4c00fcb45000fcac6600 +fcb45000fcac6600fcb45004fbb47200fcb45002fcbc6c00ffffff08f4f6f900ecf3f500 +e8ecef00e0e4e700d9dcde00d2d4d600d7c4bd00ec742a00fb7c3800fc8c3d00fcac4c00 +fca44800fcac4c01fca44800fcac4c01fca44800fcac6600fcac4c02fcb45000fbb47200 +fcb45001fcac4c00fcb45001fcac4c00fcb45000fcac4c05fca44800fcac4c00fca4480d +fc9c4200fca44805fcac4c01fcb45000fcac6600fcb45001fcac4c00fcb45003fcac4c00 +fcb45001fcac6600fcd48800ffffff09f4f6f900ecf3f500e0e4e700d9dcde01d2d4d600 +c4c5c500e68d5600ec742a00fb843a00ec742a01fb7c3800ec742a00fca44800fcac4c00 +fcb45001fcac4c00fcb45000fcac4c00fcb45000fcac6600fcb45001fcac6600fcb45000 +fcac6600fcac4c00fcac6600fcac4c00fca46d00fca44800fcac4c05fcac6600fcb45004 +fcac4c00fcb45000fcac6600fcac4c00fcb45002fcac6600fcb45000fcac4c00fcac6600 +fcb45003fcac6600fcac4c00fcac6600fcac4c00fcac6600fcac4c00fcac6600fca44800 +fca46d00fcac4c02fcac6600fcac4c01fbb47200c4c5c500bbbcbd00b4b4b400a4a5a404 +cc916400ec742a01fb7c3800ec742a01f38b3600ec742a00f38b3600fb843a00ec742a00 +f38b3600fcac4c00fca44800fcac4c00fca44809fc9d4c03fca44800fc9d4c00fca4480f +fc9c4200fca44800fc9c4200fca44800fc9c4200fca44800fc9c4200fca44802fc9c4200 +fca44807fc9c4200fca44800fc9c4207fcecc400ffffff1cfbb47200fb843a00fc8c3d03 +fb843a00fc8c3d00fb843a11f38b3600fb843a00f38b3602fc8c3d00fc944100fc8c3d0b +fc944100fc8c3d00fc944100fc8c3d00fc944100fc8c3d01fc944101fc8c3d00fc944100 +fc8c3d00fc944100fc8c3d00fc944104fc955100fc9c4200fc944102fc9c4200fc944100 +fc9c4200fc944101fc955100fc9c4200fc944100fc8c3d00ec742a02fb7c3800ec742a05 +facca600ffffff0df9dcd100fc944106fc9c4200fc944109fc8c3d03f38b3601fc8c3d02 +fc944100fc8c3d00fc944108fc9d4c01fc9c4201fc9d4c05fc9c4202fc944100fc9c4202 +fc944100fc9c4205fc9d4c00fc9c4200fca44800fc9d4c00fc9c4200fc8c3d00ec742a04 +fbb47200ffffff07f4f6f900ecf3f500e8ecef00e0e4e700d9dcde00d2d4d601d8cccb01 +fca46d00fc9c4207fc9d4c00fc9c4200fc9d4c00fc9c4200fc9d4c09fca44800fc8c3d00 +ec742a00fc6c3300ec742a00f9dcd100ffffff06ecf3f500e8ecef00e6dcdc00d9dcde00 +fac4ac00fc9c4207fca44800fc9c4200fca44800fc9c4200fca44800fc9d4c00fca44803 +fcac4c01fca44800fcac4c00fca44800fb7c3801d8a47800cbcccd03c4c5c500cbcccd00 +c4c5c500cbcccd00fcac6600fca44800fcac4c00fca44808fc9c4200fca44800fc9c4201 +fca44800fc9c4200fca44800fc9c4200fca44801fc9c4200fcecc400ffffff15f4f6f900 +e8ecef00e0e4e700d9dcde00d2d4d600c4c5c500cbcccd00c4c5c501c8aca500fb7c3800 +fca44800fcac4c00fca44802fcac6600fcac4c05fcac6602fcac4c00fcac6600fcac4c01 +fca46d00fca44800fcecc400ffffff07f4f6f900ecf3f500e0e4e700d9dcde01d2d4d600 +d8cccb00e68d5600ec742a01fca44805fca46d00fca44802fcac4c01fcac6600fcac4c02 +fcac6600fcac4c00fca44800fcac4c00fca44800fcac4c00fca44806fc9d4c00fca44800 +fc9d4c00fc9c4200fc9d4c00fc9c420efca4480bfcac4c00fca44800fcac4c00fca44800 +fcac4c00fcf4c600ffffff08ecf3f501e0e4e700d9dcde00d2d4d601c4c5c500d6938100 +ec742a05fc8c3d00fcac4c00fca44801fcac4c00fca44800fcac6600fca44800fcac4c01 +fca44800fcac6600fcac4c01fca44807fca46d00fca44800fcac4c00fca44800fcac4c00 +fca44800fcac6600fca44800fcac6600fca44800fcac6600fca44800fcac4c01fcac6600 +fcac4c00fcac6600fca44800fcac4c00fca44800fcac4c00fca46d00fcac4c00fca46d00 +fcac4c01fca44800fcac4c00fca44801fcac4c00fca44806fcac4c00fca44800fcac4c00 +fcac6600c6bcba00b4b4b400a4a5a404cc916400ec742a09fb843a00fca44804fc9c4200 +fca44800fc9c4201fc9d4c00fc9c4200fc9d4c01fc9c4202fc944100fc9c4200fc9d4c02 +fca44800fc9d4c00fca44800fc9c4200fca44800fc9c420bfc944100fc9c4211fc944100 +fc9c4201fc944100fc9c4201fc944100fac4ac00ffffff1bfad4b000fb843a04fb7c3800 +fb843a01fb7c3800fb843a12f38b3600fb843a00f38b3601fc8c3d04f38b3603fc8c3d12 +fc944100fc8c3d00fc944103fc955100fc944108fc8c3d01ec742a00ec6c2800ec742a02 +ec6c2800ec742a00ec6c2802fac4ac00ffffff0dfc9d4c00fc8c3d00fc944100fc8c3d02 +fc944106fc8c3d00fc944100fc8c3d00fc944100fc8c3d04fb843a03f38b3600fb843a00 +f38b3600fc8c3d00f38b3600fc8c3d06fc944100fc8c3d00fc944100fc8c3d00fc944100 +fc8c3d00fc944100fc955100fc8c3d00fc944103fc9c4200fc94410afc955100fc944100 +fc9d4c00fc9c4202fb7c3800fc733900ec742a03f9dcd100ffffff06f4f6f900ecf3f500 +e0e4e700e6dcdc00d2d4d602cbcccd00d8cccb00d7c4bd00fc944117fc733900ec6c2801 +fb7c3800ffffff05f4f6f900e8ecef00e0e4e700d9dcde00e6ccc900fca44800fc944100 +fc9c4200fc944104fc9c4200fc944100fc9c4200fc944101fc9c4200fc944100fc9c4201 +fc9d4c05fb843a00ec6c2800e68d5600d8cccb00d2d4d600cbcccd00c4c5c500cbcccd00 +d8cccb00c4c5c500cbcccd01e8bcb000fc9d4c02fca44800fc9d4c00fca44800fc9c4206 +fca44800fc9c4207fcac6600ffffff15ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00 +c4c5c503e68d5600fc944100fca44801fcac4c00fca46d00fca44801fca46d00fca44801 +fca46d00fca44800fca46d00fca44800fcac4c00fca44805fcac6600ffffff07f4f6f900 +e8ecef00e0e4e701d2d4d601cbcccd00d79c7e00ec6c2800ec742a00fc8c3d00fca44800 +fc9d4c00fca44800fc9d4c02fc9c4200fc9d4c00fca44800fc9d4c00fca44800fc9d4c00 +fca44802fcac4c00fca44803fc9d4c00fca44801fc9d4c05fc955100fc9c4200fc955100 +fc9c4201fc944100fc9c4200fc944102fc9d4c00fc944100fc9c4200fc944100fc9c4200 +fc944100fc9c4200fc944100fc9c4204fc9d4c07facca600f7ece700fcf4c600f7ece700 +fcf4c600f4f6f900ffffff08f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00 +c4c5c500c8aca500ec6c2800ec742a00ec6c2800ec742a00eb642400ec6c2800fc733900 +fc9c4201fc9d4c00fca44801fc9d4c00fca44800fc9d4c00fca44800fc9d4c00fca44806 +fc9d4c01fca44800fc9d4c01fc9c4200fc9d4c06fc944101fc8c3d00fc944100fc955100 +fc9d4c00fca4480cfc9d4c00fca44801fc9d4c02fca44800fc9d4c00fca44800fc9d4c00 +fca44802fc9d4c00fca44800fca46d00b4b4b400a4a5a404c8856300ec6c2800ec742a00 +ec6c2804ec742a00ec6c2801fb7c3800fca44800fc9c4200fca44800fc9c4203fc944100 +fc9c4200fc94410afc9c4200fc9d4c00fc944100fc9c4202fc944100fc9c4200fc944100 +fc9c4200fc94410dfc9c4200fc944100fc9c4200fc944100fc9c4200fc944101fc9c4200 +fc944107fc9c4200fc944101fc9c4200fca46d00ffffff1bfb8d5500fb7c3812fb843a00 +fb7c3803fb843a00fb7c3800fb843a06f38b3604fb843a00fc8c3d00fb843a00f38b3601 +fc8c3d00fb843a00fc8c3d00fb843a00fc8c3d01fb843a00fc8c3d0efc944100fc8c3d00 +fc944100fc8c3d08fb843a00eb642400ec6c2808fac4ac00ffffff0cfcbc8800fb843a00 +fc8c3d00fb843a00fc8c3d04fb843a00fc8c3d08fb843a06fb7c3800fb843a06fb7c3801 +fb843a01fc8c3d00fb843a00fc8c3d02fb8d5500fc8c3d08fc944100fc8c3d00fc944100 +fc8c3d00fc944100fc8c3d04fc944106fc8c3d00ec6c2804fb843a00ffffff06f4f6f900 +e8ecef00e0e4e700d9dcde01d2d4d600d8cccb00cbcccd02efbc8e00fc8c3d12fb8d5500 +fc8c3d00fc944101fc8c3d00ec6c2800eb642401fca46d00ffffff03f4f6f900e8ecef00 +e0e4e700e6dcdc00d9dcde00fca46d00fc944101fc8c3d00fc944106fc8c3d00fc944101 +fc8c3d00fc944101fc8c3d00fc955100fc944100fc955102fb843a00fc653100e7764400 +d2d4d602cbcccd02c4c5c500cbcccd01c4c5c500d7c4bd00fca46d00fc944100fc9d4c00 +fc944110fc9c4200fc944101ffffff14f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600 +cbcccd01c4c5c500c6bcba00c7b5b100fb7c3800fca44804fc9d4c01fc9c4200fc9d4c01 +fca44800fc9d4c00fca44800fc9d4c05fc955100fc9d4c00fad4b000ffffff06f4f6f900 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01c7b5b100ec742a00ec6c2800fc733900 +fc9c4200fc9d4c0dfca44800fc9d4c00fca44800fc9d4c03fc955101fc9d4c00fc944102 +fc8c3d00fc944101fc8c3d00fc944100fc8c3d00fc944100fc8c3d00fc955100fc8c3d00 +fc944103fc955100fc8c3d00fc944100fc8c3d00fc944101fc8c3d00fc944100fc955100 +fc944100fc955100fc944104fc955100fc9c4200fc944100fbb47200ffffff0cecf3f500 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd00e7764400eb642400 +ec6c2800eb642403fb843a00fc9c4201fc955100fc9d4c0dfc955100fc9c4200fc955100 +fc944100fc9d4c00fc944102fc955100fc9d4c00f9a58b00d79c7e00da846200ec742a00 +eb642401ec6c2803fb7c3800fb843a00fc944100fc9d4c01fca44800fc9d4c09fc9c4200 +fc9d4c00fc944100fc9d4c00fc955100fc9d4c01fc955100fc9c4200fc9d4c00fc9c4201 +fca46d00abacad00a4a5a4009c9e9c00a4a5a401c8856300ec6c2800eb642403ec6c2804 +fb7c3800fc9c4201fc944100fc9c4200fc944103fc8c3d00fc944101fc8c3d00fc944100 +fc8c3d00fc944100fc8c3d00fc944100fc8c3d00fc944104fc955100fc944103fc8c3d00 +fc944100fc8c3d00fc944100fc8c3d05fc944100fc8c3d00fc944103fc8c3d00fc94410c +fc8c3d00fc944100fc8c3d00fc944101fc8c3d00fc944100fcf4c600ffffff19fbb47200 +fc733901fb7c3800fc733900fb7c3800fc733900fb7c3800fc733901fb7c3800fc733901 +fb7c3800fc733901fb7c3800fc733900fb7c380dfb843a00fb7c3801fc733903fb7c3800 +fb843a12fc8c3d01fb843a01fc8c3d00fb843a00fc8c3d02fb843a00fc8c3d00fb843a00 +fc8c3d00fb843a06fb7c3800eb642402ec6c2800eb642405fac4ac00ffffff0bf9e4e100 +fb843a08fc8c3d00fb843a00fc8c3d00fb843a00fc8c3d00fb843a00fc8c3d00fb843a04 +fb7c3808fc6c3300fc653100eb642401e5541f00eb642400e75c2a00eb642400eb826400 +e8a58f00fca46d00fb8d5500fb843a05fb8d5500fb843a00fc8c3d14fb7c3800ec6c2804 +fcb58e00ffffff05f4f6f900ecf3f500e8ecef00e6dcdc00d9dcde00d2d4d601cbcccd00 +d2d4d600cbcccd00d2d4d600f9a58b00fc8c3d01fb843a04fb7c3800fb843a00fb7c3800 +fb843a06fc8c3d02fb8d5500fc8c3d01fc733900e75c2a00eb642401f8cbc000ffffff01 +f4f6f900ecf3f500e8ecef00e0e4e700d9dcde00fcb58e00fc8c3d0ffb8d5500fc8c3d04 +fb843a00eb642400ec6c2800e8c2b000d9dcde01d2d4d601cbcccd02c4c5c500cbcccd02 +eeb48e00fc8c3d01fb8d5500fc8c3d07fc944100fc8c3d02fc944100fc8c3d00fc944104 +fbb47200ffffff13ecf3f500e8ecef00e0e4e700d9dcde00d8cccb00cbcccd00c4c5c502 +d6938100fb843a00fc9c4200fc9d4c08fc955100fc9d4c05fc955100fc944100fc955100 +fc9d4c00ffffff06f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd02d98c7800 +ec6c2800eb642400fc8c3d00fc9d4c03fc955100fc944100fc9d4c00fc944102fc955100 +fc944100fc955100fc944100fc955101fc9d4c00fc955100fc9d4c00fc955100fc9c4200 +fc955100fc944102fc955100fc8c3d01fb8d5500fc8c3d04fb843a00fc8c3d00fb843a00 +fc8c3d00fb843a00fc8c3d02fb843a00fc8c3d00fb8d5500fc8c3d02fb8d5500fc8c3d04 +fc944100fc8c3d00fc955100fc8c3d01fc944100fc8c3d00fc944100fbe4c100ffffff0a +f4f6f900e8ecef00e0e4e700d9dcde00cbcccd00c4c5c501bbbcbd00cc916400e75c2a00 +eb642400e75c2a01e5541f00e75c2a00fc6c3300fc8c3d02fc944102fc955100fc944100 +fc955100fc944100fc955101fc944100fb8d5500fc944101fb8d5500fc8c3d00fc944100 +fc8c3d00fc944100fb8d5500fc8c3d01fc955100e59c8700c8a49d00abacad02a4a5a400 +abacad00b8938b00d3725300eb642404ec6c2800eb642400fc733900fc8c3d00fc955100 +fc9d4c01fc9c4200fc955100fc944100fc955100fc944100fc955100fc944100fc955100 +fc944106fc955100fc944101fc955100fc9d4c00fc944100dba39300a4a5a403c8856300 +eb642402e75c2a00eb642405fc733900fc944103fc8c3d02fb843a00fc8c3d01fb843a00 +fc8c3d06fb843a00fc8c3d06fb843a0cfc8c3d08fb843a00fc8c3d01fb843a00fc8c3d0c +fad4b000ffffff18f7ece700fc733900fc6c3300fc733900fc6c3305fc73390ffb7c3800 +fc733901fb7c3800fc733901fc6c3300eb642401e75c2a00eb642400e75c2a00eb642400 +e75c2a00eb642402fc733900fb843a00fb7c3805fb843a00fb7c3800fb843a02fb7c3800 +fb843a01fb7c3800fb843a00fb7c3800fb843a01fb7c3800fb843a00fb7c3800fb843a04 +fb7c3800fb843a01fb7c3800fb843a00fb7c3800fb843a00fb7c3800fc733900eb642400 +e75c2a00eb642404e75c2a00eb642401efbc8e00ffffff0bfca46d00fb7c3806fb843a01 +fb7c3800fb843a05fb7c3800fb843a00fb7c3800fb843a00fb7c3804fc733900fb7c3800 +fc6c3300fc653100e5541f04e75c2a00ec6c2800d79c7e00d7c4bd00d2d4d600d8cccb00 +cbcccd00d8cccb00e8b3a800fa9c7900fb843a07fc8c3d00fb843a00fc8c3d00fb843a08 +fc8c3d00fb843a00fc8c3d00fb843a00fc8c3d01fb843a01eb642404ec6c2800ffffff06 +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d602d8cccb00cbcccd01d8cccb00fc9d4c00 +fb7c3800fb843a00fb7c380bfb843a08fc653100e75c2a01ec6c2800f7ece700f4f6f900 +ecf3f500e8ecef00e0e4e700d9dcde00e8c2b000fb843a03fc8c3d00fb843a00fc8c3d00 +fb843a00fc8c3d00fb843a00fc8c3d08fb8d5500fc8c3d00fb843a01fc6c3300e75c2a00 +e6ad9b00e0e4e701d9dcde01d2d4d600d8cccb00cbcccd01c4c5c500cbcccd00c4c5c500 +cbcccd00d7c4bd00fb8d5500fb843a0bfc8c3d00fb843a00fc8c3d01fb843a00fc8c3d00 +fb843a00fc8c3d01fb843a00ffffff12f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600 +c4c5c503c7b5b100ec742a00fc944102fc955100fc944100fc955100fc944101fb8d5500 +fc944100fc955100fc944100fc955104fc944100fc955100fc944101facca600ffffff05 +f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600cbcccd01c4c5c500c7b5b100ec6c2801 +fc6c3300fc944101fc955100fc8c3d00fc955100fc944100fc8c3d00fc944100fc955100 +fc8c3d00fc944100fc8c3d00fc944102fc955100fc944101fc955100fc944100fc8c3d00 +fb8d5500fc8c3d02fb843a00fc8c3d00fb8d5500fa9c7900f2a27200e59c8700d8755c00 +fc653100e75c2a00fb5c2e00fc6c3300fc733900fb7c3801fb843a00fb7c3800fb843a00 +fa7c5800fb843a00fb7c3800fb843a00fb7c3800fb843a05fb8d5500fc8c3d00fb843a00 +fc8c3d00fb843a00fc8c3d01fb843a00fb8d5500fc8c3d00fc955100ffffff09f4f6f900 +ecf3f500e0e4e700d9dcde00cbcccd01c4c5c500bbbcbd00b8adaa00eb642400e5541f03 +e75c2a00e5541f00fb843a00fc8c3d02fb8d5500fc8c3d0dfb843a00fc8c3d02fc955100 +e8a58f00b4b4b401abacad07b8938b00dc6c3c00e75c2a00eb642401e75c2a00eb642402 +ec6c2800fb843a00fc8c3d00fc944100fc8c3d00fc944100fc8c3d05fb8d5500fc8c3d01 +fb8d5500fc8c3d02fc944101fc8c3d00fc944101fc955100c7998d00abacad009c9e9c00 +a4a5a400c8856300e75c2a01e5541f01eb642400d9542d00ec6c2800da633600e75c2a01 +fc6c3300fc8c3d03fb843a04fb7c3800fb843a00fb7c3800fb843a00fb7c3800fb843a09 +fb7c380bfb843a00fb7c3800fb843a00fb7c3800fb843a04fb7c3800fb843a02fb7c3800 +fb843a02fb7c3800fb843a0afcb58e00ffffff18fa9c7900fc653100fc6c3300fc653100 +fc6c3302fc653100fc6c3308fc733900fc6c3300fc733900fc6c3300fc733902fc6c3300 +fc733900fc6c3300fc733900fc6c3300fc653100eb642400e75c2a00e5541f02e75c2a00 +e5541f04da633600e68d5600d8b4ac00d7c4bd00ecae7c00fb843a00fb7c3809fc733900 +fb7c3809fc733900fb7c3800fc733900fb7c3802fc733900fb7c3800fc733902fb7c3800 +fc733900e75c2a04e5541f00e75c2a01e5541f00e75c2a00fac4ac00ffffff0afad4b000 +fc733900fb7c3800fc733902fb7c3800fc733900fb7c3812fc6c3300eb642400e5541f02 +e75c2a01e5541f00e7764400d8ac9f00d2d4d600d9dcde00d2d4d604d8cccb00cbcccd00 +e8c2b000fa9c7900fb843a00fb7c3800fb843a02fb7c3800fb843a01fb7c3800fb843a01 +fb7c3800fb843a00fb7c3800fb843a00fb7c3800fb843a01fb7c3800fb843a00fb7c3800 +fb843a01fb7c3800fb843a00fb7c3800fc733900e75c2a00eb642403fa9c7900ffffff05 +f4f6f901e0e4e701d9dcde01d2d4d601cbcccd00d2d4d600cbcccd00d7c4bd00fb843a00 +fb7c3806fc733900fb7c3800fc733900fb7c3807fb843a00fb7c3800fb843a01fc733900 +e5541f02e9947d00e8ecef01e0e4e700d9dcde00e9d5d700fb8d5500fb7c3801fb843a0c +fc8c3d00fb843a05fc6c3300e75c2a00e68d5600e8ecef02e0e4e700e6dcdc00d2d4d601 +cbcccd00d8cccb00c4c5c500cbcccd00c4c5c501cbcccd00f9a58b00fb7c3800fb843a00 +fb7c3800fb843a12fcbc8800ffffff11f4f6f900e8ecef00e0e4e700d2d4d601cbcccd01 +c4c5c501d6938100fb7c3800fc8c3d00fc944100fb8d5500fc8c3d02fb8d5500fc8c3d01 +fb843a00fc8c3d01fb8d5500fc8c3d00fc944100fc8c3d00fb8d5500fc8c3d02fc955100 +ffffff06f4f6f900e0e4e701d2d4d600cbcccd00c4c5c502cc916400e75c2a00eb642400 +fb7c3800fc944100fc8c3d00fc955100fc8c3d02fb8d5500fc8c3d00fb843a00fc8c3d00 +fb8d5500fb843a00fb8d5500fb843a00fc8c3d06fb843a03f9947500e8a58f00c7b5b100 +bbbcbd01b4b4b400bbbcbd00b8adaa00c88b7d00e9644000e5541f00e54d1d00fb5c2e00 +fb6c4100fb7c3806fa7c5800fb843a00fb7c3800fb843a00fa7c5800fb843a00fb7c3800 +fb843a00fb7c3800fb843a02fa7c5800fb843a04fac4ac00ffffff07f4f6f900ecf3f500 +e0e4e700d9dcde00cbcccd01c4c5c500bbbcbd00b4b4b400c8856300e5541f05fc653100 +fb843a07fb8d5500fb843a06fb7c3800fb843a00fb7c3800fb843a01fb8d5500e6ad9b00 +c6bcba00bbbcbd02b4b4b400abacad00b4b4b400abacad05a4a5a400c8856300e5541f05 +e75c2a00e5541f00fc6c3300fb843a09fc8c3d00fb843a00fc8c3d00fb843a00fc8c3d01 +fb8d5500fc8c3d01fb8d5500fc8c3d01fc955100a4a5a402b77c6a00e75c2a00e5541f00 +d9542d00e5541f00d9542d00e75c2a01e5541f00e75c2a00e5541f00fc6c3300fc8c3d00 +fb843a04fb7c3803fb744e00fb7c3807fa7c5800fb7c3802fc733900fb7c3801fc733900 +fb7c3800fc733900fb7c3800fc6c3300fc653100eb642400fb552700e5541f00fb552700 +fc653100fc6c3300fc733900fb7c3801fc733900fb7c3801fc733900fb7c3801fc733900 +fb7c3802fc733900fb7c3800fa7c5800fb7c3801fb843a00fb7c3800fb843a00fb7c3804 +fb843a00fc955100ffffff17f9e4e100fc6c3300fc653101fb5c2e02fc653106fc6c3300 +fc653100fc6c3300fc653100fc6c3309fb5c2e00e5541f08d9542d00e5541f00e75c2a00 +cc916400d7c4bd00d2d4d601cbcccd01d8cccb00e4ae7c00fb843a00fc733906fb7c3800 +fc73390afc6c3300fc733900fc6c3303fc733900fc6c3300fc733903fc653100e5541f04 +e75c2a00e5541f01e75c2a00e5541f00f7b9a600ffffff09f4f6f900f9947500fc6c3302 +fc733907fb7c3801fb744e00fb7c3802fc733900fb7c3801fc733900fb7c3801fc733900 +fc6c3300eb642400e5541f03e75c2a00e5541f00eb642400e6ad9b00e0e4e703e6dcdc00 +d9dcde01d2d4d603cbcccd00d8cccb00d7c4bd00f9947500fc733900fb7c3806fc733900 +fb7c3801fc733900fb7c3801fc733900fb7c3801fc733900fb7c3801fc733900fb7c3802 +fc733900eb642400e5541f00e75c2a02eb642400f7ece700ffffff05f4f6f900e8ecef01 +e6dcdc00d9dcde00d2d4d601cbcccd01d2d4d600cbcccd00e8bcb000fb7c3801fc73390c +fb7c3800fb744e00fb7c3800fb744e00fb7c3800fc733900fb7c3801fc653100e54d1d01 +e5541f00e8bcb000e0e4e701d9dcde00fa9c7900fb7c3800fc733900fb7c3800fc733900 +fb7c3804fb843a00fb7c3800fb843a04fa7c5800fb843a00fb7c3802fb843a00fc733900 +e75c2a00e7764400f7ece700ecf3f501e8ecef00e0e4e700e6dcdc00d9dcde00d2d4d600 +cbcccd03c4c5c500cbcccd00c4c5c500d8bcb600fb843a00fb7c3802fb744e00fb7c3800 +fc733900fb7c3800fc733900fb7c380afa7c5800fb843a00fa7c5800ffffff10f4f6f900 +ecf3f500e0e4e700d9dcde00d2d4d600cbcccd00c4c5c502c6bcba00ec6c2800fb843a01 +fc8c3d00fb843a00fc8c3d00fb843a05f8836200fb843a08fcb58e00ffffff05ecf3f500 +e8ecef00e0e4e700d2d4d601cbcccd00c4c5c501c7b5b100e75c2a01eb642400fb843a01 +fb8d5500fb843a00fc8c3d00fb843a01fc8c3d00fb843a0bfa7c5800fb843a01fa7c5800 +fb8d5500e6ad9b00c6bcba01bbbcbd04b4b4b400bbbcbd00b8adaa00c88b7d00e75c2a00 +d94b2000e4461800fb552700fc653100fc733900fb7c3800fb744e00fb7c3801fc733900 +fb7c3801fb744e00fb7c3804fa7c5800fb7c3805fb843a02ffffff07ecf3f500e0e4e700 +d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd01b8adaa00d9542d00e4461800d94b2000 +e54d1d00d94b2000e5541f00e54d1d00fc733900fb7c3802fa7c5800fb7c3801fa7c5800 +fb7c3802fa7c5800fb7c3800fa7c5800fb7c3800fa7c5800fc733900fb7c3800fa7c5800 +fc733900fa7c5800fca46d00d8cccb00cbcccd01c4c5c500bbbcbd02b4b4b400abacad07 +a89a9500dc6c3c00e5541f07fc653100fb843a00fa7c5800fb7c3800fb843a00fa7c5800 +fb7c3801fa7c5800fb7c3800fb843a00fa7c5800fb843a00fb7c3800fb843a04fc8c3d02 +fb843a00f9947500a4a5a401c8745e00e5541f00d9542d00e5541f02d9542d00e5541f00 +d9542d00e5541f01fc653100fb7c3803fb744e00fc733906fb6c4100fc6c3300fb6c4100 +fc6c3300fc733908fc6c3300fc733900fc6c3300fb5c2e00fb552700e4461803d94b2001 +e4461801e5541f00fb552700fc6c3300fc733901fc6c3300fc733900fc6c3301fc733901 +fc6c3300fc733905fb744e00fc733902fb7c3801fc733900fb7c3800fc733900fb7c3800 +f4f6f900ffffff16fa9c7900fc653100fb552700fb5c2e03fb552702fb5c2e02fc653100 +fb5c2e00fc653101fb5c2e00fc653107fb552700e54d1d00e5541f00d94b2000e54d1d00 +d94b2004e5541f00d94b2000e5541f00da846200d7c4bd00d9dcde03d2d4d602d8cccb00 +cbcccd00f2a27200fc733902fc6c3300fc733900fc6c3301fc733900fc6c3300fc733900 +fc6c3305fc653100fc6c3300fc653101fc6c3300fc653105fc6c3300fc653100fc6c3300 +fc653100e5541f03d9542d00e5541f01d94b2000e5541f01f7b9a600ffffff08f4f6f900 +f8cbc000fc6c3300fc653100fc6c3300fc653101fc6c3300fc653100fc6c3300fc653100 +fc6c3305fc733900fc6c3300fc733901fc6c3300fc733901fc6c3301fb5c2e00e5541f00 +e54d1d02e5541f02eb826400e9d9b900ecf3f501f7ece700e8ecef02e0e4e700d9dcde02 +d2d4d603cbcccd00d8cccb00f9ad9400fb7c3800fb6c4100fc733915fc653100e5541f04 +fa9c7900ffffff06f4f6f900e8ecef00e0e4e700d9dcde01d2d4d602cbcccd00d8cccb00 +cbcccd00f2a27200fc733902fc6c3300fc733900fc6c3300fc733900fc6c3300fc733900 +fc6c3309fc733900fc6c3300fc733900fc6c3300e5541f00e4461801e75c2a00e9d5d700 +d9dcde00f7b9a600fc733907fb7c3800fc733901fb7c3800fc733900fb7c3800fc733900 +fb744e00fb7c3805fc733900e5541f00e75c2a00f9dcd100ffffff01f4f6f901e8ecef01 +d9dcde01d2d4d600cbcccd01c4c5c500cbcccd02c4c5c500fa9c7900fc733905fc6c3300 +fc733905fb7c3800fc733901fb7c3800fb744e00fb7c3800fc733900fb7c3800fc733900 +fac4ac00ffffff0ff4f6f900e8ecef00e0e4e700d9dcde00d2d4d600d8cccb00c4c5c502 +d79c7e00fc6c3300fb7c3800fb843a00fb7c3800fb843a00fb7c3801fa7c5800fb843a00 +fb7c3800fa7c5800fb843a01fb7c3802fa7c5800fb7c3801fa7c5800fb7c3801f4f6f900 +ffffff04f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500c6bcba00 +c4c5c500c88b7d00e5541f00e54d1d00fc653100fb7c3803fa7c5800fb843a01fa7c5800 +fb843a03fb7c3800fb843a00fb7c3800fa7c5800fb7c3800fa7c5800fb843a00fa7c5800 +fb7c3801fb843a00f9ad9400cbcccd01c4c5c500bbbcbd00c4c5c500bbbcbd00c6bcba00 +b4b4b400bbbcbd01b4b4b400bbbcbd01b8adaa00d3725300d94b2000e4461800d9431900 +fb552700fc6c3300fc733907fb6c4100fc733900fb6c4100fc733902fb7c3800fc733901 +fb7c3800fb744e00fc733900fa7c5800fb7c3800fcb58e00ffffff05ecf3f500e8ecef00 +e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd01b4b4b400c97c6700e4461800d9431900 +e4461803fb552700fc6c3300fc733900fb6c4100fc733905fb6c4100fc733906fc6c3300 +fc733900fb7c3800fac4ac00d9dcde01d2d4d600cbcccd01c4c5c500bbbcbd01b4b4b401 +b8adaa00abacad03a4a5a400b98a7c00e5541f00d94b2000e4461800d94b2001e5541f00 +d94b2000e5541f01fc6c3300fb7c3803fc733900fb7c3800fb744e00fb7c3802fc733900 +fb7c3802fa7c5800fb7c3801fa7c5800fb843a00fb7c3800fb843a00fb7c3800fb843a01 +c7998d00a4a5a400c8745e00d94b2003e5541f00d94b2000e5541f00d94b2000e5541f00 +d94b2000fb5c2e00fb7c3800fc733908fc6c330feb826400b78d8500c86d5400d9431905 +e4461800d9431901e4461802fb552700fc653100fc6c330cfc733900fc6c3300fc733900 +fc6c3302fc733900fc6c3300fc733901f9dcd100ffffff15f7ece700fc653100fb552700 +fb5c2e00fb552703fb5c2e00fb552702fb5c2e01fb552700fb5c2e04fb552700fb5c2e01 +fc653101fb5c2e00e5541f00e4461800e54d1d00e4461800d94b2000e54d1d00e4461800 +e54d1d01d94b2000e4461801d9542d00d8ac9f00e0e4e701e8ecef00d9dcde00e0e4e700 +d9dcde02d2d4d601cbcccd00d2d4d600d8bcb600fb843a00fc6c3300fc653101fc6c3300 +fc653105fb5c2e06fc653100fb5c2e00fc653101fb5c2e01fc653100fb5c2e00fc653102 +fb5c2e00e54d1d00e4461800d94b2002e54d1d00d94b2000e54d1d00e4461800d94b2000 +eeb48e00ffffff08f4f6f900fb8d5500fc653100fb5c2e01fc653100fb5c2e01fc653100 +fb5c2e00fc653105fc6c3300fc653102fc6c3300fc653103e54d1d00e4461802d94b2000 +e4461800d9431900d94b2000e9947d00ecf3f500f4f6f904ecf3f500e8ecef01e0e4e701 +e6dcdc00d9dcde00d2d4d602d8cccb00cbcccd01d8bcb600fa7c5800fc6c3301fc653100 +fc6c3301fc653100fc6c3304fc653100fc6c3300fc653100fc6c3307fc653100e5541f00 +e54d1d00d94b2000e54d1d00d94b2000e5541f00ffffff07f4f6f900e8ecef00e0e4e700 +e6dcdc00d2d4d602cbcccd00d2d4d600cbcccd01f9947500fc6c3304fc65310afc6c3300 +fc653100fc6c3303fc653100e4461800d94b2000d9431900da846200d8cccb00fb7c3800 +fc6c3302fc733902fc6c3300fc733900fc6c3300fc733903fc6c3300fc733902fc6c3300 +fc733902fb6c4100fb552700d94b2000fac4ac00ffffff03f4f6f901e8ecef00d9dcde01 +d2d4d600d8cccb00cbcccd00c4c5c500cbcccd00c4c5c501cbcccd00d8bcb600fc6c330a +fc733900fc6c3301fc733901fc6c3300fc733905ffffff0fecf3f500e0e4e700d9dcde00 +d2d4d600cbcccd00c4c5c502c6bcba00dc6c3c00fc6c3300fb7c3801fb744e00fc733900 +fb7c3800fb744e00fb7c3800fc733900fb7c3800fc733904fb6c4100fc6c3300fb6c4100 +fc6c3302fa9c7900ffffff05f4f6f900e8ecef00d9dcde00d2d4d600cbcccd01c4c5c500 +bbbcbd01da633600d9431900e4461800fc6c3300fc733903fb7c3800fc733900fb7c3800 +fc733900fb7c3800fb744e01fb7c3801fb744e00fb7c3806f5886c00e6ccc900d9dcde00 +d2d4d600cbcccd02c4c5c500bbbcbd05b4b4b400bbbcbd02c88b7d00d9431900e4461800 +dc3e1400e4461800fb5c2e00fc6c3300fc733900fc6c3300fb6c4100fc6c3306fb6c4100 +fc6c3300fc733900fb6c4100fc733900fb6c4100fc733901fc6c3300fc733900fb744e00 +ffffff04f4f6f900ecf3f500e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd01b4b4b400 +b8adaa00d94b2000dc3e1400e4461800dc3e1402e4461800fb5c2e00fc6c3310fb6c4100 +fc733900f8cbc000e8ecef00e0e4e700d9dcde01d2d4d600cbcccd00c4c5c501bbbcbd00 +b4b4b400abacad04b99a9400c7634a00e4461803d94b2000e54d1d00e4461801fb552700 +fc6c3300fc733903fb7c3800fc733909fb7c3800fc733900fb7c3801fc733900fb7c3800 +fb744e00fb7c3802fb843a00a4a5a400c86d5400e4461802d9431901e4461800d9431900 +e4461802fb552700fc733900fc6c3300fc733900fc6c3301fc733900fc6c3303fc733900 +fc6c3303fc653101fc6c3300fc653101fc6c3300fc653100fc6c3301fb6c4100cc916400 +9c9e9c02b7746200e4461801d9431900e4461801dc3e1400e4461800d9431900e4461800 +dc3e1400e4461801fb552700fc653100fc6c3300fc653108fc6c3300fc653102fc6c3300 +fc653100fc6c3300fc653100fc6c3303fac4ac00ffffff15f9ad9400fb552717e4461801 +d9431901dc3e1400e4461800d9431901dc3e1400e4461800d9431901da633600d8cccb00 +e8ecef06e0e4e700d9dcde02d2d4d601cbcccd01f9947500fc653101fb5c2e02fc653100 +fb552706fb5c2e00fb552706fb5c2e00fb552700fb5c2e03fb552700d9431901e4461800 +d9431900e4461800dc3e1400e4461800d9431901dc3e1400f7b9a600ffffff07f4f6f900 +f8d4c900fc653100fb552700fc653100fb5c2e06fb552700fb5c2e00fb552700fb5c2e03 +fc653100fb5c2e01fc653101fb552700e4461802d9431900e4461800d9431900dc3e1400 +e4461800e8a58f00f4f6f900ffffff06f4f6f901f7ece700e8ecef00e0e4e701e6dcdc00 +d9dcde00d2d4d603cbcccd00d7c4bd00fa7c5800fc653105fb5c2e01fc653100fb5c2e00 +fc653101fb5c2e00fc653100fb5c2e00fc653103fb5c2e00fc653101fb552700dc3e1400 +e4461800dc3e1400e4461800d9431900fa9c7900ffffff06f4f6f900f7ece700e8ecef00 +e0e4e700d9dcde01d2d4d601cbcccd01d2d4d600d7c4bd00fb7c3800fc6c3301fc65310e +fb5c2e00fc653103fb552700dc3e1400e4461801fb744e00fc653101fc6c3300fc653100 +fc6c3300fc653103fc6c3300fc653102fc6c3300fc653100fc6c3300fc653100fc6c3302 +fb6c4100fc6c3300fb552700d9431900fa9c7900ffffff05f4f6f900e8ecef01d9dcde00 +d2d4d600cbcccd04d8cccb00c4c5c500cbcccd00f8836200fc653104f9653d00fc653101 +fc6c3300fc653101fc6c3300fc653104fc6c3300fc653100fc6c3302f8cbc000ffffff0d +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01c4c5c501c8a49d00fb552700 +fc733901fc6c3300fc733901fc6c3303fb6c4100fc6c3300fb6c4100fc653100fb6c4100 +fc653100fc6c3300fc653100fc6c3300fc653100fc6c3300fc653100f9e4e100ffffff04 +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd00c4c5c500 +c8aca500d9431900dc3e1400fb552700fc6c3306fb6c4100fc6c3300fb6c4100fc733906 +fb6c4100fc733900fb6c4100fc733900fa7c5800f8d4c900e0e4e701d9dcde01d2d4d600 +cbcccd01c4c5c501bbbcbd00c6bcba00b4b4b400bbbcbd02b4b4b402c97c6700dc3e1400 +d9431900dc3e1400e4461800fb5c2e00fc653101fc6c3302fc653100fc6c3300fc653100 +fc6c3300fc653100fc6c330af9ad9400ffffff03ecf3f500e8ecef00d9dcde00d2d4d600 +cbcccd00c4c5c500bbbcbd01b4b4b400c8847200d9431900dc3e1401e4461800dc3e1400 +e4461800e54d1d00fc6c3305fc653100fc6c3301fc653102fc6c3300fc653100fb6c4100 +fc6c3302fc653100fac4ac00f4f6f900e8ecef01e0e4e700d9dcde00d2d4d600cbcccd01 +bbbcbd01b4b4b400bbbcbd00abacad02b9857800d9542d00dc3e1400d9431900dc3e1400 +d9431902dc3e1400e4461800fb5c2e00fc6c3305fb6c4100fc6c3300fc733900fc6c3301 +fb6c4100fc6c3300fb6c4100fc6c3303fb6c4100fc6c3300fb6c4100fc733904fb744e00 +e78b7100a4a5a400c86d5400d9431900dc3e1401d9431900dc3e1401d9431900dc3e1401 +d9431900fb552700fc653100fc6c3303fc653100fc6c3301fc653100fc6c3300fc653101 +fc6c3300fc653109fb6c4100c7998d009c9e9c02a4a5a4009c9e9c00ba654f00dc3e1400 +e4461800dc3e1409fb552700fc653104fc6c3300f9653d00fc65310cfb5c2e00fc653100 +f9a58b00ffffff14f4f6f900fc653100fb552705fb5c2e00fb552700fb5c2e00fb552700 +fb5c2e00fb552701fb5c2e00fb552701fb5c2e00fb552701fb5c2e00fb552702dc3e1402 +d9431906dc3e1401da633600e6dcdc00e8ecef01ecf3f501f7ece700ecf3f501e8ecef02 +e0e4e700d9dcde02d2d4d601cbcccd00e9947d00fb552704fb5c2e03fc653100fb5c2e06 +fb552700fb5c2e01fb552701fb5c2e00fb552701fb5c2e00fb552700e4461800dc3e1401 +e4461800dc3e1402e4461800dc3e1400e4461800f9ad9400ffffff07ecf3f500fa9c7900 +fb5c2e01fb552700fb5c2e02fb552700fb5c2e03fc653100fb5c2e03fb552700fb5c2e00 +fb552700fb5c2e00fb552701e4461801dc3e1405e8866c00ffffff0af4f6f900ecf3f500 +e8ecef01e0e4e700d9dcde02d2d4d601d8cccb00cbcccd00d7c4bd00fc6c3300fb5c2e04 +fc653100fb5c2e01fc653100fb5c2e00fc653102fb5c2e00fc653100fb5c2e00fc653100 +fb552700fc653100fb5c2e01fb552700dc3e1401d9431900dc3e1400d9431900e75c2a00 +ffffff07f4f6f900ecf3f500e8ecef00e6dcdc00d9dcde00d2d4d602d8cccb00cbcccd01 +d8bcb600fc6c3300fc653100fb5c2e00fc653100fb5c2e00fc653100fb5c2e00fc653103 +f9653d00fc653100f9653d00fc653104fb5c2e00fc653101fb5c2e00e4461800dc3e1400 +fb552700fc653103fb5c2e00fc653109fb5c2e00fc653105fb552700dc3e1400e86c4c00 +ffffff07f4f6f900e8ecef00e6dcdc00d9dcde00d2d4d600cbcccd01c4c5c500cbcccd00 +c4c5c500cbcccd00c4c5c500e8b3a800fb6c4100fc6c3300fb6c410bfc6c3300fb6c4100 +fc653105fa7c5800ffffff0decf3f500e8ecef00d9dcde00d2d4d600d8cccb00c4c5c503 +da633600fb5c2e00fc6c3300fc653103fb6c4100fc653100fc6c3300fc653100fb6c4100 +fc653100fc6c3300fb6c4100fc6c3300f9653d00fb6c4100fc6c3300fb6c4102f5886c00 +ffffff05ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00c4c5c501c6bcba00bbbcbd00 +c8847200dc3e1401fb552700fc653101f9653d00fc653101f9653d00fc6c3300fc653100 +fc6c3301fc653100fc6c3301fc653100fc6c3306f7b9a600f4f6f900ecf3f500e8ecef00 +e0e4e700d9dcde01d2d4d601cbcccd00c4c5c501bbbcbd02b4b4b400bbbcbd00b4b4b400 +bbbcbd01b8adaa00d45e4400d9431902e4461800fc653100fb6c4100fc6c3300fb6c4106 +fc6c3300fc653102fc6c3305fc653100fc733900ffffff02f4f6f900ecf3f500e0e4e700 +d9dcde00cbcccd00c4c5c500bbbcbd01b4b4b401c9593b00dc3e1405fb552700fc6c3301 +fc653101fc6c3300f9653d00fc6c3300fc653100f9653d00fc6c3300fb6c4101fc6c3300 +fb6c4100fc653101f9653d00fc6c3300fa9c7900ffffff00f4f6f901ecf3f500e0e4e701 +d2d4d601c4c5c501bbbcbd00b4b4b400abacad00b4b4b400a4a5a400c7634a00dc3e1404 +d9431900dc3e1401e54d1d00fc653101fc6c3300fc653100fc6c3300fc653100fc6c3300 +fc653103fc6c3301fc653100fc6c3300fc653100fc6c3300fc653100fc6c3300fc653100 +fc6c3300fc653102fc6c3301fb6c4100fa7c5800b99a9400a4a5a401b7746200dc3e1401 +d9431901dc3e1400d9431900dc3e1401d9431900dc3e1400e54d1d00fc65310afb6c4100 +fc653100fb6c4100fc6c3300fb6c4100fc6c3300f9653d00fc6c3300fc653100fb6c4100 +fc653100fc6c3300e8866c009c9e9c00a4a5a4009c9e9c03a88c8600d94b2000d9431909 +dc3e1400d9431900fc653100fc6c3300fb6c4101f9653d00fb6c4100fc6c3300fb6c4100 +fc653100f9653d00fc6c3300fc653100fb6c4100fc6c3300f9653d00fc653100f9653d00 +fc653100f9653d00fc653100fb6c4100fc653100f9947500ffffff14fac4ac00fb552705 +fb5c2e00fb552700fb5c2e0de75c2a00d9431902c9452200d9431900d94b2000d9431900 +d94b2000d9431900d94b2000d9431900c9452200d9542d00e6ccc900e8ecef00ecf3f500 +f4f6f902ffffff01f4f6f902f7ece700e8ecef00e0e4e701d9dcde01d2d4d601cbcccd00 +f8836200fb5c2e00fc653100fb5c2e00fc653100fb5c2e05fc653100fb5c2e08fc653100 +fb5c2e02fb552701dc3e1401d9431900dc3e1401d9431900dc3e1400d9431901dc3e1400 +e8b3a800ffffff06f4f6f900f9e4e100fb6c4100fb5c2e01fc653100fb5c2e01fc653100 +fb5c2e00fc653100fb5c2e00fc653100fb5c2e01fc653100fb5c2e01fc653100fb5c2e01 +fc653100fb5c2e00fc653100fb552700dc3e1400d9431901dc3e1400d9431902d95d3b00 +f4f6f900ffffff0bf4f6f901e8ecef02e6dcdc00d9dcde01d2d4d600cbcccd00d2d4d600 +cbcccd00e8b3a800fb5c2e00fc653100fb5c2e00fc653101fb5c2e00fc653105f9653d00 +fc653100fc6c3301fc653103fc6c3300fc653100e5541f00d9431900d94b2000d9431902 +f8cbc000ffffff07f4f6f900e8ecef01e6dcdc00d9dcde01cbcccd00d2d4d600cbcccd00 +d8cccb00cbcccd00e8a58f00fc653107f9653d00fc653100f9653d01fc653100f9653d04 +fc653103fb5c2e00e4461800fc653103f9653d00fc65310af9653d00fc653104fb5c2e00 +d9431900e5541f00f4f6f900ffffff07f4f6f900e8ecef01d9dcde00d2d4d600d8cccb00 +cbcccd00d8cccb00c4c5c500cbcccd00c4c5c500cbcccd01f8836200fb6c4103fb744e00 +fc733900fb744e00fc733900fb744e00fb6c4100fc733900fb6c4100fc733900fb6c4106 +f9653d00fc653100f9e4e100ffffff0bf4f6f900e8ecef00e0e4e700d9dcde00d2d4d600 +cbcccd01c4c5c501c8aca500e54d1d00fc653100fc6c3300fb6c4105fc733900fb6c410b +f9dcd100ffffff04f4f6f900e8ecef00e0e4e700d9dcde00cbcccd01c4c5c502c6bcba00 +d45e4400d9431901fc653100fb6c4100fc6c3300fb6c4102fc6c3300fb6c4101fc6c3300 +f9653d00fc6c3300fc653100f9653d00fc653100f9653d00fc6c3300f9653d00fc653100 +fc6c3300f9653d00fb8d5500ffffff01f4f6f901e8ecef01e0e4e700d9dcde00d2d4d601 +cbcccd00c4c5c501c6bcba00bbbcbd00c6bcba00b4b4b400bbbcbd00b4b4b400bbbcbd01 +b99a9400d94b2000d9431902fb552700fb6c410cfc653100fb6c4100fc653100f9653d00 +fc6c3300f9653d00fc6c3300fb6c4100f8cbc000ffffff01ecf3f500e0e4e700d9dcde00 +d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b401b8938b00dc3e1400d9431903dc3e1400 +e4461800fc6c3300fc653101fb6c4100fc653100f9653d00fc6c3300fb6c4101fc6c3300 +fb6c4100fc6c3300fb6c4100fc6c3300fb6c4101fc6c3300fb6c4100fb744e00f4f6f900 +ffffff02ecf3f500e8ecef00e0e4e700d9dcde00cbcccd01bbbcbd02b4b4b400b98a7c00 +d9542d00d9431907fb5c2e00fc6c3303fb6c4100fc6c3300fb6c4100f9653d00fb6c4100 +fc6c3300fb6c4100fc6c3300f9653d00fc6c3300f9653d00fc6c3300fb6c4102fc6c3300 +fb6c4100f9653d00fc6c3300fb6c4100fc653101fb6c4100d98c7800a4a5a403b66c5900 +d9431900c9452200d9431907fb552700fc6c3300fb6c4104fc6c3300fb6c4103fc6c3300 +fb6c4102fc6c3300f9653d00fc6c3300fb6c4101fc6c3300fb6c4100fb744e00a4a5a401 +9c9e9c01a89a95009c9e9c02ba654f00d9431900c9452200d9431904d94b2000d9431903 +fb552700fb6c4100fc6c3300fb6c4102f9653d00fb6c4100fc6c3300fb6c4102f9653d00 +fc6c3300fb6c4103fc6c3300fb6c4100fc653101fa7c5800ffffff14f5886c00fb552700 +fb5c2e14d94b2000c9452202d94b2000c9452207dba39300e8ecef00f4f6f901ffffff07 +f4f6f900ecf3f500e8ecef01e0e4e700e6dcdc00d9dcde00d2d4d601d8cccb00fb6c4100 +fb5c2e05fc653100fb5c2e03fc653100fb5c2e01fc653100fb5c2e00fc653100fb5c2e03 +fc653100fb5c2e01fb552700d9431901c9452200d9431900c9452200d9431901c9452200 +d9431900c9452200e6ad9b00ffffff06ecf3f500e8bcb000fb5c2e03fc653100fb5c2e00 +fc653101fb5c2e00fc653106fb5c2e00fc653101fb5c2e00fc653100fb552700d9431901 +c9452200d9431902c9452200d9431900e8bcb000ffffff0ef4f6f900e8ecef01e0e4e700 +d9dcde02d2d4d601d8cccb00cbcccd00f5886c00fc653104f9653d00fc653100f9653d01 +fb6c4100f9653d00fb6c4102f9653d00fb6c4105fb5c2e00c74b2a00d94b2000c74b2a00 +d94b2000c74b2a00ea7c5e00ffffff08ecf3f500e8ecef00e0e4e700d9dcde01d2d4d601 +cbcccd00d2d4d600cbcccd01f9947500fc653102f9653d00fc653100fb6c4100f9653d01 +fb6c410af9653d00fc6c3300fb6c4100f9653d00fb6c410cfb744e00fb6c4105f9653d01 +e54d1d00d94b2000f8d4c900ffffff09ecf3f500e8ecef00d9dcde01cbcccd02c4c5c500 +cbcccd01c4c5c500cbcccd00e6ad9b00fb744e00fc733900fb744e0efc733900fb744e00 +fb6c4100fc733900fb744e00f9947500ffffff0bf4f6f900e8ecef00d9dcde00d2d4d601 +cbcccd00c4c5c502c8745e00fb5c2e00fb6c4102fc733900fb6c4100fb744e00fc733900 +fb744e00fc733900fb744e00fc733900fb744e00fc733900fb744e00fc733900fb744e00 +fc733900fb744e00fc733900fb744e00fb8d5500ffffff05f4f6f900e8ecef00e0e4e700 +d2d4d600cbcccd00c4c5c501bbbcbd01b8adaa00d94b2000c9452200e5541f00fb6c4102 +fc733900fb6c4100fc733900fb6c410ef9dcd100ffffff03f4f6f900ecf3f500e8ecef00 +e0e4e700d9dcde00d2d4d601c4c5c502bbbcbd03b4b4b400bbbcbd00b4b4b400bbbcbd00 +c86d5400c9452201c74b2a00c9452200fb6c4100fc733905fb6c4100fc733901fb6c4103 +fc6c3300fb6c4105fca46d00ffffff00f4f6f900ecf3f500e0e4e700d9dcde00cbcccd00 +c4c5c500bbbcbd00b4b4b402b77c6a00d9431905fb552700fc6c3300fb6c4100fc6c3300 +fc653100fb6c4103fc6c3300fb6c4105fc733900fb6c4101fac4ac00ffffff03f4f6f900 +e8ecef00e0e4e700d2d4d601c4c5c501bbbcbd00abacad00c8745e00c74b2a00d9431900 +c9452201d94b2000c9452200d94b2000c9452200e5541f00fc6c3300fb6c4105fc733900 +fb6c4100fc733900fb6c410cfc6c3300fb6c4100fc6c3300f9653d00f8836200c8a49d00 +a4a5a404c8745e00c9452209e54d1d00fb6c410cfc6c3300f9653d00fb6c4101fc653100 +f9653d00fb6c4100f9653d00fb6c4100e78b7100abacad00a4a5a4019c9e9c04a7847c00 +c9452200d9431900c9452207d9431900c9452200d9431900fb6c4107f9653d00fb6c410b +fc733900ffffff13f9e4e100fb5c2e00e75c2a00fb552700e75c2a00fb552700e75c2a00 +fb552700e75c2a04e5541f00e9644000e75c2a03e9644000e75c2a00e9644000e75c2a00 +d9542d00c9452200c74b2a00c9452200c74b2a01c9452200c74b2a01c9452200c74b2a01 +c9452200c86d5400e8ecef00f4f6f901ffffff0af4f6f900e8ecef01e0e4e700e6dcdc00 +d9dcde00d2d4d601d8ac9f00fb5c2e00f9653d00e9644000fb5c2e00f9653d00fb5c2e02 +f9653d00fb5c2e00f9653d00fb5c2e00f9653d00fb5c2e00fc653100fb5c2e00f9653d00 +fb5c2e00fc653101fb5c2e01fc653100fb5c2e00e75c2a00c9452203d94b2000c9452203 +d9431900e8b3a800ffffff05f4f6f900e8ecef00f9947500f9653d04fc653100f9653d0c +fc653100f9653d00e5541f00c9452201d94b2000c9452203da6d5000ffffff10f4f6f900 +ecf3f500e8ecef01e6dcdc00d9dcde00d2d4d601cbcccd00d2d4d600d7c4bd00fb6c4100 +f9653d02fb6c4100f9653d00fb6c410fd94b2000c74b2a02c9452200c9593b00ffffff09 +ecf3f500e8ecef00e6dcdc00d9dcde01d2d4d601cbcccd01d2d4d600d7c4bd00f5886c00 +fb6c4119fc733900fb744e09fc733900fb744e00fb6c4103e5541f00c9452200e8a58f00 +ffffff0af4f6f900e8ecef00e0e4e700d9dcde00d2d4d601cbcccd01c4c5c500cbcccd00 +c4c5c500d8cccb00c4c5c500f8836200fb744e03fa7c5800fb744e00fa7c5806fb744e00 +fa7c5800fb744e05fb6c4100f4f6f900ffffff09f4f6f900ecf3f500e0e4e700d9dcde00 +d2d4d600cbcccd00c4c5c502c7b5b100d9542d00fb6c4101fc733900fb6c4100fb744e00 +fc733900fb744e00fb6c4100fb744e08fa7c5800fb744e00fa7c5800fb744e00f9dcd100 +ffffff04f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500c6bcba00 +c4c5c500bbbcbd00c7998d00c74b2a01fb5c2e00fb744e05fc733900fb744e00fc733903 +fb744e00fc733903fb6c4100fc733901f9947500ffffff06ecf3f500e8ecef00e0e4e700 +d9dcde00d2d4d601c4c5c501bbbcbd02b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400 +b99a9400c9452200d94b2000c9452200d94b2000e75c2a00fb6c4100fb744e02fb6c4100 +fb744e00fc733900fb744e00fb6c4100fb744e00fc733902fb6c4104fc733900fb6c4100 +fa7c5800ffffff00ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd01 +b4b4b400b8adaa00c9593b00c9452201d9431900c9452202f9653d00fb6c4102fb744e00 +fc733902fb6c4100fb744e00fc733900fb744e00fc733901fb744e00fc733900fb744e00 +fc733900f8836200ffffff03f4f6f900ecf3f500e8ecef00e0e4e700d9dcde00d2d4d600 +c4c5c501b7a4a000c9593b00c74b2a04c9452200c74b2a01f9653d00fb744e0cfc733900 +fb744e00fc733900fb744e00fc733901fb6c4100fc733900fb6c4104fb744e00e8a58f00 +bbbcbd00abacad00a4a5a404b7746200c9452209e5541f00fc733900fb6c4100fc733900 +fb6c4100fc733900fb6c4110c8a49d00b8adaa00a4a5a4019c9e9c00a89a95009c9e9c02 +a89a9500c945220cfb5c2e00f9653d00fb6c4106fc733900fb6c4100fb744e00fb6c4101 +fb744e00fc733900fb6c4105f4f6f900ffffff12f7b9a600e75c2a07fb5c2e00e75c2a00 +e9644000e75c2a00e9644000e75c2a01e9644000e75c2a00e9644000e75c2a01e9644000 +e75c2a00c74b2a00b9462700c9452200c74b2a01b9462700c9452200b9462700c9452200 +c74b2a00b9462700c9452200c74b2a00d8bcb600f4f6f900ffffff0df4f6f900ecf3f500 +e8ecef01d9dcde01d2d4d601eb826400e75c2a00f9653d00e9644000e75c2a00e9644001 +fb5c2e00e9644001fb5c2e00e9644000fb5c2e00e9644000f9653d00e9644000f9653d01 +fb5c2e00e9644000f9653d01fb5c2e00f9653d00e5541f00c9452203c74b2a00c9452203 +c74b2a00e6ad9b00ffffff05f4f6f900e6dcdc00f9653d06fb6c4101f9653d00fb6c4104 +f9653d00fb6c4100f9653d03fb5c2e00c9452207fac4ac00ffffff11f4f6f900f7ece700 +e8ecef00e0e4e700d9dcde02d2d4d600cbcccd01e59c8700f9653d00fb6c4102f9653d03 +fb6c4100f9653d00fb6c4102fb744e00fb6c4106e75c2a00c9452200c74b2a02c9452200 +f7b9a600ffffff08f4f6f901e8ecef00e6dcdc00d9dcde00d2d4d602cbcccd02d7c4bd00 +fa7c5800fb6c4108fb744e00fb6c4100fb744e00fc733900fb744e1be9644000c74b2a00 +d8846e00ffffff0cecf3f500e8ecef00d9dcde01d8cccb00cbcccd01c4c5c500cbcccd00 +c4c5c500cbcccd00c4c5c500e8a58f00fb744e01fa7c5800fb744e01fa7c5801fb744e00 +fa7c5800fb744e01fa7c5800fb744e00fa7c5800fb744e00fa7c5804fb744e00fa7c5800 +f9a58b00ffffff09f4f6f900e8ecef00e0e4e700d2d4d601cbcccd00c4c5c502c8847200 +fb5c2e00fb744e0cfa7c5800fb744e00fa7c5800fb744e00fa7c5801fb744e00f5886c00 +ffffff05f4f6f900e8ecef00e0e4e700d2d4d600cbcccd01c4c5c500bbbcbd01c4c5c500 +c97c6700c74b2a01fb6c4100fa7c5800fb744e00fa7c5800fb744e07fb6c4100fb744e02 +fb6c4100fb744e03f9dcd100ffffff07ecf3f500e8ecef00e0e4e700d9dcde00d2d4d601 +c4c5c500bbbcbd00c4c5c500b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400bbbcbd01 +c7634a00c9452200c74b2a00c9452200c74b2a00fb6c4100fb744e01fc733900fb744e00 +fb6c4100fb744e00fb6c4100fb744e00fc733900fb744e02fc733900fb744e00fc733901 +fb6c4100fb744e01fc733900f9e4e100e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500 +bbbcbd00b4b4b402b8938b00c9452205d94b2000fb6c4100fc733900fb744e01fc733900 +fb744e00fb6c4100fb744e0afac4ac00ffffff03f4f6f900ecf3f500e0e4e700d9dcde00 +d2d4d600cbcccd00c4c5c500b77c6a00c74b2a07d95d3b00fc733900fa7c5800fb744e00 +fa7c5800fb7c3800fa7c5800fb744e00fb7c3800fb744e00fa7c5800fb744e0cfc733900 +fb744e00fc733900fb744e00f9947500d7c4bd00c4c5c500b4b4b401a4a5a404b66c5900 +c9452209e5541f00fb744e00fb6c4101fb744e01fc733900fb744e00fc733900fb744e00 +fc733900fb744e00fb6c4100fc733900fb6c4104fc733900fb6c4100fb744e00f8836200 +bbbcbd00b4b4b400abacad00a4a5a4019c9e9c04ba5d4500c945220be5541f00fb6c4103 +fc733900fb6c4100fb744e00fb6c4100fb744e00fb6c4100fb744e02fb6c4100fb744e04 +fb6c4101f9e4e100ffffff11f4f6f900ea7c5e00e75c2a00d95d3b00e75c2a02d9542d00 +e9644000e75c2a00d95d3b01e75c2a02d95d3b00e9644001d95d3b00e75c2a00e9644000 +d95d3b00e9644000c74b2a00b9462700c9452200b9462702c9452200b9462700c74b2a00 +b9462703c86d5400f4f6f900ffffff0ff4f6f900e8ecef01e0e4e701d9dcde00d2d4d600 +d8b4ac00e9644000e75c2a00fb5c2e00e9644000fb5c2e00e9644002fb5c2e00e9644000 +f9653d00e9644001fb5c2e00e9644000fb5c2e00e9644000f9653d00e9644000fb5c2e00 +e9644000f9653d00e9644000e75c2a00c74b2a02c9452200b9462700c9452200c74b2a02 +c9452200e8b3a800ffffff04f4f6f900e8ecef00e8b3a800f9653d04fb6c4100f9653d01 +fb6c4100f9653d00fb6c4100f9653d00fb6c4100f9653d00fb6c4100f9653d00fb6c4100 +f9653d03d94b2000c9452200c74b2a00c9452200c74b2a02c9452200c86d5400ffffff13 +f4f6f900ecf3f500e8ecef00e0e4e700e6dcdc00d2d4d602d8cccb00d7c4bd00fb6c4100 +f9653d00fb6c4100f9653d00fb6c4109fb744e00fb6c4100fb744e00fb6c4101fb744e00 +f9653d00e9644000c74b2a01c9452200c74b2a01d77c6200ffffff09f4f6f900e8ecef01 +e6dcdc00d9dcde00d2d4d601cbcccd00d2d4d600cbcccd00d8cccb00d8b4ac00fb744e02 +fb6c4100fb744e00fb6c4101fb744e00fb6c4100fb744e01fb6c4100fb744e00fb6c4100 +fb744e12fa7c5800fb744e05fb6c4100c74b2a00c7634a00ffffff0df4f6f900ecf3f500 +e6dcdc00d9dcde00d2d4d600cbcccd04c4c5c500cbcccd00d7c4bd00f8836200fa7c5800 +fb744e00fa7c5800fb744e00fa7c5800fb744e00fa7c5800fb744e00fa7c580bfb744e01 +ffffff08f4f6f900e8ecef01d9dcde00d2d4d600d8cccb00cbcccd00c4c5c501c6bcba00 +c9593b00fb744e09fa7c5800fb744e00fa7c5800fb744e02fa7c5800fb744e00fa7c5800 +fb744e00fa7c5800fad4b000ffffff05ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00 +c4c5c502bbbcbd00c6bcba00b66c5900b7533a00c74b2a00fb744e00fa7c5801fb744e00 +fa7c5801fb744e00fa7c5800fb744e07fa7c5800fb744e02f8836200ffffff09ecf3f500 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd00c6bcba00b4b4b400 +bbbcbd00b4b4b400bbbcbd00b4b4b401b9857800b84c3000c74b2a01c9452200e9644000 +fb744e04fc733900fb744e00fb6c4100fb744e00fb6c4100fb744e00fb6c4100fb744e00 +fb6c4100fb744e03fb6c4100fb744e00fac4ac00e8ecef00e0e4e700d2d4d600cbcccd00 +c4c5c500bbbcbd00b4b4b402b7746200b9462700c9452200b9462700c9452202e75c2a00 +fb744e0bfb6c4100fb744e03fa7c5800ffffff03f4f6f900ecf3f500e0e4e701d9dcde00 +cbcccd00c8aca500ba654f00b7533a00b84c3000b7533a00b84c3000b7533a01c74b2a00 +b7533a00e9644000fa7c5809fb744e00fa7c5807fb744e00fa7c5800fb744e04f5886c00 +e8bcb000d9dcde00cbcccd00c4c5c500bbbcbd00abacad00a4a5a404b7746200b9462701 +c9452200b9462701c9452200b9462700c9452200b9462700c9452200d9542d00fb744e03 +fb6c4100fb744e01fb6c4100fb744e01fb6c4100fb744e01fb6c4100fb744e06e9947d00 +bbbcbd00b4b4b400abacad00a4a5a4019c9e9c01a89a95009c9e9c01a9746500b9462706 +c9452200b9462701c9452200b9462700d9542d00fb6c4103fb744e00fb6c4100fb744e00 +fb6c4100fb744e02fb6c4100fb744e03fb6c4100fb744e00fb6c4100fb744e01f9dcd100 +ffffff11f9e4e100d9654700d95d3b04e75c2a00d95d3b00d9542d00e75c2a00d95d3b00 +d9542d00d95d3b01e75c2a00d95d3b01e9644000d95d3b03b946270cd8b4ac00f4f6f900 +ffffff10f4f6f900ecf3f500e8ecef00e0e4e700d9dcde01d2d4d600e8866c00e9644003 +e75c2a00e9644002e75c2a00e964400cd9542d00c74b2a00b9462700c9452200b9462700 +c74b2a00b9462704d8b4ac00ffffff04f4f6f900e8ecef00e78b7100f9653d00e9644001 +e86c4c00e9644000e86c4c00e9644000e86c4c02e9644000e86c4c04e9644000fb6c4100 +e9644000fb6c4100e9644000b84c3000c9452200b84c3000b9462700c74b2a00b9462701 +c74b2a00d8ac9f00ffffff14f4f6f900ecf3f500e8ecef00d9dcde02d2d4d600cbcccd01 +e9947d00fb6c4100f9653d00fb6c4101f9653d00fb6c4100f9653d00fb6c4101e86c4c00 +fb6c4101e86c4c00fb6c4101e86c4c00fb6c4100fb744e00fb6c4100e86c4c00fb6c4100 +c74b2a00b84c3000c74b2a00b84c3001c9593b00ffffff0aecf3f500e8ecef01d9dcde01 +d2d4d601cbcccd03e8a58f00fb744e07fb6c4100fb744e07fa7c5800fb744e00fa7c5803 +fb744e00fa7c5800fb744e00fa7c5801fb744e00fa7c5802fb744e00fa7c5800fb744e00 +fa7c5800fb744e00fa7c5800fb744e00b7533a00c9593b00f9e4e100ffffff0df4f6f900 +ecf3f500e8ecef00d9dcde00d2d4d601cbcccd01c4c5c502cbcccd00c4c5c500e8a58f00 +fb744e00fa7c5802fb744e00fa7c5809f8836200fa7c5805f7b9a600ffffff07f4f6f900 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c502c88b7d00e75c2a00fb744e00 +fa7c5800fb744e00fa7c5800fb744e00fa7c5804fb744e00fa7c5800fb744e00fa7c5801 +fb7c3800fb744e00fa7c5801fb744e00f8836200ffffff05f4f6f900ecf3f500e0e4e700 +d9dcde00d2d4d600c4c5c501bbbcbd01c4c5c500bbbcbd00c75c4d00b7533a00c9593b00 +f8836200fa7c5806fb744e00fa7c5803fb744e00fa7c5800fb744e00fa7c5803fcb58e00 +ffffff0aecf3f500e0e4e700d9dcde00d2d4d601c4c5c501bbbcbd01b4b4b400bbbcbd00 +b4b4b400bbbcbd00b4b4b400c8a49d00b9462700c74b2a00b84c3000c74b2a01fb744e13 +f9ad9400e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd01b4b4b401abacad00ba5d4500 +c9452200b84c3000b9462700b84c3000b9462700b84c3000fb6c4100fb744e04fa7c5802 +fb744e01fa7c5800fb744e05f9ad9400ffffff02ecf3f501e0e4e701d2d4d600cbcccd00 +b78d8500b7533a00b84c3001c74b2a00b84c3001c74b2a00b84c3000c9593b00fb744e00 +fa7c5819f9ad9400e0e4e700e6dcdc00d9dcde00cbcccd00c4c5c500b4b4b400abacad00 +a4a5a404b7746200b9462709d9542d00fb744e0dfb6c4100fb744e00fb6c4100fb744e03 +d8ac9f00c4c5c500bbbcbd00b4b4b400abacad00a4a5a4009c9e9c04a7847c00b9462704 +c4363800b9462706fb6c4100fb744e02fb6c4100fb744e00fb6c4100fb744e0bfb6c4100 +fb744e00f8d4c900ffffff11e8b3a800d45e4400d95d3b00d45e4401d95d3b00e9644000 +cc545800d95d3b0dc74b2a00b9462704a6442b00b9462700a6442b00b9462700a6442b00 +b9462700a6442b00ba5d4500e8ecef00ffffff12f4f6f900f7ece700e0e4e701d9dcde00 +d2d4d600d8ac9f00e9644000d9654700e9644000d45e4400e9644003e86c4c00e964400c +d95d3b00b84c3000b9462700b84c3001b9462700b84c3000b9462700b84c3002d8ac9f00 +f4f6f900ffffff02f4f6f900ecf3f500e6dcdc00e8745600e86c4c00e9644000e86c4c00 +e9644000fb6c4100e9644000e86c4c01e9644000e86c4c04e9644000e86c4c03e9644000 +d95d3b00b84c3002b9462700b84c3002b7533a00f7ece700ffffff15f7ece700e8ecef01 +e6dcdc00d9dcde00d2d4d601d8cccb00d8b4ac00e86c4c00fb6c4102e86c4c00f9653d00 +fb744e00fb6c4100e86c4c00fb6c4100e86c4c00fb744e00fb6c4100e86c4c00fb744e00 +e86c4c00fb744e00fb6c4100e86c4c00fb744e01d45e4400b84c3001c9593b00b84c3001 +f8cbc000ffffff0aecf3f500e8ecef00e6dcdc00d9dcde01d2d4d601cbcccd00d2d4d600 +d8cccb00cbcccd00e9947d00fb744e0dfa7c5801fb744e00fa7c5800fb744e00fa7c5800 +fb744e00fa7c5801fb744e00fa7c5801fb744e00fa7c5801fb744e00fa7c5800fb744e00 +fa7c5803fb744e00c75c4d00b84c3000e8b3a800ffffff0ff4f6f900e8ecef00e6dcdc00 +d9dcde00d2d4d600d8cccb00c4c5c500cbcccd02c4c5c500cbcccd00d8bcb600fa7c5811 +f8836200fa7c5802ea7c5e00ffffff07ecf3f500e8ecef00d9dcde00d2d4d600cbcccd01 +c4c5c502c7634a00fb744e00fa7c5800fb744e00fa7c5803fb744e00fa7c580cf8cbc000 +ffffff05f4f6f900e8ecef00e0e4e700d2d4d601c4c5c501c6bcba00c4c5c500bbbcbd00 +c7b5b100b7533a01d45e4400f8836200fa7c5809fb744e00fa7c5804fb744e00fa7c5801 +f9e4e100ffffff0af4f6f900ecf3f500e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500 +bbbcbd02b4b4b400bbbcbd00b4b4b400bbbcbd01c75c4d00b84c3000c74b2a00b84c3000 +c74b2a00fb744e00fa7c5800fb744e00fa7c5801fb744e00fa7c5801fb744e00fa7c5806 +fb744e00fa7c5801fb744e00f9a58b00e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00 +b4b4b402b99a9400b84c3003b9462700b84c3000c74b2a00fb744e00fa7c5800fb744e00 +fa7c5802fb744e00fa7c5800fb744e00fa7c5801fb744e00fa7c5802fb744e00fa7c5800 +fb744e00f9dcd100ffffff00f4f6f900ecf3f500e0e4e701d9dcde00d2d4d600c7b5b100 +a8655400b84c3007da633600fa7c5805f8836200fa7c5800f8836200fa7c5800f8836200 +fa7c5800f8836200fa7c580cf9947500f9dcd100f4f6f900e8ecef00e0e4e700d2d4d600 +cbcccd00c4c5c500bbbcbd00abacad00a4a5a404a9746500b84c3003b9462700b84c3000 +b9462701b84c3000b9462700d45e4400fb744e14d7c4bd00c4c5c500bbbcbd00b4b4b400 +abacad00a4a5a4019c9e9c03a88c8600a6442b01c4363800a6442b00b9462700a6442b01 +c4363800a6442b00b9462700a6442b00b9462701e9644000e86c4c00fb6c4100e86c4c00 +fb744e00e86c4c00fb744e00e86c4c00fb744e00e86c4c00fb744e00e8745600e86c4c00 +fb744e00e8745600e86c4c01fb744e00e8745600e86c4c00fb744e00f9dcd100ffffff11 +d6938100d45e4406d95d3b00d45e4400d95d3b01d45e4400d95d3b00cc545800d95d3b00 +d45e4400cc545800d9542d00d45e4400cc545800d95d3b00b9462700a6442b04b9462700 +a6442b01b9462700a6442b02cc916400f4f6f900ffffff13ecf3f501e8ecef00d9dcde01 +d8cccb00d3725300d9654700e9644000d9654705da6d5000d9654700e86c4c00d9654700 +da6d5000e86c4c00d9654700e86c4c00d9654700e86c4c00d9654700e9644000d9654700 +d95d3b00b84c3009d8ac9f00ffffff00f4f6f903ecf3f500e5c4c200e86c4c03da6d5000 +e86c4c00da6d5000e86c4c00e9644000e86c4c08da6d5000e86c4c00da6d5000b84c3003 +a84d3500b84c3000b7533a00b84c3000c97c6700ffffff17ecf3f500e8ecef00d9dcde01 +d2d4d601cbcccd01ea7c5e00e86c4c06fb744e01e86c4c00fb744e00e8745600e86c4c00 +fb744e00e86c4c00fb744e00e8745600fb744e00e8745601d9654700b7533a01b84c3000 +b7533a01dba39300ffffff0af4f6f900ecf3f500e8ecef00e6dcdc00d9dcde00d2d4d602 +cbcccd02d8cccb00e78b7100fa7c5807fb744e00fa7c5800fb744e00fa7c5801fb744e00 +fa7c5811e8745600fa7c5800ea7c5e00d9654700b7533a00c88b7d00ffffff10f4f6f900 +ecf3f500e8ecef00d9dcde00d2d4d601cbcccd01c4c5c500d8cccb00c4c5c500cbcccd00 +c4c5c500e59c8700fa7c580af8836200fa7c5801f8836200fa7c5803f8836200fa7c5801 +f8cbc000ffffff05f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600d8cccb00c4c5c502 +c7998d00c75c4d00fa7c580af8836200fa7c5801f8836200fa7c5800f8836200fa7c5800 +f8836200fa7c5800f8836200ffffff06ecf3f500e8ecef00d9dcde01cbcccd00c4c5c501 +bbbcbd02b8adaa00b7533a01da633600f8836203fa7c580df8836200fa7c5800ffffff0c +ecf3f500e8ecef00e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd01b4b4b400bbbcbd00 +b4b4b400bbbcbd00b4b4b401b7746200b84c3002b7533a00e86c4c00fa7c5812f9947500 +d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd01b4b4b401a88c8600b84c3000a84d3500 +b84c3003c9593b00fa7c5809fb744e00fa7c5800fb744e00fa7c5800fb744e00fa7c5801 +f5886c00f4f6f901e8ecef00e0e4e701d2d4d600cbcccd00b78d8500a7543f00b84c3000 +a84d3500b84c3000a84d3500b84c3002b7533a00e8745600fa7c5805f8836200fa7c5800 +f8836201ea7c5e00f8836201fa7c5800f8836202fa7c5800f8836200fa7c5800f8836200 +fa7c5800f8836200fa7c5801f5886c00fac4ac00ffffff01f4f6f900e8ecef00e0e4e700 +d2d4d600cbcccd00c4c5c500b4b4b401a4a5a404a96d5f00a84d3500b84c3000a84d3500 +b9462700a84d3500b84c3001a84d3500b84c3001c9593b00fa7c5809fb744e00e8745600 +fa7c5800e8745600fa7c5800e8745604e8866c00d2d4d600cbcccd00c4c5c500b4b4b400 +abacad00a4a5a4009c9e9c0499939300a84d3500a6442b08b9462700a6442b01d95d3b00 +fb744e00e86c4c02fb744e00e86c4c02e8745600e86c4c00e8745609f9dcd100ffffff10 +f4f6f900d3725300c75c4d02d45e4400c75c4d00c9593b01d45e4400c9593b00c75c4d00 +c9593b00cc545800d45e4400c9593b00d45e4400c9593b00d95d3b00c9593b00d95d3b00 +c75c4d00c74b2a00a6442b0cd2d4d600ffffff14f4f6f901e8ecef00e0e4e700d9dcde00 +d2d4d600d6938100d9654704da6d5005e86c4c00d9654700da6d5003e86c4c00da6d5001 +e86c4c00c7634a00b84c3001a84d3500b7533a00a84d3500b7533a01a84d3500b7533a00 +a7543f00d8ac9f00ecf3f500f4f6f902ecf3f500e8ecef00e8a58f00da6d500bd9654700 +da6d5004e86c4c00da6d5000d9654700b84c3000a7543f00a84d3501b7533a00a84d3502 +d8bcb600ffffff17f4f6f900e8ecef01d9dcde01d2d4d601cbcccd00dba39300e8745606 +e86c4c00e8745601e86c4c00e8745608e86c4c00a7543f00b7533a01a7543f00b7533a00 +b66c5900ffffff0bf4f6f900ecf3f500e8ecef00d9dcde00e6dcdc00d2d4d602cbcccd02 +d8bcb600ea7c5e00fa7c5800e8745600fa7c5800e8745600fa7c5800e8745600fb744e00 +fa7c5809ea7c5e00fa7c5801ea7c5e00fa7c5801ea7c5e00fa7c5800ea7c5e01fa7c5800 +ea7c5e01fa7c5800eb826400f8836200dc725400b7533a00b7746200ffffff12f4f6f900 +e8ecef00e0e4e700d9dcde00cbcccd00d8cccb00cbcccd01c4c5c500cbcccd00c4c5c500 +cbcccd00c6bcba00f8836201fa7c5800f8836202fa7c5800f8836206fa7c5800f8836205 +fa7c5800e8866c00ffffff05ecf3f500e8ecef00d9dcde00d2d4d601c4c5c503b7746200 +e8745600f8836213fac4ac00ffffff06e8ecef01d9dcde00d2d4d600cbcccd00c6bcba00 +c4c5c500bbbcbd00c4c5c500bbbcbd00c7b5b100b7533a01da6d5000f8836202fa7c5800 +f8836204fa7c5800f8836201fa7c5800f8836205f5886c00ffffff0cf4f6f900ecf3f500 +e0e4e700d9dcde00d2d4d600c4c5c501c6bcba00bbbcbd00b4b4b400bbbcbd00b4b4b400 +bbbcbd00b4b4b400b77c6a00b84c3000b7533a01b84c3000d9654700fa7c5807f8836200 +fa7c5800f8836207fa7c5800f5886c00d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b403 +b7746200a84d3500b84c3000a84d3500b84c3000a84d3501d9654700f8836200fa7c5803 +ea7c5e00fa7c5802f8836200fa7c5806f9a58b00ecf3f500e8ecef00e0e4e700d9dcde00 +d2d4d600c7b5b100b66c5900a84d3501b84c3000a6442b00a84d3500b84c3000a84d3500 +b84c3000c7634a00fa7c5800ea7c5e00fa7c5800ea7c5e01fa7c5800ea7c5e05fa7c5800 +eb826400ea7c5e00eb826400ea7c5e00f8836200ea7c5e01f8836200ea7c5e00f8836200 +eb826401f8836200f9a58b00f4f6f900ffffff02f4f6f900e8ecef00e0e4e700d9dcde00 +d2d4d600bbbcbd01abacad00a4a5a404a9746500b84c3000a84d3502b84c3000a84d3501 +b84c3000a84d3501c75c4d00e8745601ea7c5e00e8745601fa7c5800e8745603ea7c5e00 +fa7c5800e8745600ea7c5e01e8745600ea7c5e00e8745600ea7c5e00e8745600d69a9000 +d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a4019c9e9c00a89a95009c9e9c02 +a84d3500a6442b0bc75c4d00e86c4c01e8745600e86c4c01e8745600e86c4c00e8745600 +e86c4c00e8745600e86c4c00e8745600e86c4c00e8745604e86c4c00e8745600f9dcd100 +ffffff10e9d5d700c9593b03c75c4d00c9593b00c75c4d01c9593b00c75c4d00c9593b00 +c75c4d00c9593b05c75c4d00c9593b01b84c3000a6442b0bba654f00f4f6f900ffffff15 +f4f6f900ecf3f500e8ecef00e6dcdc00d9dcde00d8bcb600d9654700da6d500ad3725300 +da6d5003d3725300da6d5001d3725300c86d5400b7533a00a7543f00b7533a00a7543f00 +b7533a00a7543f01b7533a00a7543f00b7533a00d8b4ac00ecf3f500f4f6f900ecf3f502 +e8ecef00d98c7800da6d5009dc725400da6d5008ba5d4500a84d3501b84c3000a84d3504 +f9e4e100ffffff17f4f6f901e8ecef00e6dcdc00d9dcde00d2d4d601cbcccd00d8bcb600 +dc725400d8755c00e8745600d8755c00e8745601d8755c00e8745600dc725400e8745609 +d77c6200e8745600b7533a00a7543f01b7533a00a7543f01ffffff0cf4f6f900e8ecef01 +d9dcde01d2d4d602d8cccb00cbcccd01d8ac9f00eb826400ea7c5e00fa7c5800ea7c5e00 +fa7c5800ea7c5e10eb826402f8836200ea7c5e00eb826400f8836200eb826401ea7c5e00 +e8745600ba5d4501f9e4e100ffffff12f4f6f900ecf3f500e0e4e700d9dcde01cbcccd02 +c4c5c500cbcccd00c4c5c500cbcccd00c4c5c500e59c8700f8836200e8866c00f8836201 +eb826400f5886c00eb826400f8836200eb826400f8836208fa7c5800eb826400f8836200 +ea7c5e00f8cbc000ffffff03f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01 +c4c5c501c8a49d00c7634a00f8836201f5886c00f8836201f5886c00f8836202f5886c00 +f8836209f5886c00ffffff06f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600c4c5c500 +bbbcbd01c4c5c500bbbcbd00c4c5c500b8adaa00b7533a01c86d5400fa7c5800f8836203 +fa7c5800f8836201fa7c5800f8836209f5886c00ffffff0decf3f500e8ecef00d9dcde00 +d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400 +bbbcbd00a77c7000a84d3500a7543f00a84d3500b7533a00c7634a00f8836208eb826400 +f5886c00f8836200eb826400f8836200eb826400f8836200eb826400f8836200eb826401 +d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b402abacad00a8655400a84d3504b84c3000 +e8745600ea7c5e01f8836200ea7c5e01f8836200ea7c5e00eb826400fa7c5800ea7c5e00 +fa7c5806e8bcb000e0e4e701d9dcde00d2d4d600b8938b00a7543f00a84d3506b7533a00 +da6d5000fa7c5800ea7c5e00fa7c5800ea7c5e01f8836200ea7c5e00eb826400ea7c5e00 +f8836200eb826406ea7c5e00eb826406f5886c00f8d4c900ffffff04ecf3f500e8ecef00 +e0e4e700d2d4d600cbcccd00c4c5c500b4b4b401a4a5a404a9746500a84d3508b84c3000 +c9593b00ea7c5e00f8836200ea7c5e04fa7c5800ea7c5e00e8745602ea7c5e00e8745602 +ea7c5e00e8745602e8a58f00d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad00 +a4a5a4009c9e9c04a65b4500a6442b0bb84c3000e86c4c00da6d5000e86c4c00e8745600 +da6d5000e86c4c00e8745600e86c4c00dc725400e8745600dc725400e8745600dc725402 +da6d5000dc725401da6d5000e8745600e9d5d700ffffff10d8bcb600ba5d4500c75c4d00 +c9593b00ba5d4500c9593b00c7634a00ba5d4500c9593b01c7634a00c9593b02c75c4d00 +c9593b00c75c4d00c9593b00c75c4d00c9593b01ba5d4500a6442b0cc8938400f4f6f900 +ffffff16f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600c97c6700d9654700d3725300 +c7634a00da6d5000c86d5400da6d5000c86d5400da6d5000c86d5400d3725300c86d5400 +da6d5000d3725300da6d5000d3725300da6d5000d3725300dc725400d8755c00dc725400 +c86d5400a7543f00a65b4500b7533a00a7543f01a65b4500b7533a00a7543f00a65b4501 +c8aca500ecf3f502f4f6f900e8ecef00e0e4e700d8755c00dc725400d3725300dc725400 +d3725300dc725401d3725300dc725400d3725301d8755c00d3725300d8755c02da6d5000 +d8755c00dc725400d3725300dc725400ba5d4500a84d3500a7543f01a84d3501a7543f00 +a84d3500b66c5900ffffff19f4f6f900e8ecef01e6dcdc00d2d4d601d8cccb00cbcccd00 +d8846e00d8755c00d77c6200d8755c03e8745600d8755c01e8745600d8755c00e8745600 +d8755c00e8745600d8755c00ea7c5e00d8755c00d77c6200ea7c5e00d77c6200ba5d4500 +a7543f04f9e4e100ffffff0cf4f6f900e8ecef00e0e4e700e6dcdc00d9dcde00d2d4d600 +cbcccd00d2d4d600cbcccd02e59c8700ea7c5e06fa7c5800ea7c5e02fa7c5800ea7c5e04 +f8836200eb826400f8836200eb826402ea7c5e00eb826406c7634a00a65b4500e8bcb000 +ffffff14f4f6f900e8ecef00e6dcdc00d9dcde00d2d4d600cbcccd02c4c5c500cbcccd00 +c4c5c500cbcccd00d8b4ac00e8866c00f8836200e8866c03f5886c00e8866c03eb82640a +d98c7800ffffff03f4f6f900e8ecef00e6dcdc00d2d4d600d8cccb00cbcccd00c4c5c502 +b77c6a00d8755c00eb826400f5886c01f8836200e8866c00f8836200f5886c00f8836200 +f5886c00f8836200f5886c01f8836200f5886c06f7b9a600ffffff06f4f6f900e8ecef00 +e0e4e700d9dcde00cbcccd00c4c5c502bbbcbd00c4c5c500bbbcbd00c6bcba00a8655400 +b7533a00c86d5400f5886c00f8836200f5886c00f8836201f5886c00f8836202f5886c00 +f8836200f5886c00f8836200f5886c00f8836200f5886c03f9947500ffffff0df4f6f900 +e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd01b4b4b400bbbcbd00b4b4b400 +bbbcbd00b4b4b400b7746200a7543f03c7634a00eb826408f8836200eb826407ea7c5e00 +f5886c00d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b402b8adaa00a7543f00a84d3501 +a7543f00a84d3501a7543f00ea7c5e00eb826406f8836200eb826400f8836200eb826403 +ea7c5e01eb826400e6ccc900d9dcde00d2d4d600c7b5b100a96d5f00a84d3507c7634a00 +ea7c5e04eb826401ea7c5e00eb826403ea7c5e00eb826402e8866c00eb826400e8866c00 +eb826406f9a58b00ffffff06f4f6f900e8ecef00e0e4e700d2d4d600cbcccd00c4c5c500 +bbbcbd00abacad00a4a5a404a9746500a84d3509c7634a00ea7c5e05e8745602ea7c5e00 +e8745603d8755c00e8745600d8755c03d8b4ac00d9dcde00d2d4d600cbcccd00c4c5c500 +b4b4b400abacad00a4a5a4009c9e9c0498594900a6442b0bb7533a00da6d5000e8745600 +dc725400da6d5000e86c4c00dc725400da6d5000dc725403da6d5000dc725406da6d5000 +f9dcd100ffffff0ff4f6f900d69a9000c7634a00ba5d4501c9593b00ba5d4501c9593b00 +ba5d4501c9593b00ba5d4500c7634a00c9593b00ba654f00c7634a00c9593b00c7634a03 +b7533a00a6442b05994f3c00a6442b02994f3c00a6442b00994f3c00d8bcb600ffffff17 +f4f6f900ecf3f500e8ecef00d9dcde01d6938100c86d5401d3725300c86d5400da6d5000 +c86d5401d3725300da6d5000c56e5e00d3725303d8755c01c8745e00d8755c02c56e5e00 +a7543f00a65b4500a7543f00a65b4501a7543f00a65b4501a7543f01c8aca500f7ece700 +ecf3f500e8ecef02e9d5d700d8755c13d3725300a7543f07c8938400ffffff19f4f6f900 +ecf3f500e8ecef00d9dcde01d2d4d600cbcccd01d69a9000d8755c02ea7c5e00d8755c03 +e8745600d8755c01e8745600d8755c01ea7c5e00d8755c00d77c6200e8745600d77c6200 +d8755c00c7634a00a7543f04e8bcb000ffffff0cf4f6f900ecf3f500e8ecef00e6dcdc00 +d9dcde01d2d4d601cbcccd00d8cccb00cbcccd01e9947d00ea7c5e00eb826400ea7c5e00 +eb826404ea7c5e00eb826406e8866c00ea7c5e00e8866c06eb826403cc626500a65b4500 +c8938400ffffff15f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600d8cccb00cbcccd00 +c4c5c500cbcccd00c4c5c501cbcccd00c4c5c500e59c8700e8866c02e78b7100e8866c00 +e78b7102e8866c01e78b7100e8866c00f5886c00e8866c00eb826400e8866c00eb826400 +e8866c00eb826401f5886c00ea7c5e00e9d5d700ffffff01f4f6f900ecf3f500e0e4e700 +d9dcde00d2d4d600cbcccd01c4c5c501c7b5b100ba654f00e8866c00f5886c00eb826400 +e8866c01e78b7100e8866c00e78b7100e8866c00e78b7100e8866c01e78b7100e8866c00 +e78b7100e8866c03e78b7101ffffff07f4f6f900e8ecef00e0e4e700d9dcde00d8cccb00 +c4c5c500bbbcbd00c6bcba00bbbcbd01c4c5c500bbbcbd00b66c5900a65b4500c7634a00 +f5886c03e8866c00f5886c05e8866c00f5886c00e8866c00f5886c00e78b7100f5886c01 +e78b7100f5886c00ffffff0ee8ecef00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd01 +b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400a65b4500a7543f03d3725300e8866c00 +eb826400e8866c00f5886c00eb826401e8866c00eb826400e8866c01eb826401e8866c00 +eb826400e8866c00eb826403e8866c00cbcccd00c4c5c500bbbcbd00b4b4b402abacad00 +a89a9500a7543f05ba5d4500eb826400ea7c5e00eb826400e8866c00eb826401e8866c00 +eb826400e8866c00eb826408d8cccb00d2d4d600b99a9400a65b4500a84d3500994f3c00 +a84d3500a7543f00a84d3502b7533a00d3725300ea7c5e00eb826401f8836200eb826405 +e8866c00eb826400e8866c08eb826400e8866c00eb826400e8866c00e78b7100f9dcd100 +ffffff07f4f6f900e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500b4b4b400abacad00 +a4a5a404a9746500994f3c00a84d3500994f3c00a84d3506ba654f00ea7c5e01e8745601 +ea7c5e00e8745600d77c6200ea7c5e00d77c6200e8745600d77c6200e8745600d8755c01 +e8745600d8755c04e5c4c200e0e4e700d2d4d600cbcccd00c4c5c500b4b4b401a4a5a400 +9c9e9c01a89a95009c9e9c0198594900994f3c00a6442b01994f3c00a6442b017c3a3c00 +a6442b04ba5d4500dc725400d8755c00e8745600dc725400d8755c00dc725404d8755c00 +dc725400d8755c00d3725300dc725402d8755c00dc725400d8755c00e9d5d700ffffff10 +c8847200ba5d4503ba654f00c9593b00ba5d4500ba654f00c9593b00ba654f00c7634a00 +ba654f00ba5d4500c7634a00ba654f00c7634a00ba654f00c7634a00ba654f00c7634a00 +a7543f00a84d3500994f3c04a6442b00994f3c02a6442b00994f3c00a7543f00e0e4e700 +ffffff17f4f6f901e8ecef00e0e4e700d9dcde00c8aca500c56e5e00c86d5400c56e5e01 +c8745e00c56e5e00c8745e00c56e5e00c8745e03c56e5e00c8745e00c56e5e00c8745e04 +c86d5400a7543f00a65b4500a7543f00a65b4500a7543f00a65b4500a7543f0098594900 +a7543f00a65b4500c8aca500e8ecef01ecf3f500e8ecef01d8bcb600c8745e02d8755c00 +c8745e00d77c6200c97c6700d8755c00d77c6200c8745e00d77c6200d8755c00d77c6200 +c97c6701d77c6200c97c6700d77c6200c8745e00d77c6200c56e5e00a7543f04a65b4500 +a7543f00a65b4500d8ac9f00ffffff1af4f6f900e8ecef01d9dcde00d2d4d601cbcccd00 +d8ac9f00d8755c00d77c6200d8755c00d77c6200d8755c00d77c6200d8755c02d77c6200 +d8755c00d77c6201d8755c00d77c6201d8755c00d77c6202c56e5e00a7543f03994f3c00 +d8ac9f00ffffff0df4f6f900ecf3f500e8ecef00e6dcdc00d9dcde00d2d4d603cbcccd01 +c6bcba00e78b7100d8846e00e8866c00eb826400d8846e00ea7c5e00d8846e00eb826400 +e8866c00d77c6200e8866c00d77c6200eb826400d8846e00ea7c5e00e8866c00d77c6200 +e8866c00d8846e00eb826400d8846e00e8866c00d8846e00e8866c01d8846e00e8866c01 +c8745e00a65b4500b77c6a00ffffff17ecf3f500e8ecef00e6dcdc00d2d4d601cbcccd03 +c4c5c500cbcccd00c4c5c500c7b5b100e78b7100e8866c00e78b7101e8866c00e78b7101 +e8866c00e78b7101e8866c00e78b7100e8866c06eb826400e8866c01d69a9000ffffff01 +f4f6f900e8ecef00e0e4e700d2d4d601cbcccd00c4c5c502a7847c00d3725300e8866c01 +e78b7102e8866c00e78b7100e8866c00e78b710bf9ad9400ffffff07f4f6f900e8ecef00 +e0e4e700d2d4d601c4c5c500bbbcbd00c4c5c500bbbcbd00c4c5c500bbbcbd00c4c5c500 +a77c7000a7543f00ba5d4500e78b7100e8866c01e78b7100f5886c00e78b7102e8866c00 +e78b7100e8866c00e78b7102f5886c00e8866c00e78b7102f5886c00f4f6f900ffffff0c +f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600c4c5c500c6bcba00bbbcbd01b4b4b400 +bbbcbd00b4b4b400b99a9400a65b4500994f3c00a65b4500a7543f01d77c6200e8866c12 +e9947d00d2d4d600cbcccd00bbbcbd00b4b4b403a894900098594900a7543f0098594900 +a7543f02ba654f00e8866c0ad77c6200e8866c04e78b7100c6bcba00a96d5f00a7543f00 +994f3c00a7543f02994f3c00a7543f01ba654f00ea7c5e00e8866c00eb826400e8866c00 +eb826400e8866c00eb826400f5886c00e8866c11f7b9a600ffffff09ecf3f500e8ecef00 +e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b400a4a5a404a77c7000994f3c00 +a84d3500994f3c00a84d3500994f3c01a84d3500994f3c02ba5d4500d77c6201eb826400 +d77c6201d8755c00ea7c5e00d8755c0cd7c4bd00d9dcde01cbcccd00c4c5c500b4b4b401 +a4a5a4009c9e9c0498594900a6442b008a514200a6442b008a514200a6442b00994f3c00 +a6442b00994f3c00a6442b007c3a3c00994f3c01ba5d4500d8755c00e8745600d8755c0c +c56e5e00d8755c01c8745e00d8755c00f9dcd100ffffff0fecf3f500b77c6a00ba5d4504 +ba654f01c7634a00ba654f02c7634a00ba654f00c86d5400ba654f02c7634a00ba654f01 +a7543f00994f3c01a6442b00994f3c0898594900f4f6f900ffffff18f4f6f900e8ecef01 +e6dcdc00d7c4bd00c56e5e00c8745e0bc97c6700c8745e02c97c6700c8745e00c97c6700 +b66c590098594902994f3c0098594901994f3c0098594902c8aca500e8ecef04d8b4ac00 +c8745e01d8755c00c97c6700c8745e00d77c6200c8745e00d77c6200c97c6700d77c6200 +c97c6701d77c6200c8745e00d77c6200c97c6700d77c6200c97c6700d77c6200c97c6700 +b66c5900a7543f00a65b4502a7543f00a65b4501a7543f00d7c4bd00ffffff1af4f6f900 +ecf3f500e0e4e700e6dcdc00d2d4d601cbcccd00d8b4ac00d77c6202d8755c00d77c6200 +d8755c00d77c6202d8755c00d77c6203d8755c00d77c6204c8745e00994f3c00a7543f00 +98594900a7543f0098594900c7998d00ffffff0ef4f6f900ecf3f500e8ecef00d9dcde01 +d2d4d601cbcccd01d8cccb00cbcccd00d8b4ac00d8846e00e8866c00d8846e00e8866c00 +d8846e00e8866c00d8846e01eb826400d8846e02ea7c5e00d8846e02d77c6200e8866c00 +d77c6200d8846e01e8866c00d77c6200d8846e00e8866c00d8846e00d77c6200a65b4500 +a8655400f7ece700ffffff17f4f6f900ecf3f500e0e4e700d9dcde00d2d4d601c4c5c502 +cbcccd00c4c5c502e9947d00d98c7800d8846e00e78b7100d98c7800e78b7104d98c7800 +e78b7100d98c7800e8866c00d98c7800e8866c06d77c6200e9d5d700ecf3f500e8ecef00 +e0e4e700d9dcde00d2d4d600cbcccd01c4c5c501c6bcba00ba654f00da846200e8866c03 +e78b7105e9947d00e78b7104e9947d01e78b7100e9947d00ffffff08f4f6f900e8ecef00 +e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00c4c5c500bbbcbd00c4c5c500bbbcbd01 +b78d850098594900a65b4500e8866c00e78b7101e8866c00e78b7100e8866c01e78b7100 +e8866c00e78b7100e8866c02e78b7106f8cbc000ffffff0decf3f500e8ecef00d9dcde00 +d2d4d600c4c5c500bbbcbd01b4b4b400bbbcbd00b4b4b400bbbcbd00a7847c0098594900 +a65b450098594900a7543f00a65b4500d98c7800e78b7100e8866c00d8846e00e8866c00 +d8846e00e8866c00d8846e00e8866c00d8846e01e78b7100d8846e00e78b7100d8846e00 +e78b7100d8846e00e8866c00d8846e00e8866c00d69a9000cbcccd00c4c5c500bbbcbd00 +b4b4b403a88c8600a7543f0098594900a7543f0098594901a7543f00b66c5900e78b7100 +d98c7800e8866c00e78b7100d98c7800e8866c00d8846e00e8866c00d8846e01e8866c00 +d8846e00e8866c00d8846e03d77c6200a8655400994f3c01a7543f00994f3c02a7543f01 +c8745e00e8866c0ae78b7109d8846e00e78b7100d8846e01e9947d00f9e4e100f4f6f900 +ffffff09ecf3f500e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500b4b4b400abacad00 +a4a5a40497746b00994f3c07a7543f00994f3c00ba654f00ea7c5e00d8846e00d77c6201 +ea7c5e00d77c6200d8755c00d77c6200ea7c5e00d77c6200d8755c00d77c6200ea7c5e00 +d77c6200d8755c00d77c6200ea7c5e00d8755c00d77c6200d8755c00e5c4c200e0e4e700 +d9dcde00cbcccd00c4c5c500bbbcbd00abacad019c9e9c0496635500994f3c00a6442b00 +8a514200a6442b008a514200a6442b00994f3c02a6442b01994f3c00b7533a00d77c6202 +ea7c5e00d77c6203d8755c00d77c6200d8755c00c97c6700d8755c01c8745e00d8755c01 +c8745e00d8755c00c8745e00e9d5d700ffffff0ef4f6f901b66c5900ba654f0ab66c5900 +ba654f05b66c5900ba654f00994f3c0ca77c7000f4f6f900ffffff18f4f6f900ecf3f500 +e0e4e701d2d4d600c8745e00b7746200b66c5900b7746207c47b7d00b7746200c8745e00 +b7746200c47b7d00c8745e00b77c6a00c8745e00b77c6a00b66c590098594909c8a49d00 +e8ecef03e0e4e700d8ac9f00c8745e00c97c6700c8745e00c97c6701c8745e00c97c6701 +c8745e00c97c6700d8755c00c97c6704c8745e00c97c6700c8745e00d77c6200ba654f00 +98594900a7543f0098594900a7543f0098594903e6ccc900ffffff1bf7ece700e8ecef00 +d9dcde01d2d4d600d8cccb00c4c5c500d77c6201c97c6700d77c620bc97c6700d8755c00 +c97c6700d77c6200c97c6700c8745e00a65b450098594900a7543f0098594901c8938400 +ffffff0ff7ece700e8ecef00e0e4e700e6dcdc00d9dcde00d2d4d600d8cccb00d2d4d600 +cbcccd02d8ac9f00d8846e06d77c6200d8846e00d77c6200d8846e02d77c6200d8846e05 +d98c7800d8846e03a8655400a65b4500d7c4bd00ffffff18f4f6f900ecf3f500e8ecef00 +d9dcde00d2d4d601cbcccd00d8cccb00c4c5c500cbcccd00c4c5c500cbcccd00c4c5c500 +d8b4ac00d8846e00d98c7801d8846e00d98c7801d8846e00d98c7800d8846e00d98c7800 +d8846e00d98c7800d8846e00e78b7100d8846e00d98c7800d8846e00d98c7800d8846e02 +e8866c00c7998d00e8ecef01e0e4e700d9dcde00d2d4d600cbcccd00c4c5c502b8938b00 +b66c5900e8866c00e78b7100d98c7800e78b7100d98c7800e78b7100d8846e00d98c7800 +e78b7100d98c7808d8846e00d98c7800e8a58f00ffffff08f4f6f900e8ecef00e0e4e700 +d2d4d601c4c5c500bbbcbd00c4c5c500bbbcbd00c6bcba00bbbcbd00c4c5c500b7a4a000 +98594900a65b4500c97c6700e8866c00d98c7800e78b7100d98c7800e78b7100d98c7800 +e8866c00d98c7800d8846e00d98c7800e78b7100d8846e00d98c7800e8866c00d98c7800 +e78b7100e8866c00e78b7101e59c8700ffffff0cf4f6f900ecf3f500e0e4e700d9dcde00 +d2d4d600cbcccd00bbbcbd02b4b4b400bbbcbd00b4b4b400a8655400a65b450098594900 +a65b450098594900b7746200d98c7800e78b7100d98c7801e8866c00d98c7800e78b7100 +d8846e00d98c7800e8866c00d98c7800e78b7100d8846e00d98c7800e78b7100d98c7800 +e78b7100d98c7802d8b4ac00cbcccd00c4c5c500b4b4b404a88c860098594902a7543f00 +98594901c8745e00e78b7100d98c7802d8846e00d98c7802d8846e00d98c7800d8846e04 +e8866c00d8846e0198594900994f3c0098594900994f3c0098594900a7543f0098594900 +ba654f00d8846e00da846200e78b7100d8846e00e78b7100d8846e00e8866c00e78b7100 +d8846e00e8866c00d98c7800e78b7100d98c7800e78b7101d98c7800e78b7100d98c7800 +e78b7100d98c7800e78b7100d98c7802e8866c00d98c7800f7b9a600ffffff0cecf3f500 +e8ecef00e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b400a4a5a40497746b00 +994f3c0098594900994f3c07ba654f00d8846e03d77c6200d8846e00d77c6203eb826400 +d77c6203d8846e00d77c6203d8cccb00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00 +b4b4b400a4a5a4019c9e9c02a89a950098594900994f3c008a514200a6442b008a514200 +a6442b00994f3c008a514200a6442b00994f3c03ba5d4500d8755c00d77c6200d8755c00 +d77c6205d8846e00d77c6200d8755c00c97c6700d77c6200d8755c00c97c6700d8755c00 +c97c6700d77c6200c8745e00f9dcd100ffffff0ef4f6f900e8ecef00ba654f07b66c5900 +ba654f00b66c5900ba654f00b66c5908994f3c028a514200994f3c028a51420098594900 +8a514200985949008a51420098594900a77c7000ffffff1aecf3f500e8ecef00e0e4e700 +d9dcde00b77c6a00b7746201c8745e00b7746202c8745e00b7746203c97c6700b7746200 +b77c6a00b7746200b77c6a00b7746200b77c6a00c8745e00a96d5f0098594900994f3c00 +985949028a514200985949008a514202b8adaa00e8ecef01e0e4e700e8ecef00e0e4e700 +dba39300b77c6a00c8745e00c97c6703c47b7d00c97c6702c47b7d00c97c6703d77c6200 +c97c6703a8655400a7543f0098594903a7543f0098594901e6ccc900ffffff1becf3f500 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500d77c6202c97c6700d77c6200 +c97c6700d77c6201d8846e00d77c6200d8846e00d77c6200c47b7d00d8846e00c47b7d00 +d8846e01c47b7d00d8846e01c97c670098594902a65b450098594900b8938b00ffffff10 +ecf3f500e8ecef00e0e4e700d9dcde01d2d4d601cbcccd03d69a9000d8846e05c47b7d00 +d8846e01c8847200d8846e00c47b7d00d8846e02c8847200d8846e01d98c7800d8846e00 +d98c7802b66c59009859490096635500f4f6f900ffffff19f4f6f900e8ecef00e0e4e700 +d9dcde00d2d4d600d8cccb00cbcccd01c4c5c501cbcccd00c4c5c501d6938100d98c7803 +d8846e00d98c7802d8846e00d98c7800d8846e00d98c7800d8846e00d98c7801e8866c00 +d98c7801e8866c00d98c7800d8846e00c97c6700d2d4d600e0e4e700d9dcde00d2d4d600 +d8cccb00c4c5c500cbcccd00c4c5c500c6bcba00a96d5f00d8846e00d98c7800e78b7100 +d98c7800e78b7100d98c7800e9947d00d98c7803d8846e00e78b7100d98c7807f7ece700 +ffffff08f4f6f900e8ecef00e0e4e700d9dcde00cbcccd00c4c5c501bbbcbd00c4c5c500 +bbbcbd01c4c5c500b4b4b400a65b450098594900b7746200d98c7800e78b7100d98c7801 +d8846e00d98c7800d8846e00d98c7801d8846e00d98c7803d8846e00d98c7802e78b7101 +ffffff0decf3f500e8ecef00d9dcde00d2d4d600c4c5c500bbbcbd01b4b4b400bbbcbd00 +b4b4b400a894900098594902a65b450098594900d8846e00d98c7800e78b7100d98c7800 +e78b7100d98c7801e78b7100d98c7804e78b7100d98c7802e78b7100d98c7800e78b7100 +d98c7800d8bcb600c4c5c500bbbcbd01b4b4b402abacad00a88c860098594905b7746200 +d98c7801d8846e00d98c7801d8846e01d98c7800d8846e00d98c7801d8846e00d98c7801 +d8846e0398594903994f3c0098594900c8745e00d98c7800d8846e00d98c7800d8846e00 +e78b7100d98c7801e78b7100d8846e00d98c7800e78b7100d8846e00d98c7800e78b7100 +d98c7808d8846e00d98c7800e59c8700f9e4e100ffffff0df4f6f900e8ecef00e0e4e700 +d9dcde00cbcccd00c4c5c500bbbcbd00abacad00a4a5a404987c75008a514200994f3c00 +8a514200994f3c0098594900994f3c04a8655400d77c6201d8846e00d77c6200d8846e00 +d77c6201d8846e00d77c6202d8846e03d77c6200d8846e00c47b7d00d8846e00d77c6200 +d8cccb00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c04 +96635500994f3c028a514200994f3c028a514200994f3c018a514200994f3c00a65b4500 +d77c6202d8846e00d8755c00c47b7d00d77c6200c97c6700d77c6200c97c6701d8846e00 +c47b7d00d77c6200c97c6700d77c6200c47b7d00d77c6200c97c6701e6dcdc00ffffff0f +e0e4e700a8655400ba654f00a8655400ba654f00a8655400b66c590aba654f00b7746200 +b66c5902985949008a514200994f3c00985949008a514200985949008a51420098594900 +994f3c008a51420098594900994f3c01a7847c00f4f6f900ffffff18f4f6f901e8ecef00 +e0e4e700d9dcde00b9857800b66c5900b7746200b66c5900b7746208b77c6a00b7746202 +b77c6a00b7746200b77c6a00a96d5f008a514200985949008a514202885a4e008a514200 +885a4e0098594900885a4e00c8a49d00e0e4e700e8ecef00e6dcdc00e8ecef00e0e4e700 +c8a49d00c97c6700c8745e00c97c6700b77c6a00c97c6700b77c6a00c97c6702c8847200 +c97c6700c8847200d77c6200c8847201c47b7d00c97c6700c47b7d00c97c6701a8655400 +98594901a65b450098594904d7c4bd00ffffff1bf4f6f900e8ecef00e0e4e700d9dcde00 +d2d4d600cbcccd00d7c4bd00c97c6701d77c6200c47b7d00d77c6200c47b7d00d77c6200 +c47b7d00c97c6701c47b7d00d77c6200c8847200d8846e01c97c6700d8846e00c8847200 +d77c6200c884720198594900a65b4500985949009663550098594900c7998d00ffffff10 +f4f6f900e8ecef01d9dcde01d2d4d601cbcccd00d8cccb00cbcccd00d2d4d600c6bcba00 +c8847200d8846e00c8847201c47b7d00c8847200d8846e00c8847200d8846e00c47b7d00 +d8846e00c8847200d8846e00c8847201d8846e00c8847200d98c7800c8847200d98c7800 +c88b7d00d8846e00c47b7d00a86554009663550098594900b9857800ffffff19f4f6f900 +ecf3f500e8ecef00e6dcdc00d2d4d600cbcccd02c4c5c500d8cccb00c4c5c501cbcccd00 +c8aca500d98c7802c88b7d00d98c7800c88b7d00d98c7800c88b7d00d98c7800c88b7d00 +d98c780bc8a49d00e6dcdc00d9dcde00d2d4d600cbcccd00c4c5c502b99a9400b66c5900 +d98c7800e78b7100d98c7801e78b7100d98c7803d8846e00d98c7804d8846e00d98c7803 +e8a58f00ffffff09f4f6f900e8ecef00e0e4e700d2d4d601c4c5c500bbbcbd00c4c5c500 +bbbcbd00c4c5c500bbbcbd00c6bcba00bbbcbd00a77c700098594900b66c5900d98c7809 +d8846e00d98c7800d8846e00d98c7803d8846e00d6938100d98c7800e8b3a800ffffff0b +f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600c4c5c501bbbcbd00b4b4b400bbbcbd00 +b4b4b400a9746500985949009663550098594901a8655400d98c7800d6938100d98c7801 +d6938100d98c7803e78b7100d98c7800e78b7100d98c7802e78b7100d98c7804cbcccd01 +bbbcbd00b4b4b404a7847c0098594905b77c6a00d98c7802c88b7d00d8846e00c88b7d00 +d8846e00c88b7d00c8847200d98c7800c8847200d98c7800c88b7d00d8846e00c88b7d00 +d98c7800c88b7d00d8846e00966355008a51420098594900994f3c00a96d5f00c8847200 +d98c7805d8846e00d98c7808e9947d00d6938100d98c7800e9947d00d98c7803d6938100 +fac4ac00ffffff0fecf3f500e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500b4b4b401 +a4a5a40497746b008a514209a8655400c8847200d8846e00c47b7d00d77c6200c47b7d00 +d8846e00d77c6200c47b7d00d8846e00c8847200d77c6200c47b7d00d77c6201c47b7d00 +d8846e00c8847200d8846e00c8847200d8846e00d8cccb00e8ecef00d9dcde00d2d4d600 +cbcccd00bbbcbd00b4b4b400a4a5a4019c9e9c00a89a95009c9e9c01966355008a514200 +994f3c008a514200994f3c018a514200994f3c018a514200994f3c02a8655400d8846e00 +d77c6200c47b7d00d77c6200c47b7d00d77c6201c47b7d00d77c6200c47b7d00d77c6200 +c97c6700d8846e00c47b7d00d8846e00c97c6700c8847200c97c6702f9dcd100ffffff0e +f4f6f900e0e4e700b66c5900a96d5f00b66c5900a8655400b7746200a8655400b66c5900 +a96d5f02b66c5900a9746500a96d5f00b66c5900a96d5f00b66c5900b7746200b66c5900 +b7746200b66c5900a96d5f00985949018a514200985949008a514200985949008a514200 +985949008a514200985949008a51420198594900986d6200ffffff1af4f6f900ecf3f500 +e8ecef00e6dcdc00b9857800b66c5900b7746200a9746500b7746200a96d5f00b7746200 +a9746500b7746200a9746500b7746200a77c7000b7746200a77c7000b7746200b77c6a01 +b7746200b77c6a00b7746200a96d5f00885a4e0198594901885a4e0098594900885a4e00 +98594900885a4e0098594900b7a4a000e0e4e704c8a49d00c97c6700b77c6a00b7746200 +c97c6702b77c6a00c47b7d00c8847200c97c6700c8847200c47b7d00c8847201c97c6700 +c8847203c97c6700a96d5f00985949049663550098594901c8aca500ffffff1bf4f6f900 +ecf3f500e0e4e700e6dcdc00d2d4d601c6bcba00c97c6700c8847202c97c6700c8847201 +c97c6700c8847201d8846e00c8847205d8846e00c8847202985949009663550198594900 +96635500c8aca500ffffff11f4f6f900e8ecef00e0e4e700d9dcde00d2d4d601cbcccd03 +c7998d00c8847200c47b7d00c8847203c97c6700c8847200c97c6700c8847204c88b7d00 +c8847200c88b7d01c8847200c88b7d00d8846e00c88b7d00c8847200c97c670098594901 +96635500c8a49d00ffffff19f4f6f900e8ecef00d9dcde01d2d4d600cbcccd01c4c5c500 +cbcccd00c4c5c500cbcccd00c4c5c501d6938100c88b7d03d98c7800c88b7d01d98c7800 +c88b7d00d98c7800c88b7d01d98c7800c88b7d00d98c7800c88b7d00d98c7800c88b7d01 +d98c7800c88b7d00b77c6a00d8cccb00d2d4d600cbcccd01c4c5c502986d6200c8847200 +d98c780cc88b7d00d98c7800c88b7d00d98c7800c88b7d00d98c7800c88b7d00f9e4e100 +ffffff09f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600c4c5c501bbbcbd00c6bcba00 +bbbcbd00c4c5c500bbbcbd01a89490009859490096635500d98c7800d6938100d98c7804 +c88b7d00d8846e00d98c7800c88b7d01d98c7800c8847200d98c7800c88b7d00d8846e00 +c88b7d00d98c7802ffffff0bf4f6f900ecf3f500e0e4e700d9dcde00cbcccd00c4c5c500 +bbbcbd02b4b4b400a89490009859490396635500c97c6700d6938100d98c7800d6938104 +d98c7800d6938100d98c7800d6938100d98c7800d6938100e9947d00d98c7805d69a9000 +d2d4d600c4c5c500bbbcbd00b4b4b404999393008a514202885a4e00985949008a514200 +b7746200d6938100c88b7d00d98c7800c8847201d98c7800c8847201d8846e00c88b7d00 +c8847200c88b7d00d8846e00c88b7d01c8847200d98c7800c88b7d00a8655400885a4e00 +98594900b77c6a00c8847200d98c7800c88b7d00d98c7800c88b7d00d98c7802d6938100 +d98c7800d6938101d98c7800d6938101d98c7800d6938106d98c7801dba39300f4f6f900 +ffffff10f4f6f900e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00abacad01 +a4a5a40397746b008a514209a65b4500c8847200c47b7d00c8847202c97c6700c8847201 +c97c6700c47b7d00c8847202c97c6700c8847200c97c6700c8847203e6ccc900e0e4e700 +d9dcde00d2d4d600c4c5c500bbbcbd01abacad009c9e9c0496635500994f3c008a514200 +994f3c008a514201994f3c008a514201994f3c008a514201994f3c00a8655400c8847200 +d8846e00c8847200d77c6200c8847200d8846e00c8847209c97c6700c8847200c47b7d00 +c97c6700e6dcdc00ffffff0ef4f6f900e8ecef00b7746200a96d5f01a9746500a96d5f00 +b7746200a9746500a96d5f00b7746200a96d5f00a9746500b66c5900a96d5f00b66c5900 +a9746500b66c5900a96d5f00b7746200a96d5f00b7746200b66c59008a51420098594900 +8a514200985949008a514200985949008a51420398594900885a4e008a51420098594900 +e8ecef00ffffff19f4f6f900ecf3f500e0e4e700d9dcde00b77c6a00a9746500a96d5f00 +b7746201a9746500b7746201a9746500b7746201a9746501b7746200a9746500a77c7000 +b7746200a77c7000b77c6a01a96d5f00885a4e0098594900885a4e0398594900885a4e02 +c8aca500e0e4e701e8ecef00e0e4e701d8ac9f00b77c6a00b7746200c97c6700b77c6a01 +c97c6700b9857800c97c6700b9857800c8847206c97c6700c8847200b77c6a00c8847200 +a974650096635500985949008a6358009859490096635500985949008a63580098594900 +b78d8500ffffff1bf4f6f900e8ecef01d9dcde00d2d4d600d8cccb00c6bcba00c97c6700 +c8847200c47b7d00c97c6700c8847200c97c6700c8847208c88b7d03c8847200b9857800 +98594900966355009859490096635501d7c4bd00ffffff11f4f6f900e8ecef00e0e4e700 +e6dcdc00d2d4d602d8cccb00cbcccd00c8a49d00c8847200c47b7d00c8847201c47b7d00 +c97c6701c47b7d00c8847200c47b7d00c8847200c97c6700c8847200d8846e00c88b7d00 +c8847200d8846e00c88b7d00c8847200d98c7800c88b7d02d98c7800c88b7d00b7746200 +9663550098594901e6ccc900ffffff18f4f6f900ecf3f500e8ecef00d9dcde00d2d4d600 +cbcccd00d8cccb00cbcccd00c4c5c500cbcccd00c4c5c501cbcccd00c8a49d00c88b7d03 +c8847200c88b7d01c8847200c88b7d01c8847200d98c7800c8847200c88b7d00c8847200 +c88b7d01d8846e00c88b7d00c8847200d98c7800c8847200b7a4a000d2d4d600cbcccd01 +c4c5c501b7a4a000a8655400d98c7800d8846e02d98c7801c8847200d98c7800c8847200 +d98c7800c8847200d98c7800c88b7d00c8847200d8846e00c88b7d00c8847202c88b7d00 +d6938100ffffff0af4f6f900ecf3f500e0e4e700d9dcde00d2d4d600c4c5c502bbbcbd01 +c4c5c500bbbcbd00c4c5c500b8adaa008a63580098594900c8847200c88b7d00d6938100 +c88b7d00d6938100c88b7d00d98c7800c88b7d00d6938100c88b7d01d8846e00c88b7d01 +c8847200c88b7d01c8847200c88b7d00c8847200c88b7d00e8bcb000ffffff0aecf3f500 +e8ecef00e0e4e700d2d4d601c4c5c500bbbcbd00b4b4b400bbbcbd00b8adaa00986d6200 +885a4e0098594900885a4e0098594900a8655400c8938400d98c7800d69a9000d6938104 +d69a9000d6938104d98c7800d6938102d98c7801d6938100d8b4ac00cbcccd01bbbcbd00 +b4b4b401abacad00b4b4b401a89a9500885a4e0098594900885a4e008a51420098594900 +885a4e00b7746200c88b7d00d98c7800c8847200d98c7800c88b7d00c8847202c88b7d00 +c8847200d98c7800c88b7d01c8847200d98c7800c88b7d02a96d5f00a8655400c8847200 +c88b7d00d98c7800c88b7d00d98c7800c88b7d00d98c7800c88b7d00d6938100c88b7d01 +d6938100c88b7d00d98c7800d6938100d98c7800d6938108d69a9000f8d4c900ffffff12 +ecf3f500e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500b4b4b401a4a5a4019c9e9c00 +a4a5a401987c75008a51420996635500c8847203c47b7d00c8847201c97c6700c8847201 +c97c6700c8847200c47b7d00c8847206d8cccb00e8ecef00d9dcde00d2d4d600cbcccd00 +bbbcbd00b4b4b400abacad00a4a5a4009c9e9c00a89a95009c9e9c018a635800885a4e00 +8a514204985949008a514201994f3c008a514200994f3c00a8655400c8847201d8846e00 +c8847205d8846e00c8847203c97c6700c8847204e6dcdc00ffffff0eecf3f501b9857800 +a96d5f00a9746500a96d5f00a9746500a96d5f01a9746500a96d5f00a9746500a96d5f00 +a9746502a96d5f00b7746200a9746500b66c5900a9746500b66c5900a974650098594900 +8a514200885a4e008a514200885a4e008a514200885a4e01985949008a514200885a4e00 +8a514200885a4e01d8cccb00ffffff19f4f6f900ecf3f500e8ecef00d8cccb00a9746500 +b7746200a9746500b7746200a9746501b7746200a77c7000b7746200a77c7000a9746504 +b7746200a77c7000b77c6a00a9746500b77c6a00a9746500885a4e0098594900885a4e00 +98594900885a4e0098594900885a4e0198594900885a4e00b8adaa00e0e4e704c7b5b100 +b7746200c97c6700b77c6a01c47b7d00b77c6a00c97c6700b9857800c97c6700b9857800 +c8847200b9857800c8847200b9857800c8847200b9857801c8847200b9857800b77c6a01 +985949008a635800985949008a635800885a4e0096635500885a4e0096635500986d6200 +ffffff1bf4f6f900ecf3f500e8ecef00d9dcde00d2d4d601c8a49d00c8847202b9857800 +c8847204c88b7d00b98a7c00c88b7d04c8847200c88b7d02b77c6a0096635504e6dcdc00 +ffffff11f4f6f901e8ecef00d9dcde01d2d4d600cbcccd01c7b5b100c8847200b77c6a00 +c8847200b77c6a01c8847200b9857800b77c6a00c8847200b9857800c8847200c97c6700 +c8847204c88b7d00c8847200c88b7d00c8847200c88b7d00c8847200c88b7d00c8847200 +c88b7d00c8847200a86554009859490196635500ffffff19ecf3f500e8ecef00e6dcdc00 +d9dcde00d2d4d600cbcccd01c4c5c501d8cccb00c4c5c501c6bcba00c88b7d00c8847200 +c88b7d00c8847200c88b7d00c8847200c88b7d02c8847200c88b7d00c8847201c88b7d01 +c8847200c88b7d00c8847204b77c6a00cbcccd01c4c5c50297746b00b7746200c8847201 +c88b7d00c8847202d8846e00c8847200c88b7d00c8847200c88b7d00c8847200c88b7d02 +c8847200c88b7d01c8847200c88b7d00f8d4c900ffffff0becf3f500e8ecef00d9dcde00 +d2d4d600cbcccd00c4c5c500bbbcbd00c4c5c500bbbcbd00c4c5c500bbbcbd00c6bcba00 +bbbcbd00986d620098594900a9746500d98c7800c88b7d00d6938100c88b7d00d6938100 +c88b7d01c8847200c88b7d03c8847200c88b7d00c8847200c88b7d01c8847200c88b7d01 +c8847200f4f6f900ffffff09ecf3f500e0e4e700d9dcde00d2d4d600c4c5c501bbbcbd01 +b4b4b400987c7500885a4e00966355008a635800885a4e0096635500b9857800d6938100 +c8938400d6938100c8938400d69a9000d6938100d69a9000d6938102d69a9000d6938102 +c8938400d6938101c8938400d6938100c8938400d98c7800d8cccb00d2d4d600c4c5c500 +bbbcbd00b4b4b404a4a5a400885a4e038a514200885a4e00a96d5f00c88b7d03c8847200 +c88b7d01c8847202c88b7d00c8847200c88b7d05c8847200c88b7d02c8938400c88b7d00 +d6938100c88b7d00d6938100c88b7d00d98c7800c88b7d00d6938101c88b7d00d6938100 +c8938400d6938105d69a9000d6938101e8b3a800ffffff14f4f6f900e8ecef00e0e4e700 +d9dcde00cbcccd00c4c5c500bbbcbd00abacad01a4a5a403987c750076524a00885a4e00 +76524a008a51420076524a008a51420076524a008a51420296635500c8847200b9857800 +c8847202b9857800c8847201b9857800c8847200b9857800c8847200b9857800c47b7d00 +b9857800c8847200c47b7d00c8847201b9857800d8cccb00e0e4e700d9dcde00d2d4d600 +cbcccd00bbbcbd01a4a5a4019c9e9c0396635500885a4e008a514200885a4e018a514200 +885a4e008a514205a96d5f00c8847213e6dcdc00ffffff0ef4f6f900e8ecef00b8938b00 +a96d5f00a9746500a96d5f00a9746501a96d5f00a9746500a96d5f00a9746500a96d5f02 +a9746501a96d5f00a974650496635500885a4e018a514200885a4e018a514200885a4e00 +8a514200885a4e04c8aca500ffffff1af7ece700e8ecef00c4c5c500b7746200a9746503 +b7746200a77c7000a9746500a77c7000b7746200a77c7000b7746200a77c7000b77c6a00 +a77c7001b7746200a77c7000b77c6a01a974650098594900885a4e008a63580098594900 +885a4e008a635801985949008a635800885a4e00c8aca500e0e4e704d7c4bd00b77c6a04 +c8847200b9857800c8847200b9857800c8847200b9857800c8847200b9857802c8847200 +b985780496635501885a4e00966355048a635800f9e4e100ffffff1be8ecef01e6dcdc00 +d2d4d601c7998d00b9857803c88b7d00b98a7c02c88b7d00b78d8500c88b7d00b98a7c00 +c88b7d00b98a7c00c88b7d01b78d8500c88b7d00b78d8500c88b7d00a97465008a635800 +966355008a635800966355008a635800ffffff12f4f6f901e0e4e701d2d4d601d8cccb00 +c6bcba00b9857801b77c6a00b9857800b77c6a05c8847200b77c6a00b9857801c47b7d00 +b9857800c8847202c88b7d04d6938100c88b7d00d98c7800c88b7d00c884720096635501 +98594900a77c7000ffffff18f4f6f900ecf3f500e8ecef00d9dcde00d2d4d600cbcccd02 +c4c5c500cbcccd00c4c5c500cbcccd00c4c5c500c7998d00b9857802c88b7d00b9857801 +c8847200b9857800c88b7d00c8847200b9857800c8847202c88b7d00c8847200b9857800 +c88b7d00c8847200c88b7d01b77c6a00b7a4a000c4c5c502b8adaa0098594900c8847204 +c88b7d00c8847200c88b7d00c8847202c88b7d01c8847200c88b7d00c8847200c88b7d01 +c8847200c88b7d00c8938400ffffff0cf4f6f900e8ecef00e0e4e700d2d4d600cbcccd00 +c4c5c501bbbcbd00c6bcba00bbbcbd00c4c5c500bbbcbd01a894900096635501c8938400 +c88b7d01d6938100c88b7d08b9857800c8847200b9857801c88b7d00b9857800b98a7c00 +c88b7d00d69a9000ffffff08ecf3f500e8ecef00e0e4e700d9dcde00d2d4d600c4c5c501 +bbbcbd00b4b4b400987c7500966355008a635800885a4e0096635500885a4e00a77c7000 +d6938100c8938401d69a9000c7998d00d6938100c7998d01d69a9000c7998d00d69a9000 +c7998d00d69a9000c7998d00d69a9001c8938400d69a9000d6938100c8938400d6938100 +c8a49d00d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b402abacad00b4b4b400b8adaa00 +8a63580098594900885a4e0198594900885a4e00a96d5f00c88b7d00c8938400c88b7d02 +c8847200c88b7d07b98a7c00c88b7d04c8938401d6938100c8938403d6938100c7998d00 +d6938100c7998d00d6938100c8938400d6938100c8938400d6938100c8938400d6938100 +c7998d00d6938100d69a9000d6938100d69a9000f8d4c900ffffff15ecf3f500e8ecef00 +e0e4e700d9dcde00cbcccd00c4c5c500b4b4b401a4a5a404987c7500795b54008a514200 +885a4e008a514200885a4e008a514200885a4e0176524a00885a4e00986d6200b98a7c00 +c88b7d00c8847200b98a7c00b9857800c88b7d00b9857801c8847200b9857801b77c6a00 +b9857801b77c6a00b9857802c47b7d00b9857800d8cccb00e8ecef00e0e4e700d2d4d600 +cbcccd00bbbcbd00b4b4b400abacad00a4a5a4009c9e9c038a635800885a4e038a514200 +885a4e008a514200885a4e038a514200986d6200c8847200c88b7d01c8847200c88b7d00 +c8847203b9857800c8847200b9857800c8847201b9857800c8847200b9857800c8847200 +b9857800c8847200e6dcdc00ffffff0eecf3f501b7a4a000a96d5f00986d6200a9746500 +986d6200a96d5f00a9746500a96d5f02a9746500a96d5f01a9746502a96d5f00a9746503 +966355008a514200885a4e028a514200885a4e07a88c8600ffffff19f4f6f900ecf3f500 +e8ecef00c8a49d00a9746501b77c6a00a77c7000a9746500a77c7000a9746500a77c7004 +a9746500a77c7000b7746200a77c7001b77c6a00a77c7000b77c6a0097746b00885a4e00 +8a635800885a4e008a635800885a4e028a635800885a4e008a635800b8adaa00f9e4e100 +e0e4e703d8cccb00b9857800b77c6a00b9857802b77c6a00b985780bc8847200b9857801 +966355018a635800966355008a635804c6bcba00ffffff1af4f6f900ecf3f500e0e4e700 +d9dcde00d2d4d600cbcccd00b98a7c00c8847200b9857801c8847200b98a7c01c88b7d00 +b98a7c01c88b7d00b78d8500c88b7d00b78d8501c88b7d00b8938b00c88b7d00b78d8500 +c88b7d00b78d8500a97465008a635803a77c7000ffffff13e8ecef01e6dcdc00d2d4d601 +c4c5c500c88b7d00b9857800b77c6a01b9857800b77c6a00b9857800b77c6a01b9857800 +b77c6a00b9857800c8847200b77c6a00c8847200b9857800c8847200c88b7d00b9857800 +c8847200c88b7d02d98c7800c88b7d05c8847200885a4e0096635500885a4e00b8938b00 +ffffff18ecf3f500e0e4e700d9dcde01d2d4d600cbcccd01c4c5c503cbcccd00c7b5b100 +b9857803b98a7c00c88b7d00b9857803c88b7d00b9857801c88b7d00b9857800c8847200 +c88b7d00b9857801c8847202a7847c00c4c5c502a7847c00a96d5f00b9857800c8847200 +b9857800c8847202c88b7d00c8847200c88b7d03c8847200c88b7d00b98a7c00c88b7d00 +b78d8500c88b7d00b9857800c88b7d00e6ccc900ffffff0cecf3f500e8ecef00e0e4e700 +d9dcde00cbcccd00c4c5c501bbbcbd01c4c5c500bbbcbd00c4c5c500bbbcbd00b4b4b400 +96635501c8847200c7998d00c8938401c88b7d00c8938400c88b7d02b78d8500c88b7d00 +b9857800b98a7c03c88b7d00b9857800b98a7c00c88b7d00b78d8500b98a7c00c8a49d00 +ffffff06f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd00 +a4a5a400986d62008a635804a77c7000c7998d00d79c7e00c7998d05d69a9000c7998d00 +c8938400c7998d00d69a9000c8938400d69a9000c8938400c7998d00d6938100c7998d00 +d69a9000c8938400d69a9000d8bcb600d2d4d601c4c5c500bbbcbd00b4b4b40597746b00 +885a4e0496635500c8938400c88b7d00c8938400c88b7d01c8938400c88b7d04b78d8500 +c88b7d01c8938400b78d8500c88b7d00b78d8500c8938404c7998d00c8938400d69a9000 +c8938400c7998d00d69a9000c7998d00d69a9000c8938400d69a9000c7998d00d6938100 +c8938400d6938100c7998d00d69a9000c8938401e8bcb000ffffff17f4f6f900ecf3f500 +e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd00abacad00a4a5a404987c750076524a00 +885a4e0076524a00885a4e00795b5400885a4e0076524a00885a4e018a514200986d6200 +c88b7d00b98a7c03b9857807b77c6a00b9857800b77c6a00a7847c00b77c6a00a7847c00 +b9857800d8cccb00e0e4e700d9dcde00d2d4d600cbcccd00bbbcbd01abacad009c9e9c04 +876d6700885a4e0676524a00885a4e018a514200885a4e00986d6200c88b7d00b98a7c00 +b9857800b98a7c00b9857800c88b7d00b9857802c8847200b9857802c88b7d00b9857805 +e6dcdc00ffffff0ef4f6f900e8ecef00c7b5b100986d6200a96d5f00986d6201a9746500 +986d6200a9746500986d6201a9746500986d6200a9746500a96d5f00a974650798594900 +885a4e0b96635500e8ecef00ffffff19e8ecef01b8938b00a77c7000a9746500a77c7000 +a9746500a77c7004a9746500a77c7004b77c6a00a77c7000a7847c00b77c6a00a7847c00 +a97465008a635800885a4e008a635800885a4e008a635804885a4e00b8adaa00e0e4e700 +e8ecef00e0e4e702d9dcde00b8938b00b9857800b77c6a00b9857800b77c6a00b9857800 +b77c6a00b9857803b98a7c00b9857804b98a7c00b9857800b98a7c00b9857800a9746500 +8a635800966355008a635800885a4e00966355008a63580096635500885a4e00a7847c00 +ffffff1af4f6f900e8ecef01e6dcdc00d9dcde00c6bcba00b9857801b98a7c00b9857800 +b78d8500b98a7c00b9857800b98a7c01b78d8502b8938b00c88b7d00b78d8500b8938b00 +c88b7d00b78d8501c88b7d00b78d8500986d62008a635801966355008a635800b7a4a000 +ffffff12f4f6f900e8ecef01d9dcde01d8cccb00c7998d00b9857800b77c6a00b9857801 +b77c6a00b9857800b77c6a00b9857800b77c6a00b9857801b77c6a00b9857803c88b7d00 +b9857800c88b7d00b98a7c00c88b7d03c8938400c88b7d05b77c6a00885a4e02d8bcb600 +ffffff17f4f6f900f7ece700e0e4e700d9dcde00d2d4d600d8cccb00cbcccd00c4c5c500 +d8cccb00c4c5c500cbcccd00c4c5c501b99a9400b9857805c88b7d00b98a7c01b9857800 +c88b7d00b9857805c8847200b98a7c01b9857800b77c6a00b7a4a000c4c5c500bbbcbd00 +885a4e00b77c6a01b9857802c88b7d00b78d8500b9857800b98a7c01c88b7d00b9857800 +b78d8500c88b7d00b78d8500c88b7d00b78d8500c8938400c88b7d00b78d8500c7998d00 +ffffff0df4f6f900ecf3f500e0e4e700d9dcde00d2d4d600c4c5c503bbbcbd00c4c5c500 +bbbcbd00c6bcba00c4c5c500978c8a008a635800a9746500c8938402c7998d00c8938400 +c7998d00c88b7d00b8938b00c88b7d00b78d8501c88b7d00b78d8500c88b7d00b78d8500 +b98a7c00b78d8503c88b7d00b78d8500c8a49d00f7ece700ffffff03f4f6f900ecf3f500 +e8ecef00d9dcde01d2d4d600cbcccd00b4b4b400987c75008a635805b9857800c8938400 +c7998d04d69a9000c7998d03d69a9000c7998d03d69a9000c7998d00d69a9000c7998d03 +d9dcde01d2d4d600c4c5c500bbbcbd00b4b4b40597848100885a4e05c88b7d00c8938400 +c88b7d00c8938401c88b7d00c8938400b78d8500c8938400b78d8500c8938402b78d8500 +c88b7d00c8938402c88b7d00b78d8500c8938403c7998d00c8938400c7998d01c8938400 +c7998d02c8938400c7998d03d6938100c7998d00d69a9000f9e4e100ffffff18ecf3f500 +e8ecef00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a404987c7500 +76524a008a51420076524a018a51420076524a00885a4e0076524a00885a4e0076524a00 +986d6200b98a7c02c88b7d00b98a7c00b9857800b78d8500b9857804b77c6a00b9857800 +a77c7000b9857801a77c7000b9857800b77c6a00cbcccd00e0e4e701d2d4d600cbcccd00 +bbbcbd00b4b4b400abacad00a4a5a4009c9e9c03876d6700885a4e01795b5400885a4e01 +795b5400885a4e05986d6200c88b7d00b78d8500c88b7d00b98a7c00c88b7d00b98a7c01 +b9857803c8847200b9857804c47b7d00b9857801e6dcdc00ffffff0eecf3f501d8cccb00 +986d6202a9746500986d6201a974650097746b00a9746500986d6200a9746500986d6200 +a9746503a77c7001a9746500a77c7000a97465008a635800885a4e0296635500885a4e08 +c6bcba00ffffff18f4f6f900ecf3f500d9dcde00a9746501a77c7000a9746500a77c7007 +b77c6a00a77c7001a7847c00a77c7000b77c6a00a7847c00a77c7000b985780097746b00 +8a635802885a4e008a635800885a4e02795b54008a635800b8adaa00e0e4e701e8ecef00 +e0e4e701d2d4d600c8a49d00a7847c00b9857800b77c6a00a7847c00b77c6a00a7847c00 +b9857800a77c7000b9857804b98a7c00b9857802a7847c00b9857801a7847c008a635803 +885a4e008a635800885a4e008a635800885a4e00e8ecef00ffffff19f4f6f900ecf3f500 +e0e4e700d9dcde00d2d4d600c8a49d00b98a7c03b9857800b78d8500b98a7c00b78d8500 +b98a7c00b78d8504b8938b00b98a7c00b8938b00b98a7c00b8938b00b78d8500b9857800 +8a635804d8cccb00ffffff12f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600c8aca500 +b985780cb98a7c00b9857800c8847200b98a7c00c88b7d00b98a7c00c88b7d01c8938400 +b78d8500c8938402c88b7d00c8938400c88b7d00b8938b00c88b7d00b8938b00c88b7d00 +97746b008a635800885a4e008a635800e6dcdc00ffffff17ecf3f500e8ecef00d9dcde00 +d2d4d601cbcccd01c4c5c500cbcccd00c4c5c500cbcccd00c4c5c500c7b5b100b9857801 +b78d8500b98a7c00b78d8500b98a7c05b78d8500c88b7d00b78d8500c88b7d00b98a7c02 +b9857800b98a7c00c88b7d00b98a7c00a7847c00c4c5c500a88c8600986d6200b9857803 +b98a7c02c88b7d00b78d8500c88b7d00b78d8500c8938400b78d8500c8938400b78d8500 +c8938400b78d8500c8938400b78d8500c8938400d7c4bd00ffffff0eecf3f500e8ecef00 +d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd00c6bcba00bbbcbd01c4c5c500bbbcbd01 +b4b4b400986d62008a635800c8938400c7998d03b8938b00c8938400b8938b00c8938400 +b8938b00c88b7d00b8938b00b78d8502c8938400b78d8501c8938400b78d8500b8938b01 +c88b7d00b8938b00d7c4bd00f4f6f900ffffff00f4f6f900ecf3f500e8ecef00d9dcde01 +cbcccd00a4a5a400987c7500885a4e008a635800885a4e008a635800885a4e008a635800 +97746b00b98a7c00c7998d10c8938400c7998d01c8938400c7998d00d69a9000d8bcb600 +e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b401abacad00b4b4b401abacad00 +a89a9500885a4e0077646000885a4e008a635800885a4e01a7847c00c8938400b78d8500 +c8938400b78d8500c8938400b78d8500c8938402b78d8500c8938402b78d8500c8938400 +b78d8500c8938401c7998d00c8938400b8938b00c7998d00c8938400c7998d08c8938400 +c7998d00c8938400c7998d01d8b4ac00ffffff1af4f6f900e8ecef00e0e4e700d9dcde00 +cbcccd00c4c5c500bbbcbd00abacad019c9e9c00a4a5a402867c7b0076524a01795b5400 +8a51420076524a018a51420076524a018a514200986d6200b9857800b98a7c00b9857800 +b98a7c00b9857802b98a7c01a7847c00b9857800a7847c00b9857800a7847c00a77c7000 +a7847c00a77c7000b9857800a77c7000a7847c00d8cccb00e0e4e700d9dcde00d2d4d600 +cbcccd00bbbcbd01abacad00a4a5a4009c9e9c0199939300a4a5a400876d6700795b5400 +885a4e00795b5400885a4e00795b5400885a4e008a635800795b5400885a4e0077646000 +885a4e008a635800986d6200b8938b00c88b7d00b78d8500c88b7d00b78d8500b98a7c00 +c88b7d00b985780aa77c7000b9857800e6dcdc00ffffff0ef4f6f900ecf3f500e6dcdc00 +97746b00986d620497746b00a96d5f0097746b00986d6200a974650097746b00a9746500 +97746b00a77c7001a9746500a77c7001a9746500a77c7000986d6200885a4e09795b5400 +885a4e00795b5400a7847c00ffffff18f4f6f900e8ecef00c7b5b10097746b02987c7500 +97746b01a77c700097746b00a77c7003a7847c00a77c7002a7847c00a77c7000a7847c00 +a77c7000a7847c0097746b00885a4e01795b54008a635800795b5400885a4e0077646000 +8a635800795b5400885a4e00b7a4a000e8ecef01e0e4e700e8ecef00e0e4e700d9dcde00 +c7b5b100b9857800a77c7000a7847c01b77c6a00a7847c00a77c7000b9857800a7847c08 +b9857800b98a7c00a7847c00b985780096635500885a4e028a635800795b5400885a4e00 +77646000885a4e00b8adaa00ffffff19f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600 +b8938b00b98a7c00b9857800b78d8500b9857800a88c8600b9857800b78d8505b8938b00 +b78d8503b8938b00b98a7c00b8938b00a77c70008a635803876d6700ffffff12f4f6f901 +e8ecef00e0e4e700d9dcde00c7b5b100a88c8600b9857800a7847c00b9857803a7847c00 +b9857802b78d8500b9857800b98a7c01c88b7d00b78d8501b98a7c00c8938400b78d8500 +c8938400b78d8500c88b7d00b78d8500c8938400b78d8500b8938b00b78d8501b8938b00 +c88b7d00b78d8500c88b7d00b98a7c00986d62008a63580197746b00ffffff17f4f6f900 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd02c4c5c500cbcccd00c4c5c502a8949000 +b98a7c00a7847c00b98a7c00b78d8500a7847c00b98a7c00b78d8500b98a7c01b78d8504 +b98a7c00b78d8500b98a7c00b9857800b78d8500b9857800b98a7c00a77c7000b7a4a000 +885a4e00a7847c00b9857800b98a7c02b78d8500b9857800b78d850dffffff0ff4f6f900 +e8ecef00e0e4e700d9dcde00cbcccd00c4c5c502bbbcbd00c4c5c500bbbcbd00c6bcba00 +c4c5c500bbbcbd00a89a95008a63580097746b00c7998d06b8938b00c7998d00b8938b02 +c8938400b8938b00b78d8500b8938b01b78d8500b8938b01b78d8500b8938b01b78d8500 +c7998d00c7b5b100c6bcba00b4b4b400b8adaa00a89a9500987c75008a635800885a4e00 +795b5403885a4e0097746b00b98a7c00c7998d01c8938400c7998d14c8a49d00e0e4e700 +e8ecef00d9dcde00d2d4d600cbcccd00bbbcbd00b4b4b405a4a5a4008a635800795b5400 +8a635800885a4e00795b54008a635800a9746500c8938400b8938b00c8938400b8938b00 +c8938400b8938b00c8938400b8938b00c8938402b8938b00c8938401c7998d00c8938400 +c7998d00b8938b00c8938400b8938b00c8938400c7998d00c8938400b8938b00c8938400 +c7998d03c8938400c7998d00c8938401c7998d01c8a49d00f9e4e100ffffff1becf3f500 +e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500b4b4b401a4a5a404987c750076524a04 +795b540076524a038a635800b78d8500b9857800b78d8500b9857800b78d8500a7847c00 +b9857800a7847c00b9857800a7847c00b98a7c00b9857800a77c7000b9857800a77c7001 +b9857800a77c7000a7847c00a77c7000d8cccb00e0e4e701d2d4d600cbcccd00bbbcbd00 +b4b4b400abacad00a4a5a40099939300a4a5a4009c9e9c01876d6700795b5400885a4e00 +795b5401885a4e00795b5401885a4e00795b5400885a4e00795b5400885a4e0097746b00 +b78d8500b8938b02b78d8502b98a7c00b78d8500b9857807a7847c00b9857800a77c7000 +e6dcdc00ffffff0ef4f6f900ecf3f500e8ecef00a88c8600986d620297746b00986d6201 +97746b00986d620097746b00986d620097746b00a77c7001a9746500987c7500a77c7000 +a9746500a77c7000a9746500a77c7000986d6200885a4e00795b5400885a4e00795b5401 +885a4e00795b5403885a4e00795b540076524a008a635800d9dcde00ffffff17ecf3f500 +e8ecef00a894900097746b00a974650097746b00a77c700097746b00a77c700097746b00 +987c7500a77c7000987c7501a77c7002a7847c00a77c7001a7847c00a77c7000a7847c00 +a77c700097746b008a63580077646000885a4e00795b54008a635800795b5404b8adaa00 +e8ecef00e0e4e700e8ecef00e0e4e701e6dcdc00cbcccd00a7847c00a77c7004a7847c00 +a77c7002a7847c00a77c7001b9857800a77c7000b9857800a7847c0497746b00885a4e00 +77646000885a4e00795b54008a635800795b5400885a4e0077646000986d6200ffffff19 +ecf3f500e8ecef00e6dcdc00d9dcde00c7b5b100a7847c00b9857800a88c8600a7847c00 +b98a7c00b9857800a88c8600b78d8503b8938b00b78d8502b8938b00b78d8500b8938b00 +b78d850297746b008a635801776460008a635800a88c8600ffffff12f4f6f900e8ecef00 +e0e4e701d8cccb00b78d8500b9857800a7847c00b98a7c00a88c8600b78d8500a7847c00 +b78d8500b9857800b78d8500a88c8600b78d8501b98a7c00b78d8500b8938b00b78d8500 +b8938b00c8938400b78d8500c8938400b78d8501c8938400b78d8500c8938400b78d8500 +c8938400b78d8500c8938400b78d8500c88b7d00b8938b00b78d8500b8938b00c88b7d00 +b98a7c008a635801885a4e00a7847c00ffffff16f4f6f900ecf3f500e8ecef00d9dcde00 +d2d4d601cbcccd01c4c5c501d8cccb00c4c5c500cbcccd00c8aca500a7847c00b98a7c00 +a7847c00b98a7c00a88c8600b98a7c00a88c8600b78d8500b98a7c00b78d8503c8938400 +b78d8500b98a7c00b78d8500b98a7c00b78d8500b9857800b78d8500b9857800876d6701 +b9857801a7847c00b78d8500b9857800b78d8500b98a7c02b78d8501b98a7c00b78d8502 +b8938b00b78d8503d8bcb600ffffff0ff4f6f900ecf3f500e0e4e700d9dcde00d2d4d600 +cbcccd00c4c5c500bbbcbd00c4c5c500bbbcbd02c4c5c500bbbcbd00c4c5c50097848100 +8a635800b78d8500c7998d00b8938b00c7998d00b99a9400b8938b00c7998d00b99a9400 +c7998d00b8938b00c7998d00b8938b00b99a9400b8938b02b78d8500b8938b03b98a7c00 +b8938b00b78d8501b8938b00c88b7d00b78d850097746b00986d6200795b54038a635800 +986d6200987c7500b98a7c00b8938b05c8938400b99a9400c7998d03b99a9400c7998d0c +e6dcdc00f4f6f900e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b40687747000 +795b5401885a4e0077646000885a4e00876d6700c7998d00b8938b01c8938400b8938b00 +c8938400b8938b00c8938400b99a9400c7998d00b99a9400c7998d09b8938b00c7998d01 +b99a9400c8938400b8938b00c8938400b8938b00c8938400b8938b03d8bcb600ffffff1d +f4f6f900ecf3f500e0e4e700d2d4d601c4c5c500bbbcbd00abacad01a4a5a4029c9e9c00 +8774700076524a09986d6200a7847c00b9857800a7847c02b9857800a7847c02b9857800 +a7847c01a77c7001a7847c00a77c7003a7847c00d8cccb00e0e4e700d9dcde00d2d4d600 +cbcccd00bbbcbd01a4a5a4019c9e9c03876d670076524a00795b5407885a4e00795b5401 +97746b00b98a7c00b8938b00b98a7c00b8938b00b78d8500c88b7d00b78d8500b9857800 +a7847c00b9857800a7847c03a77c7000a7847c00a77c7000a7847c00a77c7001e6dcdc00 +ffffff0ef4f6f900ecf3f500e8ecef00b8adaa00986d6200876d6700986d6200876d6700 +986d620497746b03a77c700097746b00a9746500987c750097746b00a77c700097746b01 +8a635800885a4e00795b5400885a4e0076524a00795b5402885a4e0076524a00795b5400 +76524a00795b540076524a00a89a9500ffffff16f4f6f901d9dcde0097746b04987c7500 +97746b00a77c700097746b00987c750097746b00a77c7000987c7501a77c7000987c7500 +a77c7000987c7500a77c7000a7847c00a77c700197746b00885a4e00795b54058a635800 +795b5401b8adaa00e8ecef02f7ece700e0e4e701d2d4d600a88c8600a77c7000987c7500 +a77c7000987c7500a77c7000987c7500a7847c00a77c7006a7847c00a77c7000a7847c00 +b77c6a00a7847c01a77c70008a63580077646000885a4e0077646000885a4e0077646000 +885a4e0077646000885a4e00c4c5c500ffffff17f4f6f900e8ecef01d9dcde01b99a9400 +a88c8600b98a7c00a7847c00b98a7c00a7847c00a88c8600b78d8501a88c8600b78d8507 +a88c8600b8938b00b78d8501876d67008a635800776460008a635801c4c5c500ffffff11 +f4f6f901e8ecef00e0e4e700d8cccb00b8938b00a7847c00a88c8600b98a7c00a88c8600 +b78d8500a7847c00b78d8500a7847c00b78d8500a88c8600b98a7c00b78d8503b8938b01 +b78d8500b8938b0fb78d8500b8938b00b78d8500a7847c008a635801795b5400b7a4a000 +ffffff16f4f6f900e8ecef00e6dcdc00d9dcde00d2d4d600cbcccd02c4c5c504b8938b00 +a7847c00a88c8600b98a7c00a88c8600b78d8505b8938b00b78d8508a7847c00a77c7001 +a88c8600b9857800a88c8600b9857800a88c8600a7847c01a88c8600a7847c00b78d8500 +a88c8600b78d8506a88c8600b78d8500ffffff11f4f6f900e8ecef00e0e4e700d2d4d600 +cbcccd00c4c5c502bbbcbd00c4c5c501bbbcbd0397746b00876d6700b8938b00c7998d00 +b99a9400c7998d00b99a9400c7998d00b8938b00b99a9400c7998d00b99a9400b8938b00 +b99a9400b8938b10b98a7c00a88c8600b9857800a88c8600b98a7c00b8938b0ac7998d00 +b8938b00b99a9401c7998d00b99a9401c7998d00b99a9403c7998d00b99a9400c7998d02 +e6ccc900ffffff00ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00c4c5c500b4b4b403 +abacad00b4b4b401978481008a635800795b54038a635800b78d8500c8938400b8938b00 +c8938400b8938b01c8938400b8938b00c7998d00b8938b00c7998d02b99a9400c7998d00 +b99a9400c8938400b99a9400c7998d00b99a9400c7998d01b99a9400c7998d01b8938b00 +c7998d00b99a9400c8938400b99a9400b8938b00c8938400c8a49d00f7ece700ffffff1e +ecf3f500e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b400a4a5a404 +867c7b0076524a01684f490076524a068a635800a7847c02b9857800a7847c00a77c7000 +a7847c02a77c7000a7847c00a77c7000a7847c00a77c7001a7847c00a77c7000a7847c01 +a77c7000cbcccd00e8ecef00d9dcde00d2d4d600cbcccd00bbbcbd00b4b4b400abacad00 +9c9e9c02999393009c9e9c0077646000795b540076524a00795b540076524a00795b5400 +76524a00795b5405986d6200b78d8501b8938b00b78d8500b8938b00a88c8600b78d8501 +a7847c00b78d8500a7847c00b9857800a7847c00b9857800a7847c01a77c7000a7847c02 +e6dcdc00ffffff0fecf3f500e8ecef00c4c5c500986d6200876d6700986d62008a635800 +97746b00876d670097746b00986d620097746b0c986d620076524a00795b540276524a00 +795b540076524a00795b540176524a00795b540176524a0077646000e8ecef00ffffff15 +f4f6f900ecf3f500b7a4a000986d620097746b05987c7501a77c7000987c7501a77c7000 +987c7501a77c7000987c7500a77c7000987c7502a77c700087747000795b5409b8adaa00 +e8ecef04d9dcde01b7a4a000987c7500a77c7000987c7500a77c7000987c7500a77c7000 +97746b00987c7502a77c7000987c7501a77c7000a7847c00a77c7000a7847c04876d6700 +885a4e0077646000795b540177646000885a4e0077646000795b540097746b00ffffff17 +f4f6f900ecf3f500e0e4e700e6dcdc00cbcccd00a88c8600b98a7c00a88c8602b98a7c00 +a88c8600b78d8500a88c8600b78d8501a8949000b78d8500a88c8600b8938b00a88c8600 +b78d8500a88c8600b78d8500a88c8600b8938b00978481008a635800776460008a635800 +776460008a635800ffffff12f4f6f900e0e4e701d9dcde00b7a4a000b78d8500a88c8600 +b98a7c00a88c8600b9857800a88c8600b98a7c00a88c8600b98a7c00a88c8600a7847c00 +b78d8500a88c8600b78d8500b8938b11b78d8500b8938b00b78d8500b8938b00b98a7c00 +b78d8501987c7500795b5402d7c4bd00ffffff15f4f6f900ecf3f500e8ecef00d9dcde00 +d2d4d600d8cccb00cbcccd00c4c5c500cbcccd00c4c5c500cbcccd00c4c5c500cbcccd00 +b8adaa00b78d8501a88c8600b78d8500a88c8600b78d8500a88c8600b8938b00b78d8500 +b8938b01b78d8500b8938b02b78d8508a88c8600b78d8500a88c8600b78d8501a88c8600 +b78d8501a88c8600b78d8500b8938b00a88c8600b78d8500a88c8600b78d8500a88c8601 +b9857800c8aca500ffffff11f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00 +c4c5c501bbbcbd00c6bcba00bbbcbd01c4c5c500bbbcbd01b8adaa00876d670097746b00 +b99a9402c7998d00b99a9404b8938b14b78d8500b8938b01a88c8600b8938b01a88c8600 +b8938b08c7998d00b99a9401c7998d00b99a9401c7998d01b99a9400c7998d00b99a9400 +c7998d00b99a9401d7c4bd00ffffff01ecf3f500e8ecef00e0e4e700d2d4d600cbcccd00 +c4c5c500b4b4b405abacad00a4a5a400795b540177646000885a4e00795b5401a7847c00 +b8938b00b99a9400b8938b00b99a9403c7998d00b99a9400c7998d00b99a9401c7998d00 +b99a9400c7998d00b99a9400c7998d00b99a9400c7998d00b99a9400b8938b00c7998d00 +b99a9400c7998d00b8938b00c8938400b8938b02c8938400d7c4bd00ffffff20f4f6f900 +ecf3f500e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00abacad019c9e9c00a4a5a402 +87747000684f490176524a00684f490076524a00684f490076524a038a635800b98a7c00 +a7847c05a77c7001987c7500a77c700097848100a77c7000a7847c06cbcccd00e0e4e700 +d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad00a4a5a4009c9e9c02a89a9500 +7764600076524a00684f4900795b5400684f490076524a04795b540076524a01876d6700 +a88c8602b78d8500a88c8600b78d8500a88c8601b78d8500a7847c00a88c8600a7847c03 +a77c7000a7847c01a77c7000a7847c00e6dcdc00ffffff0ef4f6f901e8ecef00e0e4e700 +987c7500876d6702986d6200876d6700986d62008774700097746b0d795b540176524a01 +795b540076524a00795b540076524a00684f4900795b5400684f490076524a00684f4900 +76524a00a8949000ffffff15f4f6f900e6dcdc00987c7500876d670097746b0087747000 +97746b05987c7501a77c7000987c7501a77c7000987c7502a77c7000987c7500a77c7000 +987c750097746b00795b5409b8adaa00f7ece700e8ecef03e6dcdc00d9dcde00c6bcba00 +987c750097746b01987c750097746b00987c750097746b06987c7502a77c7000987c7500 +a7847c02987c7500795b540077646000795b54008a635800795b540077646000795b5400 +77646001c6bcba00ffffff16f4f6f900e8ecef00e0e4e700d9dcde00b7a4a000a88c8601 +a7847c01a88c8601b78d8500a88c8600b78d8500a88c8600b78d8500a88c8600b78d8500 +a88c8600b78d8500a88c8600b78d8500a88c8600b8938b00a88c8600b78d850097746b00 +776460008a63580077646000885a4e00978c8a00ffffff11f4f6f900e8ecef00e0e4e700 +d9dcde00c8aca500a7847c01a88c8600a7847c00a88c8603a7847c00a88c8600b98a7c00 +a88c8601b78d8500a88c8601b8938b00a88c8600b8938b00a8949000b8938b0bb78d8500 +b8938b00a88c8600b78d8501a88c8600b78d8500a88c8600b9857800876d6700795b5401 +77646000f7ece700ffffff15f4f6f900e0e4e701d9dcde00d2d4d600d8cccb00cbcccd00 +c4c5c503cbcccd00c6bcba00a8949000a88c8601b78d8500a8949000b78d8500a8949000 +b78d8500a8949000b8938b00b78d8500a8949000b78d8500b8938b00b78d8500b8938b00 +b78d8502a88c8600b78d8500a88c8601b78d8500b8938b00b78d8501a88c8601b78d8500 +a88c8601b78d8500a88c8601b78d8500a88c8600b78d8500a88c8600a7847c00a88c8600 +a7847c00f4f6f900ffffff12f4f6f900e8ecef00e0e4e700d2d4d600cbcccd01c4c5c502 +bbbcbd00c4c5c500bbbcbd00c6bcba00bbbcbd01b8adaa00776d6b00a77c7000b99a9406 +b8938b00b99a9400b8938b03a8949000b8938b07b78d8501a88c8600b78d8500b8938b00 +a88c8600b8938b00a88c8600b8938b00a88c8600b8938b01a8949000b8938b0ab99a9400 +b8938b00b99a9406c7998d00b99a9401e5c4c200ffffff02f4f6f900e8ecef00e0e4e700 +d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b406876d6700795b54037764600097746b00 +b8938b02b99a9400b8938b00b99a9400b8938b00b99a9400c7998d00b99a9401c7998d00 +b99a9402c7998d00b8938b00b99a9400b8938b00c7998d00b99a9400c7998d00b8938b00 +c7998d00b8938b00b99a9400b8938b00b99a9400c8a49d00f4f6f900ffffff15e8ecef00 +876d6700867c7b00a89a9500c7b5b100d2d4d600f4f6f900ffffff04ecf3f500e8ecef00 +e0e4e700d2d4d601c4c5c500bbbcbd00b4b4b400a4a5a4048774700076524a00684f4903 +76524a00684f49038a635800a7847c05987c7500a77c7000987c7500a77c7001987c7500 +a7847c01987c7500a7847c04cbcccd00e0e4e700d9dcde00d2d4d600cbcccd00bbbcbd00 +b4b4b400abacad009c9e9c0477646000684f4902795b5400684f4901795b5400684f4901 +76524a00675c5a0076524a008a635800a88c8601a7847c00a88c8601a7847c00b78d8500 +a7847c00a88c8600a7847c00b78d8500a7847c08e6dcdc00ffffff0ff4f6f900ecf3f500 +e8ecef00b99a9400986d6200876d6700986d6200876d670197746b00876d670097746b00 +876d670097746b00876d670097746b008774700097746b0087747000986d620087747000 +986d62008774700097746b00877470008a635800684f4900795b5400684f4904795b5400 +684f4901795b5400684f4901795b5400d9dcde00ffffff14ecf3f500b8adaa00876d6702 +97746b008774700297746b00987c7505a7847c00987c750097746b00987c750597746b00 +795b540376524a00795b5402684f4900795b5400b8adaa00ecf3f501f7ece700ecf3f500 +e8ecef00e0e4e700d9dcde00d2d4d600a7847c0097746b07876d670097746b02987c7500 +97746b00987c7502a7847c0097848100a7847c01876d67008a63580077646000795b5400 +77646000795b540077646000885a4e00795b5400776d6b00f4f6f900ffffff14f4f6f900 +ecf3f500e8ecef00e6dcdc00cbcccd00a88c8601a7847c00a88c8604a8949000a88c8600 +a8949000a88c8604b8938b00a88c8602b78d8500a88c86008a635800795b540077646000 +795b540077646000d8cccb00ffffff10f4f6f900e8ecef00e0e4e701c6bcba00a7847c02 +a88c8600a7847c00a88c8600a7847c01a88c8600a7847c00a88c8600a7847c00a88c8600 +a7847c00a88c8601b78d8500a88c8600a8949000b78d8500a8949000b8938b00a8949003 +b8938b00a8949000a88c8600a8949000b78d8500a8949000a88c860a8a635800795b5401 +87747000ffffff15f4f6f900ecf3f500e0e4e700d9dcde00d2d4d600cbcccd02c4c5c500 +cbcccd00c4c5c501cbcccd00b7a4a000b8938b00a88c8600a8949000a88c8601b78d8500 +a88c8603b78d8500a88c8605b78d8500a88c8600b78d8500a88c8600b8938b01a8949000 +b8938b00a8949000b78d8500a88c8600b8938b00a88c8603b78d8500a88c8604a7847c00 +c8a49d00ffffff13f4f6f900ecf3f500e0e4e700e6dcdc00d2d4d600cbcccd00c4c5c502 +bbbcbd00c6bcba00bbbcbd01c4c5c500bbbcbd01a4a5a400876d6700a7847c00b99a9404 +b8938b00a89a9500b8938b00a8949002b8938b00a8949000b8938b00a8949000a88c8600 +a8949000b78d8500a8949000a88c8600a8949000a88c8601b78d8500a88c8602b78d8500 +a8949000b8938b00a8949000b8938b00a8949000b8938b00a8949000b8938b00a89a9500 +b8938b00a89a9500b8938b01a8949000b8938b00a8949000b8938b00a8949000b8938b01 +b99a9405b8938b00b99a9400d7c4bd00ffffff03f4f6f900ecf3f500e0e4e700d2d4d601 +c4c5c500bbbcbd00b4b4b403abacad00b4b4b401978c8a00795b540077646000795b5400 +77646000795b54008a635800a8949000b99a9402b8938b00b99a9406b8938b00c7998d00 +b99a9401c7998d00b99a9400c7998d00b99a9403b8938b00b99a9400b8938b00c7998d00 +e9d5d700ffffff16e6dcdc0077646000795b5400684f4900795b5400675c5a0076524a00 +795b5401987c7500a89a9500b4b4b400e8ecef00f4f6f900ecf3f500e0e4e700d9dcde00 +cbcccd00c4c5c500bbbcbd00abacad01a4a5a40387747000684f490776524a00684f4900 +8a635800a7847c01987c7500a77c7000987c7500a77c7000987c7500a77c7000987c7500 +a7847c00987c7500a77c7000987c7500a7847c02987c7500a7847c02cbcccd00e0e4e700 +d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c0477646000684f4900 +76524a00684f4905795b5400684f490076524a00684f4900876d6700a88c8600a7847c02 +a88c8600a7847c00a88c8600a7847c02a88c8600a7847c02987c7500a7847c03987c7500 +d9dcde00ffffff0ff4f6f900ecf3f500e8ecef00c4c5c50087747000876d670397746b00 +87747001986d6200876d670187747000876d6700986d6200876d6703986d6200876d6702 +795b5400684f4901795b5400684f4900795b5400684f4901795b5400684f4901675c5a00 +684f490187747000f4f6f900ffffff12f4f6f900e0e4e70097746b00876d6700986d6200 +876d670297746b0187747000987c750a97746b00987c75028774700076524a00795b5401 +76524a00675c5a00795b5400684f4900675c5a00795b5400684f4900b4b4b400ecf3f502 +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600b7a4a000876d67008774700097746b00 +876d670097746b00876d670097746b00876d67008774700197746b008774700097746b00 +987c750497848100a7847c01987c750077646001795b540177646000795b540077646001 +795b540097848100ffffff14f4f6f900e8ecef00e0e4e700d9dcde00b99a9400a88c8600 +a7847c01a88c8600a7847c00a88c8602b78d8500a88c8602b78d8500a88c8600b8938b00 +a88c8602b98a7c00a88c8601987c7500776460008a635800776460008a63580087747000 +ffffff10f4f6f900e8ecef01e0e4e700c4c5c500a88c8600a7847c0097848100a7847c01 +a88c8600a7847c0497848100a7847c00a88c8600a7847c00a88c8605a8949002b8938b00 +a8949000b8938b00a8949000b8938b00a8949000b78d8500a8949000a88c8603a7847c03 +a88c860397848100795b540177646000978c8a00ffffff15f4f6f900e8ecef00d9dcde01 +d2d4d600cbcccd01c4c5c502cbcccd00c4c5c500c6bcba00a8949001a88c860fa8949001 +b8938b00a8949001b8938b00a8949000b8938b00a8949000b8938b00a8949000a88c8601 +b8938b00a88c8605a7847c00a88c8600f7ece700ffffff14f4f6f900e8ecef00e0e4e700 +d9dcde00d2d4d600cbcccd00c4c5c502bbbcbd00c4c5c500bbbcbd01c4c5c500bbbcbd00 +c6bcba00a89a9500776d6b00a88c8600b99a9401a8949000b99a9400a8949000b8938b00 +a8949001b8938b00a88c8603a8949000b78d8500a88c8601a8949000b78d8500a88c8600 +b78d8500a88c8607b8938b00a88c8600a8949000b8938b00a8949002b8938b00a8949000 +b8938b00a8949000b8938b00a8949000a88c8601b8938b00a8949000b8938b00a8949000 +b8938b00b99a9400b8938b00b99a9401b8938b00e9d5d700ffffff04f4f6f900ecf3f500 +e8ecef00d9dcde00cbcccd01bbbcbd01b4b4b400abacad00b4b4b403a4a5a400795b5405 +a88c8600b8938b00b99a9407c7998d00b99a9403b8938b00b99a9400b8938b00b99a9401 +b8938b00c7998d00b99a9400b8938b00b99a9400c8aca500ffffff17c4c5c500675c5a00 +684f4904795b5400684f4900675c5a0176524a0087747000c6bcba00ecf3f500e8ecef00 +e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a40487747000684f4900 +55454100684f49007c3a3c00684f49057764600097848100a7847c00987c7500a7847c01 +987c7500a7847c00987c750097848100a77c7000987c7501a7847c00987c7500a7847c00 +97848100a7847c0197848100a7847c00cbcccd00e0e4e700d9dcde00d2d4d600c4c5c500 +bbbcbd00b4b4b400abacad009c9e9c0477646000684f490b8a635800a7847c0097848100 +a7847c05a88c8600a7847c0297848100a7847c0097848100a7847c0097848100a7847c00 +97848100a7847c00e6dcdc00ffffff0ff4f6f901e8ecef00e0e4e700987c7500876d6707 +87747000986d6200876d67028a635800876d67038774700097746b00876d6701684f4900 +675c5a00684f4901675c5a00684f490899939300ffffff12ecf3f500a89a950087747000 +876d670397746b008774700197746b008774700097746b008774700097746b0087747000 +97746b008774700097746b0187747000987c750097746b00987c750097746b00987c7500 +876d670076524a00675c5a00684f4900675c5a0076524a00684f4900675c5a00684f4902 +b4b4b400f4f6f902ecf3f501e8ecef00e0e4e700d9dcde00c4c5c50097746b00876d6702 +8774700097746b00876d670087747000986d62008774700197746b00987c750097746b00 +987c750297848101a7847c00978c8a00a7847c00987c7500795b540077646001795b5400 +77646000795b540077646002a89a9500ffffff12f4f6f901e8ecef00e0e4e700c7b5b100 +978c8a00a7847c00978c8a00a7847c00a88c861197746b0077646000795b540077646001 +b8adaa00ffffff10ecf3f500e8ecef00e6dcdc00d2d4d600a8949000a7847c0097848101 +a7847c0097848102a7847c00978c8a0097848100a7847c0097848103a7847c00978c8a00 +a7847c00a88c860fa7847c00978c8a00a88c860097848100a88c8603a8949000a88c8600 +a8949000987c750077646000795b5401b8adaa00ffffff14f4f6f900e8ecef00e0e4e700 +d9dcde00d2d4d600d8cccb00cbcccd00c4c5c500d8cccb00c4c5c501cbcccd00c4c5c500 +b7a4a000a8949000a88c860eb8938b00a88c8600b78d8500a8949000a88c860da7847c00 +a88c8600a7847c00a88c8600b99a9400ffffff16ecf3f500e8ecef00d9dcde01d2d4d600 +cbcccd00c4c5c501bbbcbd00c4c5c500bbbcbd00c4c5c500bbbcbd03a4a5a40077646000 +a88c8600a8949004a88c8613a8949000a88c8600a8949002b8938b00a88c8600a8949000 +b8938b00a8949001b99a9400a8949000b8938b00a8949000b8938b00a89a9500b8938b00 +a8949000b8938b00a89a9500b99a9401a8949000b99a9402e0e4e700ffffff06ecf3f500 +e0e4e701d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b402abacad00b4b4b401b8adaa00 +8774700077646000795b540177646000795b540087747000b8938b01b99a9403b8938b00 +b99a9400b8938b00b99a9401b8938b00b99a9407b8938b00b99a9401e6dcdc00ffffff0f +f4f6f901ecf3f501f4f6f901ffffff00f4f6f9009c9e9c00684f490a87747000a88c8600 +a8949000e0e4e700ecf3f500e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00abacad01 +a4a5a40377747400684f490055454100684f4900584c4800684f490055454100684f4903 +885a4e0097848100a77c700097848101987c7500a7847c0097848100a77c700097848100 +a7847c0097848100a7847c0097848100a7847c0097848100a7847c01978c8a00a7847c00 +a88c8600cbcccd00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a401 +9c9e9c01a89a95009c9e9c0077646000684f490b77646000a7847c00987c750097848103 +a7847c0097848100a7847c0097848100a7847c0097848100a7847c0097848102a7847c00 +97848100a7847c00978c8a00e6dcdc00ffffff10f4f6f900e8ecef01b7a4a000876d6701 +8a635800876d6709776d6b008a635800876d670677646000684f490a584c4800684f4901 +a89a9500ffffff10f4f6f900d8cccb00876d67078774700097746b0087747001987c7500 +8774700097746b00867c7b0097746b00867c7b0097746b00867c7b0097746b00867c7b00 +8774700197746b00876d6700675c5a00684f4902675c5a00684f4904b8adaa00f4f6f904 +e8ecef00e0e4e700d9dcde00d2d4d60099939300986d6200876d670797746b0087747001 +987c7500867c7b00987c750097848100987c750097848101a7847c0097848101876d6700 +795b540077646004675c5a00795b540077646000978c8a00ffffff11f4f6f900e8ecef00 +e0e4e700cbcccd00978c8a00a7847c0097848101a88c8600978c8a00a7847c00978c8a00 +a88c8601a8949000a88c8601a8949000a88c8607a7847c0077646004ffffff10e8ecef01 +e0e4e700d9dcde00a89a950097848105a7847c0097848106a7847c0097848101a7847c00 +97848100978c8a00a88c8600978c8a00987c750077646000a88c8601a8949000a88c8608 +a7847c0097848100a88c860097848100a88c8605a89490008774700077646000675c5a00 +795b5400d9dcde00ffffff13f4f6f901e8ecef00e0e4e700d2d4d601cbcccd01c4c5c500 +cbcccd00c4c5c502c6bcba00a8949000a88c8603a7847c00978c8a00a7847c00a88c8609 +a8949000a88c8601a8949001a88c8600a8949000a88c8607978c8a00a88c860097848100 +a88c860097848100e8ecef00ffffff16f4f6f901e0e4e700d9dcde00d2d4d600cbcccd01 +c4c5c502bbbcbd01c6bcba00bbbcbd00c4c5c500bbbcbd00c6bcba00a4a5a400876d6700 +978c8a00b8938b00a88c8600a8949000a88c8601a8949000a88c8603978c8a00a88c860a +a8949000a88c8604a8949004a89a9500b8938b00a8949001a89a9500b99a9400a89a9500 +b8938b00a89a9500b99a9400a89a9500b99a9401a89a9500b99a9401b7a4a000ffffff08 +f4f6f900ecf3f500e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b405abacad00 +99939300795b540077646000675c5a00795b540177646000a8949000b99a9400b8938b00 +b99a9400b8938b00b99a9403b8938b00b99a9403b8938b01b99a9400b8938b01b99a9400 +b8938b00c7b5b100ffffff10ecf3f501e8ecef03ecf3f500e0e4e700867c7b0055454103 +584c4802684f4900584c4800684f490197746b00a88c860097848100a7847c00bbbcbd00 +e8ecef00e0e4e700d2d4d601c4c5c500b4b4b401a4a5a4048774700055454100684f4900 +55454100684f4900584c48007c3a3c00684f490055454101684f4900795b5400a77c7000 +97848100987c7500a7847c00987c750097848100a7847c0097848100987c750097848100 +987c750097848100a7847c0097848101a7847c0097848100a88c8601978c8a00cbcccd00 +e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c0099939300 +9c9e9c02675c5a0055454104684f49068a63580097848100987c7502a77c700097848100 +a7847c00978c8a00a7847c0097848103987c7500a7847c0097848103a7847c00d9dcde00 +ffffff10f4f6f900ecf3f500e8ecef00cbcccd00876d6701776d6b008a635800876d6705 +776460008a635800776d6b0077646000776d6b008a635800776d6b00876d670287747000 +876d6701684f4904584c4800684f4900584c4800684f4900584c4800684f4901584c4801 +684f4900867c7b00e8ecef00ffffff0ed9dcde0087747000876d6703776d6b00876d6703 +8774700497746b0087747000867c7b008774700197746b008774700297746b00867c7b00 +876d6700684f4907584c4800684f4900b4b4b400f4f6f900ffffff00f4f6f902e8ecef00 +e0e4e700e6dcdc00d2d4d600b4b4b400876d670087747000876d67068774700197746b00 +867c7b0097746b00867c7b00987c750097848101a7847c0097848101a88c860097848100 +776d6b0077646000795b5400675c5a00795b540077646000795b5400675c5a0077646000 +795b540087747000d2d4d600ffffff0ef4f6f900ecf3f500e0e4e700d8cccb00a88c8600 +97848106a88c8600978c8a00a88c8602a8949000a88c8601a8949000a88c8602a8949000 +a88c8601867c7b0077646000795b540077646000795b5400a4a5a400ffffff0ff4f6f900 +e8ecef00e0e4e700e6dcdc00b8adaa0097848100987c750097848100987c750097848104 +987c750097848100987c750097848101987c750097848102978c8a00a7847c0097848100 +a88c86009784810077646000675c5a00978c8a00a88c8600978c8a00a88c8600978c8a01 +a88c8600978c8a01a88c8600978c8a01a88c8600978c8a00a7847c00978c8a00a88c8600 +978c8a00a88c8601a8949001a88c8601776d6b00795b5400675c5a0077646000ffffff14 +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500cbcccd00c4c5c501 +cbcccd00c4c5c501a89a9500a88c8600978c8a00a7847c00978c8a0097848100a88c8600 +97848100a88c8600978c8a00a7847c00978c8a0097848100a88c8600978c8a00a88c8600 +978c8a00a88c8609978c8a00a88c860097848100978c8a00a7847c00978c8a00a7847c00 +97848100978c8a0097848100a8949000ffffff18f4f6f900e8ecef01d9dcde00d2d4d601 +cbcccd00c4c5c501bbbcbd00c4c5c500bbbcbd01c6bcba00bbbcbd02a4a5a40087747000 +97848100a8949000a88c8603978c8a01a88c860097848100a7847c00978c8a0097848100 +978c8a00a88c8600978c8a00a88c8600978c8a00a88c8600978c8a00a88c8600978c8a00 +a88c8602a8949000a88c8600a8949000b8938b00a8949000b8938b00a8949001b8938b00 +a8949000a89a9500b99a9400a8949001a89a9500b99a9400a89a9500b99a9400a89a9500 +b99a9400a89a9500b99a9400a89a9500c4c5c500ffffff09f4f6f900ecf3f500e0e4e700 +d9dcde00d2d4d600c4c5c500bbbcbd01b4b4b402abacad00b4b4b401abacad0077646000 +675c5a00795b5400675c5a0077646000795b5400a88c8600a89a9500b99a9400a89a9500 +b99a9401a8949000b99a9401a8949000b99a9400b8938b00b99a9400a8949000b99a9401 +a89a9500b99a9400a89a9500b99a9401d8cccb00ffffff0ef4f6f900ecf3f500e0e4e702 +d9dcde00e0e4e701b4b4b400675c5a0055454109684f4900867c7b0097848103a8949000 +e0e4e701d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b400a4a5a40487747000684f4900 +584c480055454100684f490055454100584c4800684f490055454100684f490055454100 +795b540097848100987c750097848100987c750097848100987c750097848106a7847c00 +978c8a0097848100a88c860097848100a88c860097848100d2d4d600e0e4e700d2d4d601 +c4c5c500bbbcbd00b4b4b400a4a5a4019c9e9c03675c5a0055454102684f490055454105 +684f49005545410077646000987c750297848100987c750197848104987c750097848100 +987c750097848100987c750097848100a7847c0097848101e6dcdc00ffffff10f4f6f900 +ecf3f500e8ecef00e0e4e700978c8a0077646000876d670077646000776d6b0077646001 +776d6b0077646000776d6b0077646000776d6b008a63580077646001776d6b0077646002 +776d6b00876d670077646001876d6700675c5a00584c4800684f4900584c4800684f4900 +584c4800684f4900584c4800684f4900584c4802684f4900584c480177646000bbbcbd00 +ffffff0cd9dcde00867c7b00876d6701776d6b00876d6700776d6b00876d6701776d6b00 +876d670087747000876d67008774700597746b0087747003876d67018774700177646000 +684f4902584c4800684f4900584c4804b4b4b400ffffff03f4f6f901e0e4e701d9dcde00 +d8cccb0097848100876d670787747004867c7b00987c750397848104876d6700675c5a00 +795b540077646000675c5a0077646000675c5a0077646000675c5a01795b540099939300 +f4f6f900ffffff0bf4f6f901e8ecef00c4c5c50097848101987c750097848100987c7500 +97848102a7847c0097848101a88c8600978c8a00a88c8600978c8a00a88c8600978c8a00 +a88c860199939300a88c860199939300a88c860077646004f4f6f900ffffff0ef4f6f900 +e8ecef00e0e4e700d9dcde00c6bcba0097848108867c7b00987c7500867c7b00987c7500 +867c7b00987c750097848100987c750097848101a7847c00978c8a01a88c8600776d6b00 +76524a00867c7b00c4c5c500a89a950097848100978c8a0097848100a88c8600978c8a00 +a88c8600978c8a00a88c8600978c8a00a88c8600978c8a00a88c8600978c8a00a88c8600 +97848100978c8a01a88c860099939300a88c8600a8949000a88c8600978c8a0077646000 +684f4900675c5a00867c7b00ffffff14e8ecef01d9dcde00d2d4d601d8cccb00c4c5c500 +cbcccd00c4c5c503bbbcbd0097848100a88c860097848101a88c860097848100a88c8600 +978c8a00a88c860097848100a88c860097848100a7847c0097848100978c8a00a7847c00 +978c8a0097848100978c8a03a88c8600978c8a00a88c860097848100978c8a0097848101 +a7847c00978c8a0097848100978c8a01a7847c00978c8a00e9d5d700ffffff19f4f6f900 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01c4c5c502bbbcbd00c4c5c500bbbcbd01 +c4c5c500bbbcbd00c6bcba00b8adaa00776d6b0097848100a8949001a88c8600978c8a00 +a88c8600978c8a00a7847c0097848102a7847c0097848102a88c8600978c8a00a88c8600 +978c8a00a88c8601978c8a00a88c8600978c8a00a88c8600a8949000a88c8600a8949001 +a89a9500b99a9400a89a9501b99a9400a89a9500a8949001a89a9500b8938b00a89a9500 +b99a9400a8949000b99a9400a89a9500b99a9400a89a9500d7c4bd00ffffff0becf3f500 +e8ecef00d9dcde00d2d4d600c4c5c501bbbcbd00b4b4b404abacad00b4b4b40088848400 +795b5400675c5a0077646000795b5400675c5a00876d6700a8949001b99a9400a89a9500 +a8949000b99a9400a8949000a89a9500b99a9401a89a9500a8949000b99a9400a89a9500 +b99a9400a8949000b99a9401a8949000a89a9500b99a9400e6dcdc00ffffff0cecf3f501 +e0e4e701d9dcde00d2d4d601cbcccd008c8b8c005545410a684f490087747000987c7502 +97848100987c750088848400c4c5c500e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00 +b4b4b400a4a5a4048774700055454100684f490055454100684f4900584c4800684f4900 +55454100684f490055454100584c4800795b5400987c750097848101987c750097848100 +987c750097848100987c750197848104a88c860097848100978c8a01a88c8600978c8a00 +cbcccd00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00abacad019c9e9c0476524a00 +5545410b795b5400867c7b00987c7500867c7b00987c750197848100987c750297848100 +987c750097848100987c750197848101987c750097848102d9dcde00ffffff11f4f6f900 +e8ecef01c6bcba00776d6b00776460028a635800776d6b008a63580077646006795b5400 +77646004776d6b0077646002795b5400584c4800684f4900584c4800684f4900584c4801 +684f4900584c4800684f490055454100584c480055454100584c48005545410187747000 +cbcccd00ffffff09c4c5c50087747000876d670077646000876d6700776d6b0077646000 +876d6700776d6b00876d670177747400876d670087747000876d670087747003867c7b00 +87747003876d670077747400876d67018774700077646000584c4804684f4900584c4801 +684f4900584c4800b4b4b400ffffff03f4f6f900ecf3f500e8ecef00e0e4e700d9dcde00 +d2d4d600b8adaa0077646000876d6700776d6b00876d6700776d6b00876d6701776d6b00 +876d670087747003987c750087747000867c7b0088848400987c750088848400987c7501 +97848101978c8a00987c750077646000675c5a00795b5400675c5a00795b5400675c5a00 +77646001675c5a0077646000675c5a009c9e9c00f7ece700ffffff08f4f6f901e0e4e700 +b7a4a00097848101867c7b0097848103987c7500978c8a0097848100978c8a00a88c8600 +978c8a00a88c8600978c8a00a88c8600a8949000978c8a00a88c8600978c8a00a88c8600 +99939300978c8a00a88c86008774700077646001675c5a0077646000a89a9500ffffff0e +f4f6f900e8ecef01e0e4e700cbcccd00978c8a0097848107987c7500867c7b00987c7500 +867c7b00987c7500867c7b009784810188848400987c750097848102a7847c0087747000 +684f4900675c5a00c4c5c500d8cccb00c6bcba00a88c8600978c8a0097848100978c8a00 +97848100a88c8600978c8a01a88c8600978c8a00a88c8600978c8a01a88c8600978c8a00 +a88c8601978c8a00a88c8600a894900099939300a88c8600978c8a0097848100675c5a00 +684f490199939300ffffff13f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01 +c4c5c500cbcccd00c4c5c501d7c4bd00c4c5c500a894900097848104978c8a00a7847c00 +978c8a0197848101978c8a00a7847c0097848100978c8a0097848103a7847c00978c8a01 +a88c8600978c8a0097848106a7847c0097848101a8949000ffffff1bf4f6f900e8ecef00 +e0e4e700d9dcde01cbcccd01c4c5c501bbbcbd01c4c5c500bbbcbd03b4b4b400684f4901 +87747000978c8a01a7847c00978c8a0097848101978c8a0097848103a7847c00978c8a01 +a88c8600978c8a00a88c8600978c8a00a88c8600978c8a00a88c8600a894900199939300 +a8949003a89a9500a8949000a89a9500a8949000a89a9500b99a9400a89a9504b99a9400 +a89a9503a8949000e6dcdc00ffffff0aecf3f500e8ecef00e0e4e700d9dcde00cbcccd00 +c4c5c500bbbcbd00b4b4b401abacad00b4b4b403a4a5a400675c5a01684f4900675c5a00 +795b5400675c5a00a88c8600a8949004b99a9400a8949000a89a9500a8949000b99a9400 +a89a9500a8949000a89a9500a8949000a89a9500b99a9400a89a9500a8949000b99a9400 +a8949000a89a9500e0e4e700ffffff09ecf3f501e8ecef00e0e4e700d9dcde00d2d4d601 +cbcccd00abacad00636465005545410a77646000987c7500867c7b01987c7500867c7b00 +987c75019784810099939300e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b400 +a4a5a40477747400584c480055454100684f490055454100684f490055454100684f4900 +55454100684f4901675c5a0097848100987c750197848100867c7b0097848100987c7500 +8884840097848100987c750097848106978c8a0097848100978c8a00cbcccd00e0e4e700 +d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b400a4a5a4009c9e9c0399939300675c5a00 +5545410b76524a0087747000987c750087747000987c7500867c7b0087747000867c7b00 +987c7500867c7b00987c7501867c7b02987c750088848400987c750097848100987c7500 +978c8a00e6dcdc00ffffff11f4f6f900ecf3f500e8ecef00e6dcdc00867c7b0077646004 +675c5a0077646000795b540077646002795b54007764600c684f4900584c480455454101 +584c480055454102584c48005545410277747400bbbcbd00ffffff05e0e4e700a89a9500 +77646000876d6700776d6b0177646000876d6700776d6b0077646000776d6b01876d6700 +776d6b00876d6700776d6b0087747000876d6700877470097774740087747000776d6b00 +77646000684f4900584c4801684f4900584c4805b4b4b400ffffff04f4f6f900e8ecef00 +e0e4e701d2d4d600cbcccd00867c7b00876d670077646000876d6701776d6b00876d6701 +776d6b0087747000876d670087747000876d670087747000867c7b0087747000867c7b00 +987c7500867c7b01888484009784810288848400987c750087747000675c5a0077646000 +675c5a0077646000675c5a03795b5400675c5a01978c8a00c4c5c500ffffff05f4f6f900 +ecf3f500c6bcba00978c8a0088848400987c75008884840097848100867c7b0097848100 +867c7b0097848104978c8a02a88c8600978c8a01a88c8600978c8a0099939300a88c8600 +978c8a00a88c8600978c8a0077646000675c5a0077646000675c5a0077646000f4f6f900 +ffffff0ee8ecef01e6dcdc00d2d4d600a8949000978c8a0097848103978c8a0097848101 +978c8a009784810088848400987c750088848400867c7b00987c7500867c7b00987c7500 +9784810188848400987c750097848100867c7b00684f490054545500b8adaa00cbcccd01 +c4c5c500b8adaa0097848100a88c860097848100a88c8600978c8a01a88c8600978c8a00 +a88c860099939300a88c8600978c8a00a88c8600978c8a00a88c8600978c8a00a88c8600 +99939300978c8a00a88c8600978c8a0287747000684f490054545500684f4900bbbcbd00 +ffffff12f4f6f901e0e4e700d9dcde00d2d4d600cbcccd01d8cccb00c4c5c501cbcccd00 +c4c5c501b8adaa0097848101978c8a0097848102978c8a0097848101a88c860097848103 +987c750097848101987c75009784810388848400987c750097848101987c750088848400 +987c750097848104d8cccb00ffffff1cf4f6f900e8ecef00e6dcdc00d9dcde00d2d4d600 +cbcccd00c4c5c503bbbcbd00c6bcba00bbbcbd00c4c5c500bbbcbd009c9e9c00584c4800 +684f4900584c480087747000a7847c00978c8a0097848100a88c8600978c8a00a7847c00 +97848100987c750097848101978c8a01a88c860199939300a88c860099939300a88c8600 +99939300a88c860099939300a8949001a89a9506b99a9400a89a9501a8949000b99a9400 +a89a9500b99a9400a89a9503a8949000b99a9400a89a9501e6dcdc00ffffff0aecf3f500 +e0e4e700d9dcde00cbcccd01bbbcbd01b4b4b403abacad00b4b4b401867c7b00684f4900 +675c5a0387747000a8949003a89a9501a8949000a89a9500a8949004b99a9400a8949000 +a89a9500a8949000a89a9500a8949003d2d4d600ffffff06ecf3f502e0e4e701d9dcde00 +d2d4d600cbcccd00abacad006a6c6e00584c480055454105463d3c0055454102684f4900 +876d6700987c7500867c7b00987c7500867c7b06c4c5c500d9dcde00d2d4d600c4c5c500 +bbbcbd00b4b4b400a4a5a4048774700055454100584c480055454104684f490055454100 +584c4800675c5a0097848101867c7b00987c7500867c7b0097848100867c7b00987c7500 +867c7b00987c750088848400987c75008884840097848102978c8a0097848100978c8a01 +cbcccd00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c03 +a89a9500675c5a00554541047c3a3c0055454105675c5a00867c7b0087747002867c7b00 +87747001867c7b0087747000867c7b0087747000867c7b00987c7500867c7b00987c7500 +867c7b0097848102978c8a00d9dcde00ffffff12f4f6f900e8ecef00e0e4e700b8adaa00 +77646001675c5a00795b5400675c5a0077646000795b54006364650077646000675c5a00 +77646000636465007764600d675c5a00584c480055454105584c480055454103584c4800 +4544450055454101684f490099939300cbcccd00ecf3f500e8ecef00b4b4b40087747000 +77646000776d6b0077646000776d6b0077646000776d6b0077646001776d6b01876d6700 +776d6b00876d6700777474008774700177747400877470007774740087747001867c7b00 +8774700077747400877470007774740087747000876d6700777474008774700077646000 +584c4803684f4900584c4800684f4900584c4800684f4900584c4800bbbcbd00ffffff04 +f4f6f901e8ecef00e6dcdc00d9dcde00d2d4d600b8adaa00876d6700776d6b00876d6700 +776d6b00876d6700776d6b00876d6700776d6b00876d6700776d6b008774700077747400 +876d670087747001867c7b0087747000867c7b00987c750188848400987c750097848103 +88848400876d6700675c5a00795b5400675c5a00795b5400675c5a0077646000675c5a00 +795b5400675c5a027764600088848400b8adaa00c4c5c500d9dcde00d2d4d600c4c5c500 +a88c860088848400867c7b00987c7500867c7b0097848100867c7b009784810288848400 +987c75008884840097848100978c8a01a88c8600978c8a01a8949000978c8a01a88c8600 +978c8a02a88c8600867c7b0077646000675c5a0077646000675c5a00b4b4b400ffffff0e +ecf3f500e8ecef00e0e4e700d9dcde00a4a5a400a88c8600978c8a0197848100978c8a00 +97848101978c8a009784810388848400987c7500867c7b01978481008884840097848102 +88848400867c7b00675c5a00684f490097848100d2d4d600cbcccd03a89a950097848100 +978c8a0097848100978c8a00a88c8600978c8a01a88c8600978c8a00a894900099939300 +978c8a00a894900099939300a88c860099939300978c8a00a88c8600978c8a0297848101 +776d6b00684f4900584c480054545500e6dcdc00ffffff12ecf3f500e8ecef00e0e4e700 +d9dcde00d2d4d600cbcccd00c4c5c500cbcccd00c4c5c501cbcccd00c4c5c50197848101 +987c750097848100978c8a009784810688848400867c7b00987c7500867c7b02987c7500 +88848400987c750088848400987c7500867c7b03987c7500867c7b029784810088848400 +97848100ffffff1df4f6f900ecf3f500e8ecef00d9dcde01d2d4d600cbcccd00c4c5c501 +bbbcbd03c6bcba00bbbcbd00867c7b00584c480287747000978c8a0097848100a88c8600 +978c8a0097848104978c8a00a88c8600978c8a00a88c860099939300a88c860099939300 +a88c860099939300a894900099939300a894900199939300a8949000a89a9500a8949000 +a89a9504a8949000a89a9503a8949000a89a9500a8949000a89a9504a8949000a89a9500 +e0e4e700ffffff09ecf3f500e8ecef00e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd00 +b4b4b406a4a5a400675c5a01684f4900675c5a00684f4900675c5a00a8949004a89a9502 +a8949000a89a9500a8949001a89a9500a8949002a89a9500a8949005c6bcba00f4f6f900 +ffffff01f4f6f900ecf3f501e8ecef00e0e4e701d9dcde00d2d4d600b4b4b4008c8b8c00 +675c5a0045444500584c480055454109795b5400867c7b0387747000867c7b00987c7500 +867c7b00987c7500867c7b00987c7500867c7b00a4a5a400d9dcde00cbcccd00c4c5c500 +bbbcbd00b4b4b400a4a5a40477747400584c4804684f490055454102684f4900675c5a00 +987c7500867c7b01987c7500867c7b01987c7500867c7b0088848400987c7500867c7b01 +978481008884840097848105cbcccd00e0e4e700d2d4d601c4c5c500bbbcbd00b4b4b400 +a4a5a4009c9e9c04675c5a00463d3c0055454100463d3c0055454100463d3c0055454106 +76524a00867c7b00987c750087747000867c7b0087747001867c7b0087747001867c7b00 +87747001867c7b0197848100867c7b0097848101978c8a01e6dcdc00ffffff12f4f6f900 +ecf3f500e8ecef00d9dcde007774740077646000675c5a0077646000675c5a0077646000 +675c5a0177646000675c5a0077646003675c5a0077646000675c5a00795b540063646500 +77646002776d6b0077646000776d6b0177646001675c5a00584c480155454100584c4800 +5545410345444500554541004544450055454101454445005545410045444500584c4800 +776d6b00867c7b008774700077646000776d6b0077646000776d6b0077646000876d6700 +776d6b0277646000876d6700776d6b03876d670077747400877470027774740087747001 +867c7b0187747000867c7b0087747000777474008774700177646000584c4802684f4900 +584c480054545500684f4900584c480054545500684f4900b4b4b400ffffff05f4f6f900 +e8ecef00e0e4e701d2d4d600cbcccd00867c7b0087747001876d670077747400876d6700 +776d6b0087747000776d6b00877470007774740087747003867c7b01987c750088848401 +987c7500888484008c8b8c00978481008c8b8c00978481028c8b8c008774700077646000 +63646500675c5a0963646500876d6700867c7b0097848100867c7b0088848400987c7500 +88848400867c7b0088848400987c75008884840097848100888484009784810088848400 +97848102978c8a01a88c8600978c8a04a88c8600978c8a00999393009784810077646001 +675c5a0187747000ffffff0ef4f6f900e8ecef00e0e4e700d9dcde00b8adaa0097848100 +978c8a00a7847c00978c8a0197848100978c8a0097848100978c8a0097848100978c8a00 +978481018884840097848100867c7b0097848100888484009784810288848400987c7500 +77646000584c4800776d6b00cbcccd05c4c5c50097848101978c8a0097848100978c8a0f +97848102867c7b00675c5a00584c4801675c5a00ffffff12f4f6f901e0e4e700d9dcde00 +d2d4d600d8cccb00cbcccd00c4c5c500cbcccd00c4c5c503a4a5a400867c7b0097848100 +8884840097848102978c8a0097848100978c8a0097848101867c7b0097848100867c7b01 +987c7500867c7b01987c7500867c7b0cc6bcba00ffffff1ef4f6f900e8ecef00e0e4e700 +d9dcde00d2d4d600cbcccd00c4c5c501bbbcbd01c4c5c500bbbcbd02675c5a00584c4801 +684f4900867c7b0097848100978c8a02a88c8600978c8a0397848100978c8a00a88c8600 +978c8a00a8949000978c8a00a894900099939300a894900099939300a894900199939300 +a8949000a89a9500a8949000a89a9500a8949000a89a9500a8949000a89a9500a8949000 +a89a9503a8949000a89a950af4f6f900ffffff08f4f6f900ecf3f500e0e4e700d9dcde00 +cbcccd00c4c5c500bbbcbd01b4b4b401abacad00b4b4b401abacad00b4b4b400867c7b00 +675c5a01684f4900675c5a018774700099939301a8949001a89a9501a8949000a89a9500 +a8949000a89a9500a8949000a89a9500a8949000a89a9500a8949001a89a9500a8949000 +a89a950099939300a8949000978c8a0099939300b8adaa00e0e4e700ecf3f501e8ecef00 +e0e4e700d2d4d600bbbcbd009c9e9c007b7b7d00585c5e00554541004544450055454100 +584c480055454100584c480055454100584c480055454100584c480055454101584c4800 +795b540087747000867c7b0387747000867c7b0187747000867c7b0087747000867c7b00 +87747000867c7b0088848400cbcccd00d2d4d600c4c5c500bbbcbd00abacad01a4a5a403 +87747000584c480055454101584c480055454100584c4804675c5a009784810088848400 +97848100867c7b0097848100867c7b0088848400987c7500867c7b01987c750088848400 +97848102978c8a018c8b8c0097848100978c8a00c4c5c500e0e4e700d9dcde00d2d4d600 +c4c5c500bbbcbd00b4b4b400a4a5a4019c9e9c03684f4900463d3c0155454100463d3c00 +55454101463d3c0155454103684f4900867c7b0297746b00867c7b0187747004867c7b00 +87747000867c7b00987c75008884840097848102978c8a00d9dcde00ffffff12f4f6f900 +ecf3f500e8ecef00e0e4e700b8adaa00675c5a00776460006364650077646000675c5a00 +776460006364650077646000675c5a007764600063646500776460006364650077646000 +63646500776460006364650077646001636465007764600063646500776460006a6c6e00 +776460006364650077646002675c5a00584c480145444500554541004544450055454105 +584c4800675c5a0077646000877470007774740087747000776d6b0077747400876d6700 +776d6b0277646000776d6b00876d6700776d6b02876d6700776d6b0087747000776d6b00 +77747400877470007774740087747000777474008774700077747400877470007b7b7d00 +87747000867c7b0087747000867c7b01877470007b7b7d00776d6b00584c4800684f4900 +54545500584c4800684f490054545500584c4800675c5a00584c480054545500c6bcba00 +ffffff05f4f6f900ecf3f500e8ecef00d9dcde01d2d4d600b4b4b400776d6b0087747000 +777474008774700177747400876d670077747400877470027b7b7d00867c7b0187747000 +867c7b02987c750088848401987c750097848101978c8a0097848102978c8a0097848100 +8884840087747000776d6b0077646000675c5a0077646000675c5a0077646000776d6b00 +87747000867c7b00978481008884840097848100867c7b009784810088848400867c7b01 +987c7500867c7b0088848400867c7b0088848400987c750088848400978481008c8b8c00 +88848400978c8a0b87747000675c5a03d2d4d600ffffff0df4f6f900e8ecef00e0e4e700 +e6dcdc00c6bcba00978c8a0297848100978c8a0097848100978c8a0097848100978c8a00 +97848101888484009784810088848401987c750088848400987c75008884840097848100 +8884840097848101776d6b00584c4800684f4900bbbcbd00d2d4d602cbcccd03b8adaa00 +8884840097848102978c8a0d97848100978c8a0088848400978481008884840087747000 +584c480055454100584c480077747400ffffff12ecf3f500e8ecef00e0e4e700d9dcde00 +d2d4d600cbcccd01c4c5c501cbcccd00c4c5c500cbcccd00c6bcba00978c8a0088848400 +97848101978c8a01978481008c8b8c00978c8a0097848100888484009784810088848400 +867c7b0088848400867c7b0188848400867c7b0088848400987c7500867c7b0187747003 +867c7b0087747000867c7b01987c7500ffffff20ecf3f500e8ecef00d9dcde01cbcccd01 +c4c5c500c6bcba00bbbcbd03a4a5a40055454101584c4800684f4900978c8a0097848100 +978c8a0097848100978c8a0397848100978c8a0399939300978c8a00a8949000978c8a00 +a8949000978c8a00a894900099939301a894900099939300a89490009c9e9c00a8949000 +9c9e9c00a8949000a89a9500a8949000a89a9501a8949000a89a9506a8949000a89a9504 +a8949000a4a5a400ffffff09ecf3f500e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500 +bbbcbd00b4b4b403abacad00b4b4b401a4a5a400675c5a00584c4800675c5a0054545500 +675c5a01978c8a00a894900099939300a89a9500a8949000a89a9500a8949000a89a9500 +99939300a894900099939300a89a950099939300a89a950099939300a89a95009c9e9c00 +a894900099939300a894900099939300a8949000978c8a01a89a95009c9e9c0088848400 +777474006a6c6e00584c480355454100584c480055454101454445005545410145444500 +55454101584c4800675c5a0077646000867c7b0188848400987c7500867c7b0087747001 +867c7b0087747001867c7b0087747001867c7b0087747000867c7b0097848100abacad00 +d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a40477747400584c480255454100584c4800 +55454102584c480055454100675c5a0097848100867c7b009784810088848400867c7b00 +97848100867c7b008884840097848100867c7b0088848400978481008c8b8c0097848100 +8c8b8c00978c8a00978481018c8b8c0097848100cbcccd00e0e4e700d9dcde00cbcccd00 +c4c5c500bbbcbd00b4b4b400a4a5a4009c9e9c02999393009c9e9c0054545500463d3c05 +55454100463d3c0055454100463d3c0055454101684f4900867c7b0187747000867c7b01 +87747000867c7b0387747000867c7b0288848400867c7b0097848101978c8a0097848100 +e0e4e700ffffff13f4f6f900ecf3f500e0e4e700d9dcde007b7b7d007764600163646500 +77646000675c5a0077646000675c5a007764600063646500795b540063646500675c5a00 +77646000675c5a0177646000675c5a007764600063646500776460006364650077646000 +636465007764600263646500776d6b00675c5a0077646000675c5a02684f490054545500 +684f490054545500585c5e00675c5a0077646000776d6b0077747401867c7b0087747000 +7774740087747000876d6700776d6b0487747000776d6b0077747400876d6700776d6b06 +8774700077747401877470007b7b7d008774700077747400867c7b06776d6b00684f4900 +54545500684f490054545500684f490054545500684f490054545500684f490054545500 +bbbcbd00ffffff06f4f6f900e8ecef01d9dcde00d2d4d600d8cccb00978c8a00776d6b00 +8774700077747400877470007774740087747000777474008774700077747400867c7b03 +88848400867c7b0088848400987c750088848401987c7500888484008c8b8c0097848100 +8c8b8c00978481008c8b8c00888484008c8b8c0097848101888484009784810088848400 +978481008884840197848100867c7b0188848400987c750088848400867c7b0097848100 +888484019784810088848400867c7b0488848403978481008884840097848100978c8a08 +9784810063646500675c5a02a89a9500ffffff0df4f6f900e8ecef01d9dcde00cbcccd00 +99939300978c8a0097848100978c8a0197848100978c8a0197848101978c8a0097848100 +978c8a0097848101888484009784810088848400978481008884840097848100867c7b00 +88848400867c7b00684f4900584c48009c9e9c00d9dcde01d2d4d601d8cccb00cbcccd02 +c4c5c500a89a95008884840297848100978c8a0097848100978c8a0597848100978c8a00 +97848100978c8a0088848400978c8a0097848100888484009784810088848400867c7b00 +776d6b00584c4800554541019c9e9c00ffffff12e8ecef00e0e4e700d9dcde00d2d4d600 +d8cccb00c4c5c500d8cccb00c4c5c504a4a5a40097848100978c8a0897848100867c7b00 +97848100867c7b0097848100867c7b067b7b7d00877470007b7b7d007774740087747000 +7774740087747001b8adaa00ffffff20ecf3f500e8ecef00e0e4e700d2d4d601cbcccd00 +c4c5c500bbbcbd01c4c5c500bbbcbd00c6bcba0088848400554541004544450055454100 +63646500867c7b008884840097848101978c8a09a894900099939303978c8a00a8949000 +99939300a894900099939300978c8a00999393009c9e9c00a89490019c9e9c00a8949000 +9c9e9c00a89a950099939300a89a950099939300a89a950099939300a89a950099939300 +a89a950199939300a89a950199939300a89a9501a8949000b8adaa00ffffff08ecf3f500 +e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00b4b4b401abacad00b4b4b403 +abacad008c8b8c00684f490054545500684f4900584c4800675c5a0087747000978c8a01 +99939308a894900099939300a89a950099939300a89490009c9e9c00a89a9500a8949000 +99939302978c8a0099939300978c8a01867c7b0077646000675c5a00584c480855454100 +675c5a01776d6b0087747000867c7b0188848400867c7b0587747000867c7b0087747000 +867c7b0087747000867c7b0087747000867c7b01888484008c8b8c00cbcccd00c4c5c500 +bbbcbd00b4b4b400abacad00a4a5a40377747400584c480055454100584c480455454100 +584c4801675c5a009784810088848400867c7b0097848101888484009784810188848400 +97848100888484008c8b8c0097848100978c8a03978481008c8b8c0088848400c4c5c500 +e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c03a89a9500 +675c5a00463d3c0b545455008774700077747400877470007774740087747001867c7b00 +87747002867c7b0288848400987c7500867c7b0088848402978c8a00d9dcde00ffffff13 +f4f6f900ecf3f500e8ecef00e0e4e700b4b4b40063646500776460006364650077646000 +63646500675c5a0b6364650077646000675c5a0077646000675c5a007764600063646500 +675c5a006364650077646000675c5a00776d6b00675c5a00776d6b00675c5a0077646000 +6a6c6e00776460006a6c6e0077646000776d6b0277747400877470007774740087747000 +7b7b7d00867c7b0077747402876d670077747400776d6b00877470007774740187747000 +776d6b0487747000776d6b0077747400776d6b00877470007774740287747000867c7b01 +77747400867c7b0287747000867c7b00776d6b0054545500684f4900585c5e00684f4900 +54545500684f4900585c5e00684f490054545500684f4900bbbcbd00ffffff06f4f6f900 +ecf3f500e0e4e701d9dcde00d2d4d600bbbcbd0087747000777474008774700077747400 +87747000777474008774700077747400867c7b00877470007b7b7d00867c7b02987c7500 +88848402987c7500888484019784810088848400978481008c8b8c009784810088848400 +97848100888484029784810088848403867c7b0088848400867c7b0088848400867c7b00 +888484009784810088848400867c7b0088848400867c7b06978481008884840097848100 +8884840197848100978c8a09776d6b00675c5a027b7b7d00ffffff0df4f6f900ecf3f500 +e0e4e701d2d4d600a8949000978c8a0097848101978c8a04978481008c8b8c0097848100 +8c8b8c009784810088848400978481008884840097848100888484009784810088848401 +867c7b01675c5a00584c48007b7b7d00e0e4e701d9dcde01d2d4d601cbcccd03c4c5c500 +978c8a0088848401978481008c8b8c00978c8a0788848400978481008c8b8c0097848100 +978c8a0088848403867c7b01675c5a00584c48004544450055454100c4c5c500ffffff11 +ecf3f500e8ecef00d9dcde01d2d4d600cbcccd00c4c5c501d8cccb00c4c5c500cbcccd00 +c4c5c500c6bcba00978c8a0088848400978c8a018c8b8c00978c8a038c8b8c0088848401 +867c7b05877470007b7b7d00867c7b0087747000867c7b00777474008774700077747400 +87747000777474008774700077747400ffffff21f4f6f900ecf3f500e0e4e700d9dcde00 +d2d4d600c4c5c502bbbcbd01c4c5c500bbbcbd0063646500463d3c0055454101776d6b00 +88848400867c7b00978481008884840097848101978c8a02a88c8600978c8a02a88c8600 +99939300978c8a00a88c860099939300a894900099939300a894900099939302a8949000 +99939300a8949000999393009c9e9c00a894900099939300a894900099939300a89a9500 +9c9e9c00a89a950199939300a89a950199939300a89a950199939300a89a950099939300 +a89a950099939300a89a95009c9e9c00c4c5c500ffffff08ecf3f500e0e4e700d9dcde00 +d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b402abacad00b4b4b402abacad006a6c6e00 +684f4900585c5e00684f490054545500675c5a008884840099939300978c8a0199939300 +a894900099939301a894900099939304a89a950099939300a89a950099939302a8949000 +978c8a0099939300978c8a0099939300978c8a0388848400867c7b00776d6b006a6c6e00 +63646500776460006a6c6e00776d6b0077747400867c7b0b87747000867c7b0087747000 +777474008774700077747400867c7b0077747400867c7b0188848400867c7b0097848100 +b4b4b400c4c5c500bbbcbd00b4b4b400a4a5a40477747400584c48034a4c4d00584c4803 +55454100675c5a0088848400867c7b00978481008884840097848100978c8a008c8b8c00 +888484009784810088848400978481018c8b8c00978c8a028c8b8c0188848401c4c5c500 +e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a4009c9e9c0454545500 +463d3c0155454100463d3c08684f49007774740087747000777474008774700077747401 +8774700077747400867c7b017b7b7d00867c7b0288848400867c7b009784810088848401 +97848100d9dcde00ffffff14f4f6f900e8ecef01e0e4e7008c8b8c007764600063646500 +675c5a0263646500675c5a0363646500675c5a02636465007764600063646500675c5a01 +63646501675c5a0463646500675c5a006364650177646000636465007764600063646500 +776460006a6c6e0077646000776d6b02777474017b7b7d00877470007b7b7d0087747000 +777474008774700077747403776d6b0177747400776d6b0277747400776d6b0177747401 +776d6b0077747400776d6b01877470007774740187747000867c7b047b7b7d00776d6b00 +684f490054545501684f490054545501684f4900585c5e00684f490054545500bbbcbd00 +ffffff07ecf3f500f7ece700e0e4e700d9dcde01d2d4d600a4a5a400776d6b0077747401 +87747000776d6b0077747400867c7b00877470007b7b7d00867c7b0087747000867c7b05 +88848403978481008884840a97848100867c7b008884840197848100867c7b0088848401 +867c7b0088848400867c7b0088848400867c7b0888848400987c7500888484018c8b8c00 +88848400978c8a008c8b8c0097848100978c8a0197848100978c8a0087747000675c5a02 +63646500e8ecef00ffffff0de8ecef02d2d4d600a4a5a400978c8a018c8b8c0097848100 +978c8a0197848100978c8a00978481008c8b8c00978c8a009784810088848400978c8a00 +888484009784810088848400978481008884840197848100867c7b01776d6b00584c4800 +675c5a00d9dcde00e8ecef01e0e4e700e6dcdc00d9dcde00d2d4d600cbcccd00d8cccb00 +cbcccd02b4b4b4009784810088848401978c8a07978481008c8b8c00978c8a0088848400 +8c8b8c009784810088848401987c750088848400867c7b0177747400675c5a00584c4800 +5545410054545500e8ecef00ffffff10f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600 +cbcccd02c4c5c504a4a5a400978481008c8b8c00978c8a018c8b8c00978c8a008c8b8c01 +9784810088848400867c7b0477747400867c7b007b7b7d0087747000867c7b0077747400 +877470007774740387747000777474009c9e9c00ffffff22e8ecef01d9dcde00d2d4d600 +cbcccd00c4c5c500c6bcba00c4c5c502b4b4b40055454100463d3c0155454100867c7b01 +88848401978481008c8b8c0097848100978c8a0499939300978c8a0099939300978c8a00 +99939301a89a950099939300a89a950099939301a894900099939303a89a950099939300 +a89a9500999393009c9e9c00a89a950099939300a89a950099939301a89a950099939300 +a894900099939302a89a950099939300a89a950099939300a89a950099939301a8949000 +e8ecef00ffffff07ecf3f501e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b405 +abacad00b8adaa009c9e9c00675c5a0054545501684f490054545500776d6b00978c8a00 +a8949000978c8a009993930ca894900099939301978c8a0099939300978c8a048c8b8c01 +978c8a008c8b8c00978481008884840097848100888484019784810088848401867c7b00 +88848400867c7b0c77747401867c7b04888484008c8b8c009c9e9c00c4c5c500bbbcbd00 +b4b4b400a4a5a40477747400584c48014a4c4d00584c480345444500584c4801675c5a00 +9784810088848400978481008884840397848100888484028c8b8c00978c8a018c8b8c00 +978c8a0288848401c4c5c500e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400 +a4a5a4019c9e9c03684f4900463d3c0a55454100545455008774700077747400776d6b00 +7774740187747000777474027b7b7d0087747000867c7b0388848400867c7b0088848402 +d9dcde00ffffff15f4f6f900e8ecef00e0e4e700cbcccd0063646500675c5a0963646500 +675c5a056364650077646000675c5a016364650077646000675c5a006364650077646000 +675c5a0077646000675c5a006a6c6e0063646500776d6b00776460006a6c6e00776d6b00 +6a6c6e00776d6b01777474018774700077747401877470007774740387747000776d6b00 +77747400776d6b0077747400776d6b0277747400776d6b0177747400776d6b0087747000 +77747400776d6b0177747400776d6b0077747402867c7b0077747400867c7b03776d6b00 +54545500684f4900675c5a0054545500675c5a00684f4900585c5e00584c4800585c5e00 +684f4900bbbcbd00ffffff08ecf3f500e8ecef00e0e4e700d9dcde00d2d4d600d8cccb00 +8884840077747400776d6b00777474018774700077747401867c7b0077747400867c7b00 +7b7b7d0087747000867c7b0488848400867c7b0088848404867c7b0088848400867c7b00 +97848100867c7b0088848400867c7b0088848402867c7b0088848400867c7b0588848400 +867c7b0188848401867c7b0288848400867c7b0088848401867c7b008884840197848100 +978c8a0088848400978c8a008c8b8c01978c8a008c8b8c00867c7b00675c5a03d2d4d600 +ffffff0df4f6f900e8ecef00e0e4e700d9dcde00b8adaa00978c8a078c8b8c00978c8a00 +978481008c8b8c01978481008c8b8c00978c8a008c8b8c00978481008c8b8c0097848100 +88848400867c7b008884840087747000584c480054545500bbbcbd00f4f6f900e8ecef02 +e0e4e700d9dcde01d2d4d601cbcccd03a4a5a40088848402978c8a008c8b8c00978c8a03 +8c8b8c00978c8a008c8b8c00978481008c8b8c0088848404867c7b0088848400867c7b01 +77747400584c48015545410063646500ffffff11ecf3f500e8ecef00d9dcde00d2d4d601 +cbcccd00c4c5c501cbcccd00c4c5c502bbbcbd00888484008c8b8c00978c8a008c8b8c00 +978c8a008c8b8c00978c8a0088848403867c7b017b7b7d00867c7b02777474007b7b7d00 +77747400877470007774740187747000776d6b007774740187747000e8ecef00ffffff22 +ecf3f500e8ecef00d9dcde01cbcccd00c4c5c502cbcccd019c9e9c00463d3c02684f4900 +7b7b7d0087747000867c7b0088848402978481008c8b8c00978c8a0299939300a8949000 +a4a5a400abacad00b8adaa00b4b4b401bbbcbd02b4b4b401abacad00a4a5a400a8949000 +a89a9500999393009c9e9c00999393009c9e9c0099939300a89a950099939302a89a9500 +99939304a894900099939308a89a9500ffffff08ecf3f500e0e4e700d9dcde00d2d4d600 +cbcccd00c4c5c500bbbcbd00b4b4b402abacad00b4b4b401abacad00b4b4b40088848400 +584c480154545500684f4900585c5e0088848400978c8a0099939302978c8a0099939300 +978c8a0099939300978c8a0099939305978c8a0099939301978c8a028c8b8c00978c8a00 +8c8b8c01978c8a0088848400978c8a00888484008c8b8c0088848402867c7b0088848400 +867c7b0188848401867c7b097b7b7d00877470007b7b7d0087747000867c7b0077747400 +867c7b0288848401978481008c8b8c00b4b4b400bbbcbd00b4b4b400abacad00a4a5a403 +77747400584c48004a4c4d00584c480055454100584c4805675c5a0088848401867c7b00 +888484019784810088848400978481008c8b8c00978481008c8b8c00978481008c8b8c00 +978c8a028c8b8c00978481008c8b8c0088848400c4c5c500e0e4e700d9dcde00cbcccd00 +c4c5c500bbbcbd00b4b4b400a4a5a4009c9e9c02a89a95009c9e9c0054545500463d3c08 +55454100463d3c01684f490077747402776d6b0077747400776d6b007774740287747000 +777474007b7b7d0087747000867c7b0488848401d9dcde00ffffff15f4f6f901e0e4e701 +a4a5a400675c5a02585c5e00675c5a00585c5e00675c5a00585c5e00675c5a0163646500 +675c5a0863646500675c5a0063646500675c5a0363646501675c5a007764600063646500 +776d6b0063646500776d6b00776460006a6c6e00776d6b01777474018774700077747400 +7b7b7d00867c7b007774740087747000777474018774700077747401776d6b016a6c6e00 +776d6b0177747401776d6b0077747401776d6b0077747401776d6b017774740187747000 +77747400867c7b04776d6b0054545500675c5a0054545500584c480054545501684f4900 +54545500584c480054545500bbbcbd00ffffff08f4f6f900e8ecef00e0e4e700e6dcdc00 +d9dcde00d2d4d600c4c5c50087747000776d6b01777474008774700077747400867c7b02 +877470007b7b7d00867c7b007b7b7d00867c7b007b7b7d00867c7b0188848400867c7b00 +88848400867c7b0088848400867c7b01888484059784810088848400867c7b0088848400 +867c7b0088848400867c7b037b7b7d00867c7b0588848401867c7b06888484028c8b8c00 +9784810088848400978c8a00888484008c8b8c0077646000585c5e00675c5a01d2d4d600 +ffffff0df4f6f900e8ecef00e0e4e700d9dcde00c6bcba00978c8a048c8b8c00978c8a00 +8c8b8c00978c8a008c8b8c0088848400978c8a0088848400978c8a00888484018c8b8c00 +9784810088848404867c7b00675c5a0054545500978c8a00ffffff02f4f6f900e8ecef01 +e0e4e700d9dcde00d2d4d601cbcccd03c4c5c500978c8a00888484009784810088848400 +8c8b8c00978c8a00999393008c8b8c00978c8a0088848400978c8a00888484008c8b8c00 +978c8a0097848100888484009784810088848400867c7b0088848400867c7b03776d6b00 +584c48005545410045444500867c7b00ffffff10f4f6f900e8ecef00e0e4e700d9dcde00 +d2d4d600cbcccd01c4c5c501cbcccd00c4c5c5029c9e9c00888484008c8b8c0099939300 +978c8a0188848400978c8a0088848401867c7b0288848401867c7b007b7b7d00867c7b01 +77747403776d6b0077747400776d6b007774740099939300ffffff23ecf3f500e8ecef00 +e0e4e700d9dcde00d2d4d602cbcccd00d2d4d601867c7b00463d3c026364650077747400 +867c7b0288848402978c8a0099939300abacad00bbbcbd00c4c5c500cbcccd00c4c5c502 +bbbcbd00c4c5c500bbbcbd00b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400bbbcbd00 +b4b4b400abacad0099939301a894900099939300a89a950099939304978c8a0a99939304 +c4c5c500ffffff07ecf3f501e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd01b4b4b401 +abacad00b4b4b401abacad00b4b4b400abacad0077747400584c480154545500584c4800 +675c5a00978c8a0299939307978c8a0099939300978c8a0199939301978c8a008c8b8c00 +978c8a008c8b8c02978c8a008c8b8c01978c8a008c8b8c00978c8a008c8b8c0097848100 +88848403867c7b0288848400867c7b007b7b7d00867c7b007b7b7d00867c7b0777747401 +7b7b7d00867c7b007b7b7d00867c7b02888484018c8b8c00a4a5a400bbbcbd00b4b4b400 +a4a5a40477747400584c48024a4c4d00584c48004a4c4d00584c48004a4c4d00584c4801 +675c5a0088848400867c7b008884840097848100867c7b00888484008c8b8c0297848100 +8c8b8c01978c8a018c8b8c00978c8a008c8b8c0188848401c4c5c500e0e4e700d9dcde00 +d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c04584c4800463d3c0135343400 +463d3c0535343400463d3c015454550077747400776d6b0077747400776d6b0177747400 +776d6b0277747400776d6b0077747400776d6b0077747402867c7b0288848400d9dcde00 +ffffff16ecf3f500e8ecef01d9dcde008884840054545500675c5a0054545500675c5a01 +54545500675c5a03585c5e01675c5a0054545500675c5a00585c5e00675c5a0463646500 +7764600063646500675c5a00636465007764600063646500776460006a6c6e0063646500 +7764600063646500776d6b0063646500776d6b006a6c6e00776d6b0177747402867c7b00 +77747401867c7b0077747404776d6b0077747400776d6b016a6c6e00776d6b0077747401 +87747000777474008774700077747400776d6b0077747400776d6b008774700077747400 +867c7b017b7b7d00867c7b017b7b7d00867c7b00776d6b0054545500584c4800684f4900 +585c5e00584c480054545502584c480054545500bbbcbd00ffffff09f4f6f900e8ecef00 +e0e4e700d9dcde01d2d4d600b4b4b400776d6b0177747401867c7b00777474007b7b7d01 +867c7b007b7b7d00877470007b7b7d0077747400867c7b0077747400867c7b0588848400 +867c7b0288848400867c7b0088848401867c7b0088848400867c7b017b7b7d0077747400 +867c7b007b7b7d00777474007b7b7d0077747400867c7b007b7b7d01867c7b007b7b7d00 +867c7b01888484007b7b7d00888484007b7b7d0088848402867c7b00888484038c8b8c01 +88848400978c8a00776d6b00585c5e00675c5a006a6c6e00d2d4d600ffffff0df4f6f900 +e8ecef01e6dcdc00cbcccd00999393008c8b8c03978c8a008c8b8c00978c8a008c8b8c00 +978c8a008c8b8c00978c8a008c8b8c0088848400978c8a0088848400978481008c8b8c00 +88848403867c7b0088848400776d6b00584c48006a6c6e00f4f6f900ffffff03f4f6f900 +e8ecef01e6dcdc00d9dcde00d2d4d601d8cccb00cbcccd02bbbcbd0088848401978c8a00 +8c8b8c00978c8a008c8b8c00978c8a008c8b8c01888484009784810088848403867c7b01 +88848400867c7b0277747400867c7b00777474006a6c6e0045444501463d3c009c9e9c00 +ffffff0ff4f6f901e0e4e700e6dcdc00d2d4d600d8cccb00cbcccd00c4c5c503d7c4bd00 +c4c5c500b4b4b400978c8a008c8b8c03978c8a008c8b8c0088848404867c7b0088848401 +867c7b007b7b7d0087747000777474008774700077747403776d6b0077747400d9dcde00 +ffffff23ecf3f500e8ecef00e0e4e700d9dcde01d2d4d602d9dcde0154545500463d3c01 +55454100776d6b00867c7b0288848402a89a9500bbbcbd00d9dcde02d2d4d601cbcccd01 +c4c5c502bbbcbd04b4b4b401bbbcbd00b4b4b401867c7b008884840099939302a89a9500 +99939303978c8a0099939300978c8a008c8b8c01978c8a0099939300978c8a0499939303 +f4f6f900ffffff07ecf3f500e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd00 +b4b4b404abacad00b4b4b401abacad006a6c6e004a4c4d00584c48004a4c4d00584c4800 +636465008c8b8c00978c8a0399939301978c8a0099939300978c8a0299939300978c8a00 +8c8b8c00978c8a028c8b8c01978481008c8b8c0088848400978c8a008c8b8c0197848100 +8c8b8c0088848402867c7b017b7b7d00867c7b017b7b7d00867c7b007b7b7d00867c7b00 +7b7b7d00867c7b017b7b7d00867c7b007b7b7d00867c7b007b7b7d00867c7b0388848406 +978c8a008c8b8c00978c8a00b4b4b401a4a5a4047774740054545500584c48024a4c4d00 +584c48024a4c4d00584c48006364650088848404978481008c8b8c00978481008c8b8c01 +978481008c8b8c00978c8a008c8b8c00978c8a008c8b8c00888484009784810088848400 +867c7b00cbcccd00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a400 +9c9e9c0454545500463d3c0235343400463d3c0135343400463d3c04584c480077747401 +776d6b0077747401776d6b0177747400776d6b0077747401776d6b00777474037b7b7d01 +867c7b01d9dcde00ffffff16f4f6f901e8ecef00e0e4e700d2d4d60077747400675c5a02 +585c5e00675c5a0163646500675c5a00585c5e00675c5a0154545500675c5a0054545500 +675c5a0054545500675c5a0063646500675c5a0063646501675c5a0063646501675c5a01 +6364650177646000636465017764600063646503776d6b0077747400776d6b0077747402 +7b7b7d00867c7b007b7b7d00777474018774700077747402776d6b0077747402776d6b01 +77747403776d6b0077747403867c7b00777474007b7b7d0077747400867c7b007b7b7d00 +867c7b007b7b7d00776d6b0054545502584c480054545501684f490054545501584c4800 +bbbcbd00ffffff09f4f6f901e8ecef00e0e4e700d9dcde00d2d4d601a4a5a4006a6c6e00 +776d6b007774740287747000777474007b7b7d00777474007b7b7d01877470007b7b7d00 +867c7b007b7b7d00867c7b007b7b7d00888484007b7b7d00867c7b0688848400867c7b02 +7b7b7d01777474008774700077747405867c7b00777474007b7b7d00867c7b007b7b7d01 +867c7b007b7b7d00867c7b007b7b7d00867c7b0288848405978c8a0088848400776d6b00 +585c5e00675c5a0088848400e8ecef00ffffff0df4f6f901e0e4e701d2d4d60099939300 +88848400978c8a0188848400978c8a008c8b8c00978481008c8b8c00978c8a0088848400 +8c8b8c00978c8a00888484008c8b8c00888484008c8b8c0088848403867c7b0188848400 +776d6b00584c4801d9dcde00ffffff05f4f6f900e8ecef00e0e4e700d9dcde01d2d4d600 +cbcccd02c4c5c500cbcccd00b8adaa00888484008c8b8c00888484008c8b8c00978c8a00 +888484008c8b8c00978481008c8b8c0088848403867c7b0088848400867c7b0377747400 +7b7b7d00777474008774700077747400675c5a00463d3c0135343400d2d4d600ffffff0f +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600d8cccb00c4c5c500d8cccb00c4c5c501 +cbcccd00c4c5c50199939300978c8a018c8b8c00978c8a008c8b8c01888484027b7b7d00 +888484007b7b7d00867c7b0088848401867c7b007b7b7d00867c7b007b7b7d0077747401 +8774700077747401978c8a00ffffff24f4f6f900ecf3f500e8ecef00e0e4e700d9dcde02 +e0e4e701bbbcbd00554541004544450055454100584c48007b7b7d02867c7b0088848400 +a89a9500cbcccd00e8ecef00ecf3f500e8ecef01e0e4e701d9dcde00d2d4d602c4c5c502 +bbbcbd00c6bcba00b4b4b400bbbcbd02b4b4b400bbbcbd00b4b4b400abacad00675c5a00 +6a6c6e008c8b8c00999393068c8b8c00978c8a028c8b8c00978c8a008c8b8c0099939300 +978c8a008c8b8c0099939304bbbcbd00ffffff07f4f6f900ecf3f500e0e4e700d9dcde00 +d2d4d600c4c5c500bbbcbd01b4b4b405abacad00b4b4b400abacad007774740055454100 +454445004a4c4d00584c4800776d6b008c8b8c02978c8a028c8b8c00978c8a008c8b8c00 +999393008c8b8c00978c8a008c8b8c01978c8a008c8b8c04978c8a00888484008c8b8c00 +888484018c8b8c0088848402867c7b017b7b7d00777474007b7b7d01867c7b007b7b7d00 +867c7b007b7b7d00867c7b017b7b7d00867c7b007b7b7d00867c7b007b7b7d00867c7b00 +888484007b7b7d0088848400867c7b01888484018c8b8c00978c8a00888484008c8b8c02 +88848400abacad00b4b4b400a4a5a40477747400584c48014a4c4d00584c480054545500 +584c48004a4c4d00584c4802675c5a00888484058c8b8c01978481008c8b8c01978c8a00 +8c8b8c00978c8a008c8b8c02888484017b7b7d00c4c5c500e0e4e700d9dcde00d2d4d600 +c4c5c500bbbcbd00b4b4b400abacad009c9e9c00a89a95009c9e9c01a89a950054545500 +463d3c0735343400463d3c02584c480077747403776d6b017774740a7b7b7d00867c7b00 +7b7b7d00d9dcde00ffffff17f4f6f900ecf3f500e0e4e701cbcccd0077747400675c5a00 +63646500675c5a0063646501675c5a0063646500675c5a0154545500675c5a0054545500 +675c5a0054545500675c5a01585c5e00675c5a0063646500675c5a006364650177646000 +63646501675c5a0063646504675c5a00636465007764600063646500776d6b006a6c6e00 +776d6b0077747401867c7b017b7b7d0077747400867c7b007b7b7d017774740087747000 +777474078774700077747402776d6b0087747000777474077b7b7d0077747400776d6b00 +584c480054545500684f490054545501584c480054545500584c480154545500bbbcbd00 +ffffff0af4f6f900ecf3f500e8ecef00e0e4e700d9dcde01d2d4d600a4a5a400776d6b00 +6a6c6e00776d6b0077747404867c7b00777474007b7b7d00777474017b7b7d01867c7b00 +7b7b7d00867c7b007b7b7d01888484007b7b7d00867c7b007b7b7d00867c7b017b7b7d01 +776d6b0077747400776d6b00777474017b7b7d00777474008774700077747400867c7b00 +777474007b7b7d0077747400877470007b7b7d00867c7b007b7b7d00867c7b007b7b7d01 +867c7b007b7b7d02867c7b02888484018c8b8c0088848400776d6b0054545500675c5a00 +a4a5a400ffffff0ef4f6f900ecf3f500e8ecef00e0e4e700d2d4d600a4a5a4008c8b8c00 +978c8a00888484008c8b8c02888484008c8b8c0388848400978c8a008c8b8c00978c8a00 +8c8b8c00978c8a0088848401867c7b037b7b7d00585c5e0055454100abacad00ffffff07 +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d601d8cccb00cbcccd02c4c5c50099939300 +978c8a018c8b8c00978c8a008c8b8c0088848404867c7b007b7b7d00867c7b007b7b7d01 +867c7b007b7b7d0077747400867c7b0077747403776d6b004544450035343400463d3c00 +45444500ffffff0ff4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd02c4c5c504 +b8adaa008c8b8c02978c8a008c8b8c0188848402867c7b0088848407867c7b027b7b7d00 +867c7b007b7b7d00d2d4d600ffffff25ecf3f501e8ecef00e0e4e700e8ecef00e0e4e700 +e8ecef00ecf3f5009c9e9c00463d3c0055454100463d3c0063646500867c7b0299939300 +cbcccd00f4f6f900ffffff00f4f6f901ecf3f501e8ecef01e0e4e700d9dcde01d2d4d600 +cbcccd01c4c5c501bbbcbd05b4b4b400bbbcbd019993930054545500675c5a007b7b7d00 +99939305978c8a00999393008c8b8c02999393008c8b8c00999393028c8b8c0099939304 +ffffff08ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd01b4b4b401 +abacad00b4b4b401abacad00b4b4b400abacad00b8adaa00888484004a4c4d0055454100 +45444500584c480077747400888484018c8b8c02978c8a008c8b8c08888484028c8b8c02 +88848404867c7b007b7b7d0177747402867c7b00777474007b7b7d00867c7b007b7b7d01 +867c7b007b7b7d00867c7b007b7b7d00867c7b007b7b7d00888484078c8b8c0088848400 +8c8b8c01978c8a008c8b8c0199939300b4b4b401abacad00a4a5a403777474004a4c4d00 +584c48004a4c4d00584c48004a4c4d00584c48014a4c4d00584c480163646500978c8a00 +888484008c8b8c0088848400978c8a00888484008c8b8c00978c8a008c8b8c01978c8a00 +8c8b8c00999393008c8b8c01978481008c8b8c00867c7b00888484007b7b7d00c4c5c500 +e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a4019c9e9c03585c5e00 +45444501463d3c09584c4800777474007b7b7d00777474007b7b7d0177747408867c7b00 +7b7b7d00867c7b0288848400d9dcde00ffffff18f4f6f901e0e4e701cbcccd00867c7b00 +63646501675c5a0063646502675c5a02585c5e00675c5a00585c5e00675c5a00585c5e00 +675c5a0163646500675c5a0063646500675c5a0163646500675c5a0a636465016a6c6e00 +776d6b01777474007b7b7d00867c7b0077747400867c7b0077747404776d6b0077747400 +776d6b0077747401776d6b0077747403776d6b00777474038774700077747402776d6b01 +77747402776d6b0054545500584c480054545500584c480254545500584c480054545500 +584c4800b4b4b400ffffff0bf4f6f900f7ece700e8ecef00e0e4e700d9dcde01d2d4d600 +b4b4b400777474006a6c6e00776d6b0077747400776d6b0077747400776d6b0077747401 +7b7b7d00777474037b7b7d00777474007b7b7d0877747403776d6b0077747401776d6b00 +777474057b7b7d00777474027b7b7d05867c7b017b7b7d01888484036364650054545500 +867c7b00e0e4e700ffffff0ff4f6f900e8ecef00e0e4e700d9dcde00b8adaa0088848400 +8c8b8c00888484008c8b8c00978c8a0088848400978c8a00888484008c8b8c0188848400 +978c8a008c8b8c00888484008c8b8c01888484008c8b8c00888484017b7b7d03675c5a00 +463d3c0077747400ffffff08f4f6f900e8ecef01e6dcdc00d9dcde00d2d4d601cbcccd03 +bbbcbd00999393008c8b8c00978c8a008c8b8c01888484008c8b8c00867c7b0088848400 +867c7b00888484007b7b7d00777474017b7b7d01867c7b007b7b7d00777474036a6c6e00 +776d6b00675c5a00463d3c003534340163646500ffffff0ff4f6f900e8ecef00e0e4e700 +d9dcde00d2d4d600cbcccd00c4c5c501cbcccd00c4c5c503999393008c8b8c05867c7b00 +888484017b7b7d00888484018c8b8c00888484057b7b7d01867c7b0088848400ffffff26 +f4f6f902e8ecef01ecf3f500f4f6f9019c9e9c0045444502776d6b007b7b7d0088848400 +bbbcbd00ffffff07f4f6f900ecf3f500e8ecef00e0e4e700d9dcde02cbcccd01c4c5c501 +bbbcbd00c6bcba00b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400 +77747400545455017b7b7d00999393008c8b8c00999393018c8b8c00999393008c8b8c05 +999393008c8b8c00999393038c8b8c0099939301d2d4d600ffffff07f4f6f900ecf3f500 +e8ecef00d9dcde00d2d4d601c4c5c500bbbcbd01b4b4b402abacad00b4b4b400abacad00 +b4b4b400abacad0199939300545455004a4c4d00454445004a4c4d007774740088848400 +8c8b8c02888484008c8b8c01978c8a008c8b8c04888484008c8b8c00888484087b7b7d00 +867c7b007b7b7d01777474037b7b7d02867c7b017b7b7d02867c7b007b7b7d00867c7b00 +888484038c8b8c00888484008c8b8c00888484008c8b8c04888484009c9e9c00c4c5c500 +bbbcbd00b4b4b400a4a5a404777474004a4c4d00584c48004a4c4d01584c48004a4c4d01 +584c48004a4c4d00584c480063646500888484008c8b8c00888484028c8b8c0088848400 +8c8b8c03978c8a008c8b8c00978c8a008c8b8c0088848401867c7b007b7b7d01c4c5c500 +e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c04675c5a00 +45444500584c4800463d3c004a4c4d004544450055454100463d3c0055454100463d3c02 +4544450054545500777474007b7b7d00877470007b7b7d00777474007b7b7d0377747404 +867c7b00777474007b7b7d01888484007b7b7d00d9dcde00ffffff19ecf3f500e8ecef01 +e0e4e700d2d4d600978c8a00636465017764600063646504675c5a03585c5e0063646500 +675c5a0063646500675c5a0063646500675c5a0063646500675c5a00585c5e00675c5a00 +585c5e01675c5a0054545500585c5e0054545500585c5e01675c5a016364650077646000 +6a6c6e01776d6b0077747405776d6b0177747400776d6b0077747400776d6b0063646500 +776d6b0077747400776d6b0077747409776d6b0277747400776d6b007b7b7d0077747400 +6a6c6e00584c480054545500584c480154545500584c48004a4c4d00584c48004a4c4d01 +bbbcbd00ffffff0cf4f6f900ecf3f500e8ecef00e0e4e700e6dcdc00d9dcde00d2d4d600 +c4c5c5008884840063646500776d6b0377747400776d6b0077747400776d6b0077747407 +8774700077747400776d6b0077747400776d6b0077747402776d6b0077747400776d6b00 +77747400776d6b0077747400776d6b0177747402776d6b00777474017b7b7d0077747400 +867c7b0077747401867c7b01888484007b7b7d00888484007b7b7d00888484007b7b7d00 +8884840077747400675c5a0063646500c4c5c500ffffff10f4f6f900e8ecef00e0e4e700 +e6dcdc00bbbcbd008c8b8c00888484008c8b8c00888484008c8b8c00888484008c8b8c00 +888484008c8b8c00888484018c8b8c00888484008c8b8c01888484008c8b8c0188848401 +7b7b7d01776d6b007774740063646500463d3c0054545500f4f6f900ffffff09f4f6f900 +e8ecef01d9dcde01d2d4d600d8cccb00cbcccd03b4b4b4008c8b8c03888484027b7b7d03 +777474017b7b7d00777474007b7b7d0077747401776d6b026a6c6e02675c5a0035343401 +978c8a00ffffff0ff4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01c4c5c502 +cbcccd00c4c5c501abacad00888484028c8b8c00888484008c8b8c00888484068c8b8c03 +888484027b7b7d00867c7b00d2d4d600ffffff27f4f6f903ffffff03a4a5a4004a4c4d01 +7b7b7d00a4a5a400f4f6f900ffffff0af4f6f900ecf3f500e8ecef00e0e4e700d9dcde00 +d2d4d601cbcccd00c4c5c501bbbcbd03b4b4b401bbbcbd00b4b4b400a89a950054545500 +684f4900585c5e00888484008c8b8c00999393028c8b8c00999393008c8b8c00978c8a00 +8c8b8c01999393008c8b8c00999393058c8b8c0099939300abacad00ffffff08f4f6f900 +ecf3f500e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd01b4b4b403b8adaa00 +abacad00b4b4b402a4a5a40077747400584c480045444500584c48006a6c6e0088848411 +867c7b027b7b7d00867c7b007b7b7d0177747402776d6b0177747401867c7b007b7b7d00 +867c7b007b7b7d00867c7b007b7b7d00867c7b007b7b7d00888484038c8b8c0088848400 +8c8b8c03888484018c8b8c0088848400978c8a00abacad00cbcccd00c4c5c500bbbcbd00 +b4b4b400a4a5a404776d6b00454445004a4c4d0045444500584c48004a4c4d00584c4800 +4a4c4d00584c48004a4c4d01675c5a008884840a8c8b8c01888484027b7b7d0277747400 +c4c5c500e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400a4a5a4019c9e9c01 +99939300a4a5a400545455004544450255454101454445024a4c4d0055454100463d3c00 +45444500585c5e00867c7b007b7b7d0477747400867c7b02888484007b7b7d00867c7b00 +7b7b7d02867c7b007b7b7d01867c7b00d9dcde00ffffff1af4f6f900e8ecef00e0e4e700 +d9dcde01abacad00776d6b0063646500776460006a6c6e00776460006a6c6e00675c5a00 +63646500585c5e0063646500675c5a0063646500675c5a01585c5e00675c5a02585c5e00 +675c5a00585c5e00675c5a0054545503675c5a0054545502585c5e00636465046a6c6e01 +77747400776d6b0177747400776d6b016a6c6e00776d6b006a6c6e00776d6b00585c5e00 +54545500776d6b0077747400776d6b00777474007b7b7d0077747400867c7b0077747402 +6a6c6e00776d6b006a6c6e03776d6b00777474026a6c6e00584c48024a4c4d0545444500 +b4b4b400ffffff0df4f6f900e8ecef01e0e4e701d9dcde00d2d4d601a4a5a400776d6b00 +6a6c6e02776d6b0177747403776d6b0077747400776d6b0077747400776d6b007b7b7d00 +77747400776d6b007b7b7d0077747402776d6b0077747400776d6b0077747402776d6b00 +6a6c6e00777474006a6c6e00776d6b01777474067b7b7d04888484007b7b7d00867c7b00 +7b7b7d0077747400636465006a6c6e00b4b4b400ffffff11f4f6f900e8ecef00e0e4e701 +c4c5c5008c8b8c00888484068c8b8c00888484038c8b8c00888484008c8b8c0088848403 +7b7b7d0177747401776d6b004a4c4d0045444500c4c5c500ffffff0bf4f6f900e8ecef00 +e6dcdc00d9dcde00d2d4d601cbcccd03c4c5c5009c9e9c008c8b8c0288848400867c7b00 +888484007b7b7d00867c7b01777474007b7b7d0077747406776d6b006a6c6e00776d6b00 +6364650254545500584c4800ffffff10f4f6f900ecf3f500e8ecef00d9dcde00d2d4d600 +d8cccb00cbcccd01c4c5c504867c7b007b7b7d00888484038c8b8c00888484028c8b8c00 +888484038c8b8c04888484007b7b7d008c8b8c00ffffff31c4c5c500776d6b00d9dcde00 +ffffff0df4f6f900ecf3f500e0e4e701d9dcde00d2d4d601c4c5c501bbbcbd00c6bcba00 +b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b400bbbcbd00b4b4b4006a6c6e0054545501 +636465008c8b8c00999393008c8b8c00999393028c8b8c00999393008c8b8c0099939300 +8c8b8c00999393018c8b8c02999393008c8b8c03ffffff09f4f6f900ecf3f500e0e4e700 +d9dcde00d2d4d600cbcccd00c4c5c501bbbcbd01b4b4b401abacad00b4b4b400abacad00 +b4b4b400abacad00b4b4b400abacad009c9e9c00675c5a0045444501636465007b7b7d01 +888484007b7b7d00888484047b7b7d00888484057b7b7d00888484007b7b7d0477747400 +7b7b7d0077747401776d6b01777474007b7b7d01867c7b007b7b7d00867c7b007b7b7d00 +867c7b007b7b7d00888484048c8b8c04888484008c8b8c0299939300c4c5c500d9dcde00 +cbcccd00c4c5c500bbbcbd00abacad01a4a5a40377747400454445025545410045444502 +4a4c4d00584c48004a4c4d006364650088848400867c7b00888484037b7b7d0088848407 +7b7b7d0277747401c4c5c500e0e4e700d9dcde00d2d4d600cbcccd00bbbcbd00b4b4b400 +abacad009c9e9c04675c5a00454445005545410045444500463d3c004544450255454100 +454445014a4c4d0045444500675c5a007b7b7d01867c7b007b7b7d02867c7b007b7b7d00 +888484007b7b7d00867c7b007b7b7d00867c7b007b7b7d03867c7b007b7b7d01d2d4d600 +ffffff1af4f6f901ecf3f500e8ecef00e0e4e700d9dcde00c4c5c5008884840063646503 +6a6c6e00675c5a0063646501585c5e00675c5a00585c5e0354545500585c5e015454550a +675c5a00585c5e00675c5a0063646500776d6b0063646500776460006a6c6e0263646500 +6a6c6e00776d6b006a6c6e03545455004544450054545500776d6b006a6c6e0177747402 +776d6b026a6c6e01636465006a6c6e00675c5a006a6c6e02776d6b02636465004a4c4d03 +554541004a4c4d00554541024a4c4d00b4b4b400ffffff0ff4f6f900e8ecef00e0e4e701 +d9dcde01d2d4d600c4c5c5008c8b8c006a6c6e02776d6b006a6c6e00776d6b0177747401 +776d6b0277747404776d6b0177747400776d6b00777474006a6c6e0077747400776d6b00 +777474006a6c6e0077747400776d6b006a6c6e00777474006a6c6e0077747400776d6b00 +77747400776d6b00777474017b7b7d00777474007b7b7d02888484007b7b7d026a6c6e00 +77747400b4b4b400ffffff13f4f6f900ecf3f500e0e4e700d2d4d6009993930088848400 +7b7b7d00888484057b7b7d00888484007b7b7d00888484007b7b7d00888484057b7b7d00 +88848400777474016a6c6e0054545500554541008c8b8c00ffffff0cf4f6f900ecf3f500 +e8ecef00d9dcde01d2d4d601d8cccb00cbcccd02c4c5c500978c8a00888484017b7b7d06 +777474017b7b7d0077747400867c7b007b7b7d00777474016a6c6e00777474006a6c6e01 +63646500776460008c8b8c00e8ecef00ffffff11ecf3f500e8ecef00e6dcdc00d9dcde00 +cbcccd01c4c5c501cbcccd00c4c5c501b4b4b400585c5e00867c7b00888484038c8b8c00 +888484068c8b8c0588848401c4c5c500ffffff43f4f6f901e8ecef00e0e4e700d9dcde00 +d2d4d600cbcccd01c4c5c500bbbcbd02b4b4b400bbbcbd00b4b4b401bbbcbd00978c8a00 +584c480054545501777474008c8b8c00999393008c8b8c01999393008c8b8c0ee0e4e700 +ffffff09f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd02 +b4b4b402abacad00b4b4b400abacad00b4b4b400abacad028c8b8c005454550045444500 +545455007b7b7d01888484037b7b7d01888484007b7b7d00888484007b7b7d0088848400 +7b7b7d01888484007b7b7d03777474007b7b7d0077747402776d6b00777474006a6c6e00 +777474007b7b7d03888484007b7b7d00888484038c8b8c00888484018c8b8c00978c8a00 +8c8b8c0488848400a4a5a400d9dcde00e0e4e700d2d4d601c4c5c500bbbcbd00b4b4b400 +a4a5a404776d6b003b3c3d00463d3c003b3c3d00463d3c004544450055454101463d3c00 +45444501675c5a007b7b7d00888484007b7b7d03888484007b7b7d00888484017b7b7d07 +77747401bbbcbd00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad00 +9c9e9c04585c5e00454445004a4c4d00454445005545410045444503463d3c0045444500 +5545410045444500585c5e007b7b7d03867c7b007b7b7d01888484007b7b7d0677747400 +7b7b7d03d9dcde00ffffff1bf4f6f901e8ecef01e0e4e700d9dcde01abacad0077747400 +63646501675c5a0063646501585c5e00675c5a00585c5e0054545506584c480054545500 +584c480054545500584c480054545500584c480054545501584c480054545501675c5a00 +636465086a6c6e01776d6b006a6c6e00675c5a0045444502584c48006a6c6e03776d6b00 +6a6c6e04675c5a0063646500675c5a0063646501675c5a00636465006a6c6e0263646500 +4a4c4d02554541004a4c4d0045444500463d3c00454445003b3c3d00463d3c00bbbcbd00 +ffffff0ff4f6f901f7ece700e8ecef00e0e4e701d9dcde01d2d4d600b4b4b400867c7b00 +6a6c6e04777474006a6c6e00777474096a6c6e00777474006a6c6e00777474006a6c6e00 +777474026a6c6e00777474016a6c6e00777474016a6c6e0077747403776d6b0077747402 +7b7b7d027774740099939300cbcccd00ffffff15f4f6f900e8ecef00e0e4e700d2d4d600 +abacad008c8b8c00888484007b7b7d01888484007b7b7d00888484007b7b7d0088848400 +7b7b7d03777474007b7b7d0777747400636465004544450063646500ffffff0ef4f6f900 +e8ecef01d9dcde01d2d4d600cbcccd01c4c5c500cbcccd01abacad008c8b8c007b7b7d00 +888484007b7b7d00888484007b7b7d02777474086a6c6e00776d6b006a6c6e00776d6b00 +a4a5a400e8ecef00ffffff13f4f6f900e8ecef00d9dcde01cbcccd01c4c5c5047b7b7d00 +6a6c6e007b7b7d00888484007b7b7d00888484058c8b8c007b7b7d00888484018c8b8c05 +888484008c8b8c00ffffff46e8ecef01e0e4e700d9dcde00d2d4d600cbcccd00c4c5c500 +c6bcba00bbbcbd02b4b4b400bbbcbd01b4b4b400abacad00585c5e00584c4801585c5e00 +8c8b8c05888484008c8b8c01888484008c8b8c09bbbcbd00ffffff09f4f6f901ecf3f500 +e0e4e700d9dcde00d2d4d600cbcccd01c4c5c500bbbcbd02b4b4b401abacad00b8adaa00 +abacad00b4b4b400abacad00b4b4b400b8adaa00abacad0088848400545455004a4c4d00 +636465007b7b7d00888484007b7b7d00888484027b7b7d00888484007b7b7d0088848400 +7b7b7d00888484007b7b7d01777474007b7b7d00777474007b7b7d00777474046a6c6e02 +776d6b00777474017b7b7d04888484038c8b8c02999393008c8b8c028884840099939300 +c4c5c500ecf3f500e8ecef00e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00abacad00 +a4a5a404776d6b00353434013b3c3d00463d3c003b3c3d02454445005545410045444500 +585c5e007b7b7d02888484007b7b7d02888484007b7b7d05777474007b7b7d0277747400 +6a6c6e00c4c5c500e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad00 +9c9e9c01a89a95009c9e9c01675c5a0045444500554541004a4c4d004544450155454100 +4a4c4d014544450255454100545455007b7b7d0e867c7b00777474007b7b7d02d2d4d600 +ffffff1df4f6f900ecf3f500e8ecef00e0e4e701d9dcde00d2d4d6009c9e9c0077747400 +63646501675c5a0054545500585c5e0054545503584c480354545501584c480054545502 +584c480054545505585c5e00675c5a01585c5e0063646502675c5a006364650354545500 +45444500463d3c013b3c3d0045444500636465026a6c6e0163646504675c5a0063646501 +585c5e00675c5a00585c5e0063646502776d6b00675c5a005545410045444500463d3c00 +45444500463d3c01454445003b3c3d00463d3c0063646500d2d4d600ffffff11f4f6f900 +ecf3f500e8ecef01e0e4e700e6dcdc00d9dcde01d2d4d600b8adaa007b7b7d006a6c6e00 +776d6b006a6c6e00776d6b00777474016a6c6e00777474006a6c6e00777474006a6c6e01 +776d6b006a6c6e01777474006a6c6e0077747400776d6b00777474017b7b7d0077747402 +6a6c6e00776d6b006a6c6e01777474006a6c6e00777474006a6c6e017774740488848400 +abacad00e0e4e700ffffff17f4f6f900ecf3f500e8ecef00d9dcde01d2d4d600bbbcbd00 +9c9e9c008c8b8c007b7b7d00888484017b7b7d03777474047b7b7d04777474006a6c6e00 +4a4c4d01d2d4d600ffffff0fecf3f500e8ecef00e6dcdc00d9dcde00d2d4d602d8cccb00 +cbcccd029c9e9c00888484007b7b7d01777474007b7b7d01777474026a6c6e0077747404 +6a6c6e0188848400bbbcbd00ffffff16ecf3f500e8ecef00e0e4e700d9dcde00cbcccd01 +c4c5c500d8cccb00c4c5c501b4b4b40054545500888484037b7b7d00888484007b7b7d00 +888484027b7b7d00888484028c8b8c0588848400bbbcbd00ffffff46f4f6f900ecf3f500 +e0e4e700d9dcde00d2d4d601c4c5c501bbbcbd01b4b4b400bbbcbd00b4b4b401bbbcbd00 +b4b4b400776d6b0054545502777474008c8b8c00888484047b7b7d00888484007b7b7d00 +888484018c8b8c079c9e9c00ffffff0bf4f6f900ecf3f500e0e4e701d9dcde00d2d4d600 +cbcccd00c4c5c501bbbcbd02b4b4b402abacad00b4b4b400abacad02b8adaa00abacad00 +8c8b8c0063646500545455006a6c6e007b7b7d01888484027b7b7d00888484007b7b7d00 +888484007b7b7d02777474056a6c6e00777474006a6c6e00777474006a6c6e02776d6b00 +777474017b7b7d01888484008c8b8c007b7b7d008c8b8c00888484008c8b8c0599939300 +8c8b8c00abacad00ecf3f500ffffff00ecf3f500e8ecef00e0e4e700d2d4d601bbbcbd01 +b4b4b400a4a5a40463646500353434033b3c3d00463d3c003b3c3d02463d3c0054545500 +7b7b7d0b777474066a6c6e00bbbcbd00e8ecef00d9dcde00d2d4d600c4c5c500bbbcbd00 +b4b4b400abacad00a4a5a4009c9e9c035454550045444501463d3c00454445004a4c4d00 +4544450155454100454445004a4c4d0045444501585c5e00867c7b007b7b7d0288848400 +7b7b7d00888484007b7b7d0b77747400d2d4d600ffffff1ef4f6f901e8ecef01e0e4e701 +d9dcde00cbcccd009c9e9c006a6c6e00585c5e00675c5a0054545503584c480054545500 +4a4c4d00545455004a4c4d00545455004a4c4d0154545500584c48004a4c4d0054545500 +4a4c4d00584c480154545505585c5e00675c5a0054545500585c5e0163646500675c5a00 +585c5e0045444500463d3c00353434013b3c3d0054545500776d6b00585c5e00675c5a03 +63646501675c5a0063646500675c5a0063646500585c5e00675c5a0054545500585c5e00 +54545501675c5a00636465015454550045444500463d3c0045444500463d3c003b3c3d00 +545455007b7b7d00abacad00e8ecef00ffffff14f4f6f901f7ece700e8ecef01e0e4e701 +d9dcde01d2d4d600b4b4b4008c8b8c006a6c6e00777474006a6c6e00777474006a6c6e00 +77747400776d6b006a6c6e01777474006a6c6e01776d6b006a6c6e00777474006a6c6e00 +777474017b7b7d00777474007b7b7d00777474046a6c6e00777474006a6c6e0277747402 +7b7b7d0099939300cbcccd00ffffff1bf4f6f900e8ecef00e0e4e701d9dcde02cbcccd00 +b4b4b40099939300888484017b7b7d01777474026a6c6e037774740454545500463d3c00 +a4a5a400ffffff11ecf3f500e8ecef00e6dcdc00d9dcde00d2d4d601cbcccd02d2d4d600 +cbcccd008c8b8c007b7b7d01777474007b7b7d00777474026a6c6e00777474016a6c6e00 +777474017b7b7d009c9e9c00d9dcde00ffffff18f4f6f900e8ecef00e0e4e700d9dcde00 +d8cccb00cbcccd00c4c5c501cbcccd00c4c5c500867c7b00636465007b7b7d0688848400 +7b7b7d00888484018c8b8c007b7b7d008c8b8c007b7b7d008c8b8c05ffffff48f4f6f900 +ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd02b4b4b401bbbcbd00 +b4b4b400bbbcbd008884840054545500584c480054545500636465008c8b8c007b7b7d00 +8c8b8c007b7b7d008c8b8c007b7b7d03888484007b7b7d018c8b8c007b7b7d0088848401 +8c8b8c03ffffff0bf4f6f901ecf3f500e8ecef00d9dcde01d2d4d601cbcccd00c4c5c500 +bbbcbd03b4b4b402abacad00b4b4b401abacad039c9e9c0077747400636465007b7b7d03 +888484007b7b7d00888484007b7b7d05777474006a6c6e007b7b7d006a6c6e0077747400 +6a6c6e01636465006a6c6e00636465006a6c6e03777474007b7b7d02888484007b7b7d00 +888484008c8b8c03999393008c8b8c009c9e9c00e0e4e700ffffff02ecf3f500e8ecef00 +e0e4e700d9dcde00cbcccd00c4c5c500bbbcbd00abacad00a4a5a4046a6c6e0035343402 +2e2c2d00353434002e2c2d00353434003b3c3d00353434003b3c3d004a4c4d0077747400 +6a6c6e00777474006a6c6e00777474017b7b7d00777474026a6c6e00777474006a6c6e00 +777474006a6c6e00777474006a6c6e03bbbcbd00e0e4e700d9dcde00d2d4d600c4c5c500 +bbbcbd00b4b4b400abacad009c9e9c04675c5a00454445004a4c4d00454445004a4c4d00 +454445004a4c4d00454445024a4c4d004544450055454100636465007b7b7d0588848400 +7b7b7d01777474007b7b7d00777474007b7b7d00777474007b7b7d02777474017b7b7d00 +d2d4d600ffffff1ff4f6f901ecf3f500e8ecef00e0e4e702d9dcde00d8cccb009c9e9c00 +6a6c6e0054545501584c48004a4c4d02584c48004a4c4d02584c4800545455004a4c4d01 +54545500584c4800545455004a4c4d0054545503585c5e0054545500585c5e0054545505 +45444500353434003b3c3d0054545500867c7b00a4a5a400c4c5c500d2d4d600b8adaa00 +585c5e04675c5a00585c5e02675c5a00585c5e00675c5a00585c5e0054545504585c5e00 +675c5a00545455003b3c3d004a4c4d006364650099939300c4c5c500f4f6f900ffffff19 +f4f6f900ecf3f500f4f6f900e8ecef01e0e4e701d9dcde02c4c5c5009c9e9c007b7b7d00 +6a6c6e00777474016a6c6e00777474006a6c6e0177747400776d6b00777474057b7b7d01 +777474007b7b7d00777474026a6c6e03777474006a6c6e00777474007b7b7d00abacad00 +e0e4e700ffffff1df4f6f901e8ecef00e0e4e701d9dcde02d2d4d601c4c5c500a4a5a400 +8c8b8c007b7b7d00777474016a6c6e01636465016a6c6e0177747402585c5e00463d3c00 +63646500ffffff12f4f6f900ecf3f500e8ecef00d9dcde01d2d4d600d9dcde00d2d4d602 +d9dcde00c4c5c5007b7b7d03777474007b7b7d00777474016a6c6e017774740088848400 +b4b4b400ecf3f500ffffff1aecf3f500e8ecef00d9dcde01cbcccd01c4c5c502b4b4b400 +4a4c4d00777474007b7b7d08888484007b7b7d00888484047b7b7d008c8b8c0188848400 +b4b4b400ffffff49ecf3f500e8ecef00e0e4e700d9dcde00cbcccd00c4c5c501bbbcbd00 +b4b4b400bbbcbd01b4b4b400bbbcbd00b4b4b4009c9e9c004a4c4d00545455004a4c4d00 +54545500888484008c8b8c01888484008c8b8c007b7b7d058c8b8c007b7b7d008c8b8c00 +888484007b7b7d008c8b8c007b7b7d008c8b8c01ecf3f500ffffff0cf4f6f900ecf3f501 +e0e4e700d9dcde01d2d4d601cbcccd00c4c5c500bbbcbd02b4b4b403abacad00b4b4b400 +abacad00b4b4b400abacad038c8b8c007b7b7d018c8b8c007b7b7d07777474027b7b7d00 +6a6c6e00777474006a6c6e00636465026a6c6e00636465006a6c6e00777474006a6c6e00 +777474007b7b7d02888484007b7b7d008c8b8c007b7b7d008c8b8c029c9e9c00c4c5c500 +ffffff04f4f6f900e8ecef00e0e4e700d2d4d600cbcccd00c4c5c500b4b4b401a4a5a404 +776d6b00353434042e2c2d01353434024a4c4d006a6c6e03777474006a6c6e0ebbbcbd00 +e8ecef00d9dcde00d2d4d600c4c5c500bbbcbd00b4b4b400abacad009c9e9c04675c5a00 +454445004a4c4d00554541004544450055454100454445024a4c4d00463d3c0045444501 +585c5e007b7b7d00888484007b7b7d00888484037b7b7d04777474007b7b7d0077747405 +d2d4d600ffffff21f4f6f902e8ecef01e0e4e701d9dcde01abacad00867c7b0054545501 +4a4c4d02584c48004a4c4d04545455004a4c4d0054545502584c480054545504584c4800 +54545500584c4800545455026364650088848400b8adaa00d2d4d600e0e4e701d9dcde00 +e0e4e700d9dcde00b4b4b40054545507584c480054545505584c4800585c5e00776d6b00 +7b7b7d008c8b8c01abacad00d9dcde00ecf3f500ffffff1ef4f6f901f7ece700e8ecef02 +e0e4e701d9dcde01d2d4d600b4b4b4008c8b8c00777474016a6c6e00777474006a6c6e00 +777474036a6c6e00777474027b7b7d03777474016a6c6e047b7b7d009c9e9c00cbcccd00 +ffffff21f4f6f901e8ecef02e0e4e701d9dcde03d2d4d600bbbcbd009993930077747400 +6a6c6e0063646500585c5e026a6c6e00636465006a6c6e0063646500463d3c00585c5e00 +ecf3f500ffffff13f4f6f900e8ecef01e0e4e700d9dcde00e6dcdc00d9dcde01e6dcdc00 +d9dcde00e0e4e700b4b4b400888484007b7b7d00777474007b7b7d00777474006a6c6e02 +8c8b8c00cbcccd00ffffff1cf4f6f901e8ecef00d9dcde01cbcccd01c4c5c501cbcccd00 +867c7b00585c5e00777474077b7b7d03888484018c8b8c047b7b7d008c8b8c00ffffff4b +ecf3f500e0e4e700d9dcde00d2d4d600c4c5c501bbbcbd01b4b4b402bbbcbd00b4b4b400 +a4a5a4004a4c4d00545455004a4c4d00545455007b7b7d00888484067b7b7d0488848400 +7b7b7d00888484018c8b8c00888484008c8b8c00d2d4d600ffffff0eecf3f501e8ecef00 +e0e4e700d9dcde01d2d4d601cbcccd00c4c5c501bbbcbd02b4b4b403abacad00b4b4b400 +abacad04a4a5a4008c8b8c037b7b7d04777474006a6c6e00777474016a6c6e0077747400 +6a6c6e01636465036a6c6e01777474027b7b7d02888484007b7b7d00888484008c8b8c00 +99939300c4c5c500ffffff06ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00c4c5c500 +bbbcbd00abacad01a4a5a400abacad00a4a5a4017b7b7d0045444500463d3c0035343400 +463d3c00353434042e2c2d00454445006a6c6e04636465006a6c6e00636465026a6c6e00 +636465066a6c6e01bbbcbd00e0e4e700d9dcde00d2d4d600cbcccd00bbbcbd00b4b4b400 +abacad009c9e9c00a4a5a4009c9e9c00a4a5a4009c9e9c006a6c6e00454445054a4c4d01 +454445004a4c4d0145444500585c5e007b7b7d00888484017b7b7d00888484007b7b7d00 +888484008c8b8c007b7b7d00888484007b7b7d01777474016a6c6e0277747402d2d4d600 +ffffff22f4f6f901ecf3f500e8ecef02e0e4e701d9dcde00e0e4e700c4c5c5009c9e9c00 +776d6b00545455004a4c4d08545455084a4c4d00545455007774740099939300bbbcbd00 +d9dcde00e8ecef06e0e4e701bbbcbd00585c5e0154545502636465006a6c6e0077747400 +7b7b7d008c8b8c009c9e9c00a4a5a400b4b4b400c6bcba00cbcccd00d9dcde00e0e4e700 +e8ecef00ecf3f501f4f6f902ffffff21f4f6f902e8ecef03e0e4e702d9dcde00d2d4d600 +b4b4b400999393007b7b7d00777474006a6c6e00777474006a6c6e007b7b7d0077747400 +7b7b7d00777474007b7b7d04777474006a6c6e00777474006a6c6e007b7b7d0099939300 +c4c5c500ecf3f500ffffff24f4f6f900ffffff00f4f6f900e8ecef02e0e4e702d9dcde00 +e0e4e702d2d4d600b4b4b40088848400585c5e01636465026a6c6e00454445008c8b8c00 +ffffff16f4f6f900ecf3f500e8ecef01e0e4e700e8ecef00e0e4e700e8ecef01ecf3f500 +e8ecef00999393007b7b7d01777474017b7b7d00a4a5a400e8ecef00ffffff1ef4f6f900 +ecf3f500e0e4e700e6dcdc00d2d4d600cbcccd01c4c5c501b4b4b4004a4c4d006a6c6e01 +777474046a6c6e007b7b7d006a6c6e007b7b7d028c8b8c00888484018c8b8c0088848400 +8c8b8c0088848401abacad00ffffff4becf3f500e8ecef00e0e4e700d9dcde00cbcccd00 +c4c5c500bbbcbd01b4b4b400c6bcba00bbbcbd00b4b4b400bbbcbd00a4a5a4004a4c4d00 +584c48004a4c4d00584c480063646500888484027b7b7d008c8b8c007b7b7d0a8c8b8c00 +7b7b7d01bbbcbd00ffffff0ff4f6f900ecf3f500e8ecef00e0e4e701d9dcde01d2d4d601 +cbcccd01c4c5c501bbbcbd02b4b4b400bbbcbd00b4b4b408abacad009c9e9c0088848400 +7b7b7d036a6c6e00777474006a6c6e01777474006a6c6e01636465056a6c6e027b7b7d04 +8c8b8c00b4b4b400d9dcde00f4f6f900ffffff07f4f6f900e8ecef00e0e4e700d9dcde00 +d2d4d600cbcccd00bbbcbd01abacad00b4b4b404a4a5a4008c8b8c00776d6b004a4c4d00 +463d3c013b3c3d0035343402454445006a6c6e04636465006a6c6e00636465006a6c6e00 +636465016a6c6e00636465066a6c6e00bbbcbd00e8ecef00d9dcde01cbcccd00c4c5c500 +bbbcbd00b4b4b400abacad00a4a5a400abacad03a4a5a4008c8b8c0077747400585c5e00 +4a4c4d014544450055454100454445004a4c4d00454445004a4c4d00585c5e007b7b7d00 +888484037b7b7d00888484007b7b7d00888484007b7b7d036a6c6e00777474026a6c6e00 +777474006a6c6e00d2d4d600ffffff25f4f6f901e8ecef03e0e4e702d9dcde00cbcccd00 +a4a5a4007b7b7d00636465004a4c4d03545455004a4c4d0054545504585c5e006a6c6e00 +888484009c9e9c00bbbcbd00e0e4e700e8ecef01ecf3f500f4f6f904ecf3f501f7ece700 +e8ecef01d9dcde00abacad00bbbcbd00c4c5c500cbcccd00d9dcde00e0e4e701e8ecef06 +ecf3f501f4f6f903ffffff27f4f6f901f7ece700ecf3f500e8ecef03e0e4e702d9dcde00 +c4c5c500a4a5a4009c9e9c00888484007b7b7d00777474027b7b7d00777474016a6c6e00 +7b7b7d008c8b8c009c9e9c00b4b4b400d2d4d600f4f6f900ffffff2af4f6f901ecf3f501 +e8ecef04e0e4e700ecf3f500e8ecef00ecf3f500d9dcde00a4a5a400777474006a6c6e00 +636465006a6c6e00cbcccd00ffffff18f4f6f901f7ece700ecf3f500e8ecef00ecf3f501 +f4f6f902e0e4e7007b7b7d018c8b8c00c4c5c500f4f6f900ffffff20f4f6f900e8ecef00 +e0e4e700d9dcde00d2d4d600cbcccd01c4c5c5018884840054545500777474017b7b7d01 +777474007b7b7d03777474006a6c6e007b7b7d04888484028c8b8c0088848400ecf3f500 +ffffff35f4f6f900ffffff14f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600c4c5c500 +c6bcba00bbbcbd01b4b4b400bbbcbd00b4b4b4019c9e9c004a4c4d03585c5e0088848400 +8c8b8c007b7b7d008c8b8c007b7b7d046a6c6e00777474007b7b7d05888484007b7b7d00 +abacad00ffffff10f4f6f901ecf3f501e0e4e701d9dcde01d2d4d601cbcccd02c4c5c502 +bbbcbd08c4c5c500bbbcbd00c4c5c500bbbcbd00b4b4b4009c9e9c00888484007b7b7d01 +6a6c6e0463646502585c5e00636465026a6c6e03888484009c9e9c00c4c5c500e8ecef00 +ffffff0bf4f6f900ecf3f500e8ecef00e0e4e700d9dcde00d2d4d600c4c5c501bbbcbd00 +b4b4b400bbbcbd05c4c5c500bbbcbd00a4a5a4008c8b8c006364650045444500463d3c01 +4a4c4d00777474016a6c6e01777474006a6c6e037b7b7d018c8b8c009c9e9c00a4a5a400 +b4b4b400bbbcbd00cbcccd00d2d4d600e0e4e700e8ecef02e0e4e700d9dcde00d2d4d601 +c4c5c500bbbcbd00b4b4b405bbbcbd00b4b4b401bbbcbd00b4b4b4009c9e9c008c8b8c00 +6a6c6e0054545500463d3c004544450055454100585c5e007b7b7d00888484028c8b8c00 +7b7b7d00888484007b7b7d018c8b8c019c9e9c00a4a5a400abacad00bbbcbd01cbcccd00 +d9dcde00e8ecef00ecf3f500ffffff27f4f6f900ffffff00f4f6f900e8ecef03e0e4e704 +d9dcde00cbcccd00b4b4b4009c9e9c00978c8a00888484018c8b8c019c9e9c00b4b4b400 +c4c5c500d2d4d600e0e4e700e8ecef02ecf3f501f4f6f902ffffff01f4f6f900ffffff00 +f4f6f905e8ecef05ecf3f500e8ecef00f4f6f900e8ecef00f4f6f901ecf3f500f4f6f903 +ffffff2df4f6f901ecf3f501e8ecef08d9dcde00d2d4d600c4c5c500bbbcbd00c4c5c500 +bbbcbd00cbcccd00d9dcde00e8ecef00ecf3f500ffffff30f4f6f902ecf3f505f4f6f901 +ffffff02d9dcde00b4b4b400ffffff1df4f6f902ffffff04d9dcde01f4f6f900ffffff22 +f4f6f900e8ecef00d9dcde00d2d4d601cbcccd00c4c5c501c6bcba004a4c4d006a6c6e01 +777474007b7b7d006a6c6e007b7b7d01777474016a6c6e027b7b7d006a6c6e007b7b7d01 +8c8b8c007b7b7d008c8b8c007b7b7d008c8b8c009c9e9c00ffffff35b4b4b4004a4c4d00 +d9dcde00ffffff14ecf3f500e0e4e700d9dcde00d2d4d600c4c5c501bbbcbd00b4b4b402 +bbbcbd01978c8a004a4c4d00454445004a4c4d0154545500888484007b7b7d008c8b8c00 +7b7b7d008c8b8c007b7b7d046a6c6e007b7b7d006a6c6e007b7b7d059c9e9c00ffffff12 +f4f6f901ecf3f500e8ecef00e0e4e701d9dcde02d2d4d601cbcccd04c4c5c500cbcccd00 +c4c5c505cbcccd00c4c5c500d2d4d600cbcccd00d2d4d600cbcccd00bbbcbd00abacad00 +9c9e9c007b7b7d00777474006a6c6e0163646505777474008c8b8c00abacad00cbcccd00 +ecf3f500f4f6f900ffffff0ef4f6f900ecf3f500e8ecef00e0e4e700d9dcde01cbcccd01 +c4c5c504cbcccd02c4c5c500cbcccd01d2d4d602abacad008c8b8c006a6c6e008c8b8c00 +9c9e9c00abacad00bbbcbd00c4c5c500d2d4d600e0e4e700e8ecef00f4f6f900ffffff09 +ecf3f502e8ecef00e0e4e700d9dcde00d2d4d600c4c5c501bbbcbd04c4c5c500bbbcbd00 +c4c5c500bbbcbd00c4c5c501cbcccd00d2d4d601d9dcde00c4c5c500a4a5a40088848400 +7b7b7d009c9e9c00abacad00b4b4b400c4c5c500cbcccd00d9dcde00e0e4e700e8ecef00 +ecf3f500f4f6f900ffffff03f4f6f900ffffff01f4f6f900ffffff2cf4f6f902ecf3f501 +e8ecef03e0e4e700e8ecef00e0e4e705e8ecef05ecf3f501f4f6f902ffffff0bf4f6f90a +ffffff00f4f6f900ffffff35f4f6f900ecf3f500ffffff00ecf3f50bf4f6f902ffffff38 +f4f6f900ffffff53f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd02c4c5c500 +8c8b8c004a4c4d00777474006a6c6e00777474026a6c6e017b7b7d006a6c6e007b7b7d00 +6a6c6e027b7b7d006a6c6e007b7b7d05e0e4e700ffffff34d2d4d600454445014a4c4d00 +d2d4d600ffffff12f4f6f900ecf3f500e8ecef00e0e4e700d2d4d600cbcccd00bbbcbd03 +b4b4b400bbbcbd00b4b4b40077747400454445004a4c4d038c8b8c007b7b7d008c8b8c00 +7b7b7d06777474007b7b7d016a6c6e007b7b7d006a6c6e007b7b7d0299939300ffffff14 +f4f6f901ecf3f501e8ecef00e0e4e701d9dcde03d2d4d601cbcccd00d2d4d600cbcccd01 +d2d4d600cbcccd00d2d4d606d9dcde01e0e4e702e8ecef00d9dcde00cbcccd00c4c5c500 +bbbcbd00c4c5c500bbbcbd00d2d4d600e0e4e700ecf3f500ffffff15ecf3f502e0e4e700 +d9dcde01d2d4d600cbcccd02d2d4d601cbcccd02d2d4d602d9dcde00e0e4e701e8ecef00 +ecf3f500f4f6f900ffffff13ecf3f501e8ecef00e0e4e700d9dcde01d2d4d601c4c5c503 +cbcccd00c4c5c501cbcccd03d2d4d600d9dcde00e0e4e702ecf3f502f4f6f906ffffff3a +f4f6f901ecf3f500f4f6f900e8ecef00ecf3f500e8ecef04ecf3f500e8ecef00ecf3f500 +e8ecef00ecf3f500e8ecef00f4f6f904ffffff12f4f6f900ffffff44f4f6f900ffffff02 +f4f6f900ffffff93ecf3f500e8ecef00d9dcde01d2d4d600cbcccd00c4c5c501bbbcbd00 +4a4c4d00636465006a6c6e01777474006a6c6e02777474006a6c6e007b7b7d006a6c6e06 +7b7b7d038c8b8c00ffffff34e0e4e700454445003b3c3d00463d3c00454445004a4c4d00 +d2d4d600ffffff12ecf3f500e8ecef00d9dcde00d2d4d600cbcccd00c4c5c500bbbcbd00 +b4b4b401bbbcbd00b4b4b40154545500454445004a4c4d00454445004a4c4d017b7b7d01 +8c8b8c007b7b7d076a6c6e007b7b7d006a6c6e007b7b7d00777474016a6c6e007b7b7d00 +8c8b8c00ffffff16f4f6f901ecf3f502e0e4e702d9dcde0de0e4e704e8ecef01ecf3f502 +f4f6f901ffffff1becf3f501e8ecef01d9dcde01d2d4d600d9dcde02d2d4d600d9dcde04 +e0e4e702ecf3f501f4f6f902ffffff12f4f6f900ecf3f502e0e4e701d9dcde00d2d4d602 +cbcccd00d2d4d607d9dcde01e0e4e700e8ecef00ecf3f502f4f6f900ffffff44f4f6f908 +ecf3f500f4f6f904fffffff4f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01 +c4c5c500cbcccd008c8b8c004a4c4d006a6c6e0c777474006a6c6e047b7b7d006a6c6e00 +d2d4d600ffffff2ff4f6f902ffffff00e8ecef00545455003b3c3d034a4c4d0088848400 +ffffff12ecf3f500e8ecef00e0e4e700d2d4d600cbcccd00c4c5c500bbbcbd01b4b4b400 +bbbcbd00b4b4b40099939300454445024a4c4d0045444500585c5e008c8b8c007b7b7d07 +6a6c6e007b7b7d016a6c6e007b7b7d006a6c6e017b7b7d006a6c6e00777474008c8b8c00 +ffffff17f4f6f901ecf3f502e8ecef01e0e4e702d9dcde00e0e4e700d9dcde03e0e4e700 +d9dcde00e0e4e704e8ecef01ecf3f503f4f6f900ffffff1df4f6f900ecf3f502e8ecef00 +e0e4e701d9dcde04e0e4e700d9dcde00e0e4e704e8ecef00ecf3f502f4f6f900ffffff13 +f4f6f900ecf3f501e8ecef01e0e4e701d9dcde00d2d4d607d9dcde02e0e4e701e8ecef00 +ecf3f502f4f6f901ffffff44f4f6f900ffffff00f4f6f904ecf3f500f4f6f900ffffff00 +f4f6f901fffffff7f4f6f900e8ecef00e0e4e700d2d4d600d8cccb00cbcccd00c4c5c500 +cbcccd00c6bcba004a4c4d006a6c6e0c7b7b7d006a6c6e067b7b7d00ffffff2eecf3f501 +e8ecef00ecf3f501e8ecef0063646500353434013b3c3d0145444500636465007b7b7d00 +c4c5c500ffffff11ecf3f500e8ecef00d9dcde01cbcccd00c4c5c500b4b4b400bbbcbd00 +b4b4b400bbbcbd00b4b4b40063646500454445015545410045444501636465007b7b7d07 +6a6c6e007b7b7d006a6c6e017b7b7d006a6c6e007b7b7d006a6c6e007b7b7d006a6c6e01 +a4a5a400ffffff17f4f6f901ecf3f501e8ecef00e0e4e700e8ecef00e0e4e702d9dcde00 +e0e4e700d9dcde00e0e4e700d9dcde02e0e4e704e8ecef03ecf3f502f4f6f901ffffff1b +f4f6f901ecf3f501e8ecef01e0e4e701d9dcde02e0e4e700d9dcde01e0e4e701d9dcde00 +e0e4e702e8ecef01ecf3f501f4f6f902ffffff10ecf3f502e8ecef01e0e4e701d9dcde01 +d2d4d601d9dcde00d2d4d600d9dcde00d2d4d600d9dcde01d2d4d600d9dcde01e0e4e701 +ecf3f500e8ecef00ecf3f501f4f6f900ffffff43f4f6f900ffffff00f4f6f901ffffff00 +f4f6f90bfffffff3f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd02c4c5c500 +8c8b8c004a4c4d00636465006a6c6e13c4c5c500ffffff2decf3f500e8ecef01e0e4e702 +7b7b7d002e2c2d00353434013b3c3d01585c5e007b7b7d02ffffff11ecf3f500e8ecef00 +d9dcde00d2d4d600cbcccd00bbbcbd01b4b4b400bbbcbd00b4b4b4009c9e9c0045444500 +463d3c00454445036a6c6e007b7b7d046a6c6e007b7b7d006a6c6e077b7b7d006a6c6e02 +b4b4b400ffffff17f4f6f902ecf3f500e8ecef01e0e4e702d9dcde00e0e4e700d9dcde02 +e0e4e700d9dcde00e0e4e700d9dcde00e0e4e702e8ecef00e0e4e700e8ecef02ecf3f501 +f4f6f902ffffff19f4f6f901ecf3f502e8ecef01e0e4e701d9dcde02e0e4e700d9dcde00 +e0e4e701d9dcde00e0e4e704e8ecef02ecf3f504f4f6f90decf3f502e8ecef02e0e4e701 +d9dcde02d2d4d602d9dcde00d2d4d600d9dcde00d2d4d601d9dcde01e0e4e703ecf3f502 +f4f6f901ffffff43f4f6f90effffff00f4f6f900fffffff2f4f6f900e8ecef00e0e4e700 +d2d4d601cbcccd00c4c5c50254545500636465036a6c6e11f4f6f900ffffff2bf4f6f900 +ecf3f500e8ecef00e0e4e700d9dcde0299939300353434002e2c2d00353434002e2c2d00 +353434004a4c4d00777474017b7b7d019c9e9c00ffffff10ecf3f500e8ecef00d9dcde00 +d2d4d600cbcccd00c4c5c500bbbcbd00b4b4b402585c5e003b3c3d01454445024a4c4d00 +7b7b7d056a6c6e0a7b7b7d006a6c6e01d2d4d600ffffff16f4f6f901ecf3f502e8ecef01 +e0e4e703d9dcde00e0e4e700d9dcde02e0e4e700d9dcde00e0e4e704e8ecef02ecf3f504 +f4f6f900ecf3f500f4f6f901ffffff00f4f6f900ffffff00f4f6f900ffffff00f4f6f901 +ffffff00f4f6f907ecf3f500f4f6f900ecf3f500f4f6f900ecf3f500f4f6f900ecf3f502 +e8ecef01e0e4e700e8ecef00e0e4e702d9dcde00e0e4e700d9dcde03e0e4e700d9dcde00 +e0e4e700d9dcde00e0e4e702e8ecef00e0e4e700e8ecef02ecf3f501e8ecef00ecf3f502 +e8ecef00ecf3f500e8ecef06ecf3f500e8ecef03e0e4e702d9dcde03d2d4d604d9dcde02 +d2d4d600d9dcde00d2d4d600d9dcde00e0e4e701e8ecef00ecf3f502f4f6f901ffffff41 +f4f6f911fffffff2f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd02c4c5c500 +999393003b3c3d00636465056a6c6e00636465006a6c6e03636465026a6c6e0463646500 +abacad00ffffff2cecf3f500e8ecef00d9dcde01d2d4d601a4a5a4003b3c3d0035343400 +2e2c2d01353434003b3c3d006a6c6e02777474007b7b7d01c4c5c500ffffff0ef4f6f900 +e8ecef00e0e4e700d9dcde00d2d4d600c4c5c500bbbcbd02b4b4b400888484003b3c3d04 +45444500636465007b7b7d046a6c6e007b7b7d006a6c6e02636465056a6c6e03e0e4e700 +ffffff09f4f6f900ffffff00f4f6f900ffffff00f4f6f900ffffff00f4f6f901ffffff00 +f4f6f901ecf3f500e8ecef03e0e4e703d9dcde02d2d4d601cbcccd00d2d4d602cbcccd00 +d2d4d608d9dcde03e0e4e700d9dcde07d2d4d600d9dcde00d2d4d608cbcccd00d2d4d600 +cbcccd06c4c5c504bbbcbd0bb4b4b400bbbcbd09b4b4b400bbbcbd00b4b4b401bbbcbd00 +b4b4b402bbbcbd00b4b4b400abacad00b4b4b400abacad00b4b4b400abacad00b4b4b400 +abacad02a4a5a400abacad00a4a5a4019c9e9c00a4a5a4009c9e9c02a4a5a4009c9e9c07 +a4a5a402abacad02b4b4b402bbbcbd01cbcccd00ffffff2fe8ecef00b4b4b4009c9e9c04 +999393009c9e9c01999393009c9e9c01999393009c9e9c028c8b8c009c9e9c018c8b8c00 +9c9e9c00999393019c9e9c00999393068c8b8c00999393048c8b8c02999393008c8b8c01 +999393008c8b8c01999393008c8b8c0b888484048c8b8c00888484018c8b8c0088848400 +8c8b8c00888484047b7b7d008c8b8c00888484017b7b7d00888484007b7b7d00867c7b00 +7b7b7d01888484007b7b7d01867c7b007b7b7d0a777474007b7b7d007774740a6a6c6e00 +777474006a6c6e00777474006a6c6e00777474006a6c6e00777474006a6c6e0077747400 +6a6c6e0c636465006a6c6e00636465006a6c6e00636465006a6c6e00636465006a6c6e00 +636465006a6c6e00675c5a0063646502675c5a0063646505585c5e00675c5a00585c5e00 +675c5a00585c5e0063646500585c5e00675c5a00585c5e00675c5a00585c5e0154545500 +585c5e0054545500585c5e0054545500585c5e0054545500585c5e0054545500585c5e00 +545455094a4c4d00584c48004a4c4d00584c48004a4c4d00584c48004a4c4d01584c4800 +4a4c4d00584c48004a4c4d00454445004a4c4d00454445004a4c4d0145444500584c4800 +4a4c4d00454445004a4c4d004544450a463d3c003b3c3d00454445003b3c3d00463d3c00 +3b3c3d00463d3c003b3c3d00463d3c003b3c3d00463d3c003b3c3d00353434003b3c3d00 +353434003b3c3d00353434003b3c3d00353434003b3c3d00353434003b3c3d003534340a +2e2c2d00353434002e2c2d03353434002e2c2d00353434022e2c2d00353434002e2c2d03 +675c5a00ffffff00ecf3f500e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c502 +5454550163646501585c5e0063646501585c5e0063646500585c5e0063646500585c5e00 +63646502585c5e00636465006a6c6e0063646504ecf3f500ffffff06867c7b00150e0d00 +1a1b1a00150e0d011a1b1a00150e0d0a0c0b0c02150e0d000c0b0c00150e0d05e0e4e700 +ffffff07ecf3f500e8ecef00d9dcde01d2d4d600cbcccd00b4b4b4004544450035343402 +2e2c2d003b3c3d00636465016a6c6e01777474007b7b7d00777474007b7b7d00d9dcde00 +ffffff0decf3f500e8ecef00d9dcde01cbcccd00c4c5c501bbbcbd00b4b4b4008c8b8c00 +3b3c3d00353434003b3c3d02454445016a6c6e007b7b7d026a6c6e007b7b7d006a6c6e04 +63646502585c5e02636465016a6c6e007b7b7d00e0e4e700150e0d000402049e2e2c2d00 +7b7b7d00cbcccd00ffffff27e8ecef00b4b4b4006a6c6e001a1b1a00040204ff04020410 +585c5e00f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd01c4c5c5019c9e9c00 +3534340063646501585c5e0063646503585c5e0063646500585c5e0163646500585c5e00 +63646506585c5e009c9e9c00ffffff05f4f6f900e0e4e7000402041b24232400ffffff06 +ecf3f500e8ecef00d9dcde01d2d4d600cbcccd00bbbcbd00545455003b3c3d0035343402 +3b3c3d00585c5e006a6c6e00636465006a6c6e03777474007b7b7d008c8b8c00d2d4d600 +ffffff0becf3f500e8ecef00e0e4e700d9dcde00d2d4d601c4c5c500bbbcbd00b4b4b400 +7b7b7d00353434023b3c3d00353434003b3c3d01585c5e007b7b7d006a6c6e007b7b7d00 +6a6c6e007b7b7d006a6c6e007b7b7d006a6c6e0263646502585c5e0063646500585c5e01 +636465016a6c6e009c9e9c01040204a3353434007b7b7d00d2d4d600ffffff1ff4f6f900 +bbbcbd006a6c6e0024232400040204ff04020414bbbcbd00ecf3f500e8ecef00e0e4e700 +d9dcde00d8cccb00cbcccd01c4c5c501585c5e004a4c4d0063646500585c5e006a6c6e00 +63646504585c5e00636465046a6c6e0063646500585c5e0063646500585c5e0063646500 +585c5e00d9dcde00ffffff02f4f6f901ecf3f501777474000402041ca4a5a400ffffff04 +f4f6f900e8ecef00e0e4e700d9dcde00d2d4d600cbcccd00c4c5c5006a6c6e003b3c3d01 +35343402545455006a6c6e047b7b7d02777474007b7b7d006a6c6e008c8b8c00d2d4d600 +ffffff08ecf3f500e8ecef00e0e4e701d2d4d600cbcccd00c4c5c5019c9e9c004a4c4d00 +2e2c2d03353434013b3c3d00454445006a6c6e01777474006a6c6e007b7b7d006a6c6e03 +63646501585c5e0063646503585c5e00636465016a6c6e01b4b4b4002e2c2d0004020430 +170204000402040217020400040204021702040004020400170204000402040017020400 +040204001702040004020400170204000402040017020400040204001702040104020400 +170204020402040017020402040204001702042127020400170204002702040017020400 +270204001702040027020400170204012702040017020400270204001702040027020400 +170204002702040017020400270204001702040027020400170204002702041f58020400 +a6442b00e8bcb000ffffff1ba65b4500580204003a020406480204003a02040348020400 +3a020401480204003a020401480204013a020400480204013a020400480204013a020400 +480204165802040048020400580204004802040158020400480204005802040048020400 +580204004802040058020401480204005802041568020400580204036802040058020401 +680204005802040068020400580204006802040058020400680204005802040068020400 +580204006802041779020400680204017902040068020402790204006802040079020400 +680204007902040068020400790204016802040079020401680204007902041688020400 +790204008802040079020400880204007902040088020400790204008802040079020400 +88020403790204008802041c940204018802040094020401880204009402040188020400 +9402040ca002040094020400a002040094020400a002040094020400a002040094020400 +a002040094020400a002040294020400a002041cc4363800ecf3f500f7ece700e0e4e700 +d9dcde00d2d4d600cbcccd01c4c5c501a4a5a4003b3c3d00585c5e026a6c6e0163646500 +6a6c6e0063646502585c5e00636465036a6c6e0163646501585c5e018c8b8c00ffffff02 +f4f6f900ecf3f500e8ecef01d9dcde0004020401b302041bbf181800ffffff03ecf3f500 +e8ecef00e0e4e700d2d4d601cbcccd017b7b7d00454445013b3c3d013534340054545500 +6a6c6e00636465006a6c6e067b7b7d006a6c6e007b7b7d00636465003b3c3d0063646500 +b4b4b400ecf3f500ffffff04ecf3f501e0e4e701d2d4d601c4c5c5008c8b8c004a4c4d00 +2e2c2d00242324002e2c2d04353434003b3c3d00585c5e006a6c6e0763646503585c5e00 +63646500585c5e006a6c6e047b7b7d00abacad0004020405b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020401a0020400b3020401a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020401a0020400b3020402a0020400b3020401a0020400b3020400 +a0020400b3020401a0020400b3020400a0020400b3020400a0020400b3020400a0020401 +b3020400a0020401b3020400a0020401b3020400a0020402b3020400a0020402b3020400 +a0020402b3020400a002043894020400a002040094020400a002040094020400a0020400 +94020400a002040094020400a002040094020400a002040294020400a002040194020400 +a002040194020400a002040bcc626500ffffff1af9e4e100c4363800a0020400b3020400 +a0020400b3020400a0020401b3020400a0020401b3020400a0020400b3020400a0020400 +b3020400a0020401b3020400a0020400b3020400a0020400b3020400a0020401b3020400 +a0020400b3020400a0020400b3020400a0020401b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b302040aa0020400b3020404a0020400b3020404 +a0020400b3020402a0020400b3020401a0020400b3020484bc0b0e00b3020400bc0b0e01 +b3020400bc0b0e01b3020400bc0b0e01b3020400bc0b0e00b3020404bc0b0e00b3020404 +bc0b0e00b3020404bc0b0e00b3020423bc0b0e01b3020401bc0b0e00b3020400bc0b0e00 +b3020403e8a58f00e8ecef01e0e4e700d9dcde00d2d4d600cbcccd01c4c5c501585c5e00 +4a4c4d00636465036a6c6e00585c5e0063646501585c5e0263646500585c5e0063646501 +6a6c6e0063646500585c5e0063646501585c5e00d2d4d600f4f6f901ecf3f500e8ecef00 +e0e4e701d9dcde0077747400040204003a020400b302041cea7c5e00ffffff01f4f6f900 +ecf3f500e0e4e700d9dcde00d2d4d600cbcccd01999393003b3c3d01454445013b3c3d00 +4a4c4d006a6c6e087b7b7d006a6c6e01777474006a6c6e013b3c3d00353434003b3c3d00 +6364650099939300c4c5c500d9dcde00ecf3f500e8ecef00e0e4e700d9dcde00bbbcbd00 +8c8b8c00636465002e2c2d00242324022e2c2d0535343400545455006a6c6e0863646500 +585c5e0063646500585c5e026a6c6e037b7b7d006a6c6e008c8b8c004a4c4d0004020404 +58020400a0020400b3020401a0020400b3020401a0020400b3020400a0020400b3020401 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020401b3020400a0020402b3020400a0020401 +b3020400a0020401b3020400a0020402b3020400a0020403b3020400a0020401b3020400 +a0020401b3020400a002044194020400a002040194020400a002040294020400a0020401 +94020400a002040194020400a002040094020400a002040094020400a002040094020400 +a002040094020400a002040094020400a002040094020401a002040094020400a0020400 +94020405a002040094020400b2181a00e9d5d700ffffff19f4f6f900d8846e00b3020400 +a0020401b3020400a0020401b3020400a0020400b3020400a0020401b3020400a0020401 +b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020400b3020400 +a0020401b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020400 +b3020400a0020400b3020400a0020401b3020400a0020401b3020400a0020401b3020400 +a0020400b3020400a0020400b3020400a0020401b3020401a0020400b3020400a0020400 +b3020400a0020400b3020402a0020400b3020401a0020400b3020402a0020400b3020400 +a0020400b3020401a0020400b3020401a0020400b302044ebc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b302040d +bc0b0e00b3020405bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e02b3020400bc0b0e04 +b3020400bc0b0e05b3020400bc0b0e07b3020400bc0b0e01b3020400bc0b0e02b3020400 +bc0b0e02b3020400bc0b0e00b3020402bc0b0e06b3020400bc0b0e02b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01c4232400 +e8ecef01e0e4e700d9dcde00d2d4d600d8cccb00cbcccd00c4c5c501a4a5a4003b3c3d00 +585c5e0063646500585c5e0063646504585c5e0463646500585c5e01636465006a6c6e00 +6364650288848400ecf3f500f4f6f900ecf3f500e0e4e701d9dcde01d8cccb0004020401 +a0020400b3020402bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020401bc0b0e00 +b3020411e5c4c200f4f6f900e8ecef00e0e4e700d9dcde01cbcccd01a4a5a4003b3c3d00 +353434003b3c3d00454445003b3c3d004a4c4d007b7b7d006a6c6e007b7b7d006a6c6e03 +636465016a6c6e027b7b7d006a6c6e02636465004a4c4d0035343401242324002e2c2d00 +242324003b3c3d01454445002e2c2d001a1b1a03242324042e2c2d012423240035343400 +54545500636465046a6c6e00636465006a6c6e0063646502585c5e01636465026a6c6e05 +9c9e9c0004020405a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020401a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020401 +b3020400a0020401b3020400a0020400b3020400a0020402b3020400a0020409b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020401 +b3020400a0020401b3020400a0020401b3020400a002041f94020400a002040394020400 +a002040094020400a002040094020400a002040094020400a002040194020400a0020401 +94020400a002040094020400a002040194020400a002040194020400a002040294020400 +a002040194020400a002040194020400a002040094020400a002040094020400a0020400 +94020401a002040094020400a002040194020400a002040094020401a0020401d98c7800 +ffffff1ad7c4bd00bf181800a0020401b3020400a0020401b3020400a0020401b3020400 +a0020400b3020400a0020400b3020400a0020401b3020400a0020400b3020400a0020400 +b3020400a0020401b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020401a0020400 +b3020401a0020400b3020401a0020400b3020401a0020400b3020402a0020400b3020401 +a0020400b3020400a0020400b3020401a0020400b3020401a0020400b3020401a0020400 +b3020400a0020400b3020403a0020400b3020404a0020400b3020400a0020400b3020400 +a0020400b3020401a0020400b3020401a0020400b302043bbc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020404bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e07b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e01b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400 +bc0b0e00b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01 +b3020400bc0b0e01b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e00b3020401 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e02b3020400bc0b0e00 +b3020400bc0b0e00b3020401e59c8700e8ecef01e0e4e700d9dcde00d2d4d600cbcccd01 +c4c5c500cbcccd00636465004a4c4d0063646503585c5e0d63646502c4c5c500ecf3f501 +e0e4e700d9dcde01d2d4d600cbcccd007b7b7d000402040027020400b3020401bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020402bc0b0e00b3020401bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020408b0262800 +d9dcde00e8ecef00d9dcde01cbcccd01c4c5c500636465002e2c2d01353434003b3c3d00 +45444500777474007b7b7d01777474006a6c6e0263646501585c5e006a6c6e0763646500 +585c5e004544450035343400242324002e2c2d001a1b1a04242324001a1b1a0124232400 +1a1b1a0124232402353434004a4c4d00585c5e0463646502585c5e0063646502585c5e00 +63646500585c5e00636465026a6c6e00636465006a6c6e017b7b7d014a4c4d0004020404 +27020400b3020400a0020400b3020402a0020400b3020401a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020401a0020400b3020400 +a0020401b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020401 +b3020400a0020401b3020400a0020400b3020400a0020400b3020400a0020401b3020400 +a0020401b3020400a0020403b3020400a0020400b3020400a0020401b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020418b3020400a002041d94020400 +a002040794020400a002040294020400a002040294020400a002040194020400a0020400 +94020400a002040094020400a002040194020400a002040094020400a002040094020400 +a002040194020400a002040194020400a002040094020400a002040094020402a0020400 +94020400a002040094020400a002040094020400a0020400b0262800f9e4e100ffffff08 +f4f6f900ffffff0ef4f6f900e0e4e700c75c4d00b3020400a0020400b3020400a0020401 +b3020400a0020400b3020400a0020401b3020400a0020401b3020400a0020401b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020401a0020400b3020400a0020400 +b3020401a0020400b3020400a0020400b3020401a0020400b3020404a0020400b3020400 +a0020400b3020401a0020400b3020404a0020400b3020404a0020400b3020405a0020400 +b3020408a0020400b3020428bc0b0e00b3020401bc0b0e00b3020402bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020404bc0b0e01b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020400 +bc0b0e00b3020406bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e01b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00 +b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e03b3020401bc0b0e00b3020400 +bc0b0e01b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e02b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e02b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020401bc0b0e01b3020400bc0b0e01bf181800e0e4e700 +e8ecef00e0e4e700d9dcde00d2d4d600cbcccd02c4c5c500a4a5a4003b3c3d00585c5e00 +63646504585c5e0063646500585c5e0354545500585c5e0363646500585c5e0063646501 +7b7b7d00ecf3f501e0e4e701d2d4d600cbcccd02170204000402040094020400bc0b0e00 +b3020401bc0b0e00b3020403bc0b0e00b3020401bc0b0e00b3020401bc0b0e00b3020401 +bc0b0e00b3020403bc0b0e00b3020408a8655400d9dcde01d2d4d600cbcccd00c4c5c501 +a4a5a400353434002e2c2d013b3c3d0063646500777474006a6c6e01777474006a6c6e01 +63646502585c5e00636465006a6c6e05585c5e0063646502585c5e004a4c4d0035343400 +2e2c2d00242324001a1b1a06242324001a1b1a00242324002e2c2d004a4c4d0054545500 +585c5e10636465026a6c6e038c8b8c000402040588020400b3020401a0020400b3020400 +a0020400b3020401a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020401b3020400a0020400b3020401a0020401b3020400 +a0020401b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020400 +b3020400a0020402b3020400a0020400b3020400a0020400b3020400a0020401b3020400 +a0020400b3020400a0020403b3020400a0020408b3020400a0020401b3020400a0020402 +b3020400a0020401b3020400a0020401b3020400a002042294020400a002040194020400 +a002040294020400a002040194020400a002040094020400a002040294020400a0020402 +94020400a002040294020400a002040194020400a002040194020400a002040094020400 +a002040094020400a002040194020400a002040094020400a002040094020400a0020400 +94020400a002040094020400a002040194020400a002040094020400a002040094020400 +a002040094020401a0020401dba39300ffffff04f4f6f900ffffff11f4f6f900ecf3f500 +e8ecef00c8a49d00b3020400a0020400b3020400a0020401b3020400a0020401b3020400 +a0020401b3020400a0020400b3020400a0020401b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020401a0020400b3020401a0020400b3020400a0020400 +b3020400a0020400b3020401a0020400b3020400a0020400b3020401a0020400b3020401 +a0020400b3020400a0020400b3020400a0020400b3020403a0020400b3020401a0020400 +b3020400a0020400b3020401a0020400b3020400a0020400b302040ba0020400b3020401 +a0020400b3020405a0020400b3020422bc0b0e00b3020409bc0b0e00b3020401bc0b0e00 +b3020401bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020402 +bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e04 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020401bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400 +bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e02b3020400 +bc0b0e00b3020400bc0b0e02b3020401bc0b0e03b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e02b3020400bc0b0e00 +b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e00b3020400e78b7100e8ecef00 +e0e4e700e6dcdc00d9dcde00d2d4d600cbcccd01c4c5c501636465004a4c4d00585c5e03 +63646500585c5e0263646500585c5e0863646500585c5e0063646500b4b4b400ecf3f500 +e8ecef00d9dcde00d2d4d601cbcccd00c4c5c500888484000402040017020400b3020401 +bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020401bc0b0e00b3020401bc0b0e00b3020401bc0b0e00b3020403bc0b0e00b3020401 +bc0b0e00b3020403a0020400b7a4a000d2d4d600cbcccd00c4c5c502bbbcbd008c8b8c00 +2e2c2d0035343400545455006a6c6e046364650b585c5e0063646500585c5e0063646503 +585c5e014a4c4d003b3c3d002e2c2d001a1b1a01242324022e2c2d003b3c3d004a4c4d00 +545455004a4c4d01545455004a4c4d02545455004a4c4d03585c5e08636465016a6c6e01 +7b7b7d01454445000402040417020400b3020400a0020400b3020401a0020400b3020400 +a0020400b3020400a0020400b3020401a0020400b3020400a0020400b3020401a0020400 +b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020401b3020400a0020400b3020400a0020402b3020400a0020401b3020400 +a0020400b3020400a0020401b3020400a0020403b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020405b3020400a0020409b3020400a002042894020400 +a002040194020400a002040094020400a002040194020400a002040094020400a0020401 +94020400a002040194020400a002040094020400a002040094020400a002040094020400 +a002040194020400a002040094020400a002040094020400a002040194020400a0020400 +94020400a002040094020401a002040094020401a002040094020402a002040094020400 +a002040094020400a0020400cf4d4f00e8ecef00ffffff15f4f6f901e8ecef00e0e4e700 +d8cccb00b9462700a0020401b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020401b3020400a0020400b3020400a0020401b3020400a0020400b3020400 +a0020400b3020400a0020401b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020401a0020400b3020400a0020400b3020401a0020400b3020400a0020400 +b3020400a0020400b3020401a0020400b3020401a0020400b3020400a0020400b3020401 +a0020400b3020403a0020400b3020404a0020400b3020401a0020400b3020400a0020400 +b3020401a0020400b3020406a0020400b3020404a0020400b3020402a0020400b3020423 +bc0b0e00b3020400bc0b0e00b3020404bc0b0e00b3020402bc0b0e00b3020401bc0b0e00 +b3020402bc0b0e01b3020401bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020401 +bc0b0e00b3020403bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400 +bc0b0e01b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e01b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e02b3020400bc0b0e02b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e01b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020401bc0b0e00 +b3020400bc0b0e00b3020400bf181800e6dcdc00e8ecef00e0e4e700d9dcde00d2d4d600 +d8cccb00cbcccd00c4c5c501abacad002e2c2d00585c5e0463646502585c5e026a6c6e00 +585c5e01636465006a6c6e0063646500585c5e00636465026a6c6e00e8ecef01e0e4e700 +d9dcde01cbcccd00c4c5c5011a1b1a000402040088020400b3020401bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020403bc0b0e00b3020401bc0b0e00 +b3020405bc0b0e00b302040988020400c4c5c503bbbcbd02585c5e0045444500585c5e00 +63646504585c5e0063646500585c5e0163646506585c5e0263646500585c5e0063646500 +585c5e05545455014a4c4d01545455034a4c4d07454445024a4c4d04545455024a4c4d01 +585c5e02636465016a6c6e007b7b7d000402040579020400b3020400a0020400b3020400 +a0020400b3020401a0020400b3020401a0020400b3020400a0020400b3020401a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020401b3020400a0020401 +b3020400a0020401b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020401b3020400a0020402b3020400a0020402b3020400a0020400b3020400a0020408 +b3020400a0020400b3020400a0020403b3020400a0020402b3020400a0020406b3020400 +a0020407b3020400a002040e94020400a002040394020400a002040394020400a0020402 +94020400a002040494020400a002040394020400a002040094020400a002040094020400 +a002040194020400a002040394020400a002040194020400a002040094020400a0020400 +94020400a002040094020400a002040094020400a002040094020400a002040094020400 +a002040094020400a002040094020400a002040094020400a002040094020400a0020400 +94020400a0020401e8bcb000ffffff03f4f6f900ffffff10f4f6f900ecf3f500e8ecef01 +e0e4e700c88b7d00b3020400a0020402b3020400a0020401b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020401b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020401a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020401a0020400b3020400a0020400 +b3020402a0020400b3020401a0020400b3020402a0020400b3020401a0020400b3020403 +a0020400b3020401a0020400b3020400a0020400b3020402a0020400b3020400a0020400 +b302040ba0020400b302042ebc0b0e00b3020401bc0b0e00b3020404bc0b0e00b3020402 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e00 +b3020401bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e01 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e01b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e01b3020400bc0b0e02b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01 +b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400 +bc0b0e01b3020400d8846e00e8ecef00e0e4e701d9dcde00d2d4d600cbcccd00c4c5c501 +cbcccd00636465003b3c3d00585c5e05636465046a6c6e00636465006a6c6e0063646503 +585c5e02b4b4b400ecf3f501e8ecef00d9dcde01d2d4d601b4b4b4000402040017020400 +b3020401bc0b0e00b3020401bc0b0e00b3020403bc0b0e00b3020400bc0b0e00b3020401 +bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b302040e7c3a3c00c4c5c501bbbcbd03 +abacad006a6c6e0063646500585c5e0063646500585c5e0763646500585c5e0063646500 +585c5e0063646500585c5e0463646503585c5e02545455044a4c4d06454445064a4c4d00 +454445014a4c4d06585c5e03636465017b7b7d008c8b8c000402040417020400b3020400 +a0020400b3020401a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020401b3020400a0020400b3020400a0020400b3020400 +a0020402b3020400a0020400b3020400a0020400b3020400a0020402b3020400a0020401 +b3020400a0020405b3020400a0020400b3020400a0020401b3020400a002040ab3020400 +a0020402b3020400a002042494020400a002040394020400a002040294020400a0020400 +94020400a002040194020400a002040094020400a002040194020400a002040194020400 +a002040094020400a002040094020401a002040094020400a002040094020400a0020401 +94020400a002040094020400a002040094020401a002040094020401a002040094020400 +a002040094020401a002040094020402a002040094020403a002040094020400cc626500 +ffffff15f4f6f901e8ecef01e0e4e700d8bcb600c42c3000a0020400b3020400a0020401 +b3020400a0020400b3020400a0020401b3020400a0020401b3020400a0020400b3020400 +a0020401b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020401a0020400b3020400a0020400b3020401a0020400b3020400 +a0020400b3020401a0020400b3020400a0020400b3020400a0020400b3020401a0020400 +b3020401a0020400b3020401a0020400b3020400a0020400b3020401a0020400b3020401 +a0020400b3020401a0020400b3020406a0020400b3020401a0020400b3020401a0020400 +b3020404a0020400b3020402a0020400b302042dbc0b0e00b3020402bc0b0e00b3020400 +bc0b0e00b3020404bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020401bc0b0e00 +b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00 +b3020400bc0b0e01b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e01b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e01b3020400bc0b0e00 +b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e02b3020400bc0b0e01b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e01b3020400bc0b0e02 +b3020400bc0b0e00b3020400bc0b0e01b3020401bc0b0e01b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e01e6dcdc00e8ecef01 +d9dcde00d2d4d600cbcccd02c4c5c500b4b4b4002e2c2d004a4c4d00545455014a4c4d00 +54545500585c5e04636465016a6c6e01636465006a6c6e0163646501585c5e016a6c6e00 +ecf3f500f4f6f901ecf3f500e8ecef00d9dcde02c4c5c5000402040079020400b3020402 +bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e00 +b3020401bc0b0e00b3020403bc0b0e00b3020401bc0b0e00b3020401bc0b0e00b3020407 +a0020400978c8a00c4c5c500bbbcbd00c4c5c500bbbcbd02a4a5a40063646500585c5e05 +54545501585c5e0463646500585c5e0063646501585c5e0063646500585c5e0063646504 +585c5e04545455014a4c4d02454445013b3c3d004544450b3b3c3d00454445004a4c4d05 +585c5e00636465029c9e9c00cbcccd00b4b4b400241a18000402040279020400a0020400 +b3020401a0020400b3020400a0020400b3020401a0020400b3020401a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020401b3020400a0020400b3020400a0020401b3020400a0020400b3020400 +a0020400b3020400a0020401b3020400a0020400b3020400a0020400b3020400a0020404 +b3020400a0020400b3020400a0020400b3020400a0020402b3020400a0020400b3020400 +a0020400b3020400a0020407b3020400a0020402b3020400a0020400b3020400a0020409 +b3020400a0020404b3020400a002041594020400a002040694020400a002040394020400 +a002040294020400a002040194020400a002040194020400a002040194020400a0020401 +94020400a002040294020400a002040094020400a002040094020401a002040094020400 +a002040094020401a002040094020400a002040094020400a002040094020401a0020400 +94020401a002040094020400a002040094020402a002040094020400a002040094020401 +b2181a00d2d4d600ffffff00f4f6f900ffffff13ecf3f501e8ecef01d9dcde00c8745e00 +b3020400a0020400b3020400a0020401b3020400a0020400b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020400b3020401a0020400b3020400a0020400b3020401a0020400b3020400a0020400 +b3020401a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020401 +a0020400b3020401a0020400b3020402a0020400b3020402a0020400b3020401a0020400 +b3020400a0020400b3020400a0020400b3020402a0020400b3020404a0020400b3020411 +a0020400b3020419bc0b0e00b3020402bc0b0e00b3020401bc0b0e00b3020402bc0b0e00 +b3020401bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020403 +bc0b0e00b3020403bc0b0e00b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020401bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020401bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400 +bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e02b3020400bc0b0e01b3020400 +bc0b0e00b3020400bc0b0e03b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00 +b3020400bc0b0e00b3020400bc0b0e01b3020400bc0b0e00b3020400bc0b0e01b3020400 +bc0b0e01b3020400bc0b0e00b3020400bc0b0e00b3020400bc0b0e00d8755c00f7ece700 +e0e4e700e6dcdc00d9dcde00d2d4d600cbcccd01c4c5c5016a6c6e002e2c2d0054545500 +4a4c4d0054545501585c5e004a4c4d00585c5e0263646500585c5e00636465006a6c6e00 +636465016a6c6e0163646500585c5e02a4a5a400f4f6f900ffffff00f4f6f900ecf3f500 +e8ecef01e0e4e700d9dcde00e0e4e7003a020400b3020402bc0b0e00b3020401bc0b0e00 +b3020401bc0b0e00b3020400bc0b0e00b3020402bc0b0e00b3020401bc0b0e00b3020401 +bc0b0e00b3020401bc0b0e00b3020401bc0b0e00b30204099c161400c6bcba00bbbcbd05 +99939300585c5e00545455024a4c4d0154545502585c5e0463646500585c5e0063646500 +585c5e02636465016a6c6e0063646500585c5e06545455004a4c4d00545455004a4c4d00 +4544450f4a4c4d00454445004a4c4d0354545500585c5e01636465007b7b7d00cbcccd00 +d2d4d601d9dcde007b7b7d000402040017020400b3020401a0020400b3020401a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020401a0020400b3020400 +a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020400a0020400b3020400a0020400b3020400 +a0020401b3020400a0020401b3020400a0020400b3020400a0020400b3020400a0020400 +b3020400a0020402b3020400a0020402b3020400a0020400b3020400a0020405b3020400 +a0020400b3020400a0020400b3020400a0020403b3020400a0020408b3020400a0020423 +94020400a002040294020400a002040194020400a002040294020400a002040094020400 +a002040194020400a002040194020400a002040094020400a002040194020400a0020401 +94020400a002040094020400a002040194020400a002040094020400a002040094020400 +a002040094020400a002040094020400a002040094020400a002040094020401a0020400 +94020401a002040094020401a002040094020400a002040094020400a002040094020402 +a002040094020400a0020401c47b7d00ffffff15f4f6f901e8ecef01e0e4e700d8b4ac00 +b2181a00a0020401b3020400a0020402b3020400a0020401b3020400a0020400b3020400 +a0020400b3020400a0020400b3020400a0020401b3020400a0020400b3020400a0020400 +b3020400a0020400b3020400a0020400b3020401a0020400b3020400a0020400b3020401 +a0020400b3020412a0020400b3020427bc0b0e00b3020405bc0b0e00b3020402bc0b0e00 +b3020401bc0b0e00b3020400bc0b0e0cbf181800bc0b0e06bf181800bc0b0e00bf181800 +bc0b0e00bf181800bc0b0e00bf181801bc0b0e00bf181800bc0b0e00bf18180ec4232400 +bf181801c4232400bf181803c4232402bf181800c4232402bf181800c4232403c42c3000 +c4232400c42c3000c4232401c42c3000c4232400c42c3000c4232400c42c300ac4363801 +c42c3000c4363800c42c3000c4363800c42c3000c4363800c42c3000c4363800c42c3000 +c436380acc3c3f00c4363800cc3c3f00c4363800cc3c3f00c4363802cc3c3f00c4363801 +cc3c3f0acc444400cc3c3f00cc444400cc3c3f00cc444400cc3c3f00cc444400cc3c3f00 +cc444400cc3c3f00cc444401cf4d4f00cc444400cf4d4f06e9d5d700e8ecef00e0e4e700 +d9dcde00d2d4d600d8cccb00cbcccd00c4c5c501b4b4b4002e2c2d00454445004a4c4d01 +54545500585c5e0054545500585c5e0054545500585c5e0363646500585c5e0063646500 +585c5e0063646500585c5e0063646501585c5e0063646500ecf3f500ffffff02f4f6f900 +ecf3f500e8ecef03c47b7d00c75c4d00cc54580ad45e4400cc626500cc545801cc626500 +cc545800d45e4400cc545800cc626500cc545800cc626505d9654700cc626502cc545800 +cc626501cc545800ba5d4500cc545800b7533a00b7a4a000bbbcbd00c4c5c500bbbcbd04 +7b7b7d0054545500585c5e0054545501585c5e004a4c4d0054545502585c5e0863646502 +6a6c6e0163646501585c5e06545455004a4c4d01454445013b3c3d00454445003b3c3d00 +454445023b3c3d00454445003b3c3d00454445013b3c3d00454445014a4c4d0354545501 +585c5e0063646501b4b4b400d9dcde00e0e4e700d9dcde02bbbcbd00b77c6a00c47b7d00 +c8745e00c47b7d00c8745e00c47b7d01c97c6700c47b7d32c8847200c47b7d00c8847200 +c47b7d00b9857800c47b7d00b9857800c47b7d00b9857800c47b7d00c8847200c47b7d00 +c88b7d00c47b7d00b9857800c88b7d00c47b7d00c88b7d00c47b7d00c88b7d00c47b7d00 +c88b7d00b78d8500c88b7d00b98a7c00c88b7d02b98a7c00c88b7d00b98a7c00c88b7d00 +b98a7c00c88b7d00b78d8500c88b7d00b78d8500c88b7d01b78d8500c88b7d00b78d8500 +c88b7d00b98a7c00c8938400b78d8500c8938400b78d8500c8938400b78d8500c8938400 +b78d8504b8938b03c8938400b78d8500b8938b01c8938400b78d8500b8938b05b78d8500 +b8938b00b78d8500b8938b00b78d8500b8938b00b99a9400b8938b02b99a9400b8938b03 +b99a940ac8a49d00b7a4a000c8aca502d8b4ac00d8bcb601d7c4bd00e5c4c200e6ccc900 +e9d5d701f8d4c900e9d5d708e6dcdc00e9d5d700f9dcd100e9d5d700f4f6f900ffffff15 +f4f6f902ecf3f501e8ecef00e6ccc901d7c4bd00d8cccb00e6ccc900d8cccb01e6ccc900 +d8cccb07e9d5d700d8cccb00d2d4d600e9d5d700d8cccb00d2d4d600e9d5d700d2d4d600 +e9d5d700d2d4d600e9d5d700d9dcde00e9d5d700e6dcdc00e9d5d700d9dcde00e9d5d700 +d9dcde00e6dcdc00d9dcde00e9d5d700d9dcde00e6dcdc02d9dcde00e0e4e700e6dcdc02 +d9dcde00e6dcdc00e0e4e703e6dcdc00e8ecef00e6dcdc00e0e4e701e6dcdc00e0e4e700 +e8ecef00e0e4e700e8ecef00e0e4e700e8ecef0aecf3f500e8ecef00ecf3f500e8ecef00 +ecf3f500e8ecef00ecf3f500e8ecef00f4f6f900e8ecef00f4f6f900e8ecef00f4f6f900 +e8ecef00f4f6f900e8ecef00f4f6f900e8ecef00ecf3f500e8ecef00ecf3f500f7ece700 +ecf3f501e8ecef00f4f6f900e8ecef01f4f6f900f7ece700f4f6f900e8ecef00f4f6f900 +f7ece700f4f6f900f7ece700f4f6f900f7ece700f4f6f900f7ece700f4f6f900f7ece700 +f4f6f902f7ece700f4f6f901f7ece700f4f6f909f7ece700f4f6f902f7ece700f4f6f901 +f7ece700f4f6f900f7ece700f4f6f904f7ece700f4f6f90dffffff01f4f6f906ffffff00 +f4f6f91dffffff00f4f6f902ffffff00f4f6f903ffffff00f4f6f901ffffff00f4f6f91a +ffffff00f4f6f903ffffff00f4f6f900ffffff09f4f6f901e8ecef01e0e4e700d9dcde00 +d2d4d600cbcccd01c4c5c501777474002e2c2d004a4c4d0254545500585c5e0054545500 +585c5e0e9c9e9c00f4f6f900ffffff04f4f6f900ecf3f503e8ecef00f4f6f902ecf3f500 +f4f6f900ecf3f500f4f6f900ecf3f500f4f6f900ecf3f500f4f6f900e8ecef00f4f6f902 +f7ece700ecf3f501f4f6f900f7ece700ecf3f500f4f6f907f7ece700e8ecef01e0e4e700 +d9dcde01d2d4d600cbcccd00c4c5c501c6bcba00bbbcbd067b7b7d004a4c4d0054545506 +585c5e0a6a6c6e0163646500585c5e04545455004a4c4d00545455014a4c4d0054545500 +4a4c4d03454445004a4c4d04454445024a4c4d06585c5e004a4c4d00585c5e028c8b8c00 +e8ecef01e0e4e700e8ecef01e0e4e700e8ecef00e0e4e707e6dcdc00e0e4e700d9dcde00 +e0e4e700d9dcde00e0e4e700d9dcde00e0e4e700d9dcde00e0e4e702d9dcde00e0e4e701 +d9dcde00e0e4e700d9dcde00e0e4e701d9dcde00e0e4e700d9dcde00e0e4e700d9dcde00 +e0e4e700d9dcde00e0e4e700d9dcde00e0e4e704d9dcde00e0e4e700d9dcde00e0e4e700 +d9dcde00e0e4e700d9dcde00e0e4e700d9dcde15e0e4e700d9dcde0bd2d4d600d9dcde00 +d2d4d600d9dcde00d2d4d616d9dcde00d2d4d600d9dcde00d2d4d600d9dcde00d2d4d60a +cbcccd00d2d4d602cbcccd00d2d4d600cbcccd00d2d4d600cbcccd00d2d4d600cbcccd00 +d2d4d600cbcccd01d2d4d600cbcccd00d2d4d600cbcccd03d2d4d600cbcccd03d2d4d600 +cbcccd00d2d4d600cbcccd00d2d4d601e0e4e701e8ecef01ecf3f501ffffff2bf4f6f902 +e8ecef00ecf3f500e8ecef11ecf3f500f7ece700e8ecef02f4f6f900e8ecef00ecf3f500 +e8ecef00ecf3f501e8ecef00ecf3f500f4f6f900e8ecef00ecf3f505f4f6f902ecf3f501 +f4f6f901ecf3f500f4f6f903ecf3f501f7ece700ecf3f500f4f6f900ecf3f500f4f6f904 +f7ece700f4f6f900ecf3f500f7ece700f4f6f90bffffff00f4f6f905ffffff00f4f6f902 +ffffff00f4f6f914ffffff00f4f6f900ffffff00f4f6f900ffffff00f4f6f900ffffff13 +f4f6f900ffffff01f4f6f900ffffff01f4f6f900ffffff71f4f6f901e8ecef00e0e4e700 +d9dcde00d2d4d600cbcccd01c4c5c501bbbcbd0035343400454445004a4c4d04585c5e00 +4a4c4d00585c5e004a4c4d0054545502585c5e004a4c4d0454545501585c5e00ecf3f500 +ffffff09f4f6f900ffffff01f4f6f901ffffff00f4f6f906ffffff00f4f6f901ffffff00 +f4f6f900ffffff01f4f6f900ffffff01f4f6f900ffffff06f4f6f901ecf3f500e8ecef00 +e0e4e700d9dcde00d2d4d601cbcccd00c4c5c502bbbcbd00c4c5c500bbbcbd01c4c5c500 +bbbcbd00b4b4b40077747400585c5e0054545500585c5e00545455014a4c4d0054545502 +585c5e004a4c4d0054545504585c5e0263646502585c5e0554545501585c5e0054545501 +4a4c4d04545455004a4c4d07545455004a4c4d00585c5e0054545502585c5e026a6c6e00 +e0e4e700ecf3f50ce8ecef25e0e4e700e8ecef00e0e4e700e8ecef00e0e4e702e8ecef00 +e0e4e702e8ecef00e0e4e703e8ecef01e0e4e700e8ecef00e0e4e701e8ecef00e0e4e700 +e8ecef00e0e4e700e8ecef01e0e4e701e8ecef00e0e4e701e8ecef00e0e4e700e8ecef00 +e0e4e707d9dcde00e0e4e701d9dcde00e0e4e702d9dcde00e0e4e701d9dcde00e0e4e701 +d9dcde00e0e4e701d9dcde00e0e4e700d9dcde00e0e4e700d9dcde00e0e4e702d9dcde01 +e0e4e700d9dcde03e0e4e700d9dcde00e0e4e700d9dcde0cd2d4d600d9dcde0cd2d4d600 +d9dcde03d2d4d600d9dcde03e0e4e702e8ecef00ecf3f500f4f6f902ffffff2cf4f6f915 +ecf3f500f4f6f90bffffff00f4f6f901ffffff00f4f6f900ffffff01f4f6f900ffffff03 +f4f6f900ffffff00f4f6f903ffffff00f4f6f900ffffff01f4f6f901ffffff00f4f6f902 +ffffff00f4f6f900ffffff01f4f6f900ffffffc0f4f6f900ecf3f500e8ecef00e0e4e700 +d9dcde00d2d4d600d8cccb00cbcccd00c4c5c5017b7b7d002e2c2d004a4c4d0554545500 +4a4c4d00585c5e014a4c4d0a8c8b8c00ffffff2bf4f6f900ecf3f500e8ecef00e0e4e700 +d9dcde00d2d4d601cbcccd00c4c5c501bbbcbd06b4b4b4007b7b7d00585c5e0054545504 +585c5e004a4c4d00545455004a4c4d00545455004a4c4d00585c5e004a4c4d00585c5e03 +63646500585c5e0163646500585c5e02545455004a4c4d0054545500585c5e0054545500 +585c5e005454550a4a4c4d00545455004a4c4d00585c5e0054545500585c5e0254545500 +585c5e0263646500d2d4d600ecf3f501f4f6f902ffffff02f4f6f906ffffff00f4f6f912 +ecf3f500f4f6f901ecf3f500f4f6f909ecf3f501f4f6f900ecf3f50fe8ecef00ecf3f501 +e8ecef00ecf3f501e8ecef00ecf3f501e8ecef00ecf3f500e8ecef00ecf3f500e8ecef00 +ecf3f501e8ecef00ecf3f500e8ecef00ecf3f501e8ecef01ecf3f500e8ecef08e0e4e700 +e8ecef08e0e4e700e8ecef05e0e4e700e8ecef02e0e4e700e8ecef03e0e4e700e8ecef04 +e0e4e700e8ecef00e0e4e704d9dcde00e0e4e704d9dcde00e0e4e702d9dcde00e0e4e70f +e8ecef03ecf3f501f4f6f901ffffff11f4f6f900ffffff1ff4f6f900ffffff01f4f6f900 +ffffff00f4f6f900ffffff00f4f6f900ffffff01f4f6f900fffffff3f4f6f901e0e4e700 +e6dcdc00d2d4d601cbcccd01c4c5c500bbbcbd00353434004a4c4d00545455004a4c4d04 +454445004a4c4d00454445004a4c4d01454445004a4c4d003b3c3d0645444500e8ecef00 +ffffff2df4f6f900e8ecef01d9dcde00d2d4d601cbcccd00c4c5c503bbbcbd04b4b4b400 +7b7b7d004a4c4d00585c5e0054545500585c5e0054545500585c5e00545455014a4c4d02 +545455004a4c4d01585c5e08545455044a4c4d0054545502585c5e0154545500585c5e00 +54545501585c5e0254545502585c5e0763646500bbbcbd00ffffff29f4f6f900ffffff04 +f4f6f900ffffff00f4f6f900ffffff00f4f6f900ffffff00f4f6f900ffffff00f4f6f900 +ffffff00f4f6f904ecf3f500f4f6f905ecf3f500f4f6f907ecf3f500f4f6f901ecf3f500 +f4f6f901ecf3f500f4f6f901ecf3f500f4f6f903ecf3f500f4f6f900ecf3f50be8ecef00 +ecf3f515e8ecef04ecf3f500e8ecef12e0e4e700e8ecef01e0e4e700e8ecef05e0e4e700 +e8ecef02ecf3f502f4f6f903ffffff0ff4f6f900ffffffffffffff20ecf3f500e8ecef00 +e0e4e700d9dcde00d2d4d600cbcccd01c4c5c5017b7b7d002e2c2d004a4c4d0345444501 +3b3c3d004a4c4d00454445033b3c3d087b7b7d00f4f6f900ffffff2ef4f6f900e8ecef00 +e0e4e701d2d4d601cbcccd00c4c5c501bbbcbd01c4c5c500bbbcbd03b4b4b4007b7b7d00 +585c5e01545455034a4c4d00545455004a4c4d03585c5e0054545500585c5e0554545500 +4a4c4d00545455004a4c4d0254545503585c5e0054545500585c5e0054545500585c5e00 +54545500585c5e0054545500585c5e0254545500585c5e0363646500585c5e0263646500 +bbbcbd00f4f6f900ffffff5af4f6f900ffffff01f4f6f900ffffff02f4f6f900ffffff00 +f4f6f917ffffff00f4f6f909ecf3f500f4f6f901ecf3f51ff4f6f903ffffffffffffff32 +f4f6f900ecf3f500e8ecef00e0e4e700d2d4d601cbcccd01c4c5c500bbbcbd0035343400 +3b3c3d004a4c4d01454445004a4c4d00454445033b3c3d004a4c4d00454445004a4c4d00 +3b3c3d08d9dcde00ffffff30f4f6f900ecf3f500e0e4e700d9dcde01d2d4d600cbcccd01 +c4c5c502bbbcbd058c8b8c0054545500585c5e0054545500585c5e00545455014a4c4d00 +545455004a4c4d01545455004a4c4d0054545502585c5e05545455024a4c4d0054545500 +4a4c4d0054545501585c5e0054545501585c5e004a4c4d0054545502585c5e0663646500 +585c5e026a6c6e00d9dcde00ffffff8af4f6f900ffffff02f4f6f901ffffff00f4f6f917 +ffffff00f4f6f900ffffff13f4f6f900ffffff00f4f6f900ffffff00f4f6f900ffffffff +ffffff1df4f6f900ecf3f500e0e4e700d9dcde00d2d4d600cbcccd01c4c5c5017b7b7d00 +242324004a4c4d003b3c3d06454445094a4c4d00454445016a6c6e00f4f6f900ffffff31 +f4f6f900ecf3f500e8ecef00d9dcde01d2d4d600cbcccd00c4c5c502bbbcbd00c4c5c500 +bbbcbd049c9e9c00585c5e0054545500585c5e0054545503585c5e0154545500585c5e00 +54545504585c5e02545455014a4c4d0054545502585c5e01545455024a4c4d0154545501 +585c5e0463646501585c5e0063646500585c5e0063646500585c5e008c8b8c00ecf3f500 +ffffffc1f4f6f900ffffffffffffff20ecf3f500e8ecef00e6dcdc00d2d4d601cbcccd00 +c4c5c5024a4c4d003b3c3d04454445003b3c3d04454445014a4c4d003b3c3d0045444506 +d9dcde00ffffff33f4f6f900e8ecef01e0e4e700d9dcde01d2d4d600cbcccd01c4c5c501 +bbbcbd00c4c5c500bbbcbd03a4a5a4006a6c6e0054545500585c5e0054545501585c5e05 +545455014a4c4d00585c5e0354545500585c5e0054545504585c5e0154545500585c5e00 +545455004a4c4d0154545500585c5e02636465067b7b7d00d2d4d600ffffffc1f4f6f900 +ffffff02f4f6f900ffffffffffffff1eecf3f500e8ecef00e0e4e700d9dcde00d2d4d600 +cbcccd02bbbcbd002e2c2d003b3c3d012e2c2d00353434013b3c3d01454445004a4c4d01 +454445004a4c4d00454445003b3c3d004a4c4d00454445004a4c4d046a6c6e00f4f6f900 +ffffff35ecf3f500e8ecef00e0e4e701d9dcde00d2d4d601cbcccd01c4c5c502bbbcbd00 +c4c5c500bbbcbd01b4b4b40088848400585c5e0163646500585c5e0e54545504585c5e00 +54545500585c5e0154545500585c5e05636465016a6c6e03bbbcbd00f4f6f901ffffffc0 +f4f6f900ffffff01f4f6f900ffffffffffffff20f4f6f900e8ecef00e0e4e700d9dcde00 +d2d4d602cbcccd00a4a5a4002e2c2d00353434012e2c2d00353434002e2c2d003b3c3d01 +454445013b3c3d00454445013b3c3d004a4c4d00454445014a4c4d01454445004a4c4d01 +cbcccd00ffffff37ecf3f501e0e4e701d9dcde01d2d4d601cbcccd02c4c5c503bbbcbd01 +a4a5a4007b7b7d0063646501585c5e0d54545501585c5e0054545501585c5e004a4c4d00 +585c5e0054545502585c5e02636465016a6c6e00636465006a6c6e007b7b7d00b4b4b400 +ffffffc8f4f6f900ffffff00f4f6f900ffffffffffffff1eecf3f500e8ecef00e0e4e701 +d9dcde00d2d4d60188848400353434002e2c2d01353434002e2c2d00353434013b3c3d00 +454445004a4c4d0b6a6c6e00f4f6f900ffffff38f4f6f900ecf3f501e0e4e701d9dcde02 +d2d4d601cbcccd02c4c5c500cbcccd00c4c5c501bbbcbd009c9e9c007b7b7d0063646500 +585c5e0463646500585c5e024a4c4d00585c5e004a4c4d0054545501585c5e004a4c4d00 +585c5e0054545501585c5e004a4c4d0054545500585c5e0054545500585c5e0263646502 +8c8b8c00cbcccd00f4f6f901ffffffc5f4f6f900ffffffffffffff23f4f6f901e8ecef00 +e0e4e703a4a5a4006a6c6e00585c5e003b3c3d002e2c2d00353434002e2c2d003b3c3d02 +454445004a4c4d00454445004a4c4d02545455034a4c4d01bbbcbd00ffffff3bf4f6f900 +ecf3f500e8ecef00ecf3f500e0e4e701d9dcde02d2d4d603cbcccd00d2d4d600cbcccd02 +b4b4b4008c8b8c006a6c6e00585c5e054a4c4d00585c5e0054545500585c5e014a4c4d00 +54545505585c5e004a4c4d00545455004a4c4d01585c5e0163646500a4a5a400e8ecef00 +f4f6f900ffffffc7f4f6f900ffffff01f4f6f900ffffff00f4f6f900ffffffffffffff20 +f4f6f901e8ecef03e0e4e703c4c5c500b4b4b4009c9e9c008c8b8c007b7b7d0063646500 +4a4c4d003b3c3d004a4c4d01545455044a4c4d0054545500585c5e00ffffff3ef4f6f900 +ecf3f501e8ecef01e0e4e702d9dcde03d2d4d601d9dcde00d2d4d600d9dcde00d2d4d601 +bbbcbd009c9e9c0077747400585c5e004a4c4d01585c5e014a4c4d00585c5e004a4c4d0b +585c5e009c9e9c00d2d4d600f4f6f901ffffffcbf4f6f900ffffff02f4f6f900ffffffff +ffffff21f4f6f901ecf3f504e8ecef00ecf3f500e8ecef00ecf3f500e8ecef00ecf3f502 +e0e4e700cbcccd00bbbcbd00abacad008c8b8c007b7b7d00585c5e0054545502b4b4b400 +ffffff3ff4f6f901ecf3f502e8ecef01e0e4e702d9dcde00e0e4e701d9dcde00e0e4e700 +d9dcde01e0e4e700d9dcde01e0e4e700d9dcde00c4c5c500a4a5a4008c8b8c007b7b7d00 +585c5e00545455014a4c4d06585c5e008c8b8c00b4b4b400e0e4e700ffffff00f4f6f900 +ffffffcdf4f6f900ffffff01f4f6f900ffffffffffffff27f4f6f902ecf3f504f4f6f903 +ffffff00f4f6f902ffffff00f4f6f900ffffff00ecf3f500e0e4e700f4f6f900ffffff42 +f4f6f900ecf3f500f4f6f900ecf3f502e8ecef02e0e4e700e8ecef00e0e4e700e8ecef01 +e0e4e700e8ecef03ecf3f504e0e4e700d2d4d601c4c5c500cbcccd00d2d4d600d9dcde00 +e0e4e700ecf3f500ffffff00f4f6f901ffffffcdf4f6f900ffffff03f4f6f900ffffff01 +f4f6f900ffffffffffffff81f4f6f901ecf3f500f4f6f900ecf3f50cf4f6f901ffffff00 +f4f6f900ffffff00f4f6f900ffffff00f4f6f900ffffff00f4f6f900ffffffd5f4f6f900 +ffffff00f4f6f900ffffff01f4f6f900ffffffffffffff86f4f6f900ffffff00f4f6f902 +ecf3f500f4f6f902ffffffe0f4f6f900ffffff04f4f6f900ffffff01f4f6f900ffffff00 + +%%EndData +end +%%PageTrailer +%%Trailer +%%BoundingBox: 0 0 633 196 +%%EOF diff --git a/doc/doxygen_logo.gif b/doc/doxygen_logo.gif new file mode 100644 index 0000000..6b45597 Binary files /dev/null and b/doc/doxygen_logo.gif differ diff --git a/doc/doxygen_logo_low.gif b/doc/doxygen_logo_low.gif new file mode 100644 index 0000000..02e3c9a Binary files /dev/null and b/doc/doxygen_logo_low.gif differ diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex new file mode 100644 index 0000000..8d28a55 --- /dev/null +++ b/doc/doxygen_manual.tex @@ -0,0 +1,42 @@ +\documentclass[a4paper]{article} +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyheadings} +\usepackage{epsf} +\usepackage{doxygen} +\usepackage{multicol} +\makeindex +\setcounter{tocdepth}{1} +\setlength{\footrulewidth}{0.4pt} +\begin{document} +\begin{titlepage} +\setlength{\epsfxsize}{\textwidth} +\epsffile{doxygen_logo.eps} +\begin{center} +Manual for version $VERSION\\[2ex] +Written by Dimitri van Heesch\\[2ex] +\copyright 1997-1998 +\end{center} +\end{titlepage} +\clearemptydoublepage +\tableofcontents +\clearemptydoublepage +\pagenumbering{arabic} +\include{index} +\part{User Manual} +\input{install} +\input{starting} +\input{trouble} +\part{Reference Manual} +\input{features} +\input{history} +\input{doxygen_usage} +\input{doxytag_usage} +\input{doxysearch_usage} +\input{installdox_usage} +\input{autolink} +\input{config} +\input{commands} +\input{htmlcmds} +\printindex +\end{document} diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc new file mode 100644 index 0000000..e6fee75 --- /dev/null +++ b/doc/doxygen_usage.doc @@ -0,0 +1,47 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page doxygen_usage Doxygen usage + +Doxygen is a command line based utility. Calling \c doxygen with the +\c -h option at the command line will give you a brief description of the +usage of the program. + +All options consist of a leading character -, +followed by one character and optionally an argument. + +To generate a class browser you typically need to follow these steps: +
    +
  1. You document your source code with + special documentation blocks. +
  2. You generate a configuration file (see section \ref config) by + calling doxygen with the \c -g option: +\verbatim +doxygen -g +\endverbatim +
  3. You edit the configuration file so it matches your project. + In the configuration file you can specify the input files and + a lot of optional information. +
  4. You let doxygen generate the documentation, based on the settings in the + configuration file: +\verbatim +doxygen +\endverbatim +
+ +If you also want a search engine to be generated, you should look +at section \ref doxysearch_usage. + +*/ diff --git a/doc/doxysearch_usage.doc b/doc/doxysearch_usage.doc new file mode 100644 index 0000000..a4a3e96 --- /dev/null +++ b/doc/doxysearch_usage.doc @@ -0,0 +1,169 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page doxysearch_usage Doxysearch usage + +Doxysearch is a small, fast and highly portable search engine that allows +you to search for strings or words in the documentation generated by +doxygen or +in the Qt documentation (see below). +Doxysearch must be run as a CGI binary. This implies the following: +
    +
  • There must be a HTTP daemon running on the system where you want to + install the documentation (the target) +
  • You must have permission to install and execute a CGI binary on the + target. +
+Ask you system administrator or provider if you are unsure if this is possible. + +In order to be able to search fast and efficient, doxysearch does not +search the generated documentation directly. Instead, it uses an +index file, that should be generated with +doxytag. The index file is extracted from +the generated HTML files and contains all words and substrings of words +present in the HTML files, in a compact form, together with their +frequencies and links. Although I tried to store all information +as compactly as possible, the size of the index is still quite large. +Usually it is about the same size as the original HTML files. + +I have tried to make the search engine highly portable, because it +must run on the target system. As a result doxysearch does not require the +Qt library. All that is required to build doxysearch is a C++ compiler. +If you are using \c g++ for example, you can build the search engine manually, +by typing: +\verbatim + g++ doxysearch.cpp -o doxysearch +\endverbatim + + +

Generating the search engine

+
+ +To include a search engine in the documentation generated by doxygen +follow these steps: +
    +
  1. Generate a configuration file with + doxygen using the + -g option, if you haven't done this already. + +
  2. Edit the search engine section (see section \ref config_search of + the configuration file). + Make sure the \c SEARCHENGINE tag is set to \c YES + and that all paths are correct. + +
  3. Use doxygen to generate the + documentation. Apart from the documentation, Doxygen will create the + following files: +
      +
    • A small CGI script. the name of the script is determined by the + \c CGI_NAME tag in the configuration file. + The script is a small wrapper that calls \c doxysearch with + the correct parameters. Using this script allows multiple + search engines for different projects to be present in one directory. +
    • \c search.cfg: this file is a small configuration file + for the search engine. It contains two lines of text. The first line + should be the absolute URL to the documentation. The second line should + be the absolute URL to the CGI script. This information is taken from + the configuration file. +
    • \c search.gif: this is the image that is used for the search button. +
    + +
  4. Copy (or move) the CGI script to the directory where the CGI binaries + are located. + This is usually a special directory on your system or in your + home directory. + Consult the manual of your HTTP daemon or your system administrator to + find out, where this directory resides on your system. + +
  5. Goto the directory where the generated HTML files are located and run + doxytag as follows: +
    doxytag -s search.idx
    + This will create a search index with the name search.idx. + Currently the index file must be called like this. + +
  6. Run installdox to replace + any dummy links in the documentation with real links. + + Notice: When using a search engine this step is required + even if no tag files are used. If tag files are used you must specify + the correct options. +
+ + +

Creating a search engine to search in the Qt documentation

+
+ +Using doxytag and doxysearch it is possible to create a search engine for +the Qt documentation, without needing the sources! +This can be done by carefully following these steps: +
    +
  1. Goto the html directory of the Qt-distribution: +
    cd $QTDIR/html
    +
  2. Generate the search index by typing: +
    doxytag -s search.idx *.html
    + This will parse all files and build a search index. + Apart from the file search.idx two other files + will be generated: search.gif and search.cgi + + \par Notice: + Doxytag requires quite a large amount of memory to + generate the search index (about 30 Mb on my Linux box)! + The resulting index file requires about 3 Mb space on your disk. + +
  3. Edit the shell script search.cgi with a text editor. + + Fill in the absolute path to the doxysearch binary after + the DOXYSEARCH= tag. + On my system this becomes: +
    DOXYSEARCH=/usr/local/bin/doxysearch
    + + Fill in the absolute path to the qt documentation after the + DOXYPATH= tag. + On my system this becomes: +
    DOXYPATH=/usr/local/qt/html
    +
  4. + CGI binaries are usually located in a special directory. + Consult the manual of your HTTP daemon or your system administrator to + find out, where this directory resides on your system. + Copy (or move) the search.cgi script to this directory. + If needed you may change the name of the script. + On my system, this becomes: +
    cp search.cgi /usr/local/lib/httpd/cgi-bin/
    + +
  5. Create a text-file with the name search.cfg. + On the first line, you must put the absolute URL to the Qt + documentation. + Since, I only use the search engine on my own standalone system, I use + the file: protocol. + On the second line, you must put the absolute URL to the + cgi script. + On my system the resulting file looks like this: +\verbatim +file:///usr/local/qt/html +http://blizzard/cgi-bin/search.cgi +\endverbatim + +
  6. Add a link to the search engine in the Qt documentation. + On my system, I have put a line +\verbatim +
  7. Search the documentation +\endverbatim + in the additional information section of the index.html file. +
  8. Start your favourite web browser and click on the link. + If everything is ok, you should get a page where you can enter + search terms. +
+ +*/ diff --git a/doc/doxytag_usage.doc b/doc/doxytag_usage.doc new file mode 100644 index 0000000..fb966fd --- /dev/null +++ b/doc/doxytag_usage.doc @@ -0,0 +1,116 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page doxytag_usage Doxytag usage + +Doxytag is a small command line based utility. +It has two functions: +
    +
  • + Doxytag can generate tag files. + These tag files can be used with doxygen + to generate references to external documentation + (i.e. documentation not contained in the input files that are used by + doxygen). + A tag file contains information about files, classes and members + documented in external documentation. Doxytag extracts this information + directly from the HTML files. This has the advantage that you do not need + to have the sources from which the documentation was extracted. + If you do have the sources you can also let \c doxygen generate the + tag file by putting the name of the tag file after \c GENERATE_TAGFILE in + the configuration file. +
  • + Doxytag can generate a search index for the documentation + generated with doxygen or for the Qt documentation. See the documentation of + doxysearch for more information on how + to do this. + A search index contains information about all the words (and all substrings + thereof) that are contained in the documentation. + For each string the index contains the set of documentation blocks that + contain the string and the frequency of occurrence. This way + doxysearch can search for words very quickly + (most queries are processed within a few milliseconds on my system.) +
+In both cases the input of doxytag consists of a set of HTML files. + +\par Important: + If you use tag files or use a search engine, the links that + are generated by doxygen will contain \e dummy links. You have to run + the \c installdox script to change these dummy links into real links. + See \ref installdox_usage for more information. + The use of dummy links may seem redundant, but it is really useful, + if you want to move the external documentation to another location. + Then the documentation does not need to be regenerated by \c doxygen, + only \c installdox has to be run. + +\par Notice: +Because the HTML files are expected to have a certain +structure, only HTML files generated with doxygen or with Qt's class +browser generator can be used. Doxytag only reads the HTML files, +they are not altered in any way. + +Doxytag expects a list of all HTML files that form the documentation +or a directory that contains all HTML files. If neither is present doxytag +will read all files with a .html extension from the current directory. +If doxytag is used with the -t flag it generates a tag file. + +\par Example 1: + Suppose the file \c example.cpp from the \c examples directory that is listed + below is included in some package for which you do not have the sources. + Fortunately, the distributor of the packages included the HTML documentation + that was generated by doxygen in the package. + \verbinclude example.cpp + Now you can create a tag file from the HTML files in the package by + typing: +\verbatim +doxytag -t example.tag example/html +\endverbatim + from the examples directory. + Finally you can use this tag file with your own piece of code, such + as done in the following example: + \verbinclude tag.cpp + Doxygen will now include links to the external package in your own + documentation. Because the tag file does not specify where the + documentation is located, you will have to specify that by running the + installdox script that doxygen generates + (See \ref installdox_usage for more information). + + Notice that this is actually a feature because if you (or someone else) + moves the external documentation to a different + directory or URL you can simply run the script again and all links in + the HTML files will be updated. + + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen using + only the tag file and second piece of code. + \endhtmlonly + +\par Example 2: + To generate a tag file of the Qt documentation you can do the following: +\verbatim +doxytag -t qt.tag $QTDIR/html +\endverbatim + +A typical example to use doxytag to generate a search index is: +\verbatim +doxytag -s search.idx +\endverbatim + +\par Notice: +In the current version of doxygen, the search index must be +called \c search.idx. + +*/ diff --git a/doc/features.doc b/doc/features.doc new file mode 100644 index 0000000..2f34e18 --- /dev/null +++ b/doc/features.doc @@ -0,0 +1,79 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page features.html + +\section features Features + +\addindex features +
    +
  • Requires very little overhead from the writer of the documentation. + Plain text will do, but for more fancy or structured output HTML tags + and/or some of doxygen's special commands can be used. +
  • Outputs documentation in on-line format (HTML and man page) and off-line + format (LaTeX) simulatiously (one can be disabled if desired). + Both formats are optimized for ease of reading. +
  • Allows documentation of files, classes, templates, variables, functions, + typedefs, enums and defines. +
  • Includes a full C preprocessor to allow proper parsing of conditional + code fragments and to allow expansion of all or part of the define macros. +
  • Automatically detects public, protected and private sections, as well as + the Qt specific signal and slots sections. Extraction of private class + members is optional. +
  • Automatically generates of class diagrams in HTML (as clickable + image maps) and Latex (as encapsulated postscript). +
  • JavaDoc (1.1) and Qt-Doc compatible. +
  • References to base/super classes and inherited/overridden members are + generated automatically. +
  • Includes a fast, rank based search engine to search for strings or words + in the class and member documentation. +
  • Automatic generation of references to documented classes, files and + members. Documentation of global functions, globals variables, + typedefs, defines and enumerations is also supported. +
  • Documentation may be placed either at the declaration or at the definition + of a member function or class. Most documentation systems (such as Javadoc) only + support the former, others (such as Qt) only the latter. +
  • You can type normal HTML tags in your documentation. Doxygen will convert + them to Latex automatically. +
  • Allows references to documentation generated for other projects + (or another part of the same project) in a location independent way. +
  • Allows inclusion of source code examples that are automatically + cross-referenced with the documentation. +
  • Inclusion of undocumented classes is also supported, allowing to quickly + learn the structure and interfaces of a (large) piece of code without + looking into the implementation details. +
  • All options are read from an easy to edit and documented configuration + file. +
  • Documentation and search engine can be transferred to another + location or machine without regenerating the documentation. +
  • Can cope with large projects easily. +
+ +Although doxygen can be used in any C or C++ project, it was specifically +designed to be used for projects that make use of Troll Tech's +Qt toolkit. I have tried to make doxygen +`Qt-compatible'. That is: Doxygen can read the documentation contained in +the Qt source code and create a class browser that looks very similar to the +one that is generated by Troll Tech. Doxygen understands the C++ extensions +used by Qt such as signals and slots. + +Doxygen can also automatically generate links to existing documentation +that was generated with Doxygen or with Qt's non-public class browser +generator. For a Qt based project this means that whenever you refer to +members or classes belonging to the Qt toolkit, a link will be generated to +the Qt documentation. This is done independent of where this documentation +is located! + +*/ diff --git a/doc/history.doc b/doc/history.doc new file mode 100644 index 0000000..3571bd6 --- /dev/null +++ b/doc/history.doc @@ -0,0 +1,140 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + + +/*! \page history Doxygen History + +

TODO/Wish list

+
    +
  • Add support for grouping members, and document then as a group. +
  • Support for K&R-style function arguments. +
  • More ouput formats: suggested are info format and RTF format. +
  • Reintroduction of the multi-column class list (and file list) to quickly + select a class or file +
  • Split long lists in an index to a set of smaller lists. +
  • Add a nice graphical front-end for creating and modifying the + configuration file (it should be flexible enough to quickly add new options). +
  • Improve the search index generation, so it uses less memory and + is easier to get running. +
  • Generate code metrics (Anyone know a good book about code metrics?) +
  • Add features that you think are missing... So if you know any that are + not yet listed here, please let me know. +
+ +

Features scheduled for version 0.5

+
    +
  • Proper support for namespaces. +
  • Include LaTeX style formulas in LaTeX and HTML output (in HTML as a gif). +
  • Proper support for template classes, members, functions and specializations. +
  • Multi-lingual support. +
  • Generation of class diagrams (clickable image maps in HTML, eps images in + postscript). +
  • Add generator for man pages format. +
+ +

Version 0.4

+ +

New features:

+
    +
  • LaTeX output generation. +
  • Full JavaDoc support. +
  • Build-in C-preprocessor for correct conditional parsing of source code + that is read by Doxygen. +
  • Build-in HTML to LaTeX converter. This allows you to use HTML tags in + your documentation, while doxygen still generates proper LaTeX output. +
  • Many new commands (there are now more than 60!) to document + more entities, to make the documentation look nicer, and to include + examples or pieces of examples. +
  • Enum types, enum values, typedefs, #defines, and files can now be + documented. +
  • Completely new documentation, that is now generated by Doxygen. +
  • A lot of small examples are now included. +
+

Bug fixes:

+
    +
  • A lot of parser bugs are fixed. +
  • Improved support for documenting C code. +
+ +

Version 0.3

+

New features:

+
    +
  • A search engine doxysearch, + that allows you to search through the generated documentation. +
  • A configuration file instead of command-line options. A default + configuration file can be generated + by doxygen. +
  • Added an option to generate output for undocumented classes. +
  • Added an option to generate output for private members. +
  • Every page now contains a condensed index page, allowing much faster + navigation through the documentation. +
  • Global and member variables can now be documented. +
  • A project name can now given, which will be included in the + documentation. +
+ +

Bug fixes:

+
    +
  • Fixed bug when files with the same name but in different directories + are used as include files. +
  • Template classes now work. +
  • Inner classes now work. +
  • Fixed a bug regarding unrelated functions and \fn. +
  • Fixed parse bug with /**/ comments +
  • Fixed a bug regarding inline friend functions. +
  • The list of all members now also contains the undocumented members. +
  • Special documentation is now removed from code blocks. +
  • Doxygen should compile on Sun Solaris (with CC), HP-UX (with + CC), Irix (with DCC) and Linux (with GCC) +
  • Fixed several minor bugs. +
+ +

Version 0.2

+

New features:

+
    +
  • Blocks of code are now parsed. Function calls and variables are + replaced by links to their documentation if possible. +
  • Special example documentation block added. This can be used to + provide cross references between the documentation and some example code. +
  • Documentation blocks can now be placed inside the body of a class. +
  • Documentation blocks with line range may now be created using + special //! C++ line comments. +
  • Unrelated members can now be documented. A page containing a + list of these members is generated. +
  • Added an \include command to insert blocks of source code + into the documentation. +
  • Warnings are generated for members that are undocumented. +
  • You can now specify your own HTML headers and footers for the + generated pages. +
  • Option added to generated indices containing all external classes + instead of only the used ones. +
+ +

Bug fixes:

+
    +
  • Fixed a link generation problem with mixed case filenames are used. +
  • Made doxygen a little more portable. + (doxygen should now compile on Linux (with g++) and HP-UX (with CC)) +
  • Fixed a bug in err() function. +
  • Fixed a problem with the type cast operator. +
  • Removed some typo's from the docs. +
  • Several small bug fixes and enhancements. +
+ +

Version 0.1

+Initial version. + +*/ diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc new file mode 100644 index 0000000..7a35200 --- /dev/null +++ b/doc/htmlcmds.doc @@ -0,0 +1,111 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page htmlcmds HTML Commands + +Here is a list of all HTML commands that may be used inside the +documentation. Notice that all attributes of a HTML tag are ignored +(the HREF and NAME attributes for the A tag are the only exception). + +
    +
  • \ Starts a HTML hyper-link (HTML only). +
  • \ Starts an named anchor (HTML only). +
  • \c Ends a link or anchor (HTML only). +
  • \c Starts a piece of text displayed in a bold font. +
  • \c Ends a \c section. +
  • \c Does not generate any output. +
  • \c Does not generate any output. +
  • \c
    Forces a line break. +
  • \c
    starts a section of centered text. +
  • \c
  • ends a section of centered text. +
  • \c Starts a piece of text displayed in a typewriter font. +
  • \c End a \c section. +
  • \c
    Starts an item description. +
  • \c Starts a piece of text displayed in a typewriter font. +
  • \c Ends a \c section. +
  • \c
    Starts a description list. +
  • \c
  • Ends a description list. +
  • \c
    Starts a item title. +
  • \c
  • Does not generate any output. +
  • \c Starts a piece of text displayed in an italic font. +
  • \c Ends a \c section. +
  • \c
    Does not generate any output. +
  • \c
  • Does not generate any output. +
  • \c
    Writes a horizontal ruler. +
  • \c

    Starts an unnumbered section. +
  • \c
  • Ends an unnumberd section. +
  • \c

    Starts an unnumbered subsection. +
  • \c
  • Ends an unnumbered subsection. +
  • \c Where ? is one of {3,4,5,6}, starts an unnumbered subsubsection. +
  • \c Where ? is one of {3,4,5,6}, ends an unnumbered subsubsection. +
  • \c Starts a piece of text displayed in an italic font. +
  • \c Does not generated any output. +
  • \c Ends a \c section. +
  • \c This command is written with attributes to the HTML output only. +
  • \c
  • Starts a new list item. +
  • \c
  • Does not generate any output. +
  • \c Does not generate any output. +
  • \c ignored by Doxygen. +
  • \c ignored by Doxygen. +
  • \c
      Starts a numbered item list. +
    1. \c
    Ends a numbered item list. +
  • \c

    Starts a new paragraph. +

  • \c

    Does not generate any output. +
  • \c
     starts a code fragment, 
    +             equivalent to the command \\code (see section \ref cmdcode).
    +
  • \c
  • ends a code fragment, + equivalent to the command \\endcode (see section \ref cmdendcode). +
  • \c starts a section of text displayed in a smaller font. +
  • \c ends a \c section. +
  • \c starts a section of bold text. +
  • \c ends a section of bold text. +
  • \c Starts a piece of text displayed in superscript. +
  • \c Ends a \c section. +
  • \c Starts a piece of text displayed in subscript. +
  • \c Ends a \c section. +
  • \c starts a table, the available space of a page is always + divided equally amount the columns. +
  • \c
  • ends a table +
  • \c Starts a new table element. +
  • \c Does not generate any output. +
  • \c Starts a new table row. +
  • \c Does not generate any output. +
  • \c Starts a piece of text displayed in a typewriter font. +
  • \c Ends a \c section. +
  • \c
      Starts an unnumbered item list. +
    • \c
    Ends an unnumbered item list. +
  • \c Starts a piece of text displayed in an italic font. +
  • \c Ends a \c section. +
+ +The special HTML characters entities that are recognized by Doxygen: + +
    +
  • \c © the copyright symbol +
  • \c " a double quote +
  • \c &?uml; where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y}, + writes a character with a diaeresis accent (like ä). +
  • \c &?acute; where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y}, + writes a character with a acute accent (like á). +
  • \c &?grave; where ? is one of {A,E,I,O,U,a,e,i,o,u,y}, + writes a character with a grave accent (like à). +
  • \c &?circ; where ? is one of {A,E,I,O,U,a,e,i,o,u,y}, + writes a character with a circumflex accent (like â). +
  • \c &?tilde; where ? is one of {A,N,O,a,n,o}, + writes a character with a tilde accent (like ã). +
+ +*/ + diff --git a/doc/index.doc b/doc/index.doc new file mode 100644 index 0000000..add62b4 --- /dev/null +++ b/doc/index.doc @@ -0,0 +1,163 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page index +
+\htmlonly +doxygen
+Version: $(VERSION) +\endhtmlonly +
+ +

Doxygen license

+\addindex license +\addindex GPL + +Copyright © 1997-1999 by +Dimitri van Heesch.

+ +Permission to use, copy, modify, and distribute this software and its +documentation under the terms of the GNU General Public License is hereby +granted. No representations are made about the suitability of this software +for any purpose. It is provided "as is" without express or implied warranty. +See the GNU General Public License for more details. +

+All output generated by Doxygen is not covered by this license. + +

Introduction

+Doxygen is a documentation system for C and C++. It can generate an on-line +class browser (in HTML) and/or an off-line reference manual +(in \f$\mbox{\LaTeX}\f$) from a set +of documented source files. The documentation is extracted directly from the +sources. Doxygen is developed on a Linux +platform, but it runs on most other UNIX flavors as well. +An executable for Windows 95/NT is also available. + +Doxygen can also be configured to extract the code-structure from undocumented +source files. This can be very useful to quickly find your way in large +source distributions. + +You can even `abuse' doxygen for creating normal documentation (as I did +for this manual). + +This manual is divided into two parts, each of which is divided into several +sections. + +The first part forms a user manual: +
    +
  • Section \ref install discusses how to download, compile and install + doxygen for your platform. +
  • Section \ref starting tells you how to generate your first piece of + documentation quickly. +
  • Section \ref trouble tells you what to do when you have problems. +
+ +The second part forms a reference manual: + +
    +
  • Section \ref features presents an overview of what Doxygen can do. +
  • Section \ref history shows what has changed during the development + of Doxygen and what still has to be done. +
  • Section \ref doxygen_usage shows how to use the \c doxygen program. +
  • Section \ref doxytag_usage shows how to use the \c doxytag program. +
  • Section \ref doxysearch_usage shows how to use the \c doxysearch program. +
  • Section \ref installdox_usage shows how to use the \c installdox + script that is generated by Doxygen if you use tag files. +
  • Section \ref autolink shows how to put links to files, classes, + and members in the documentation. +
  • Section \ref config shows how to fine-tune doxygen, so it + generates the documentation you want. +
  • Section \ref commands shows an overview of the special commands that can be + used within the documentation. +
  • Section \ref htmlcmds shows an overview of the HTML commands that + can be used within the documentation. +
+ +

Acknowledgements

+\addindex acknowledgements +Thanks go to: +
    +\addindex Doc++ +
  • Malte Zöckler and Roland Wunderling, authors of Doc++. + The first version of Doxygen was based on an old version of Doc++. + Although I have rewritten practically all code since then, Doc++ has still + given me a good start in writing Doxygen. +
  • All people at Troll Tech, for creating a beautiful GUI Toolkit. + (which is even useful for GUI-less applications like doxygen :-) +
  • My brother Frank + for rendering the logos. +
  • +Arnt Gulbrandsen, +Adam P. Jenkins, +Frank van de Pol, +Ulrich Quill, +Karl Robillard, +Frugal the Curious, +Michael Figley, +Eric Bos, +Barry Roberts, +Mark Tigges, +Jan Ekholm, +Andre Johansen, +Martin Franken, +Martin Hofmann, +Ulrich Ring, +Andy Guy, +Ryan Mclean, +Joseph Reklow, +Morten Eriksen, +Arthur Pope, +Andreas Felber, +Matthias Schwartz, +Björn Bon, +Volker Börchers, +Baruch Even, +Kor de Jong, +Thomas Eschenbacher, +Bert Scholten, +Germar Morgenthaler, +Daniel Bellen, +Terry Brown, +Anke Selig, +David Aspinwall, +Hellmar Becker, +Harald Krummeck, +Christoph Koegl, +Martin Reinecke, +Joseph Turian, +Craig P Earls, +Greg Sjaardema, +Vlado Sironja, +Jens Schmidt, +Lutz Sammer, +Robert Dale, +Ionutz Borcoman, +Markus Noga, +Darren Kelly, +Joerg Ott, +Kostya Serebrainy, +Marco Molteni, +Johannes Zellner, +Ole Gerden, +Olaf Meeuwissen, +Feiyi Wang, +Robert J. Clark, +Matthias Baas and +Walter Mueller + for suggestions, patches and bug reports. +
+*/ + diff --git a/doc/install.doc b/doc/install.doc new file mode 100644 index 0000000..2c5f0ac --- /dev/null +++ b/doc/install.doc @@ -0,0 +1,99 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page install Installation + +\addindex installation +First go to the +download page +\latexonly({\tt http://www.stack.nl/$\sim$dimitri/doxygen/download.html})\endlatexonly +to get the latest distribution and unpack it. + +If you downloaded the source distribution, you need at least the +following to build the executable: +
    +
  • Troll Tech's GUI toolkit Qt + \latexonly(see {\tt http://www.troll.no/dl})\endlatexonly. + \addindex Qt +
  • The GNU tools + flex, bison and make + \latexonly(see {\tt ftp://prep.ai.mit.edu/pub/gnu})\endlatexonly. + \addindex flex + \addindex bison + \addindex make +
  • In order to generate a Makefile for your platform, you need + dimitri@stack.nl. + +After compilation, the binaries will be located in the \c bin +directory of the distribution. +You may want to copy these files to a location in your path +(\c /usr/local/bin for instance) or add the \c bin +directory of the distribution to your search path. + +The following binaries should now be available: +
      +
    • \c doxygen: for generating the class browser. +
    • \c doxytag: for creating a tag file containing references + to external documentation. +
    • \c doxysearch: the search engine. This binary should not be + executed directly. It must be called from an CGI script that will be + generated by doxygen. +
    + +Doxygen was developed and tested under Linux using the following tools: +
      +
    • GCC version 2.8.1 +
    • GNU flex version 2.5.4 +
    • GNU bison version 1.25 +
    • GNU make version 3.77 +
    • Perl version 5.001 (patch level 1m) +
    • VIM version 5.3 +
    • Netscape 4.04 & 4.5 +
    • Troll Tech's tmake version 1.2 (included in the distribution) +
    • teTeX version 0.4 +
    + +\htmlonly +Go to the next section or return to the + index. +\endhtmlonly + +*/ + diff --git a/doc/installdox_usage.doc b/doc/installdox_usage.doc new file mode 100644 index 0000000..d22e4a7 --- /dev/null +++ b/doc/installdox_usage.doc @@ -0,0 +1,61 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page installdox_usage Installdox usage + +Installdox is a perl script that is generated by doxygen whenever +tag files are used (See \c TAGFILES +in section \ref config_extref) +or the search engine is enabled (See \c SEARCHENGINE +in section \ref config_search). The script is +located in the same directory where the HTML files are located. + +Its purpose is to set the location of the external documentation +for each tag file and to set the correct links to the search engine +at install time. + +Calling \c installdox with option -h at the command line +will give you a brief description of the usage of the program. + +The following options are available: +
    +
    -l \\@\
    + Each tag file contains information about the files, classes and members + documented in a set of HTML files. A user can install these + HTML files anywhere on his/her hard disk or web site. + Therefore installdox \e requires the location of the + documentation for each tag file \ + that is used by doxygen. The location \ can be + an absolute path or a URL. + + \par Notice: + Each must be unique and should only be the name of the + file, not including the path. + +
    -q
    + When this option is specified, installdox will generate no output other + than fatal errors. +
    +Optionally a list of HTML files may be given. +These files are scanned and modified if needed. +If this list is omitted all files in the current directory +that end with \c .html are used. + +The \c installdox script is unique for each generated class browser +in the sense that it `knows' what tag files are used. It will generate an error if +the -l option is missing for a tag file or if an invalid tag file +is given. + +*/ diff --git a/doc/starting.doc b/doc/starting.doc new file mode 100644 index 0000000..1d3cbcd --- /dev/null +++ b/doc/starting.doc @@ -0,0 +1,411 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page starting Getting started + +The executable \c doxygen is the main program that parses the sources and +generates the documentation. See section \ref doxygen_usage for more +detailed usage information. + +The executable \c doxytag is only needed if you want to generate references +to external documentation (i.e. documentation that was generated by Doxygen) +for which you do not have the sources or to create a search index for +the search engine. See section \ref doxytag_usage for more detailed usage +information. + +The executable \c doxysearch is only needed if you want to use the search +engine. See section \ref doxysearch_usage for more detailed usage information. + +\subsection step1 Step 1: Creating a configuration file + +Doxygen uses a configuration file to determine all of its settings. +Each project should get its own configuration file. A project can consist +of a single source file, but can also be an entire source tree that is +recursively scanned. + +To simplify the creation of a configuration file, Doxygen can create a +template configuration file for you. To do this call \c doxygen with the \c -g +option: + +\verbatim +doxygen -g +\endverbatim +where \ is the name of the configuration file. If you omit +the file name, a file named \c Doxyfile will be created. If a file with the +name \ already exists, Doxygen will rename it to +\.bak before generating the configuration template. + +The configuration file has a format that is similar to that of a (simple) +Makefile. It contains of a number of assignments (tags) of the form: + +TAGNAME = VALUE or
    +TAGNAME = VALUE1 VALUE2 ...
    + +You can probably leave the values of most tags to their default value. + +The \c INPUT tag is the only tag for which you are required to provide +a value. See section \ref config for more details about the configuration file. +For a small project consisting of a few C and/or C++ source and header files, +you can add the names of the files after the \c INPUT tag. +If you have a larger project consisting of a source directory or tree +this may become tiresome. In this case you should put the root directory or +directories after the \c INPUT tag, and add one or more file +patterns to the \c FILE_PATTERN tag. Only files that match one of the +patterns will be parsed (if the patterns are omitted all files will be parsed). +For recursive parsing of a source tree you must set +the \c RECURSIVE tag to \c YES. To further finetune the list of files +that is parsed the \c EXCLUDE and \c EXCLUDE_PATTERNS tags can be used. + +If you start using Doxygen for an existing project (thus without any +documentation that Doxygen is aware of), you can still get an idea of +what the documented result would be. To do so, you must set the \c EXTRACT_ALL +tag in the configuration file to \c YES. Then, Doxygen will pretend +everything in your sources is documented. Please note that warnings of +undocumented members will not be generated as long as \c EXTRACT_ALL is set +to \c YES. + +\subsection step2 Step 2: Running doxygen + +To generate the documentation you can now enter: +\verbatim +doxygen +\endverbatim + +Doxygen will create a \c html, \c latex and/or \c man directory inside +the output directory. +As the names suggest the \c html directory contains the +generated documentation in HTML format and the \c latex directory contains the +generated documentation in \f$\mbox{\LaTeX}\f$ format. Man pages are put +in a man3 directory inside the \c man directory. + +The default output directory is the directory in which \c doxygen +is started. The directory to which the output is written can be changed +using the \c OUTPUT_DIRECTORY , \c HTML_OUTPUT, \c LATEX_OUTPUT, and +\c MAN_OUTPUT tags of the configuration file. If the output directory does not +exist, \c doxygen will try to create it for you. + +\addindex browser +The generated HTML documentation can be viewed by pointing a HTML browser +to the \c index.html file in the \c html directory. For the best results +a browser that supports cascading style sheets (CSS) should be used +(I'm currently using Netscape 4.0 to test the generated output). +\addindex LaTeX + +The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by +a \f$\mbox{\LaTeX}\f$ compiler. (I use teTeX distribution version 0.4 +that contains \f$\mbox{\TeX}\f$ version 3.14159). To simplify the process +of compiling the generated +documentation, \c doxygen writes a \c Makefile into the \c latex directory. +By typing \c make in the \c latex directory the dvi file \c refman.dvi +will be generated. This file can then be viewed using \c xdvi or +converted into a postscript file \c refman.ps by typing make ps +(this requires \c dvips ). The Postscript file can be send to a postscript +printer. If you do not have a postscript printer, you can try to use +ghostscript to convert postscript into something your printer understands. + +The generated man pages can be viewed using the \c man program. You do need +to make sure the man directory is in the man path (see the MANPATH +environment variable). Notice that there are some limitations to the +capabilities of the man page format, so some information +(like class diagrams, cross references and formulas) will be lost. + +\subsection step3 Step 3: Documenting the sources + +Although documenting the source is presented as step 3, in a new project +this should ofcourse be step 1. Here I assume +you already have some code and you want Doxygen to generate a nice document +describing the API and maybe the internals as well. + +If the \c EXTRACT_ALL option is set to \c NO in the configuration file +(the default), then doxygen will only generate documentation for +\e documented members, files, classes and namespaces. So how do you document +these? For members, classes and namespaces there are basicly two options: +
      +
    1. Place a \e special documentation block in front of the declaration or + definition of the member, class or namespace. For file, class and namespace + members it is also allowed to place the documention directly after the + member. See section \ref specialblock to learn more about special + documentation blocks. +
    2. Place a special documentation block somewhere else (another file or + another location) \e and put a structural command in the + documentation block. A structural command links a documentation block + to a certain object that can be documented (e.g. a member, class, + namespace or file). See section \ref structuralcommands to learn more + about structural commands. +
    +Files can only be documented using the second option. +The text inside a special documentation block is parsed +before it is written to the HTML and/or \f$\mbox{\LaTeX}\f$ output files. + +\addindex parsing +During parsing the following steps take place: +
      +
    • The special commands inside the documentation are executed. See + section \ref commands for an overview of all commands. +
    • If a line starts with some whitespace followed by one or more asterixes + (*) then the whitespace and asterixes are removed. +
    • All resulting blank lines are treated as a paragraph separators. + This saves you from placing new-paragraph commands yourself, + in order to make the generated documentation readable. +
    • Links are created for words corresponding to documented classes. +
    • Links to members are created when certain patterns are found in the + text. See section \ref autolink + for more information on how the automatic link generation works. +
    • HTML tags that are in the documentation are interpreted and converted + to \f$\mbox{\LaTeX}\f$ equivalents for the \f$\mbox{\LaTeX}\f$ output. + See section \ref htmlcmds for an overview of all supported HTML tags. +
    + +\subsection specialblock Special documentation blocks + +The following types of special documentation blocks are supported by Doxygen: +
      +
    • The Qt style, where special documentation blocks look like: +\verbatim +/*! + ... text ... +*/ +\endverbatim and the one line version: +\verbatim +//! ... one line of text ... +\endverbatim +
    • The JavaDoc style, where special documentation blocks look like: +\verbatim +/** + * ... text ... + */ +\endverbatim and the one line version: +\verbatim +/// ... one line of text ... +\endverbatim +
    + +Here is an example of a documented piece of C++ code using the Qt style: +\verbinclude qtstyle.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +The one-line comments should contain a brief description, +whereas the multi-line comment blocks contain a more detailed description. +The brief descriptions are included in the member overview of a class, +namespace or file and are printed using a small italic font +(this description can be omitted by setting \c BRIEF_MEMBER_DESC to \c NO in +the config file). By default the brief descriptions are also the first +sentence of the detailed description +(this can be changed by setting the \c REPEAT_BRIEF tag to \c NO). +Both the brief and the detailed descriptions are optional +for the Qt style. + +Here is the same piece of code, this time documented using the JavaDoc +style: +\verbinclude jdstyle.cpp + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +Notice that the first sentence of the documentation (until the .) +is treated as a brief description, whereas the documentation block as a whole +forms the detailed description. The brief description is required for the +JavaDoc style. + +Unlike most other documentation systems, Doxygen also allows you to put +the documentation of members (including global functions) in front of +the \e definition. This way the documentation can be placed in the source +file instead of the header file. This keeps the header file compact, and allows the +implementer of the members more direct access to the documentation. +As a compromise the brief description could be placed before the +declaration and the detailed description before the member definition +(assuming you use the Qt style comments). + +\subsection structuralcommands Structural commands + +So far we have assumed that the documentation blocks are always located in +front of the declaration or definition of a file, class or namespace or in +front of one of its members. +Although this is often comfortable, it may sometimes be better to put the +documentation somewhere else. For some types of documentation blocks (like file +documentation) this is even required. Doxygen allows you to put your +documentation blocks practically anywhere (the exception is inside the body +of a function or inside a normal C style comment block), as long as you put a +structural command inside the documentation block. + +Structural commands (like all other commands) start with a backslash +(\\) followed by a command name and one or more parameters. +For instance, if you want to document the class \c Test in the example +above, you could have also put the following documentation block somewhere +in the input that is read by Doxygen: +\verbatim +/*! \class Test + \brief A test class. + + A more detailed class description. +*/ +\endverbatim + +Here the special command \c \class is used to indicated that the +comment block contains documentation for the class \c Test. +Other structural commands are: +
      +
    • \c \struct to document a C-struct. +
    • \c \union to document a union. +
    • \c \enum to document an enumeration type. +
    • \c \fn to document a function. +
    • \c \var to document a variable or typedef or enum value. +
    • \c \def to document a \#define. +
    • \c \file to document a file. +
    • \c \namespace to document a namespace. +
    +See section \ref commands for detailed information about these and other +commands. Notice that the documentation block belonging to a file +should always contain a structural command. + +To document a member of a C++ class, you must also document the class +itself. The same holds for namespaces. To document a C function, typedef, +enum or preprocessor definition you must first document the file that +contains it (usually this will be a header file, because that file contains +the information that is exported to other source files). + +Here is an example of a C header named \c structcmd.h that is documented +using structural commands: +\verbinclude structcmd.h + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +\par Notice: + Because each comment block in the example above contains a structural command, all + the comment blocks could be moved to another location or input file + (the source file for instance), without affecting the generated + documentation. The disadvantage of this approach is that prototypes are + duplicated, so all changes have to be made twice! + +\subsection memberdoc Documenting compound members. + +If you want to document the members of a file, struct, union, class, or enum +and you want to put the documentation for these members inside the compound, +it is sometimes desired to place the documentation block after the member +instead of before. For this purpose Doxygen has the following +additional comment blocks: +\verbatim +/*!< ... */ +\endverbatim +This block can be used to put a qt style documentation blocks after a member. +The one line version look as follows: +\verbatim +//!< ... +\endverbatim +There are also JavaDoc versions: +\verbatim +/**< ... */ +\endverbatim +and +\verbatim +///< ... +\endverbatim +Notice that these blocks have the same structure and meaning as the +special comment blocks above only the \< indicates that the member is +located in front of the block instead of after the block. + +Here is an example of a the use of these comment blocks: +\verbinclude afterdoc.h + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + +\warning These blocks can only be used to document \e members. + They cannot be used to document file classes, unions, structs and + enums. Furthermore, the structural commands mentioned in the + previous section are ignored inside these comment blocks. + +\subsection formulas Including formulas in the documentation + +Doxygen allows you to put \f$\mbox{\LaTeX}\f$ formulas in the +output (this works only for the HTML and \f$\mbox{\LaTeX}\f$ formats, +not for the man page output). To be able to include formulas (as images) +in the HTML documentation, you will also need to have the following tools +installed +
      +
    • \c latex: the \f$\mbox{\LaTeX}\f$ compiler, needed to parse the formulas. + To test I have used the teTeX 0.4 distribution. +
    • \c dvips: a tool to convert dvi files to postscript files + I have used version 5.58f from Radical Eye software for testing. +
    • \c gs: the ghostscript interpreter for converting postscript files + to bitmaps. I have used Aladdin Ghostscript 5.01 for testing. +
    + +There are two ways to include formulas in the documentation. +
      +
    1. Using in-text formulas that appear in the running text. + These formulas should be put between a pair of \\f\$ + commands, so +\verbatim + The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is + \f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$. +\endverbatim results in: + + The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is + \f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$. +
      +
    2. Unnumbered displayed formulas that are centered on a separate line. + These formulas should be put between \\f\[ and \\f\] commands. + An example: +\verbatim + \f[ + |I_2|=\left| \int_{0}^T \psi(t) + \left\{ + u(a,t)- + \int_{\gamma(t)}^a + \frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi + \right\} dt + \right| + \f] +\endverbatim + results in: + \f[ + |I_2|=\left| \int_{0}^T \psi(t) + \left\{ + u(a,t)- + \int_{\gamma(t)}^a + \frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi + \right\} dt + \right| + \f] +
    +Formulas should be valid commands in \f$\mbox{\LaTeX}\f$'s math-mode. + +\warning Currently, Doxygen is not very fault tolerant in recovering +from typos in formulas. It may have to be necessary to remove the +file formula.repository that is written in the html directory to +a rid of an incorrect formula + +\subsection moreinfo More information + +\addindex QdbtTabular +For a more elaborate example see +the documentation of QdbtTabular \latexonly +({\tt http://www.stack.nl/$\sim$dimitri/qdbttabular/html})\endlatexonly. +\htmlonly +I hope that was clear. If not, please let me know, so I can improve this document. If you have problems +take a look at the troubleshooting section. +\endhtmlonly + +*/ diff --git a/doc/trouble.doc b/doc/trouble.doc new file mode 100644 index 0000000..5103bda --- /dev/null +++ b/doc/trouble.doc @@ -0,0 +1,67 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +/*! \page trouble Troubleshooting + +

    Known problems:

    + + + +

    How to help

    +The development of Doxygen highly depends on your input! + +If you are trying Doxygen let me know what you think of it (do you +miss certain features?). Even if you decide not to use it, please let me +know why. + +Furthermore, I would appreciate a mail if you have found +a bug, or if you have ideas (or even better some code or a patch) +how to fix existing bugs and limitations. + +My email address:
    dimitri@stack.nl +*/ + diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..dd97c2c --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,94 @@ +include ../Makefile.config +DOXYDIR = ../bin + +all: class/html/index.html \ + define/html/index.html \ + enum/html/index.html \ + file/html/index.html \ + func/html/index.html \ + page/html/index.html \ + relates/html/index.html \ + author/html/index.html \ + par/html/index.html \ + overload/html/index.html \ + example/html/index.html \ + include/html/index.html \ + qtstyle/html/index.html \ + jdstyle/html/index.html \ + structcmd/html/index.html \ + autolink/html/index.html \ + resdefine/html/index.html \ + restypedef/html/index.html \ + afterdoc/html/index.html \ + template/html/index.html \ + tag/html/index.html + +clean: + rm -rf class define enum file func page relates author \ + par overload example include qtstyle jdstyle structcmd \ + autolink tag resdefine restypedef afterdoc template + +class/html/index.html: class.h class.cfg + $(DOXYDIR)/doxygen class.cfg + +define/html/index.html: define.h define.cfg + $(DOXYDIR)/doxygen define.cfg + +enum/html/index.html: enum.h enum.cfg + $(DOXYDIR)/doxygen enum.cfg + +file/html/index.html: file.h file.cfg + $(DOXYDIR)/doxygen file.cfg + +func/html/index.html: func.h func.cfg + $(DOXYDIR)/doxygen func.cfg + +page/html/index.html: page.doc page.cfg + $(DOXYDIR)/doxygen page.cfg + +relates/html/index.html: relates.cpp relates.cfg + $(DOXYDIR)/doxygen relates.cfg + +author/html/index.html: author.cpp author.cfg + $(DOXYDIR)/doxygen author.cfg + +par/html/index.html: par.cpp par.cfg + $(DOXYDIR)/doxygen par.cfg + +overload/html/index.html: overload.cpp overload.cfg + $(DOXYDIR)/doxygen overload.cfg + +example/html/index.html: example.cpp example_test.cpp example.cfg + $(DOXYDIR)/doxygen example.cfg + +include/html/index.html: include.cpp example_test.cpp include.cfg + $(DOXYDIR)/doxygen include.cfg + +qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg + $(DOXYDIR)/doxygen qtstyle.cfg + +jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg + $(DOXYDIR)/doxygen jdstyle.cfg + +structcmd/html/index.html: structcmd.h structcmd.cfg + $(DOXYDIR)/doxygen structcmd.cfg + +autolink/html/index.html: autolink.cpp autolink.cfg + $(DOXYDIR)/doxygen autolink.cfg + +tag/html/index.html: tag.cpp tag.cfg + $(DOXYDIR)/doxygen tag.cfg + sed -e "1,1s.perl.$(PERL).g" tag/html/installdox >tag/html/installdox.perl + cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html + +resdefine/html/index.html: resdefine.cpp resdefine.cfg + $(DOXYDIR)/doxygen resdefine.cfg + +restypedef/html/index.html: restypedef.cpp restypedef.cfg + $(DOXYDIR)/doxygen restypedef.cfg + +afterdoc/html/index.html: afterdoc.h afterdoc.cfg + $(DOXYDIR)/doxygen afterdoc.cfg + +template/html/index.html: templ.cpp templ.cfg + $(DOXYDIR)/doxygen templ.cfg diff --git a/examples/Makefile.windows b/examples/Makefile.windows new file mode 100644 index 0000000..da7cd09 --- /dev/null +++ b/examples/Makefile.windows @@ -0,0 +1,93 @@ +DOXYDIR = ..\bin + +all: class/html/index.html \ + define/html/index.html \ + enum/html/index.html \ + file/html/index.html \ + func/html/index.html \ + page/html/index.html \ + relates/html/index.html \ + author/html/index.html \ + par/html/index.html \ + overload/html/index.html \ + example/html/index.html \ + include/html/index.html \ + qtstyle/html/index.html \ + jdstyle/html/index.html \ + structcmd/html/index.html \ + autolink/html/index.html \ + tag/html/index.html \ + resdefine/html/index.html \ + restypedef/html/index.html \ + afterdoc/html/index.html + +clean: + deltree /y class define enum file + deltree /y func page relates author + deltree /y par overload example include qtstyle + deltree /y jdstyle structcmd autolink tag resdefine + deltree /y restypedef + +class/html/index.html: class.h class.cfg + $(DOXYDIR)\doxygen class.cfg + +define/html/index.html: define.h define.cfg + $(DOXYDIR)\doxygen define.cfg + +enum/html/index.html: enum.h enum.cfg + $(DOXYDIR)\doxygen enum.cfg + +file/html/index.html: file.h file.cfg + $(DOXYDIR)\doxygen file.cfg + +func/html/index.html: func.h func.cfg + $(DOXYDIR)\doxygen func.cfg + +page/html/index.html: page.doc page.cfg + $(DOXYDIR)\doxygen page.cfg + +relates/html/index.html: relates.cpp relates.cfg + $(DOXYDIR)\doxygen relates.cfg + +author/html/index.html: author.cpp author.cfg + $(DOXYDIR)\doxygen author.cfg + +par/html/index.html: par.cpp par.cfg + $(DOXYDIR)\doxygen par.cfg + +overload/html/index.html: overload.cpp overload.cfg + $(DOXYDIR)\doxygen overload.cfg + +example/html/index.html: example.cpp example_test.cpp example.cfg + $(DOXYDIR)\doxygen example.cfg + +include/html/index.html: include.cpp example_test.cpp include.cfg + $(DOXYDIR)\doxygen include.cfg + +qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg + $(DOXYDIR)\doxygen qtstyle.cfg + +jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg + $(DOXYDIR)\doxygen jdstyle.cfg + +structcmd/html/index.html: structcmd.h structcmd.cfg + $(DOXYDIR)\doxygen structcmd.cfg + +autolink/html/index.html: autolink.cpp autolink.cfg + $(DOXYDIR)\doxygen autolink.cfg + +tag/html/index.html: tag.cpp tag.cfg + $(DOXYDIR)\doxygen tag.cfg + cd tag\html + echo perl installdox -lexample.tag@../../example/html >runperl.bat + runperl.bat + cd ..\.. + +resdefine/html/index.html: resdefine.cpp resdefine.cfg + $(DOXYDIR)\doxygen resdefine.cfg + +restypedef/html/index.html: restypedef.cpp restypedef.cfg + $(DOXYDIR)\doxygen restypedef.cfg + +afterdoc/html/index.html: afterdoc.h afterdoc.cfg + $(DOXYDIR)\doxygen afterdoc.cfg diff --git a/examples/afterdoc.cfg b/examples/afterdoc.cfg new file mode 100644 index 0000000..9ebe07a --- /dev/null +++ b/examples/afterdoc.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "AfterDocs" +OUTPUT_DIRECTORY = afterdoc +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = afterdoc.h +QUIET = YES diff --git a/examples/afterdoc.h b/examples/afterdoc.h new file mode 100644 index 0000000..907dabe --- /dev/null +++ b/examples/afterdoc.h @@ -0,0 +1,18 @@ +/*! A test class */ + +class Test +{ + public: + /** An enum type. + * The documentation block cannot be put after the enum! + */ + enum EnumType + { + int EVal1, /**< enum value 1 */ + int EVal2 /**< enum value 2 */ + }; + void member(); //!< a member function. + + protected: + int value; /*!< an integer value */ +}; diff --git a/examples/author.cfg b/examples/author.cfg new file mode 100644 index 0000000..f099903 --- /dev/null +++ b/examples/author.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Author Command" +OUTPUT_DIRECTORY = author +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = author.cpp +QUIET = YES diff --git a/examples/author.cpp b/examples/author.cpp new file mode 100644 index 0000000..ce1c58c --- /dev/null +++ b/examples/author.cpp @@ -0,0 +1,14 @@ +/*! \class WindowsNT + * \brief Windows Nice Try. + * \author Bill Gates + * \author Several hundred furry animals gathered in a cave and grooving + * with a pit. + * \version 4.0 + * \date 1996-1998 + * \bug It crashes a lot and requires huge amounts of memory. + * \bug The class introduces the more bugs, the longer it is used. + * \warning This class may explode in your face. + * \warning If you inherit anything from this class, you're doomed. + */ + +class WindowsNT {}; diff --git a/examples/autolink.cfg b/examples/autolink.cfg new file mode 100644 index 0000000..ff77f83 --- /dev/null +++ b/examples/autolink.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Automatic link generation" +OUTPUT_DIRECTORY = autolink +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = autolink.cpp +QUIET = YES diff --git a/examples/autolink.cpp b/examples/autolink.cpp new file mode 100644 index 0000000..924256b --- /dev/null +++ b/examples/autolink.cpp @@ -0,0 +1,99 @@ +/*! \file autolink.cpp + Testing automatic link generation. + + A link to a member of the Test class: Test::member, + + More specific links to the each of the overloaded members: + Test::member(int) and Test#member(int,int) + + A link to a protected member variable of Test: Test#var, + + A link to the global enumeration type #GlobEnum. + + A link to the define #ABS(x). + + A link to the destructor of the Test class: Test::~Test, + + A link to the typedef ::B. + + A link to the enumeration type Test::EType + + A link to some enumeration values Test::Val1 and ::GVal2 +*/ + +/*! + Since this documentation block belongs to the class Test no link to + Test is generated. + + Two ways to link to a constructor are: #Test and Test(). + + Links to the destructor are: #~Test and ~Test(). + + A link to a member in this class: member(). + + More specific links to the each of the overloaded members: + member(int) and member(int,int). + + A link to the variable #var. + + A link to the global typedef ::B. + + A link to the global enumeration type #GlobEnum. + + A link to the define ABS(x). + + A link to a variable \link #var using another text\endlink as a link. + + A link to the enumeration type #EType. + + A link to some enumeration values: ::Val1 and ::GVal1. + + And last but not least a link to a file: autolink.cpp. + + \sa Inside a see also section any word is checked, so EType, + Val1, GVal1, ~Test and member will be replaced by links in HTML. +*/ + +class Test +{ + public: + Test(); //!< constructor + ~Test(); //!< destructor + void member(int); /**< A member function. Details. */ + void member(int,int); /**< An overloaded member function. Details */ + + /** An enum type. More details */ + enum EType { + Val1, /**< enum value 1 */ + Val2 /**< enum value 2 */ + }; + + protected: + int var; /**< A member variable */ +}; + +/*! details. */ +Test::Test() { } + +/*! details. */ +Test::~Test() { } + +/*! A global variable. */ +int globVar; + +/*! A global enum. */ +enum GlobEnum { + GVal1, /*!< global enum value 1 */ + GVal2 /*!< global enum value 2 */ + }; + +/*! + * A macro definition. + */ +#define ABS(x) (((x)>0)?(x):-(x)) + +typedef Test B; + +/*! \fn typedef Test B + * A type definition. + */ diff --git a/examples/class.cfg b/examples/class.cfg new file mode 100644 index 0000000..dfc59eb --- /dev/null +++ b/examples/class.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Class Command" +OUTPUT_DIRECTORY = class +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = class.h +QUIET = YES diff --git a/examples/class.h b/examples/class.h new file mode 100644 index 0000000..e5c4e2d --- /dev/null +++ b/examples/class.h @@ -0,0 +1,11 @@ +/* A dummy class */ + +class Test +{ +} + +/*! \class Test class.h inc/class.h + * \brief This is a test class. + * + * Some details about the Test class + */ diff --git a/examples/define.cfg b/examples/define.cfg new file mode 100644 index 0000000..4960748 --- /dev/null +++ b/examples/define.cfg @@ -0,0 +1,7 @@ +PROJECT_NAME = "Define Command" +OUTPUT_DIRECTORY = define +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = define.h +ENABLE_PREPROCESSING = YES +QUIET = YES diff --git a/examples/define.h b/examples/define.h new file mode 100644 index 0000000..9a8e4d0 --- /dev/null +++ b/examples/define.h @@ -0,0 +1,11 @@ +/*! \file define.h + \brief testing defines + + This is to test the documentation of defines. +*/ + +/*! \def ABS(x) + The define ABS computes the absolute value of its argument \a x. +*/ + +#define ABS(x) (((x)>0)?(x):-(x)) diff --git a/examples/enum.cfg b/examples/enum.cfg new file mode 100644 index 0000000..b38291a --- /dev/null +++ b/examples/enum.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Enum Command" +OUTPUT_DIRECTORY = enum +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = enum.h +QUIET = YES diff --git a/examples/enum.h b/examples/enum.h new file mode 100644 index 0000000..1586074 --- /dev/null +++ b/examples/enum.h @@ -0,0 +1,17 @@ +class Test +{ + public: + enum TEnum { Val1, Val2 }; +}; + +/*! \class Test + * The class description. + */ + +/*! \enum Test::TEnum + * A description of the enum type. + */ + +/*! \var Test::TEnum Test::Val1 + * The description of the first enum value. + */ diff --git a/examples/example.cfg b/examples/example.cfg new file mode 100644 index 0000000..a30b3ff --- /dev/null +++ b/examples/example.cfg @@ -0,0 +1,7 @@ +PROJECT_NAME = "Example Command" +OUTPUT_DIRECTORY = example +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = example.cpp +EXAMPLE_PATH = example_test.cpp +QUIET = YES diff --git a/examples/example.cpp b/examples/example.cpp new file mode 100644 index 0000000..230d6ec --- /dev/null +++ b/examples/example.cpp @@ -0,0 +1,19 @@ +/** A Test class. + * More details about this class. + */ + +class Test +{ + public: + /** An example member function. + * More details about this function. + */ + void example(); +}; + +void Test::example() {} + +/** \example example_test.cpp + * This is an example of how to use the Test class. + * More details about this example. + */ diff --git a/examples/example.tag b/examples/example.tag new file mode 100644 index 0000000..3998b90 --- /dev/null +++ b/examples/example.tag @@ -0,0 +1,2 @@ +>Test: +example a0 "()" diff --git a/examples/example_test.cpp b/examples/example_test.cpp new file mode 100644 index 0000000..a7e1643 --- /dev/null +++ b/examples/example_test.cpp @@ -0,0 +1,5 @@ +void main() +{ + Test t; + t.example(); +} diff --git a/examples/file.cfg b/examples/file.cfg new file mode 100644 index 0000000..52b766a --- /dev/null +++ b/examples/file.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "File Command" +OUTPUT_DIRECTORY = file +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = file.h +QUIET = YES diff --git a/examples/file.h b/examples/file.h new file mode 100644 index 0000000..8dff6cb --- /dev/null +++ b/examples/file.h @@ -0,0 +1,10 @@ +/** \file file.h + * A brief file description. + * A more elaborated file description. + */ + +/** + * A global integer value. + * More details about this value. + */ +extern int globalValue; diff --git a/examples/func.cfg b/examples/func.cfg new file mode 100644 index 0000000..44d67c6 --- /dev/null +++ b/examples/func.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Fn Command" +OUTPUT_DIRECTORY = func +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = func.h +QUIET = YES diff --git a/examples/func.h b/examples/func.h new file mode 100644 index 0000000..b335448 --- /dev/null +++ b/examples/func.h @@ -0,0 +1,21 @@ +class Test +{ + public: + const char *member(char,int) throw(std::out_of_range); +}; + +const char *Test::member(char c,int n) throw(std::out_of_range) {} + +/*! \class Test + * \brief Test class. + * + * Details about Test. + */ + +/*! \fn const char *Test::member(char c,int n) + * \brief A member function. + * \param c a character. + * \param n an integer. + * \exception std::out_of_range parameter is out of range. + * \return a character pointer. + */ diff --git a/examples/include.cfg b/examples/include.cfg new file mode 100644 index 0000000..c4f997e --- /dev/null +++ b/examples/include.cfg @@ -0,0 +1,7 @@ +PROJECT_NAME = "Include Command" +OUTPUT_DIRECTORY = include +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = include.cpp +EXAMPLE_PATH = example_test.cpp +QUIET = YES diff --git a/examples/include.cpp b/examples/include.cpp new file mode 100644 index 0000000..c50ab96 --- /dev/null +++ b/examples/include.cpp @@ -0,0 +1,22 @@ + +/*! A test class. */ + +class Test +{ + public: + /// a member function + void example(); +}; + +/*! \page example + * \dontinclude example_test.cpp + * Our main function starts like this: + * \skip main + * \until { + * First we create a object \c t of the Test class. + * \skipline Test + * Then we call the example member function + * \line example + * After that our little test routine ends. + * \line } + */ diff --git a/examples/jdstyle.cfg b/examples/jdstyle.cfg new file mode 100644 index 0000000..833a4aa --- /dev/null +++ b/examples/jdstyle.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "JavaDoc Style" +OUTPUT_DIRECTORY = jdstyle +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = jdstyle.cpp +QUIET = YES diff --git a/examples/jdstyle.cpp b/examples/jdstyle.cpp new file mode 100644 index 0000000..bbd2149 --- /dev/null +++ b/examples/jdstyle.cpp @@ -0,0 +1,66 @@ +/** + * A test class. A more elaborate class description. + */ + +class Test +{ + public: + + /** + * An enum. + * More detailed enum description. + */ + + enum TEnum { + TVal1, /**< enum value TVal1. */ + TVal2, /**< enum value TVal2. */ + TVal3 /**< enum value TVal3. */ + } + *enumPtr, /**< enum pointer. Details. */ + enumVar; /**< enum variable. Details. */ + + /** + * A constructor. + * A more elaborate description of the constructor. + */ + Test(); + + /** + * A destructor. + * A more elaborate description of the destructor. + */ + ~Test(); + + /** + * a normal member taking two arguments and returning an integer value. + * @param a an integer argument. + * @param s a constant chararcter pointer. + * @see Test() + * @see ~Test() + * @see testMeToo() + * @see publicVar() + * @return The test results + */ + int testMe(int a,const char *s); + + /** + * A pure virtual member. + * @see testMe() + * @param c1 the first argument. + * @param c2 the second argument. + */ + virtual void testMeToo(char c1,char c2) = 0; + + /** + * a public variable. + * Details. + */ + int publicVar; + + /** + * a function variable. + * Details. + */ + int (*handler)(int a,int b); +}; + diff --git a/examples/overload.cfg b/examples/overload.cfg new file mode 100644 index 0000000..690edae --- /dev/null +++ b/examples/overload.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Overloaded Command" +OUTPUT_DIRECTORY = overload +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = overload.cpp +QUIET = YES diff --git a/examples/overload.cpp b/examples/overload.cpp new file mode 100644 index 0000000..02bcced --- /dev/null +++ b/examples/overload.cpp @@ -0,0 +1,25 @@ +class Test +{ + public: + void drawRect(int,int,int,int); + void drawRect(const Rect &r); +}; + +void Test::drawRect(int x,int y,int w,int h) {} +void Test::drawRect(const Rect &r) {} + +/*! \class Test + * \brief A short description. + * + * More text. + */ + +/*! \fn void Test::drawRect(int x,int y,int w,int h) + * This command draws a rectangle with a left upper corner at ( \a x , \a y ), + * width \a w and height \a h. + */ + +/*! + * \overload void Test::drawRect(const Rect &r) + */ + diff --git a/examples/page.cfg b/examples/page.cfg new file mode 100644 index 0000000..40a8869 --- /dev/null +++ b/examples/page.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Page Command" +OUTPUT_DIRECTORY = page +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = page.doc +QUIET = YES diff --git a/examples/page.doc b/examples/page.doc new file mode 100644 index 0000000..41c9e02 --- /dev/null +++ b/examples/page.doc @@ -0,0 +1,12 @@ +/*! \page page1 A documentation page + This page contains the subsections \ref subsection1 and \ref subsection2. + For more info see section \ref page2. + \subsection subsection1 The first subsection + Text. + \subsection subsection2 The second subsection + More text. +*/ + +/*! \page page2 Another page + Even more info. +*/ diff --git a/examples/par.cfg b/examples/par.cfg new file mode 100644 index 0000000..76dab9f --- /dev/null +++ b/examples/par.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Par Command" +OUTPUT_DIRECTORY = par +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = par.cpp +QUIET = YES diff --git a/examples/par.cpp b/examples/par.cpp new file mode 100644 index 0000000..144d1af --- /dev/null +++ b/examples/par.cpp @@ -0,0 +1,9 @@ +/*! \class Test + * Normal text. + * \par User defined paragraph: + * Contents of the paragraph. + * + * More normal text. + */ + +class Test {}; diff --git a/examples/qtstyle.cfg b/examples/qtstyle.cfg new file mode 100644 index 0000000..6d20b53 --- /dev/null +++ b/examples/qtstyle.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Qt Style" +OUTPUT_DIRECTORY = qtstyle +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = qtstyle.cpp +QUIET = YES diff --git a/examples/qtstyle.cpp b/examples/qtstyle.cpp new file mode 100644 index 0000000..de5ad34 --- /dev/null +++ b/examples/qtstyle.cpp @@ -0,0 +1,65 @@ +//! A test class. +/*! + A more elaborate class description. +*/ + +class Test +{ + public: + + //! An enum. + /*! More detailed enum description. */ + enum TEnum { + TVal1, /*!< Enum value TVal1. */ + TVal2, /*!< Enum value TVal2. */ + TVal3 /*!< Enum value TVal3. */ + } + //! Enum pointer. + /*! Details. */ + *enumPtr, + //! Enum variable. + /*! Details. */ + enumVar; + + //! A constructor. + /*! + A more elaborate description of the constructor. + */ + Test(); + + //! A destructor. + /*! + A more elaborate description of the destructor. + */ + ~Test(); + + //! A normal member taking two arguments and returning an integer value. + /*! + \param a an integer argument. + \param s a constant chararcter pointer. + \return The test results + \sa Test(), ~Test(), testMeToo() and publicVar() + */ + int testMe(int a,const char *s); + + //! A pure virtual member. + /*! + \sa testMe() + \param c1 the first argument. + \param c2 the second argument. + */ + virtual void testMeToo(char c1,char c2) = 0; + + //! A public variable. + /*! + Details. + */ + int publicVar; + + //! A function variable. + /*! + Details. + */ + int (*handler)(int a,int b); +}; + diff --git a/examples/relates.cfg b/examples/relates.cfg new file mode 100644 index 0000000..83e2be5 --- /dev/null +++ b/examples/relates.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Relates Command" +OUTPUT_DIRECTORY = relates +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = relates.cpp +QUIET = YES diff --git a/examples/relates.cpp b/examples/relates.cpp new file mode 100644 index 0000000..d5e483d --- /dev/null +++ b/examples/relates.cpp @@ -0,0 +1,24 @@ +/*! + * A String class. + */ + +class String +{ + friend int strcmp(const String &,const String &); +}; + +/*! + * Compares two strings. + */ + +int strcmp(const String &s1,const String &s2) +{ +} + +/*! \relates String + * A string debug function. + */ + +void stringDebug() +{ +} diff --git a/examples/resdefine.cfg b/examples/resdefine.cfg new file mode 100644 index 0000000..009a4e8 --- /dev/null +++ b/examples/resdefine.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Resolving Defines" +OUTPUT_DIRECTORY = resdefine +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = resdefine.cpp +QUIET = YES diff --git a/examples/resdefine.cpp b/examples/resdefine.cpp new file mode 100644 index 0000000..05a77c5 --- /dev/null +++ b/examples/resdefine.cpp @@ -0,0 +1,21 @@ +#define ExportedName InternalName + +class InternalName +{ + public: + InternalName() {} + ~InternalName() {} +}; + +/*! \class ExportedName + * This class's real name is InternalName but everyone should use + * ExportedName. + */ + +/*! \fn ExportedName::ExportedName() + * The constructor + */ + +/*! \fn ExportedName::~ExportedName() + * The destructor + */ diff --git a/examples/restypedef.cfg b/examples/restypedef.cfg new file mode 100644 index 0000000..f17ba4d --- /dev/null +++ b/examples/restypedef.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Resolving Typedefs" +OUTPUT_DIRECTORY = restypedef +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = restypedef.cpp +QUIET = YES diff --git a/examples/restypedef.cpp b/examples/restypedef.cpp new file mode 100644 index 0000000..2cd3f8f --- /dev/null +++ b/examples/restypedef.cpp @@ -0,0 +1,25 @@ +/*! \file restypedef.cpp + * An example of resolving typedefs. + */ + +/*! \struct CoordStruct + * A coordinate pair. + */ +struct CoordStruct +{ + /*! The x coordinate */ + float x; + /*! The y coordinate */ + float y; +}; + +/*! Creates a type name for CoordStruct */ +typedef struct CoordStruct Coord; + +/*! + * This function returns the addition of \a c1 and \a c2, i.e: + * (c1.x+c2.x,c1.y+c2.y) + */ +Coord add(Coord c1,Coord c2) +{ +} diff --git a/examples/structcmd.cfg b/examples/structcmd.cfg new file mode 100644 index 0000000..bbc4e71 --- /dev/null +++ b/examples/structcmd.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Structural commands" +OUTPUT_DIRECTORY = structcmd +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = structcmd.h +QUIET = YES diff --git a/examples/structcmd.h b/examples/structcmd.h new file mode 100644 index 0000000..3e27029 --- /dev/null +++ b/examples/structcmd.h @@ -0,0 +1,57 @@ +/*! \file structcmd.h + \brief A Documented file. + + Details. +*/ + +/*! \def MAX(a,b) + \brief A macro that returns the maximum of \a a and \a b. + + Details. +*/ + +/*! \var typedef unsigned int UINT32 + \brief A type definition for a . + + Details. +*/ + +/*! \var int errno + \brief Contains the last error code. + + \warning Not thread safe! +*/ + +/*! \fn int open(const char *pathname,int flags) + \brief Opens a file descriptor. + + \param pathname The name of the descriptor. + \param flags Opening flags. +*/ + +/*! \fn int close(int fd) + \brief Closes the file descriptor \a fd. + \param fd The descriptor to close. +*/ + +/*! \fn size_t write(int fd,const char *buf, size_t count) + \brief Writes \a count bytes from \a buf to the filedescriptor \a fd. + \param fd The descriptor to write to. + \param buf The data buffer to write. + \param count The number of bytes to write. +*/ + +/*! \fn int read(int fd,char *buf,size_t count) + \brief Read bytes from a file descriptor. + \param fd The descriptor to read from. + \param buf The buffer to read into. + \param count The number of bytes to read. +*/ + +#define MAX(a,b) (((a)>(b))?(a):(b)) +typedef unsigned int UINT32; +int errno; +int open(const char *,int); +int close(int); +size_t write(int,const char *, size_t); +int read(int,char *,size_t); diff --git a/examples/tag.cfg b/examples/tag.cfg new file mode 100644 index 0000000..79c2ec0 --- /dev/null +++ b/examples/tag.cfg @@ -0,0 +1,8 @@ +PROJECT_NAME = "Tag Files" +OUTPUT_DIRECTORY = tag +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = tag.cpp +TAGFILES = example.tag +PERL_PATH = perl +QUIET = YES diff --git a/examples/tag.cpp b/examples/tag.cpp new file mode 100644 index 0000000..6497dd4 --- /dev/null +++ b/examples/tag.cpp @@ -0,0 +1,9 @@ +/*! A class that is inherited from the external class Test. +*/ + +class Tag : public Test +{ + public: + /*! an overloaded member. */ + void example(); +}; diff --git a/examples/templ.cfg b/examples/templ.cfg new file mode 100644 index 0000000..ec16654 --- /dev/null +++ b/examples/templ.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Template Test" +OUTPUT_DIRECTORY = template +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = templ.cpp +QUIET = YES diff --git a/examples/templ.cpp b/examples/templ.cpp new file mode 100644 index 0000000..c838c6e --- /dev/null +++ b/examples/templ.cpp @@ -0,0 +1,37 @@ +/*! A template class */ +template class Test +{ + public: + Test(); + Test(const Test &); + friend void friendTempFunc(Test &, int=5); +}; + +/*! complete specialization */ +template<> class Test +{ + public: + Test(); +}; + +/*! A partial template specialization */ +template class Test< T * > : public Test +{ + public: + Test(); +}; + +/*! The constructor of the template class*/ +template Test::Test() {} + +/*! The copy constructor */ +template Test::Test(const Test &t) {} + +/*! A friend function of a template class */ +template void friendTempFunc(Test &t,int a) {} + +/*! The constructor of the specilization */ +template<> Test::Test() {} + +/*! The constructor of the partial specilization */ +template Test::Test() {} diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..a8a2f4e --- /dev/null +++ b/make.bat @@ -0,0 +1,4 @@ +REM make script for Microsoft Visual C++ + +set TMAKEPATH=..\tmake\lib\win32-msvc +nmake /NOLOGO -f Makefile.windows win32-msvc diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..e57994c --- /dev/null +++ b/src/Makefile @@ -0,0 +1,44 @@ +# +# $Id$ +# +# Copyright (C) 1997-1999 by Dimitri van Heesch. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation under the terms of the GNU General Public License is hereby +# granted. No representations are made about the suitability of this software +# for any purpose. It is provided "as is" without express or implied warranty. +# See the GNU General Public License for more details. +# +# All output generated with Doxygen is not covered by this license. +# + +include ../Makefile.config + +all: Makefile.doxygen Makefile.doxytag Makefile.doxysearch Makefile + $(MAKE) -f Makefile.doxygen $@ + $(MAKE) -f Makefile.doxytag $@ + $(MAKE) -f Makefile.doxysearch $@ + +Makefile.doxygen: doxygen.pro doxygen.t + $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen + +Makefile.doxytag: doxytag.pro doxytag.t + $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag + +Makefile.doxysearch: doxysearch.pro + $(PERL) $(TMAKE) doxysearch.pro >Makefile.doxysearch + +tmake: + $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen + $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag + $(PERL) $(TMAKE) doxysearch.pro >Makefile.doxysearch + +clean: + $(MAKE) -f Makefile.doxygen clean + $(MAKE) -f Makefile.doxytag clean + $(MAKE) -f Makefile.doxysearch clean + -rm -f scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \ + ce_parse.cpp ce_parse.h doxytag.cpp tag.cpp \ + declinfo.cpp defargs.cpp version.cpp + +FORCE: diff --git a/src/classdef.cpp b/src/classdef.cpp new file mode 100644 index 0000000..079252d --- /dev/null +++ b/src/classdef.cpp @@ -0,0 +1,900 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#include +#include +#include +#include "classdef.h" +#include "classlist.h" +#include "entry.h" +#include "scanner.h" +#include "doxygen.h" +#include "membername.h" +#include "message.h" +#include "config.h" +#include "util.h" +#include "diagram.h" +#include "language.h" + +static QString stripExtension(const char *fName) +{ + QString result=fName; + if (result.right(5)==".html") result=result.left(result.length()-5); + return result; +} + +// constructs a new class definition +ClassDef::ClassDef(const char *nm,int ct,const char *ref,const char *fName) + : Definition(removeRedundantWhiteSpace(nm)) +{ + //name=n; + if (fName) + fileName=stripExtension(fName); + else + fileName="class_"+nameToFile(nm); + if (ref) + { + //url=(QString)"doxygen=\""+ref+":\" href=\""+fileName; + exampleList = 0; + exampleDict = 0; + } + else + { + //url="href=\""+fileName; + exampleList = new ExampleList; + exampleDict = new ExampleDict(29); + } + memListFileName="class_"+nameToFile(nm)+"-members"; + inherits = new BaseClassList; + inherits->setAutoDelete(TRUE); + inheritedBy = new BaseClassList; + inheritedBy->setAutoDelete(TRUE); + allMemberNameInfoList = new MemberNameInfoList; + allMemberNameInfoList->setAutoDelete(TRUE); + allMemberNameInfoDict = new MemberNameInfoDict(1009); + visited=FALSE; + reference=ref; + compType=ct; + incFile=0; + tempArgs=0; + prot=Public; + nspace=0; +} + +// destroy the class definition +ClassDef::~ClassDef() +{ + delete inherits; + delete inheritedBy; + delete allMemberNameInfoList; + delete allMemberNameInfoDict; + delete exampleList; + delete exampleDict; +} + +// inserts a base class in the inheritance list +void ClassDef::insertBaseClass(ClassDef *cd,Protection p, + Specifier s,const char *t) +{ + inherits->inSort(new BaseClassDef(cd,p,s,t)); +} + +// inserts a super class in the inherited list +void ClassDef::insertSuperClass(ClassDef *cd,Protection p, + Specifier s,const char *t) +{ + inheritedBy->inSort(new BaseClassDef(cd,p,s,t)); +} + +// adds new member definition to the class +void ClassDef::insertMember(const MemberDef *md) +{ + //printf("adding %s::%s\n",name(),md->name()); + if (!reference) + { + if (md->isRelated() && (extractPrivateFlag || md->protection()!=Private)) + { + related.append(md); + } + else if (md->isFriend()) + { + friends.append(md); + } + else + { + switch (md->memberType()) + { + case MemberDef::Signal: + signals.append(md); + break; + case MemberDef::Slot: + switch (md->protection()) + { + case Protected: proSlots.append(md); break; + case Public: pubSlots.append(md); break; + case Private: priSlots.append(md); break; + } + break; + default: // any of the other members + if (md->isStatic()) + { + switch (md->protection()) + { + case Protected: proStaticMembers.append(md); break; + case Public: pubStaticMembers.append(md); break; + case Private: priStaticMembers.append(md); break; + } + } + else + { + switch (md->protection()) + { + case Protected: proMembers.append(md); break; + case Public: pubMembers.append(md); break; + case Private: priMembers.append(md); break; + } + } + break; + } + } + } + // check if we should add this member in the `all members' list + if (md->isFriend() || md->protection()!=Private || extractPrivateFlag) + { + MemberInfo *mi = new MemberInfo((MemberDef *)md,Public,Normal); + MemberNameInfo *mni; + if ((mni=(*allMemberNameInfoDict)[md->name()])) + { + mni->append(mi); + } + else + { + mni = new MemberNameInfo(md->name()); + mni->append(mi); + allMemberNameInfoList->inSort(mni); + allMemberNameInfoDict->insert(mni->memberName(),mni); + } + } +} + + +// compute the anchors for all members +void ClassDef::computeAnchors() +{ + setAnchors('a',&pubMembers); + setAnchors('b',&proMembers); + setAnchors('c',&priMembers); + setAnchors('d',&pubStaticMembers); + setAnchors('e',&proStaticMembers); + setAnchors('f',&priStaticMembers); + setAnchors('g',&pubSlots); + setAnchors('h',&proSlots); + setAnchors('i',&priSlots); + setAnchors('j',&signals); + setAnchors('k',&related); + setAnchors('l',&friends); +} + +// add a file name to the used files set +void ClassDef::insertUsedFile(const char *f) +{ + if (files.find(f)==-1) files.append(f); +} + +static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd) +{ + if (bcd->prot!=Public || bcd->virt!=Normal) + { + ol.startTypewriter(); + ol.docify(" ["); + QStrList sl; + if (bcd->prot==Protected) sl.append("protected"); + else if (bcd->prot==Private) sl.append("private"); + if (bcd->virt==Virtual) sl.append("virtual"); + const char *s=sl.first(); + while (s) + { + ol.docify(s); + s=sl.next(); + if (s) ol.docify(", "); + } + ol.docify("]"); + ol.endTypewriter(); + } +} + +// write all documentation for this class +void ClassDef::writeDocumentation(OutputList &ol) +{ + // write title + QString pageTitle=name().copy(); + QString pageType; + switch(compType) + { + case Class: pageType=" Class"; break; + case Struct: pageType=" Struct"; break; + case Union: pageType=" Union"; break; + default: pageType+=compType; break; // an error + } + pageTitle+=pageType+" Reference"; + startFile(ol,fileName,pageTitle); + startTitle(ol); + ol.docify(name()+" "+pageType.right(pageType.length()-1)+" "); + parseDoc(ol,0,0,theTranslator->trReference()); + endTitle(ol,name()); + + // write brief description + OutputList briefOutput(&ol); + if (!briefDescription().isEmpty()) + { + parseDoc(briefOutput,name(),0,briefDescription()); + ol+=briefOutput; + ol.writeString(" \n"); + ol.disableAllBut(OutputGenerator::Html); + ol.startTextLink(0,"details"); + parseDoc(ol,0,0,theTranslator->trMore()); + ol.endTextLink(); + ol.enableAll(); + } + ol.disable(OutputGenerator::Man); + ol.newParagraph(); + ol.enable(OutputGenerator::Man); + ol.writeSynopsis(); + + if (incFile) + { + QString nm=incName.copy(); + if (incName.isNull()) nm=incFile->name(); + ol.startTypewriter(); + ol.docify("#include <"); + ol.disable(OutputGenerator::Man); + if (verbatimHeaderFlag) + { + ol.writeObjectLink(0,fileName+"-include",0,nm); + } + else + { + ol.docify(nm); + } + ol.enable(OutputGenerator::Man); + ol.disableAllBut(OutputGenerator::Man); + ol.docify(nm); + ol.enableAll(); + ol.docify(">"); + ol.endTypewriter(); + ol.newParagraph(); + } + + if (genTagFile.length()>0) tagFile << ">" << name() << ":"; + + if (classDiagramFlag) ol.disableAllBut(OutputGenerator::Man); + + // write superclasses + int count; + if ((count=inherits->count())>0) + { + parseDoc(ol,0,0,theTranslator->trInherits()+" "); + BaseClassDef *bcd=inherits->first(); + while (bcd) + { + ClassDef *cd=bcd->classDef; + if (cd->hasDocumentation() || cd->isReference()) + { + if (genTagFile.length()>0) tagFile << cd->classFile() << "?"; + ol.writeObjectLink(cd->getReference(),cd->classFile(),0,cd->name()+bcd->templSpecifiers); + } + else + { + ol.docify(cd->name()); + } + writeInheritanceSpecifier(ol,bcd); + bcd=inherits->next(); + if (bcd) + { + if (inherits->at()==count-1) + parseDoc(ol,0,0," "+theTranslator->trAnd()+" "); + else + ol.writeString(", "); + } + } + ol.writeString("."); + ol.newParagraph(); + } + + if (genTagFile.length()>0) tagFile << " \"" << fileName << ".html\"\n"; + + // write subclasses + if ((count=inheritedBy->count())>0) + { + parseDoc(ol,0,0,theTranslator->trInheritedBy()+" "); + BaseClassDef *bcd=inheritedBy->first(); + while (bcd) + { + ClassDef *cd=bcd->classDef; + if (cd->hasDocumentation() || cd->isReference()) + { + ol.writeObjectLink(cd->getReference(),cd->classFile(),0,cd->name()); + } + else + { + ol.docify(cd->name()); + } + writeInheritanceSpecifier(ol,bcd); + bcd=inheritedBy->next(); + if (bcd) + { + if (inheritedBy->at()==count-1) + parseDoc(ol,0,0," "+theTranslator->trAnd()+" "); + else + ol.writeString(", "); + } + } + ol.writeString("."); + ol.newParagraph(); + } + + if (classDiagramFlag) ol.enableAll(); + + count=0; + BaseClassDef *ibcd; + ibcd=inheritedBy->first(); + while (ibcd) + { + ClassDef *icd=ibcd->classDef; + if (//(icd->protection()!=Private || extractPrivateFlag) && + //(icd->hasDocumentation() || !hideClassFlag || icd->isReference()) + icd->isVisibleExt() + ) count++; + ibcd=inheritedBy->next(); + } + ibcd=inherits->first(); + while (ibcd) + { + ClassDef *icd=ibcd->classDef; + if (//(icd->protection()!=Private || extractPrivateFlag) && + //(icd->hasDocumentation() || !hideClassFlag | icd->isReference()) + icd->isVisibleExt() + ) count++; + ibcd=inherits->next(); + } + if (classDiagramFlag && count>0) + // write class diagram + { + ClassDiagram diagram(this); // create a diagram of this class. + ol.startClassDiagram(); + ol.disable(OutputGenerator::Man); + parseDoc(ol,name(),0,theTranslator->trClassDiagram(name())); + ol.enable(OutputGenerator::Man); + ol.endClassDiagram(diagram,fileName,name()); + } + + // write link to list of all members (HTML only) + if (allMemberNameInfoList->count()>0 && compType==Class) + { + ol.disableAllBut(OutputGenerator::Html); + ol.startTextLink(memListFileName,0); + parseDoc(ol,0,0,theTranslator->trListOfAllMembers()); + ol.endTextLink(); + ol.enableAll(); + } + + // write member groups + writeMemberDecs(ol,this,0,0,"Public Members",0,&pubMembers); + writeMemberDecs(ol,this,0,0,"Public Slots",0,&pubSlots); + writeMemberDecs(ol,this,0,0,"Signals",0,&signals); + writeMemberDecs(ol,this,0,0,"Static Public Members",0,&pubStaticMembers); + writeMemberDecs(ol,this,0,0,"Protected Members",0,&proMembers); + writeMemberDecs(ol,this,0,0,"Protected Slots",0,&proSlots); + writeMemberDecs(ol,this,0,0,"Static Protected Members",0,&proStaticMembers); + if (extractPrivateFlag) + { + writeMemberDecs(ol,this,0,0,"Private Members",0,&priMembers); + writeMemberDecs(ol,this,0,0,"Private Slots",0,&priSlots); + writeMemberDecs(ol,this,0,0,"Static Private Members",0,&priStaticMembers); + } + writeMemberDecs(ol,this,0,0,"Friends",0,&friends); + writeMemberDecs(ol,this,0,0, + theTranslator->trRelatedFunctions(), + theTranslator->trRelatedSubscript(), + &related + ); + + // write detailed description + bool exampleFlag=hasExamples(); + if (!briefDescription().isEmpty() || !documentation().isEmpty() || exampleFlag) + { + ol.writeRuler(); + ol.writeAnchor("details"); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trDetailedDescription()); + ol.endGroupHeader(); + if (tempArgs) // class is a template + { + ol.startSubsubsection(); + ArgumentList *al=tempArgs; + ol.docify("template<"); + Argument *a=al->first(); + while (a) + { + ol.docify(a->type); + ol.docify(a->name); + if (a->defval.length()!=0) + { + ol.docify(" = "); + ol.docify(a->defval); + } + a=al->next(); + if (a) ol.docify(", "); + } + ol.docify("> "+pageType.lower()+" "+name()); + ol.endSubsubsection(); + ol.writeString("\n"); + } + + // repeat brief description + if (!briefDescription().isEmpty()) + { + ol+=briefOutput; + ol.newParagraph(); + } + // write documentation + if (!documentation().isEmpty()) + { + parseDoc(ol,name(),0,documentation()+"\n"); + } + // write examples + if (exampleFlag) + { + ol.startDescList(); + ol.startBold(); + parseDoc(ol,0,0,theTranslator->trExamples()+": "); + ol.endBold(); + ol.endDescTitle(); + ol.writeDescItem(); + writeExample(ol); + //ol.endDescItem(); + ol.endDescList(); + } + } + + pubMembers.countDocMembers(); + proMembers.countDocMembers(); + priMembers.countDocMembers(); + pubStaticMembers.countDocMembers(); + proStaticMembers.countDocMembers(); + priStaticMembers.countDocMembers(); + pubSlots.countDocMembers(); + proSlots.countDocMembers(); + priSlots.countDocMembers(); + related.countDocMembers(); + friends.countDocMembers(); + signals.countDocMembers(); + + if ( pubMembers.typedefCount() + proMembers.typedefCount() + + (extractPrivateFlag ? priMembers.typedefCount() : 0 ) + ) + { + ol.writeRuler(); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trMemberTypedefDocumentation()); + ol.endGroupHeader(); + + writeMemberDocs(ol,&pubMembers,name(),MemberDef::Typedef); + writeMemberDocs(ol,&proMembers,name(),MemberDef::Typedef); + if (extractPrivateFlag) + { + writeMemberDocs(ol,&priMembers,name(),MemberDef::Typedef); + } + } + + if (pubMembers.enumCount() + + proMembers.enumCount() + + ( extractPrivateFlag ? priMembers.enumCount() : 0 ) + ) + { + ol.writeRuler(); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trMemberEnumerationDocumentation()); + ol.endGroupHeader(); + + writeMemberDocs(ol,&pubMembers,name(),MemberDef::Enumeration); + writeMemberDocs(ol,&proMembers,name(),MemberDef::Enumeration); + if (extractPrivateFlag) + { + writeMemberDocs(ol,&priMembers,name(),MemberDef::Enumeration); + } + } + + if (pubMembers.enumValueCount() + + proMembers.enumValueCount() + + ( extractPrivateFlag ? priMembers.enumValueCount() : 0 ) + ) + { + ol.writeRuler(); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trEnumerationValueDocumentation()); + ol.endGroupHeader(); + + writeMemberDocs(ol,&pubMembers,name(),MemberDef::EnumValue); + writeMemberDocs(ol,&proMembers,name(),MemberDef::EnumValue); + if (extractPrivateFlag) + { + writeMemberDocs(ol,&priMembers,name(),MemberDef::EnumValue); + } + } + + if ( pubMembers.funcCount() + pubSlots.funcCount() + + pubStaticMembers.funcCount() + + proMembers.funcCount() + proSlots.funcCount() + + proStaticMembers.funcCount() + + (extractPrivateFlag ? + priMembers.funcCount() + priSlots.funcCount() + + priStaticMembers.funcCount() : 0 + ) + ) + { + ol.writeRuler(); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trMemberFunctionDocumentation()); + ol.endGroupHeader(); + + writeMemberDocs(ol,&pubMembers,name(),MemberDef::Function); + writeMemberDocs(ol,&pubSlots,name(),MemberDef::Slot); + writeMemberDocs(ol,&signals,name(),MemberDef::Signal); + writeMemberDocs(ol,&pubStaticMembers,name(),MemberDef::Function); + writeMemberDocs(ol,&proMembers,name(),MemberDef::Function); + writeMemberDocs(ol,&proSlots,name(),MemberDef::Slot); + writeMemberDocs(ol,&proStaticMembers,name(),MemberDef::Function); + if (extractPrivateFlag) + { + writeMemberDocs(ol,&priMembers,name(),MemberDef::Function); + writeMemberDocs(ol,&priSlots,name(),MemberDef::Slot); + writeMemberDocs(ol,&priStaticMembers,name(),MemberDef::Function); + } + } + + if ( friends.count() + related.count() ) + { + ol.writeRuler(); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trRelatedFunctionDocumentation()); + ol.endGroupHeader(); + writeMemberDocs(ol,&friends,name(),MemberDef::Friend); + writeMemberDocs(ol,&related,name(),MemberDef::Function); + } + + + if ( pubMembers.varCount() + pubStaticMembers.varCount() + + proMembers.varCount() + proStaticMembers.varCount() + + (extractPrivateFlag ? + priMembers.varCount() + priStaticMembers.varCount() : 0 + ) + ) + { + ol.writeRuler(); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trMemberDataDocumentation()); + ol.endGroupHeader(); + + writeMemberDocs(ol,&pubMembers,name(),MemberDef::Variable); + writeMemberDocs(ol,&pubStaticMembers,name(),MemberDef::Variable); + writeMemberDocs(ol,&proMembers,name(),MemberDef::Variable); + writeMemberDocs(ol,&proStaticMembers,name(),MemberDef::Variable); + if (extractPrivateFlag) + { + writeMemberDocs(ol,&priMembers,name(),MemberDef::Variable); + writeMemberDocs(ol,&priStaticMembers,name(),MemberDef::Variable); + } + } + + // write the list of used files (Html and LaTeX only) + ol.disable(OutputGenerator::Man); + ol.writeRuler(); + parseDoc(ol,0,0, + theTranslator->trGeneratedFrom(pageType.lower(), + files.count()==1)); + ol.startItemList(); + + const char *file = files.first(); + while (file) + { + QFileInfo fi(file); + ol.writeListItem(); + FileDef *fd; + bool ambig; + if ((fd=findFileDef(&inputNameDict,fi.absFilePath(),ambig)) + && fd->hasDocumentation()) + { + ol.writeObjectLink(fd->getReference(),fd->diskName(),0, + fi.fileName()); + } + else + { + ol.docify(fi.fileName()); + } + file=files.next(); + } + + ol.endItemList(); + ol.enable(OutputGenerator::Man); + + // write Author section (Man only) + ol.disableAllBut(OutputGenerator::Man); + ol.writeString("\n"); + ol.startGroupHeader(); + parseDoc(ol,0,0,theTranslator->trAuthor()); + ol.endGroupHeader(); + parseDoc(ol,0,0,theTranslator->trGeneratedAutomatically(projectName)); + ol.enableAll(); + + endFile(ol); +} + +// write the list of all (inherited) members for this class +void ClassDef::writeMemberList(OutputList &ol) +{ + if (allMemberNameInfoList->count()==0) return; + // do not generate Latex output + ol.disableAllBut(OutputGenerator::Html); + startFile(ol,memListFileName,theTranslator->trMemberList()); + startTitle(ol); + parseDoc(ol,name(),0,name()+" "+theTranslator->trMemberList()); + endTitle(ol,0); + parseDoc(ol,0,0,theTranslator->trThisIsTheListOfAllMembers()); + ol.writeString(" "); + ol.writeObjectLink(reference,fileName,0,name()); + ol.writeString(", "); + parseDoc(ol,0,0,theTranslator->trIncludingInheritedMembers()); + + ol.startItemList(); + + MemberNameInfo *mni=allMemberNameInfoList->first(); + while (mni) + { + MemberInfo *mi=mni->first(); + while (mi) + { + MemberDef *md=mi->memberDef; + ClassDef *cd=md->memberClass(); + + // compute the protection level for this member + Protection protect=md->protection(); + if (mi->prot==Protected) // inherited protection + { + if (protect==Public) protect=Protected; + else if (protect==Protected) protect=Private; + } + + //printf("Member %s of class %s mi->prot=%d prot=%d\n", + // md->name().data(),cd->name().data(),mi->prot,protect); + + Specifier virt=md->virtualness(); + MemberDef *rmd=md->reimplements(); + while (rmd && virt==Normal) + { + virt = rmd->virtualness()==Normal ? Normal : Virtual; + rmd = rmd->reimplements(); + } + + if (cd && !md->name().isEmpty() && md->name()[0]!='@' && + ( + md->isFriend() || + (mi->prot!=Private && (protect!=Private || extractPrivateFlag)) + ) + ) + { + bool memberWritten=FALSE; + if (cd->isVisible() && (md->hasDocumentation() || md->isReference())) + // create a link to the documentation + { + QString name=mi->ambiguityResolutionScope+md->name(); + ol.writeListItem(); + ol.writeObjectLink(cd->getReference(),cd->classFile(), + md->anchor(),name); + if ( md->isFunction() || md->isSignal() || md->isSlot() ) + ol.docify(md->argsString()); + else if (md->isEnumerate()) + parseDoc(ol,0,0," "+theTranslator->trEnumName()); + else if (md->isEnumValue()) + parseDoc(ol,0,0," "+theTranslator->trEnumValue()); + else if (md->isTypedef()) + ol.docify(" typedef"); + else if (md->isFriend() && !strcmp(md->typeString(),"friend class")) + ol.docify(" class"); + ol.writeString("\n"); + memberWritten=TRUE; + } + else if (!hideMemberFlag) // no documentation, + // generate link to the class instead. + { + ol.writeListItem(); + ol.writeBoldString(md->name()); + if ( md->isFunction() || md->isSignal() || md->isSlot() ) + ol.docify(md->argsString()); + else if (md->isEnumerate()) + parseDoc(ol,0,0," "+theTranslator->trEnumName()); + else if (md->isEnumValue()) + parseDoc(ol,0,0," "+theTranslator->trEnumValue()); + else if (md->isTypedef()) + ol.docify(" typedef"); + ol.writeString(" ("); + parseDoc(ol,0,0,theTranslator->trDefinedIn()+" "); + if (cd->isVisible()) + { + ol.writeObjectLink(cd->getReference(),cd->classFile(),0,cd->name()); + } + else + { + ol.writeBoldString(cd->name()); + } + ol.writeString(")"); + memberWritten=TRUE; + } + if ((protect!=Public || md->isStatic() || virt!=Normal || + md->isFriend() || md->isRelated() + ) + && memberWritten) + { + ol.startTypewriter(); + ol.docify(" ["); + QStrList sl; + if (md->isFriend()) sl.append("friend"); + else if (md->isRelated()) sl.append("related"); + else + { + if (protect==Protected) sl.append("protected"); + else if (protect==Private) sl.append("private"); + if (virt==Virtual) sl.append("virtual"); + else if (virt==Pure) sl.append("pure virtual"); + if (md->isStatic()) sl.append("static"); + if (md->isSignal()) sl.append("signal"); + if (md->isSlot()) sl.append("slot"); + } + const char *s=sl.first(); + while (s) + { + ol.docify(s); + s=sl.next(); + if (s) ol.docify(", "); + } + ol.docify("]"); + ol.endTypewriter(); + } + } + mi=mni->next(); + } + mni=allMemberNameInfoList->next(); + } + ol.endItemList(); + endFile(ol); + ol.enableAll(); +} + +void ClassDef::writeIncludeFile(OutputList &ol) +{ + if (!incFile) return; + //printf("incFile=%s\n",incFile->absFilePath().data()); + ol.disableAllBut(OutputGenerator::Html); + startFile(ol,fileName+"-include",name()+" Include File"); + startTitle(ol); + QString n=incName.copy(); + if (incName.isNull()) n=incFile->name(); + parseDoc(ol,0,0,n); + endTitle(ol,0); + parseDoc(ol,0,0,theTranslator->trVerbatimText(incFile->name())); + ol.writeRuler(); + ol.startCodeFragment(); + parseCode(ol,n,fileToString(incFile->absFilePath()),FALSE,0); + ol.endCodeFragment(); + endFile(ol); + ol.enableAll(); +} + +// add a reference to an example +bool ClassDef::addExample(const char *anchor,const char *nameStr, + const char *file) +{ + if (exampleDict && !exampleDict->find(nameStr)) + { + Example *e=new Example; + e->anchor=anchor; + e->name=nameStr; + e->file=file; + exampleDict->insert(nameStr,e); + exampleList->inSort(e); + return TRUE; + } + return FALSE; +} + +// returns TRUE if this class is used in an example +bool ClassDef::hasExamples() +{ + if (exampleList==0) + return FALSE; + else + return exampleList->count()>0; +} + +// write the list of all examples that are use this class. +void ClassDef::writeExample(OutputList &ol) +{ + Example *e=exampleList->first(); + while (e) + { + ol.writeObjectLink(0,e->file,e->anchor,e->name); + e=exampleList->next(); + if (e) + { + if (exampleList->at()==(int)exampleList->count()-1) + parseDoc(ol,0,0," "+theTranslator->trAnd()+" "); + else + ol.writeString(", "); + } + } + ol.writeString("."); +} + +void ClassDef::setTemplateArguments(ArgumentList *al) +{ + if (al==0) return; + if (!tempArgs) delete tempArgs; // delete old list if needed + tempArgs=new ArgumentList; + tempArgs->setAutoDelete(TRUE); + ArgumentListIterator ali(*al); + Argument *a; + for (;(a=ali.current());++ali) + { + tempArgs->append(new Argument(*a)); + } +} + +QString ClassDef::getTemplateNameString() +{ + QString result; + if (!tempArgs || tempArgs->count()==0) return result; + result="<"; + Argument *a=tempArgs->first(); + while (a) + { + if (a->name.length()>0) // add template argument name + { + result+=a->name; + } + else // extract name from type + { + int i=a->type.length()-1; + while (i>=0 && isId(a->type.at(i))) i--; + if (i>0) + { + result+=a->type.right(a->type.length()-i-1); + } + } + a=tempArgs->next(); + if (a) result+=", "; + } + result+=">"; + return result; +} + +bool ClassDef::hasNonReferenceSuperClass() +{ + bool found=!isReference(); + BaseClassListIterator bcli(*inheritedBy); + for ( ; bcli.current() && !found ; ++bcli ) + found=found || bcli.current()->classDef->hasNonReferenceSuperClass(); + return found; +} diff --git a/src/classdef.h b/src/classdef.h new file mode 100644 index 0000000..8fe0f21 --- /dev/null +++ b/src/classdef.h @@ -0,0 +1,169 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef CLASSDEF_H +#define CLASSDEF_H + +#include +#include +#include +#include +#include +#include + +#include "membername.h" +#include "memberlist.h" +#include "memberdef.h" +#include "example.h" +#include "entry.h" +#include "definition.h" + +typedef QDict MemberDict; +class ClassList; +class OutputList; +class FileDef; +class BaseClassList; +class MemberInfoList; +class MemberInfoDict; +class NamespaceDef; + +class ClassDef : public Definition +{ + public: + + enum CompoundType { Class=Entry::CLASS_SEC, + Struct=Entry::STRUCT_SEC, + Union=Entry::UNION_SEC + }; + + ClassDef(const char *name,int ct,const char *ref=0,const char *fName=0); + ~ClassDef(); + QString classFile() const { return fileName; } + int compoundType() const { return compType; } + const char *memberListFileName() const { return memListFileName; } + void insertBaseClass(ClassDef *,Protection p,Specifier s,const char *t=0); + BaseClassList *baseClasses() { return inherits; } + void insertSuperClass(ClassDef *,Protection p,Specifier s,const char *t=0); + BaseClassList *superClasses() { return inheritedBy; } + void setIncludeFile(FileDef *fd) { incFile=fd; } + FileDef *includeFile() const { return incFile; } + void setIncludeName(const char *n_) { incName=n_; } + MemberNameInfoList *memberNameInfoList() { return allMemberNameInfoList; } + MemberNameInfoDict *memberNameInfoDict() { return allMemberNameInfoDict; } + bool isReference() { return !reference.isNull(); } + const char *getReference() const { return reference; } + void insertMember(const MemberDef *); + void insertUsedFile(const char *); + void computeAnchors(); + void setAnchor(MemberDef *); + void dumpMembers(); + void writeDocumentation(OutputList &ol); + void writeMemberList(OutputList &ol); + void writeIncludeFile(OutputList &ol); + bool addExample(const char *anchor,const char *name, const char *file); + bool hasExamples(); + void writeExample(OutputList &ol); + void setProtection(Protection p) { prot=p; } + Protection protection() const { return prot; } + bool isVisible() + { return !name().isEmpty() && name().at(0)!='@' && + (prot!=Private || extractPrivateFlag) && + hasDocumentation(); + } + bool hasNonReferenceSuperClass(); + bool isVisibleExt() + { return (allExtFlag || hasNonReferenceSuperClass()) && + !name().isEmpty() && name().at(0)!='@' && + (prot!=Private || extractPrivateFlag) && + (hasDocumentation() || !hideClassFlag || !reference.isNull()); + } + + // template argument functions + ArgumentList *templateArguments() const { return tempArgs; } + void setTemplateArguments(ArgumentList *al); + QString getTemplateNameString(); + void setNamespace(NamespaceDef *nd) { nspace = nd; } + NamespaceDef *getNamespace() { return nspace; } + + bool visited; + + private: + //QString name; // name of the class + QString fileName; // HTML containing the class docs + //QString doc; // general class documentation + FileDef *incFile; // header file to refer to + QString incName; // alternative include file name + //QString brief; // brief class discription + QString memListFileName; + BaseClassList *inherits; + BaseClassList *inheritedBy; + NamespaceDef *nspace; // the namespace this class is in + MemberList pubMembers; + MemberList proMembers; + MemberList priMembers; + MemberList pubStaticMembers; + MemberList proStaticMembers; + MemberList priStaticMembers; + MemberList pubSlots; + MemberList proSlots; + MemberList priSlots; + MemberList related; + MemberList signals; + MemberList friends; + MemberNameInfoList *allMemberNameInfoList; + MemberNameInfoDict *allMemberNameInfoDict; + ArgumentList *tempArgs; + QStrList files; + QString reference; + ExampleList *exampleList; + ExampleDict *exampleDict; + int compType; + Protection prot; +}; + + +struct BaseClassDef +{ + BaseClassDef(ClassDef *cd,Protection p,Specifier v,const char *t) : + classDef(cd), prot(p), virt(v), templSpecifiers(t) {} + ClassDef *classDef; + Protection prot; + Specifier virt; + QString templSpecifiers; +}; + +class BaseClassList : public QList +{ + public: + int compareItems(GCI item1,GCI item2) + { + ClassDef *c1=((BaseClassDef *)item1)->classDef; + ClassDef *c2=((BaseClassDef *)item2)->classDef; + if (c1==0 || c2==0) + return FALSE; + else + return strcmp(c1->name(),c2->name()); + } +}; + +class BaseClassListIterator : public QListIterator +{ + public: + BaseClassListIterator(const BaseClassList &bcl) : + QListIterator(bcl) {} +}; + +#endif diff --git a/src/classlist.cpp b/src/classlist.cpp new file mode 100644 index 0000000..518f757 --- /dev/null +++ b/src/classlist.cpp @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#include "classlist.h" + +ClassList::ClassList() : QList() +{ +} + +ClassList::~ClassList() +{ +} + +int ClassList::compareItems(GCI item1, GCI item2) +{ + ClassDef *c1=(ClassDef *)item1; + ClassDef *c2=(ClassDef *)item2; + return strcmp(c1->name(),c2->name()); +} + +ClassListIterator::ClassListIterator(const ClassList &cllist) : + QListIterator(cllist) +{ +} diff --git a/src/classlist.h b/src/classlist.h new file mode 100644 index 0000000..28d8454 --- /dev/null +++ b/src/classlist.h @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef CLASSLIST_H +#define CLASSLIST_H + +#include "classdef.h" + +class ClassList : public QList +{ + public: + ClassList(); + ~ClassList(); + + int compareItems(GCI item1,GCI item2); +}; + +class ClassListIterator : public QListIterator +{ + public: + ClassListIterator(const ClassList &list); +}; + +#endif diff --git a/src/code.h b/src/code.h new file mode 100644 index 0000000..4b781fb --- /dev/null +++ b/src/code.h @@ -0,0 +1,28 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef CODE_H +#define CODE_H + +#include +#include + +class OutputList; + +extern void parseCode(OutputList &,const char *,const QString &, + bool ,const char *); +extern void initParseCodeContext(); +#endif diff --git a/src/code.l b/src/code.l new file mode 100644 index 0000000..8bff410 --- /dev/null +++ b/src/code.l @@ -0,0 +1,747 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +%{ + +/* + * includes + */ +#include +#include +#include +#include + +#include + +#include "scanner.h" +#include "entry.h" +#include "doxygen.h" +#include "message.h" +#include "outputlist.h" +#include "util.h" + +#define YY_NO_UNPUT +#define YY_NEVER_INTERACTIVE 1 + +class CodeClassDef +{ + public: + CodeClassDef() {} + CodeClassDef(const CodeClassDef &d) + { + name = d.name; + bases = d.bases; + } + ~CodeClassDef() {} + + QString name; + QStrList bases; +}; + +class CodeVarDef +{ + public: + CodeVarDef() {} + CodeVarDef(const CodeVarDef &d) + { + name = d.name; + type = d.type; + classScope = d.classScope; + } + ~CodeVarDef() {} + + QString name; + QString type; + QString classScope; +}; + +typedef QList CodeClassList; +typedef QDict CodeClassDict; +typedef QList CodeVarList; + +static CodeClassList codeClassList; +static CodeClassDict codeClassDict(17); +static CodeVarList codeVarList; +static CodeVarList codeParmList; + +/* ----------------------------------------------------------------- + * + * statics + */ + +static const char * inputString; +static int inputPosition; +static int lastCContext; +static int lastDContext; +static int lastStringContext; +static int bracketCount = 0; +static int curlyCount = 0; +static int sharpCount = 0; +static int yyLineNr = 0; +static QString type; +static QString name; +static QString args; +static QString parmType; +static QString parmName; +static bool inClass; +static QString classScope; +static OutputList *code; +static CodeClassDef ccd; +static CodeVarDef cvd; +static bool exampleBlock; +static QString exampleName; +static QString exampleFile; +static int anchorCount; + +static void addType() +{ + if (name=="const") { name.resize(0); return; } + if (type.length()) type += ' ' ; + type += name ; + name.resize(0) ; + if (type.length()) type += ' ' ; + type += args ; + args.resize(0) ; +} + +static void addParmType() +{ + if (parmName=="const") { parmName.resize(0); return; } + if (parmType.length()) parmType += ' ' ; + parmType += parmName ; + parmName.resize(0) ; +} + +static void setClassScope(const QString &name) +{ + QString n=name; + n=n.simplifyWhiteSpace(); + int index; + if ((index=n.find("::"))!=-1) + classScope=n.left(index); + else + classScope.resize(0); + //printf("--->New class scope `%s'\n",classScope.data()); +} + +static void addVariable() +{ + cvd.name=name.copy().simplifyWhiteSpace(); + cvd.type=type.copy().simplifyWhiteSpace(); + if (type.length()==0) + return; + else if ((getClass(cvd.type)) || (codeClassDict[cvd.type])) + { + cvd.classScope=classScope; + codeVarList.append(new CodeVarDef(cvd)); // add it to a list + } +} + +static void addParameter() +{ + cvd.name=parmName.copy().simplifyWhiteSpace(); + cvd.type=parmType.copy().simplifyWhiteSpace(); + if (cvd.type.length()==0) + return; + else if ((getClass(cvd.type)) || (codeClassDict[cvd.type])) + { + cvd.classScope=classScope; + codeParmList.append(new CodeVarDef(cvd)); // add it to a list + } +} + +static void generateClassLink(OutputList &ol,const char *clName) +{ + QString className=clName; + if (className.length()==0) return; + ClassDef *cd; + if ((cd=getClass(className)) && cd->isVisible()) + { + if (exampleBlock) + { + QString anchor; + anchor.sprintf("a%d",anchorCount); + //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),exampleName.data(), + // exampleFile.data()); + if (cd->addExample(anchor,exampleName,exampleFile)) + { + ol.writeAnchor(anchor); + anchorCount++; + } + } + ol.writeCodeLink(cd->getReference(),cd->classFile(),0,className); + } + else + { + ol.codify(clName); + } +} + +static bool getLink(const char *className, + const char *memberName,OutputList &result) +{ + MemberDef *md; + ClassDef *cd; + FileDef *fd; + QString m=memberName; + QString c=className; + //printf("Trying `%s'::`%s'\n",c.data(),m.data()); + if (getDefs(m,c,"()",md,cd,fd) && + (md->hasDocumentation() || md->isReference())) + { + //printf("Found!\n"); + if (exampleBlock) + { + QString anchor; + anchor.sprintf("a%d",anchorCount); + //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),exampleName.data(), + // exampleFile.data()); + if (md->addExample(anchor,exampleName,exampleFile)) + { + result.writeAnchor(anchor); + anchorCount++; + } + } + if (cd) + { + result.writeCodeLink(cd->getReference(),cd->classFile(), + md->anchor(),memberName); + return TRUE; + } + else if (fd) + { + result.writeCodeLink(fd->getReference(),fd->diskName(), + md->anchor(),memberName); + return TRUE; + } + } + + return FALSE; +} + +static void generateMemberLink(OutputList &ol,const char *varName, + const char *memName) +{ + //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n", + // varName,memName,classScope.data()); + CodeVarDef *cvd=codeParmList.last(); + while (cvd && cvd->name!=varName) cvd=codeParmList.prev(); + if (!cvd) + { + cvd=codeVarList.last(); + while (cvd && cvd->name!=varName) cvd=codeVarList.prev(); + } + if (cvd) // variable found + { + CodeClassDef *ccd=codeClassDict[cvd->type]; + if (ccd) + { + char *s=ccd->bases.first(); + while (s) + { + OutputList result(&ol); + if (getLink(s,memName,result)) + { + ol+=result; + return; + } + s=ccd->bases.next(); + } + } + else + { + OutputList result(&ol); + if (getLink(cvd->type,memName,result)) + { + ol+=result; + } + else + { + ol.codify(memName); + } + return; + } + } + ol.codify(memName); + return; +} + +static void generateFunctionLink(OutputList &ol,const char *funcName) +{ + //printf("generateFunctionLink(%s) classScope=%s\n",funcName,classScope.data()); + OutputList result(&ol); + CodeClassDef *ccd=0; + if (classScope.length()>0 && (ccd=codeClassDict[classScope])) + { + //printf("using classScope %s\n",classScope.data()); + char *s=ccd->bases.first(); + while (s) + { + if (getLink(s,funcName,result)) + { + ol+=result; + return; + } + s=ccd->bases.next(); + } + } + if (getLink(classScope,funcName,result)) + { + ol+=result; + } + else + { + ol.codify(funcName); + } + return; +} + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +%} + +ID [a-z_A-Z][a-z_A-Z0-9]* + +%x SkipString +%x SkipCPP +%x SkipComment +%x SkipSpecialComment +%x SkipCxxComment +%x SkipSpecialCxxComment +%x Body +%x FuncCall +%x MemberCall +%x MemberCall2 +%x SkipInits +%x ClassName +%x Bases +%x SkipSharp +%x ReadInclude + +%% + +<*>\x0d +^([ \t]*"#include"[ \t]*)("<"|"\"") { + code->codify(yytext); + BEGIN( ReadInclude ); + } +("class"|"struct"|"union")[ \t\n]+ { + code->codify(yytext); + BEGIN( ClassName ); + } +[a-z_A-Z0-9.]+(("/"[a-z_A-Z0-9.]+)*)/(">"|"\"") { + //FileInfo *f; + bool ambig; + FileDef *fd; + if ((fd=findFileDef(&inputNameDict,yytext,ambig)) && + fd->hasDocumentation()) + { + code->writeCodeLink(0,fd->diskName(),0,yytext); + } + else + { + code->codify(yytext); + } + char c=yyinput(); + QString text; + text+=c; + code->codify(text); + BEGIN( Body ); + } +^[ \t]*"#" { + code->codify(yytext); + BEGIN( SkipCPP ) ; + } +. { + code->codify(yytext); + } +\\\n { + code->codify(yytext); + yyLineNr++ ; + } +\n { + yyLineNr++ ; + code->codify(yytext); + BEGIN( Body ) ; + } +"//" { + code->codify(yytext); + } +"{" { + code->codify(yytext); + curlyCount++; + type.resize(0); name.resize(0); + } +"}" { + code->codify(yytext); + inClass=FALSE; + if (--curlyCount<=0) + { + classScope.resize(0); + codeParmList.clear(); + } + } +";" { + code->codify(yytext); + BEGIN( Body ); + } +[*&]+ { + addType(); + code->codify(yytext); + } +{ID} { + ccd.name=yytext; + addType(); + generateClassLink(*code,yytext); + } +[ \t\n]*":"[ \t\n]* { + code->codify(yytext); + BEGIN( Bases ); + } +[ \t]*"{"[ \t]* { + code->codify(yytext); + curlyCount++; + inClass=TRUE; + if (ccd.name.length()>0) + { + classScope=ccd.name.copy(); + CodeClassDef *cd=new CodeClassDef(ccd); + codeClassList.append(cd); + codeClassDict.insert(cd->name,cd); + } + BEGIN( Body ); + } +"virtual" { + code->codify(yytext); + } +"public" { + code->codify(yytext); + } +"protected" { + code->codify(yytext); + } +"private" { + code->codify(yytext); + } +{ID} { + //printf("%s:addBase(%s)\n",ccd.name.data(),yytext); + ccd.bases.inSort(yytext); + generateClassLink(*code,yytext); + } +"<" { + code->codify(yytext); + sharpCount=1; + BEGIN ( SkipSharp ); + } +"<" { + code->codify(yytext); + ++sharpCount; + } +">" { + code->codify(yytext); + if (--sharpCount<=0) + BEGIN ( Bases ); + } +"," { + code->codify(yytext); + } + + +("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*)/"(" { + code->codify(yytext); + name.resize(0);type.resize(0); + } +("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*) { + code->codify(yytext); + name.resize(0);type.resize(0); + } +([a-z_A-Z~][a-z_A-Z0-9]*)/([ \t]*) { + generateClassLink(*code,yytext); + addType(); + name+=yytext; + } +[a-z_A-Z~]([a-z_A-Z0-9]*[ \t\n]*"::")+[ \t\n]*[~a-z_A-Z][a-z_A-Z0-9]*[ \t\n]* { + code->codify(yytext); + addType(); + name+=yytext; + } +([a-z_A-Z~][a-z_A-Z0-9:]*)/([ \t]*"(") { + addType(); + if (type.length()==0) + generateFunctionLink(*code,yytext); + else + code->codify(yytext); + bracketCount=1; + args.resize(0); + name+=yytext; + BEGIN( FuncCall ); + } +\" { + code->codify(yytext); + lastStringContext=YY_START; + BEGIN( SkipString ); + } +[^\"\\]* { + code->codify(yytext); + } +\" { + code->codify(yytext); + BEGIN( lastStringContext ); + } +\\\" { + code->codify(yytext); + } +":" { + code->codify(yytext); + name.resize(0);type.resize(0); + } +"'"."'" { + code->codify(yytext); + } +"."|"->" { + code->codify(yytext); + BEGIN( MemberCall ); + } +([a-z_A-Z~][a-z_A-Z0-9]*)/([ \t\n]*"(") { + if (name.length()>0) + generateMemberLink(*code,name,yytext); + else + code->codify(yytext); + name.resize(0);type.resize(0); + bracketCount=0; + BEGIN(FuncCall); + } +[^a-z_A-Z0-9(] { + code->codify(yytext); + type.resize(0); + name.resize(0); + BEGIN(Body); + } +[,=;\[] { + code->codify(yytext); + if (type.length()>0) + addVariable(); + name.resize(0); + if (*yytext!=',') type.resize(0); + args.resize(0); + } +[0-9]+ { + code->codify(yytext); + } +[a-z_A-Z][:a-z_A-Z0-9]* { + addParmType(); + parmName=yytext; + generateClassLink(*code,yytext); + } +, { + code->codify(yytext); + addParameter(); + parmType.resize(0);parmName.resize(0); + } +"(" { + code->codify(yytext); + bracketCount++; + } +")" { + code->codify(yytext); + if (--bracketCount<=0) + name.resize(0);args.resize(0); + parmType.resize(0);parmName.resize(0); + BEGIN( Body ); + } +")"[ \t\n]*";" { + code->codify(yytext); + bracketCount=0; + if (!inClass && type.length()>0) + addVariable(); + name.resize(0);type.resize(0); + parmType.resize(0);parmName.resize(0); + BEGIN( Body ); + } +")"[ \t\n]*"{" { + addParameter(); + parmType.resize(0);parmName.resize(0); + if (name.length()>0) setClassScope(name); + code->codify(yytext); + curlyCount++; + type.resize(0); name.resize(0); + BEGIN( Body ); + } +")"[ \t\n]*":" { + addParameter(); + parmType.resize(0);parmName.resize(0); + if (name.length()>0) setClassScope(name); + code->codify(yytext); + type.resize(0); name.resize(0); + BEGIN( SkipInits ); + } +"{" { + code->codify(yytext); + curlyCount++; + BEGIN( Body ); + } +{ID} { + generateClassLink(*code,yytext); + } +([a-z_A-Z][a-z_A-Z0-9]*)/"(" { + generateFunctionLink(*code,yytext); + } +([a-z_A-Z][a-z_A-Z0-9]*)/("."|"->") { + code->codify(yytext); + args=yytext; + BEGIN( MemberCall2 ); + } +([a-z_A-Z][a-z_A-Z0-9]*)/([ \t\n]*"(") { + if (args.length()>0) + generateMemberLink(*code,args,yytext); + else + code->codify(yytext); + args.resize(0); + BEGIN( FuncCall ); + } +([a-z_A-Z][a-z_A-Z0-9]*)/([ \t\n]*("."|"->")) { + code->codify(yytext); + args=yytext; + } +"//" { + code->codify(yytext); + } +[ \t]*"*/" { + code->codify(yytext); + BEGIN( lastCContext ) ; + } +.*\n { + code->codify(yytext); + yyLineNr++ ; + BEGIN( lastCContext ) ; + } +"//" + /*! +[ \t]*"* /"[ \t]* /"\n" { + BEGIN( lastDContext ) ; + } + */ +[ \t]*"*/" { + BEGIN( lastDContext ) ; + } +[ \t]*"*/"[ \t\n]*"\n"/"/*" { + //code->codify("\n"); + QString lineText=yytext; + yyLineNr+=lineText.contains('\n'); + BEGIN( lastDContext ) ; + } +. +\n { yyLineNr++; } +.*/\n { + yyLineNr++ ; + BEGIN( lastDContext ) ; + } +. +\n { yyLineNr++; } +<*>[ \t]*"/*!"|"/**" { + lastDContext = YY_START ; + BEGIN( SkipSpecialComment ); + } +<*>"/*" { + code->codify(yytext); + lastCContext = YY_START ; + BEGIN( SkipComment ) ; + } +<*>[ \t]*"//!" { + lastDContext = YY_START ; + BEGIN( SkipSpecialCxxComment ); + } +<*>"//" { + code->codify(yytext); + lastCContext = YY_START ; + BEGIN( SkipCxxComment ) ; + } +<*>. { + code->codify(yytext); + } +<*>\n { + code->codify(yytext); + } +<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines + QString sepLine=yytext; + code->codify("\n\n"); + yyLineNr+=sepLine.contains('\n'); + } + +%% + +/*@ ---------------------------------------------------------------------------- + */ + +void initParseCodeContext() +{ + codeClassList.setAutoDelete(TRUE); + codeVarList.setAutoDelete(TRUE); + codeParmList.setAutoDelete(TRUE); + codeClassDict.clear(); + codeClassList.clear(); + codeVarList.clear(); + codeParmList.clear(); + ccd.bases.clear(); + anchorCount = 0; +} + +void parseCode(OutputList &ol,const char *className,const QString &s, + bool e, const char *exName) +{ + code = new OutputList(&ol); + if (s.length()==0) return; + inputString = s; + inputPosition = 0; + yyLineNr = 0; + curlyCount = 0; + bracketCount = 0; + sharpCount = 0; + classScope = className; + exampleBlock = e; + exampleName = exName; + exampleFile = convertSlashes(exampleName,TRUE)+"-example"; + type.resize(0); + name.resize(0); + args.resize(0); + parmName.resize(0); + parmType.resize(0); + codeYYrestart( codeYYin ); + BEGIN( Body ); + codeYYlex(); + ol+=*code; + delete code; + return; +} + +extern "C" { // some bogus code to keep the compiler happy + int codeYYwrap() { return 1 ; } + void codeYYdummy() { yy_flex_realloc(0,0); } +} diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..6269e85 --- /dev/null +++ b/src/config.h @@ -0,0 +1,80 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include +#include + +extern void parseConfig(const QString &config); +extern void writeTemplateConfig(QFile *f,bool shortList); + +extern QString projectName; // the name of the project +extern QString projectNumber; // the number of the project +extern QString htmlOutputDir; // the directory to put the HTML files +extern QString latexOutputDir; // the directory to put the Latex files +extern QString manOutputDir; // the directory to put the man pages +extern QString headerFile; // the name of the personal HTML header +extern QString footerFile; // the name of the personal HTML footer +extern QString cgiName; // the name of the CGI binary +extern QString cgiURL; // the absolute URL to the CGI binary +extern QString docURL; // the absolute URL to the documentation +extern QString binAbsPath; // the absolute path to the doxysearch +extern QString docAbsPath; // the absolute path to the documentation +extern QString perlPath; // the absolute path to perl +extern QString genTagFile; // the tag file to generate +extern QString inputFilter; // a filter command that is applied to input files +extern QString paperType; // the page type to generate docs for +extern QString stripFromPath; // the string to strip from the file path +extern QStrList includePath; // list of include paths +extern QStrList examplePath; // list of example paths +extern QStrList inputSources; // list of input files +extern QStrList excludeSources; // list of files to exclude from the input +extern QStrList filePatternList; // list of file patterns +extern QStrList excludePatternList; // list of patterns to exclude from input +extern QStrList tagFileList; // list of tag files +extern QStrList extDocPathList; // list of external doc. directories. +extern QStrList predefined; // list of predefined macro names. +extern QStrList extraPackageList; // list of extra LaTeX packages. +extern bool quietFlag; // generate progress messages flag +extern bool warningFlag; // generate warnings flag +extern bool recursiveFlag; // scan directories recursively +extern bool allExtFlag; // include all external classes flag +extern bool searchEngineFlag; // generate search engine flag +extern bool extractAllFlag; // gererate docs for all classes flag +extern bool extractPrivateFlag; // generate docs for private members flag +extern bool noIndexFlag; // generate condensed index flag +extern bool generateHtml; // generate HTML output +extern bool generateLatex; // generate Latex output +extern bool generateMan; // generate Man pages +extern bool preprocessingFlag; // enable preprocessing +extern bool briefMemDescFlag; // enable `inline' brief member descr. +extern bool hideMemberFlag; // hide undocumented members. +extern bool hideClassFlag; // hide undocumented members. +extern bool searchIncludeFlag; // search for included files +extern bool macroExpansionFlag; // expand macros in the source. +extern bool onlyPredefinedFlag; // expand only predefined macros +extern bool fullPathNameFlag; // using full path name in output +extern bool classDiagramFlag; // enable the generation of class diagrams. +extern bool compactLatexFlag; // generate compact LaTeX documentation. +extern bool repeatBriefFlag; // repeat brief descriptions. +extern bool internalDocsFlag; // determines what happens to internal docs. +extern bool caseSensitiveNames; // determines if output can be mixed case. +extern bool verbatimHeaderFlag; // enable/disable generation of verb headers. + +#endif diff --git a/src/config.l b/src/config.l new file mode 100644 index 0000000..232f531 --- /dev/null +++ b/src/config.l @@ -0,0 +1,1112 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +%{ + +/* + * includes + */ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "doxygen.h" +#include "config.h" +#include "message.h" +#include "pre.h" +#include "version.h" +#include "language.h" + +#define YY_NEVER_INTERACTIVE 1 + +/* ----------------------------------------------------------------- + * + * exported variables + */ + +QString projectName; +QString projectNumber; +QString outputDir; +QString htmlOutputDir; +QString latexOutputDir; +QString manOutputDir; +QString headerFile; +QString footerFile; +QString cgiName; +QString cgiURL; +QString docURL; +QString binAbsPath; +QString docAbsPath; +QString perlPath; +QString genTagFile; +QString inputFilter; +QString paperType; +QString outputLanguage; +QString stripFromPath; +QStrList includePath; +QStrList examplePath; +QStrList inputSources; +QStrList excludeSources; +QStrList filePatternList; +QStrList excludePatternList; +QStrList tagFileList; +QStrList extDocPathList; +QStrList predefined; +QStrList extraPackageList; +bool quietFlag = FALSE; +bool warningFlag = FALSE; +bool recursiveFlag = FALSE; +bool allExtFlag = FALSE; +bool searchEngineFlag = FALSE; +bool extractAllFlag = FALSE; +bool extractPrivateFlag = FALSE; +bool noIndexFlag = FALSE; +bool hideMemberFlag = FALSE; +bool hideClassFlag = FALSE; +bool macroExpansionFlag = FALSE; +bool onlyPredefinedFlag = FALSE; +bool fullPathNameFlag = FALSE; +bool compactLatexFlag = FALSE; +bool internalDocsFlag = FALSE; +bool caseSensitiveNames = FALSE; +bool generateHtml = TRUE; +bool generateLatex = TRUE; +bool generateMan = TRUE; +bool preprocessingFlag = TRUE; +bool briefMemDescFlag = TRUE; +bool searchIncludeFlag = TRUE; +bool classDiagramFlag = TRUE; +bool repeatBriefFlag = TRUE; +bool verbatimHeaderFlag = TRUE; + +/* ----------------------------------------------------------------- + * + * static variables + */ + +static const char * inputString; +static int inputPosition; +static int yyLineNr; +static QString tmpString; +static QString * s=0; +static bool * b=0; +static QStrList * l=0; +static int lastState; +static int lastEnvState; +static QString elemStr; + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +%} + +%x Start +%x SkipComment +%x GetString +%x GetBool +%x GetStrList +%x GetQuotedString +%x GetEnvVar + +%% + +<*>\0x0d +"#" { BEGIN(SkipComment); } +"PROJECT_NAME"[ \t]*"=" { BEGIN(GetString); s=&projectName; } +"PROJECT_NUMBER"[ \t]*"=" { BEGIN(GetString); s=&projectNumber; } +"OUTPUT_DIRECTORY"[ \t]*"=" { BEGIN(GetString); s=&outputDir; } +"HTML_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&htmlOutputDir; } +"MAN_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&manOutputDir; } +"LATEX_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&latexOutputDir; } +"HTML_HEADER"[ \t]*"=" { BEGIN(GetString); s=&headerFile; } +"HTML_FOOTER"[ \t]*"=" { BEGIN(GetString); s=&footerFile; } +"CGI_NAME"[ \t]*"=" { BEGIN(GetString); s=&cgiName; } +"CGI_URL"[ \t]*"=" { BEGIN(GetString); s=&cgiURL; } +"DOC_URL"[ \t]*"=" { BEGIN(GetString); s=&docURL; } +"BIN_ABSPATH"[ \t]*"=" { BEGIN(GetString); s=&binAbsPath; } +"DOC_ABSPATH"[ \t]*"=" { BEGIN(GetString); s=&docAbsPath; } +"PERL_PATH"[ \t]*"=" { BEGIN(GetString); s=&perlPath; } +"GENERATE_TAGFILE"[ \t]*"=" { BEGIN(GetString); s=&genTagFile; } +"INPUT_FILTER"[ \t]*"=" { BEGIN(GetString); s=&inputFilter; } +"PAPER_TYPE"[ \t]*"=" { BEGIN(GetString); s=&paperType; } +"OUTPUT_LANGUAGE"[ \t]*"=" { BEGIN(GetString); s=&outputLanguage; } +"STRIP_FROM_PATH"[ \t]*"=" { BEGIN(GetString); s=&stripFromPath; } +"INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&includePath; elemStr=""; } +"EXAMPLE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&examplePath; elemStr=""; } +"INPUT"[ \t]*"=" { BEGIN(GetStrList); l=&inputSources; elemStr=""; } +"EXCLUDE"[ \t]*"=" { BEGIN(GetStrList); l=&excludeSources; elemStr=""; } +"FILE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&filePatternList; elemStr=""; } +"EXCLUDE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&excludePatternList; elemStr=""; } +"TAGFILES"[ \t]*"=" { BEGIN(GetStrList); l=&tagFileList; elemStr=""; } +"EXT_DOC_PATHS"[ \t]*"=" { BEGIN(GetStrList); l=&extDocPathList; elemStr=""; } +"PREDEFINED"[ \t]*"=" { BEGIN(GetStrList); l=&predefined; elemStr=""; } +"EXTRA_PACKAGES"[ \t]*"=" { BEGIN(GetStrList); l=&extraPackageList; elemStr=""; } +"QUIET"[ \t]*"=" { BEGIN(GetBool); b=&quietFlag; } +"WARNINGS"[ \t]*"=" { BEGIN(GetBool); b=&warningFlag; } +"RECURSIVE"[ \t]*"=" { BEGIN(GetBool); b=&recursiveFlag; } +"ALLEXTERNALS"[ \t]*"=" { BEGIN(GetBool); b=&allExtFlag; } +"SEARCHENGINE"[ \t]*"=" { BEGIN(GetBool); b=&searchEngineFlag; } +"EXTRACT_ALL"[ \t]*"=" { BEGIN(GetBool); b=&extractAllFlag; } +"EXTRACT_PRIVATE"[ \t]*"=" { BEGIN(GetBool); b=&extractPrivateFlag; } +"DISABLE_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&noIndexFlag; } +"GENERATE_LATEX"[ \t]*"=" { BEGIN(GetBool); b=&generateLatex; } +"GENERATE_HTML"[ \t]*"=" { BEGIN(GetBool); b=&generateHtml; } +"GENERATE_MAN"[ \t]*"=" { BEGIN(GetBool); b=&generateMan; } +"ENABLE_PREPROCESSING"[ \t]*"=" { BEGIN(GetBool); b=&preprocessingFlag; } +"MACRO_EXPANSION"[ \t]*"=" { BEGIN(GetBool); b=¯oExpansionFlag; } +"SEARCH_INCLUDES"[ \t]*"=" { BEGIN(GetBool); b=&searchIncludeFlag; } +"BRIEF_MEMBER_DESC"[ \t]*"=" { BEGIN(GetBool); b=&briefMemDescFlag; } +"HIDE_UNDOC_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&hideMemberFlag; } +"HIDE_UNDOC_CLASSES"[ \t]*"=" { BEGIN(GetBool); b=&hideClassFlag; } +"EXPAND_ONLY_PREDEF"[ \t]*"=" { BEGIN(GetBool); b=&onlyPredefinedFlag; } +"FULL_PATH_NAMES"[ \t]*"=" { BEGIN(GetBool); b=&fullPathNameFlag; } +"CLASS_DIAGRAMS"[ \t]*"=" { BEGIN(GetBool); b=&classDiagramFlag; } +"COMPACT_LATEX"[ \t]*"=" { BEGIN(GetBool); b=&compactLatexFlag; } +"REPEAT_BRIEF"[ \t]*"=" { BEGIN(GetBool); b=&repeatBriefFlag; } +"INTERNAL_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&internalDocsFlag; } +"CASE_SENSE_NAMES"[ \t]*"=" { BEGIN(GetBool); b=&caseSensitiveNames; } +"VERBATIM_HEADERS"[ \t]*"=" { BEGIN(GetBool); b=&verbatimHeaderFlag; } +[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); } +\n { yyLineNr++; BEGIN(Start); } +\n { + yyLineNr++; + if (elemStr.length()>0) + { + //printf("elemStr1=`%s'\n",elemStr.data()); + l->append(elemStr); + } + BEGIN(Start); + } +[ \t]+ { + if (elemStr.length()>0) + { + //printf("elemStr2=`%s'\n",elemStr.data()); + l->append(elemStr); + } + elemStr.resize(0); + } +[^ \"\$\t\r\n]+ { (*s)+=yytext; } +"\"" { lastState=YY_START; + BEGIN(GetQuotedString); + tmpString.resize(0); + } +"\$\(" { + //printf(">> Enter env\n"); + lastEnvState=YY_START; + BEGIN(GetEnvVar); + } +[a-z_A-Z0-9]+")" { + yytext[yyleng-1]='\0'; + const char *env=getenv(yytext); + int i; + int l=strlen(env); + //printf("env name=`%s' text=`%s'\n",yytext,env); + for (i=l-1;i>=0;i--) unput(env[i]); + BEGIN(lastEnvState); + } +"\""|"\n" { + //printf("Quoted String = `%s'\n",tmpString.data()); + if (lastState==GetString) + (*s)+=tmpString; + else + elemStr+=tmpString; + if (*yytext=='\n') + { + err("Warning: Missing end quote (\") on line %d\n",yyLineNr); + yyLineNr++; + } + BEGIN(lastState); + } +"\\\"" { + tmpString+='"'; + } +. { tmpString+=*yytext; } +[a-zA-Z]+ { + QString bs=yytext; + bs=bs.upper(); + if (bs=="YES") + *b=TRUE; + else if (bs=="NO") + *b=FALSE; + else + { + *b=FALSE; + warn("Warning: Invalid value `%s' for " + "boolean tag in line %d; use YES or NO\n", + bs.data(),yyLineNr); + } + } + /* +[a-z_A-Z.*:?~0-9/\\\-]+ { + elemStr+=yytext; + } + */ +[^ \#\"\$\t\r\n]+ { + elemStr+=yytext; + } +\n { yyLineNr++; BEGIN(Start); } +\\[ \r\t]*\n { yyLineNr++; BEGIN(Start); } +<*>\\[ \r\t]*\n { yyLineNr++; } +<*>. +<*>\n { yyLineNr++ ; } + +%% + +/*@ ---------------------------------------------------------------------------- + */ + + +void dumpConfig() +{ + printf("projectName=`%s'\n",projectName.data()); + printf("outputDir=`%s'\n", outputDir.data()); + printf("headerFile=`%s'\n", headerFile.data()); + printf("footerFile=`%s'\n", footerFile.data()); + char *ip=includePath.first(); + while (ip) + { + printf("includePath=`%s'\n",ip); + ip=includePath.next(); + } + printf("quiet=`%d'\n", quietFlag); + printf("warnings=`%d'\n", warningFlag); + char *is=inputSources.first(); + while (is) + { + printf("inputSources=`%s'\n",is); + is=inputSources.next(); + } + char *fp=filePatternList.first(); + while (fp) + { + printf("filePattern=`%s'\n",fp); + fp=filePatternList.next(); + } + printf("recusive=`%d'\n",recursiveFlag); + printf("inputFilter=`%s'\n",inputFilter.data()); + char *tf=tagFileList.first(); + while (tf) + { + printf("tagFile=`%s'\n",tf); + tf=tagFileList.next(); + } + printf("allExternals=`%d'\n",allExtFlag); + printf("searchEngine=`%d'\n",searchEngineFlag); + printf("cgiName=`%s'\n",cgiName.data()); + printf("cgiURL=`%s'\n",cgiURL.data()); + printf("docURL=`%s'\n",docURL.data()); + printf("binAbsPath=`%s'\n",binAbsPath.data()); + char *ed=extDocPathList.first(); + while (ed) + { + printf("binAbsPathFile=`%s'\n",ed); + ed=extDocPathList.next(); + } +} + +void writeTemplateConfig(QFile *f,bool sl) +{ + QTextStream t(f); + t << "# Doxyfile " << versionString << endl; + if (!sl) + { + t << "# This file describes the settings to be used by doxygen for a project\n"; + t << "#\n"; + t << "# All text after a hash (#) is considered a comment and will be ignored\n"; + t << "# The format is:\n"; + t << "# TAG = value [value, ...]\n"; + t << "# Values that contain spaces should be placed between quotes (\" \")\n"; + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# General configuration options\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The PROJECT_NAME tag is a single word (or a sequence of word surrounded\n"; + t << "# by quotes) that should identify the project. \n"; + t << "\n"; + } + t << "PROJECT_NAME =\n"; + if (!sl) + { + t << "\n"; + t << "# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n" ; + t << "# This could be handy for archiving the generated documentation or \n"; + t << "# if some version control system is used.\n"; + t << "\n"; + } + t << "PROJECT_NUMBER =\n"; + if (!sl) + { + t << "\n"; + t << "# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n"; + t << "# base path where the generated documentation will be put. \n"; + t << "# If a relative path is entered, it will be relative to the location \n"; + t << "# where doxygen was started. If left blank the current directory will be used.\n"; + t << "\n"; + } + t << "OUTPUT_DIRECTORY =\n"; + if (!sl) + { + t << "\n"; + t << "# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n"; + t << "# documentation generated by doxygen is written. Doxygen will use this\n"; + t << "# information to generate all constant output in the proper language.\n"; + t << "# The default language is English, other supported languages are: Dutch\n"; + t << "\n"; + } + t << "OUTPUT_LANGUAGE = English\n"; + if (!sl) + { + t << "\n"; + t << "# The QUIET tag can be used to turn on/off the messages that are generated\n"; + t << "# by doxygen. Possible values are YES and NO. If left blank NO is used.\n"; + t << "\n"; + } + t << "QUIET = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The WARNINGS tag can be used to turn on/off the warning messages that are\n"; + t << "# generated by doxygen. Possible values are YES and NO. If left blank\n"; + t << "# NO is used.\n"; + t << "\n"; + } + t << "WARNINGS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The DISABLE_INDEX tag can be used to turn on/off the condensed index at\n"; + t << "# top of each HTML page. The value NO (the default) enables the index and\n"; + t << "# the value YES disables it.\n"; + t << "\n"; + } + t << "DISABLE_INDEX = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXTRACT_ALL tag is set to YES all classes and functions will be\n"; + t << "# included in the documentation, even if no documentation was available.\n"; + t << "\n"; + } + t << "EXTRACT_ALL = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n"; + t << "# will be included in the documentation.\n"; + t << "\n"; + } + t << "EXTRACT_PRIVATE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n"; + t << "# undocumented members inside documented classes or files.\n"; + t << "\n"; + } + t << "HIDE_UNDOC_MEMBERS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all\n"; + t << "# undocumented classes.\n"; + t << "\n"; + } + t << "HIDE_UNDOC_CLASSES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n"; + t << "# include brief member descriptions after the members that are listed in \n"; + t << "# the file and class documentation (similar to JavaDoc).\n"; + t << "# Set to NO to disable this.\n"; + t << "\n"; + } + t << "BRIEF_MEMBER_DESC = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The INTERNAL_DOCS tag determines if documentation\n"; + t << "# that is typed after a \\internal command is included. If the tag is set \n"; + t << "# to NO (the default) then the documentation will be excluded.\n"; + t << "# Set it to YES to include the internal documentation.\n"; + t << "\n"; + } + t << "INTERNAL_DOCS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n"; + t << "# the brief description of a member or function before the detailed description.\n"; + t << "# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"; + t << "# brief descriptions will be completely suppressed.\n"; + t << "\n"; + } + t << "REPEAT_BRIEF = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the FULL_PATH_NAMES tag is set to YES Doxygen will prepend the full\n"; + t << "# path before files name in the file list and in the header files. If set\n" ; + t << "# to NO the shortest path that makes the file name unique will be used.\n"; + t << "\n"; + } + t << "FULL_PATH_NAMES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n"; + t << "# can be used to strip a user defined part of the path. Stripping is\n" ; + t << "# only done if the specified string matches the left-hand part of the path.\n"; + t << "\n"; + } + t << "STRIP_FROM_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n"; + t << "# generate a class diagram (in Html and LaTeX) for classes with base or\n"; + t << "# super classes. Setting the tag to NO turns the diagrams off.\n"; + t << "\n"; + } + t << "CLASS_DIAGRAMS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the CASE_SENSE_NAMES tag is set to NO (the default) then Doxygen\n"; + t << "# will only generate file names in lower case letters. If set to\n"; + t << "# YES upper case letters are also allowed. This is useful if you have\n"; + t << "# classes or files whose names only differ in case and if your file system\n"; + t << "# supports case sensitive file names.\n"; + t << "\n"; + } + t << "CASE_SENSE_NAMES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the VERBATIM_HEADERS tag is set the YES (the default) then Doxygen\n"; + t << "# will generate a verbatim copy of the header file for each class for\n"; + t << "# which an include is specified. Set to NO to disable this.\n"; + t << "\n"; + } + t << "VERBATIM_HEADERS = YES\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the input files\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The INPUT tag can be used to specify the files and/or directories that contain \n"; + t << "# documented source files. You may enter file names like \"myfile.cpp\" or \n"; + t << "# directories like \"/usr/src/myproject\". Separate the files or directories \n"; + t << "# with spaces.\n"; + t << "\n"; + } + t << "INPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the INPUT tag contains directories, you can use the \n"; + t << "# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"; + t << "# and *.h) to filter out the source-files in the directories. If left \n"; + t << "# blank all files are included.\n"; + t << "\n"; + } + t << "FILE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; + t << "# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n"; + t << "# should be searched for input files as well. Possible values are YES and NO.\n"; + t << "# If left blank NO is used.\n"; + t << "\n"; + } + t << "RECURSIVE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The EXCLUDE tag can be used to specify files and/or directories that should\n"; + t << "# excluded from the INPUT source files. This way you can easily exclude a \n"; + t << "# subdirectory from a directory tree whose root is specified with the INPUT tag.\n"; + t << "\n"; + } + t << "EXCLUDE =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the INPUT tag contains directories, you can use the\n"; + t << "# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n"; + t << "# certain files from those directories.\n"; + t << "\n"; + } + t << "EXCLUDE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; + t << "# The EXAMPLE_PATH tag can be used to specify one or more files or \n"; + t << "# directories that contain example code fragments that are included (see \n"; + t << "# the \\include command).\n"; + t << "\n"; + } + t << "EXAMPLE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The INPUT_FILTER tag can be used to specify a program that doxygen should\n"; + t << "# invoke to filter for each input file. Doxygen will invoke the filter program \n"; + t << "# by executing (via popen()) the command , where \n"; + t << "# is the value of the INPUT_FILTER tag, and is the name of an\n"; + t << "# input file. Doxygen will then use the output that the filter program writes\n"; + t << "# to standard output.\n"; + t << "\n"; + } + t << "INPUT_FILTER =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the HTML output\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n"; + t << "# generate HTML output\n"; + t << "\n"; + } + t << "GENERATE_HTML = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `html' will be used as the default path.\n"; + t << "\n"; + } + t << "HTML_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_HEADER tag can be used to specify a personal HTML header for \n"; + t << "# each generated HTML page. If it is left blank doxygen will generate a \n"; + t << "# standard header.\n"; + t << "\n"; + } + t << "HTML_HEADER =\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_FOOTER tag can be used to specify a personal HTML footer for \n"; + t << "# each generated HTML page. If it is left blank doxygen will generate a \n"; + t << "# standard footer.\n"; + t << "\n"; + } + t << "HTML_FOOTER =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the LaTeX output\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n"; + t << "# generate Latex output.\n"; + t << "\n"; + } + t << "GENERATE_LATEX = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `latex' will be used as the default path.\n"; + t << "\n"; + } + t << "LATEX_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n"; + t << "# LaTeX documents. This may be useful for small projects and may help to\n"; + t << "# save some trees in general.\n"; + t << "\n"; + } + t << "COMPACT_LATEX = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The PAPER_TYPE tag can be used to set the paper type that is used\n"; + t << "# by the printer. Possible values are: a4, a4wide, letter, legal and \n"; + t << "# executive. If left blank a4wide will be used.\n"; + t << "\n"; + } + t << "PAPER_TYPE = a4wide\n"; + if (!sl) + { + t << "\n"; + t << "# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n"; + t << "# packages that should be included in the LaTeX output.\n"; + t << "\n"; + } + t << "EXTRA_PACKAGES =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the man page output\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n"; + t << "# generate man pages\n"; + t << "\n"; + } + t << "GENERATE_MAN = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `man' will be used as the default path.\n"; + t << "\n"; + } + t << "MAN_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to the preprocessor \n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n"; + t << "# evaluate all C-preprocessor directives found in the sources and include\n"; + t << "# files.\n"; + t << "\n"; + } + t << "ENABLE_PREPROCESSING = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n"; + t << "# names in the source code. If set to NO (the default) only conditional \n"; + t << "# compilation will be performed.\n"; + t << "\n"; + } + t << "MACRO_EXPANSION = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n"; + t << "# in the INCLUDE_PATH (see below) will be search if a #include is found.\n"; + t << "\n"; + } + t << "SEARCH_INCLUDES = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The INCLUDE_PATH tag can be used to specify one or more directories that\n"; + t << "# contain include files that are not input files but should be processed by\n"; + t << "# the preprocessor.\n" ; + t << "\n"; + } + t << "INCLUDE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The PREDEFINED tag can be used to specify one or more macro names that\n"; + t << "# are defined before the preprocessor is started (similar to the -D option of\n"; + t << "# gcc). The argument of the tag is a list of macros of the form: name\n"; + t << "# or name=definition (no spaces). If the definition and the = are \n"; + t << "# omitted =1 is assumed.\n"; + t << "\n"; + } + t << "PREDEFINED =\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n"; + t << "# then the macro expansion is limited to the macros specified with the\n"; + t << "# PREDEFINED tag.\n"; + t << "\n"; + } + t << "EXPAND_ONLY_PREDEF = NO\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to external references \n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The TAGFILES tag can be used to specify one or more tagfiles. \n"; + t << "\n"; + } + t << "TAGFILES =\n"; + if (!sl) + { + t << "\n"; + t << "# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n"; + t << "# a tag file that is based on the input files it reads.\n"; + t << "\n"; + } + t << "GENERATE_TAGFILE =\n"; + if (!sl) + { + t << "\n"; + t << "# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n"; + t << "# in the class index. If set to NO only the inherited external classes\n"; + t << "# will be listed.\n"; + t << "\n"; + } + t << "ALLEXTERNALS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The PERL_PATH should be the absolute path and name of the perl script\n"; + t << "# interpreter (i.e. the result of `which perl').\n"; + t << "\n"; + } + t << "PERL_PATH = /usr/local/bin/perl\n"; + if (!sl) + { + t << "\n"; + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to the search engine \n"; + t << "#---------------------------------------------------------------------------\n"; + t << "\n"; + t << "# The SEARCHENGINE tag specifies whether or not a search engine should be \n"; + t << "# used. If set to NO the values of all tags below this one will be ignored.\n"; + t << "\n"; + } + t << "SEARCHENGINE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The CGI_NAME tag should be the name of the CGI script that\n"; + t << "# starts the search engine (doxysearch) with the correct parameters.\n"; + t << "# A script with this name will be generated by doxygen.\n"; + t << "\n"; + } + t << "CGI_NAME = search.cgi\n"; + if (!sl) + { + t << "\n"; + t << "# The CGI_URL tag should be the absolute URL to the directory where the\n"; + t << "# cgi binaries are located. See the documentation of your http daemon for \n"; + t << "# details.\n"; + t << "\n"; + } + t << "CGI_URL =\n"; + if (!sl) + { + t << "\n"; + t << "# The DOC_URL tag should be the absolute URL to the directory where the\n"; + t << "# documentation is located. If left blank the absolute path to the \n"; + t << "# documentation, with file:// prepended to it, will be used.\n"; + t << "\n"; + } + t << "DOC_URL =\n"; + if (!sl) + { + t << "\n"; + t << "# The DOC_ABSPATH tag should be the absolute path to the directory where the\n"; + t << "# documentation is located. If left blank the directory on the local machine\n"; + t << "# will be used.\n"; + t << "\n"; + } + t << "DOC_ABSPATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The BIN_ABSPATH tag must point to the directory where the doxysearch binary\n"; + t << "# is installed.\n"; + t << "\n"; + } + t << "BIN_ABSPATH = /usr/local/bin/\n"; + if (!sl) + { + t << "\n"; + t << "# The EXT_DOC_PATHS tag can be used to specify one or more paths to \n"; + t << "# documentation generated for other projects. This allows doxysearch to search\n"; + t << "# the documentation for these projects as well.\n"; + t << "\n"; + } + t << "EXT_DOC_PATHS =\n"; +} + +void checkConfig() +{ + //if (projectName.length()>0) + //{ + // projectName[0]=toupper(projectName[0]); + //} + + paperType = paperType.lower().stripWhiteSpace(); + if (paperType.isEmpty()) + { + paperType = "a4wide"; + } + if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" && + paperType!="legal" && paperType!="executive") + { + err("Error: Unknown page type specified"); + } + + outputLanguage=outputLanguage.stripWhiteSpace(); + if (outputLanguage.isEmpty()) + { + setTranslator("English"); + } + else + { + if (!setTranslator(outputLanguage)) + { + err("Error: Output language %s not supported! Using english instead.\n", + outputLanguage.data()); + } + } + + // Test to see if output directory is valid + if (outputDir.isEmpty()) + outputDir=QDir::currentDirPath(); + else + { + QDir dir(outputDir); + if (!dir.exists()) + { + dir.setPath(QDir::currentDirPath()); + if (!dir.mkdir(outputDir)) + { + err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not " + "exist and cannot be created\n",outputDir.data()); + exit(1); + } + else if (!quietFlag) + { + err("Notice: Output directory `%s' does not exist. " + "I have created it for you.\n", outputDir.data()); + } + dir.cd(outputDir); + } + outputDir=dir.absPath(); + } + + if (htmlOutputDir.isEmpty() && generateHtml) + { + htmlOutputDir=outputDir+"/html"; + } + else if (htmlOutputDir && htmlOutputDir[0]!='/') + { + htmlOutputDir.prepend(outputDir+'/'); + } + QDir htmlDir(htmlOutputDir); + if (!htmlDir.exists() && !htmlDir.mkdir(htmlOutputDir)) + { + err("Could not create output directory %s\n",htmlOutputDir.data()); + exit(1); + } + + if (latexOutputDir.isEmpty() && generateLatex) + { + latexOutputDir=outputDir+"/latex"; + } + else if (latexOutputDir && latexOutputDir[0]!='/') + { + latexOutputDir.prepend(outputDir+'/'); + } + QDir latexDir(latexOutputDir); + if (!latexDir.exists() && !latexDir.mkdir(latexOutputDir)) + { + err("Could not create output directory %s\n",latexOutputDir.data()); + exit(1); + } + + if (manOutputDir.isEmpty() && generateMan) + { + manOutputDir=outputDir+"/man"; + } + else if (manOutputDir && manOutputDir[0]!='/') + { + manOutputDir.prepend(outputDir+'/'); + } + QDir manDir(manOutputDir); + if (!manDir.exists() && !manDir.mkdir(manOutputDir)) + { + err("Could not create output directory %s\n",manOutputDir.data()); + exit(1); + } + + // Test to see if HTML header is valid + if (headerFile.length()>0) + { + QFileInfo fi(headerFile); + if (!fi.exists()) + { + err("Error: tag HTML_HEADER: header file `%s' " + "does not exist\n",headerFile.data()); + exit(1); + } + } + // Test to see if HTML footer is valid + if (footerFile.length()>0) + { + QFileInfo fi(footerFile); + if (!fi.exists()) + { + err("Error: tag HTML_FOOTER: footer file `%s' " + "does not exist\n",footerFile.data()); + exit(1); + } + } + // check include path + char *s=includePath.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) err("Warning: tag INCLUDE_PATH: include path `%s' " + "does not exist\n",s); + addSearchDir(fi.absFilePath()); + s=includePath.next(); + } + // check input + if (inputSources.count()==0) + { + err("Error: tag INPUT: no input files specified after the INPUT tag.\n"); + exit(1); + } + else + { + s=inputSources.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) + { + err("Error: tag INPUT: input source `%s' does not exist\n",s); + exit(1); + } + s=inputSources.next(); + } + } + // add default pattern if needed + if (filePatternList.count()==0) + { + filePatternList.append("*"); + } + + // more checks needed if and only if the search engine is enabled. + if (searchEngineFlag) + { + // check cgi name + if (cgiName.length()==0) + { + err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); + exit(1); + } + // check cgi URL + if (cgiURL.length()==0) + { + err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); + exit(1); + } + else if (cgiURL.left(7)!="http://") + { + err("Error: tag CGI_URL: URL to cgi directory is invalid (must " + "start with http://).\n"); + exit(1); + } + // check documentation URL + if (docURL.length()==0) + { + docURL = outputDir.copy().prepend("file://").append("html"); + } + else if (docURL.left(7)!="http://" && docURL.left(7)!="file://") + { + err("Error: tag DOC_URL: URL to documentation is invalid or " + "not absolute.\n"); + exit(1); + } + // check absolute documentation path + if (docAbsPath.length()==0) + { + docAbsPath = outputDir+"/html"; + } + else if (docAbsPath && docAbsPath[0]!='/') + { + err("Error: tag DOC_ABSPATH: path is not absolute\n"); + exit(1); + } + // check path to doxysearch + if (binAbsPath.length()==0) + { + err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " + "specified.\n"); + exit(1); + } + else + { + if (binAbsPath && binAbsPath[0]!='/') + { + err("Error: tag BIN_ABSPATH: path is not absolute " + "(must start with /).\n"); + exit(1); + } + } + // check perl path + if (perlPath.length()==0) + { + perlPath="/usr/local/bin/perl"; + } + QFileInfo fi(perlPath); + if (!fi.exists()) + { + err("Error: tag PERL_PATH: perl interpreter not found at `%s'\n", + perlPath.data()); + exit(1); + } + } +} + +void parseConfig(const QString &s) +{ + inputString = s; + inputPosition = 0; + yyLineNr = 1; + configYYrestart( configYYin ); + BEGIN( Start ); + configYYlex(); + checkConfig(); +} + +extern "C" { // some bogus code to keep the compiler happy + int configYYwrap() { return 1 ; } +} diff --git a/src/constexp.h b/src/constexp.h new file mode 100644 index 0000000..9979bfd --- /dev/null +++ b/src/constexp.h @@ -0,0 +1,30 @@ +/****************************************************************************** + * + * $Id$ + * + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef _CONSTEXP_H +#define _CONSTEXP_H + +#include +#include "cppvalue.h" + +extern bool parseCppExpression(const QString &s); +extern int cppExpYYparse(); +extern int cppExpYYdebug; +extern QString strToken; +extern CPPValue resultValue; + +#endif diff --git a/src/constexp.l b/src/constexp.l new file mode 100644 index 0000000..f023507 --- /dev/null +++ b/src/constexp.l @@ -0,0 +1,110 @@ +/****************************************************************************** + * + * $Id$ + * + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +%{ + +#include "constexp.h" +#include "cppvalue.h" +#include "ce_parse.h" // generated header file + +#define YY_NO_UNPUT +#define YY_NEVER_INTERACTIVE 1 + +QString strToken; + +static const char *inputString; +static int inputPosition; +CPPValue resultValue; + +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +%} + +%% + +"?" { return TOK_QUESTIONMARK; } +":" { return TOK_COLON; } +"||" { return TOK_OR; } +"&&" { return TOK_AND; } +"|" { return TOK_BITWISEOR; } +"^" { return TOK_BITWISEXOR; } +"&" { return TOK_AMPERSAND; } +"!=" { return TOK_NOTEQUAL; } +"==" { return TOK_EQUAL; } +"<" { return TOK_LESSTHAN; } +">" { return TOK_GREATERTHAN; } +"<=" { return TOK_LESSTHANOREQUALTO; } +">=" { return TOK_GREATERTHANOREQUALTO; } +"<<" { return TOK_SHIFTLEFT; } +">>" { return TOK_SHIFTRIGHT; } +"+" { return TOK_PLUS; } +"-" { return TOK_MINUS; } +"*" { return TOK_STAR; } +"/" { return TOK_DIVIDE; } +"%" { return TOK_MOD; } +"~" { return TOK_TILDE; } +"!" { return TOK_NOT; } +"(" { return TOK_LPAREN; } +")" { return TOK_RPAREN; } +"'"(([^\'\n\r\\]+)|(\\(([ntvbrfa\\?'\"])|([0-9]+)|([xX][0-9a-fA-F]+))))"'" { + strToken=yytext; + return TOK_CHARACTER; + } +0[0-7]*[uUlL]* { strToken=yytext; + return TOK_OCTALINT; + } +[1-9][0-9]*[uUlL]* { strToken=yytext; + return TOK_DECIMALINT; + } +(0x|0X)[0-9a-fA-F]+[uUlL]* { strToken=yytext; return TOK_HEXADECIMALINT; } +(([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE]([\-\+])?[0-9]+)?([fFlL])? { + strToken=yytext; return TOK_FLOAT; + } +([0-9]+[eE])([\-\+])?[0-9]+([fFlL])? { + strToken=yytext; return TOK_FLOAT; + } +. +\n + +%% + +bool parseCppExpression(const QString &s) +{ + //printf("Expression: `%s'\n",s.data()); + inputString = s; + inputPosition = 0; + cppExpYYrestart( cppExpYYin ); + cppExpYYparse(); + //printf("Result: %ld\n",(long)resultValue); + return (long)resultValue!=0; +} + +extern "C" { + int cppExpYYwrap() { return 1; } +} diff --git a/src/constexp.y b/src/constexp.y new file mode 100644 index 0000000..fa13d6e --- /dev/null +++ b/src/constexp.y @@ -0,0 +1,275 @@ +/****************************************************************************** + * + * $Id$ + * + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +%{ + +#include "cppvalue.h" +#include "constexp.h" + +#if defined(_MSC_VER) +#define MSDOS +#endif + +#define YYSTYPE CPPValue + +#include +#include + +int cppExpYYerror(const char *s) +{ + printf("ERROR: %s\n",s); + return 0; +} + +int cppExpYYlex(); + +%} + +%token TOK_QUESTIONMARK +%token TOK_COLON +%token TOK_OR +%token TOK_AND +%token TOK_BITWISEOR +%token TOK_BITWISEXOR +%token TOK_AMPERSAND +%token TOK_NOTEQUAL +%token TOK_EQUAL +%token TOK_LESSTHAN +%token TOK_GREATERTHAN +%token TOK_LESSTHANOREQUALTO +%token TOK_GREATERTHANOREQUALTO +%token TOK_SHIFTLEFT +%token TOK_SHIFTRIGHT +%token TOK_PLUS +%token TOK_MINUS +%token TOK_STAR +%token TOK_DIVIDE +%token TOK_MOD +%token TOK_TILDE +%token TOK_NOT +%token TOK_LPAREN +%token TOK_RPAREN +%token TOK_OCTALINT +%token TOK_DECIMALINT +%token TOK_HEXADECIMALINT +%token TOK_CHARACTER +%token TOK_FLOAT + +%% + +start: constant_expression + { resultValue = $1; return 0; } +; + +constant_expression: logical_or_expression + { $$ = $1; } + | logical_or_expression + TOK_QUESTIONMARK logical_or_expression + TOK_COLON logical_or_expression + { + bool c = ($1.isInt() ? ((long)$1 != 0) : ((double)$1 != 0.0)); + $$ = c ? $3 : $5; + } +; + +logical_or_expression: logical_and_expression + { $$ = $1; } + | logical_or_expression TOK_OR logical_and_expression + { + $$ = CPPValue( (long)((long)$1 || (long)$3) ); + } +; + +logical_and_expression: inclusive_or_expression + { $$ = $1; } + | logical_and_expression TOK_AND inclusive_or_expression + { + $$ = CPPValue( (long)((long)$1 && (long)$3) ); + } +; + +inclusive_or_expression: exclusive_or_expression + { $$ = $1; } + | inclusive_or_expression TOK_BITWISEOR + exclusive_or_expression + { + $$ = CPPValue( (long)$1 | (long)$3 ); + } +; + +exclusive_or_expression: and_expression + { $$ = $1; } + | exclusive_or_expression TOK_BITWISEXOR and_expression + { + $$ = CPPValue( (long)$1 ^ (long)$3 ); + } +; + +and_expression: equality_expression + { $$ = $1; } + | and_expression TOK_AMPERSAND equality_expression + { + $$ = CPPValue( (long)$1 & (long)$3 ); + } +; + +equality_expression: relational_expression + { $$ = $1; } + | equality_expression TOK_EQUAL relational_expression + { + $$ = CPPValue( (long)((double)$1 == (double)$3) ); + } + | equality_expression TOK_NOTEQUAL relational_expression + { + $$ = CPPValue( (long)((double)$1 != (double)$3) ); + } +; + +relational_expression: shift_expression + { $$ = $1; } + | relational_expression TOK_LESSTHAN shift_expression + { + $$ = CPPValue( (long)((double)$1 < (double)$3) ); + } + | relational_expression TOK_GREATERTHAN shift_expression + { + $$ = CPPValue( (long)((double)$1 > (double)$3) ); + } + | relational_expression TOK_LESSTHANOREQUALTO + shift_expression + { + $$ = CPPValue( (long)((double)$1 <= (double)$3) ); + } + | relational_expression TOK_GREATERTHANOREQUALTO + shift_expression + { + $$ = CPPValue( (long)((double)$1 >= (double)$3) ); + } +; + +shift_expression: additive_expression + { $$ = $1; } + | shift_expression TOK_SHIFTLEFT additive_expression + { + $$ = CPPValue( (long)$1 << (long)$3 ); + } + | shift_expression TOK_SHIFTRIGHT additive_expression + { + $$ = CPPValue( (long)$1 >> (long)$3 ); + } +; + +additive_expression: multiplicative_expression + { $$ = $1; } + | additive_expression TOK_PLUS multiplicative_expression + { + if (!$1.isInt() || !$3.isInt()) + { + $$ = CPPValue( (double)$1 + (double)$3 ); + } + else + { + $$ = CPPValue( (long)$1 + (long)$3 ); + } + } + | additive_expression TOK_MINUS multiplicative_expression + { + if (!$1.isInt() || !$3.isInt()) + { + $$ = CPPValue( (double)$1 - (double)$3 ); + } + else + { + $$ = CPPValue( (long)$1 - (long)$3 ); + } + } +; + +multiplicative_expression: unary_expression + { $$ = $1; } + | multiplicative_expression TOK_STAR unary_expression + { + if (!$1.isInt() || !$3.isInt()) + { + $$ = CPPValue( (double)$1 * (double)$3 ); + } + else + { + $$ = CPPValue( (long)$1 * (long)$3 ); + } + } + | multiplicative_expression TOK_DIVIDE unary_expression + { + if (!$1.isInt() || !$3.isInt()) + { + $$ = CPPValue( (double)$1 / (double)$3 ); + } + else + { + long value = $3; + if (value==0) value=1; + $$ = CPPValue( (long)$1 / value ); + } + } + | multiplicative_expression TOK_MOD unary_expression + { + long value = $3; + if (value==0) value=1; + $$ = CPPValue( (long)$1 % value ); + } +; + +unary_expression: primary_expression + { $$ = $1; } + | TOK_PLUS unary_expression + { $$ = $1; } + | TOK_MINUS unary_expression + { + if ($2.isInt()) + $$ = CPPValue(-(long)$2); + else + $$ = CPPValue(-(double)$2); + } + | TOK_TILDE unary_expression + { + $$ = CPPValue(~(long)$2); + } + | TOK_NOT unary_expression + { + $$ = CPPValue((long)!(long)$2); + } +; + +primary_expression: constant + { $$ = $1; } + | TOK_LPAREN constant_expression TOK_RPAREN + { $$ = $2; } +; + +constant: TOK_OCTALINT + { $$ = parseOctal(); } + | TOK_DECIMALINT + { $$ = parseDecimal(); } + | TOK_HEXADECIMALINT + { $$ = parseHexadecimal(); } + | TOK_CHARACTER + { $$ = parseCharacter(); } + | TOK_FLOAT + { $$ = parseFloat(); } +; + +%% diff --git a/src/cppvalue.cpp b/src/cppvalue.cpp new file mode 100644 index 0000000..ab2a1d4 --- /dev/null +++ b/src/cppvalue.cpp @@ -0,0 +1,85 @@ +/****************************************************************************** + * + * $Id$ + * + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#include + +#include "cppvalue.h" +#include "constexp.h" + +CPPValue parseOctal() +{ + long val = 0; + for (const char *p = strToken.data(); *p != 0; p++) + { + if (*p >= '0' && *p <= '7') val = val * 8 + *p - '0'; + } + return CPPValue(val); +} + +CPPValue parseDecimal() +{ + long val = 0; + for (const char *p = strToken.data(); *p != 0; p++) + { + if (*p >= '0' && *p <= '9') val = val * 10 + *p - '0'; + } + return CPPValue(val); +} + +CPPValue parseHexadecimal() +{ + long val = 0; + for (const char *p = strToken.data(); *p != 0; p++) + { + if (*p >= '0' && *p <= '9') val = val * 16 + *p - '0'; + else if (*p >= 'a' && *p <= 'f') val = val * 16 + *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') val = val * 16 + *p - 'A' + 10; + } + return CPPValue(val); +} + +CPPValue parseCharacter() // does not work for '\n' and the alike +{ + if (strToken[1]=='\\') + { + switch(strToken[2]) + { + case 'n': return CPPValue((long)'\n'); + case 't': return CPPValue((long)'\t'); + case 'v': return CPPValue((long)'\v'); + case 'b': return CPPValue((long)'\b'); + case 'r': return CPPValue((long)'\r'); + case 'f': return CPPValue((long)'\f'); + case 'a': return CPPValue((long)'\a'); + case '\\': return CPPValue((long)'\\'); + case '?': return CPPValue((long)'\?'); + case '\'': return CPPValue((long)'\''); + case '"': return CPPValue((long)'"'); + case '0': return parseOctal(); + case 'x': + case 'X': return parseHexadecimal(); + default: printf("Invalid escape sequence %s found!\n",strToken.data()); + return CPPValue(0L); + } + } + return CPPValue((long)strToken[1]); +} + +CPPValue parseFloat() +{ + return CPPValue(atof(strToken)); +} diff --git a/src/cppvalue.h b/src/cppvalue.h new file mode 100644 index 0000000..d3751b2 --- /dev/null +++ b/src/cppvalue.h @@ -0,0 +1,59 @@ +/****************************************************************************** + * + * $Id$ + * + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef _CPPVALUE_H +#define _CPPVALUE_H + +#include +#include + +class CPPValue +{ + friend CPPValue parseOctal(); + friend CPPValue parseDecimal(); + friend CPPValue parseHexadecimal(); + friend CPPValue parseCharacter(); + friend CPPValue parseFloat(); + + public: + enum Type { Int, Float }; + + CPPValue(long val=0) : type(Int) { v.l = val; } + CPPValue(double val) : type(Float) { v.d = val; } + + operator double () const { return type==Int ? (double)v.l : v.d; } + operator long () const { return type==Int ? v.l : (long)v.d; } + + bool isInt() const { return type == Int; } + + void print() const + { + if (type==Int) + printf("(%ld)\n",v.l); + else + printf("(%f)\n",v.d); + } + + private: + Type type; + union { + double d; + long l; + } v; +}; + +#endif diff --git a/src/debug.cpp b/src/debug.cpp new file mode 100644 index 0000000..fc2731d --- /dev/null +++ b/src/debug.cpp @@ -0,0 +1,62 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#include "debug.h" +#include +#include +#include + +Debug::DebugMask Debug::curMask = Debug::Quiet; +int Debug::curPrio = 0; + +void Debug::print(DebugMask mask,int prio,const char *fmt,...) +{ + if ((curMask&mask) && prio<=curPrio) + { + va_list args; + va_start(args,fmt); + vfprintf(stdout, fmt, args); + va_end(args); + } +} + +static int labelToEnumValue(const char *l) +{ + QString label=l; + if (label=="FindMembers") + return Debug::FindMembers; + else if (label=="Functions") + return Debug::Functions; + else if (label=="Variables") + return Debug::Variables; + else + return 0; +} + +void Debug::setFlag(const char *lab) +{ + curMask = (DebugMask)(curMask | labelToEnumValue(lab)); +} + +void Debug::clearFlag(const char *lab) +{ + curMask = (DebugMask)(curMask & ~labelToEnumValue(lab)); +} + +void Debug::setPriority(int p) +{ + curPrio = p; +} diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..b2b389f --- /dev/null +++ b/src/debug.h @@ -0,0 +1,39 @@ +/****************************************************************************** + * + * $Id$ + * + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef _DEBUG_H +#define _DEBUG_H + +class Debug +{ + public: + enum DebugMask { Quiet = 0x00000000, + FindMembers = 0x00000001, + Functions = 0x00000002, + Variables = 0x00000004 + }; + static void print(DebugMask mask,int prio,const char *fmt,...); + static void setFlag(const char *label); + static void clearFlag(const char *label); + static void setPriority(int p); + + private: + static DebugMask curMask; + static int curPrio; +}; + +#endif diff --git a/src/declinfo.h b/src/declinfo.h new file mode 100644 index 0000000..4ec3ec5 --- /dev/null +++ b/src/declinfo.h @@ -0,0 +1,32 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#ifndef DECLINFO_H +#define DECLINFO_H + +#include +#include + +extern void parseFuncDecl(const QString &decl, + QString &clName, + QString &classTempList, + QString &type, + QString &name, + QString &args, + QString &funcTempList, + QString &exceptions + ); +#endif diff --git a/src/declinfo.l b/src/declinfo.l new file mode 100644 index 0000000..0f0505d --- /dev/null +++ b/src/declinfo.l @@ -0,0 +1,292 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +%{ + +/* + * includes + */ +#include +#include +#include +#include + +#include "declinfo.h" +#include "util.h" + + +#define YY_NO_UNPUT + +/* ----------------------------------------------------------------- + * + * statics + */ + +static const char * inputString; +static int inputPosition; +static QString scope; +static QString className; +static QString classTempList; +static QString funcTempList; +static QString type; +static QString name; +static QString args; +static QString tmpType; +static int sharpCount; +static bool classTempListFound; +static bool funcTempListFound; +static QString exceptionString; + +static void addType() +{ + //printf("addType() type=`%s' scope=`%s' name=`%s'\n", + // type.data(),scope.data(),name.data()); + if (name.isEmpty() && scope.isEmpty()) return; + if (!type.isNull()) type+=' '; + if (!scope.isEmpty()) type+=scope+"::"; + type+=name; + scope.resize(0); + name.resize(0); +} + +static void addTypeName() +{ + //printf("addTypeName() type=`%s' scope=`%s' name=`%s'\n", + // type.data(),scope.data(),name.data()); + if (name.isEmpty()) return; + if (!type.isNull()) type+=' '; + type+=name; + name.resize(0); +} + +#define YY_NEVER_INTERACTIVE 1 + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +%} + +B [ \t] +ID [a-z_A-Z][a-z_A-Z0-9]* + +%x Start +%x Template +%x ReadArgs +%x Operator +%x FuncPtr +%x EndTemplate +%x StripTempArgs +%x SkipSharp +%x ReadExceptions + +%% + +"operator" { // operator rule must be before {ID} rule + name += yytext; + BEGIN(Operator); + } +(~{B}*)?{ID} { + addTypeName(); + name += yytext; + } +{B}*"::"{B}* { // found a scope specifier + if (!scope.isEmpty()) + { + scope+="::"+name; // add name to scope + } + else + { + scope = name.copy(); // scope becomes name + } + name.resize(0); + } +[*&]+ { + addType(); + type+=yytext; + } +{B}+ { + addType(); + } +{B}*"("{B}*"*" { + addType(); + type+="(*"; + } +{B}*")" { + type+=")"; + } +{B}*"(" { // TODO: function pointers + args+="("; + BEGIN(ReadArgs); + } +{B}*"[" { + args+="["; + BEGIN(ReadArgs); + } +{B}*"<" { + name+="<"; + sharpCount=0; + BEGIN(Template); + } +